Skip to contentSkip to conversation

s2io: enabling VLAN tag stripping at driver initialization

PATCH Applied Breno Leitao 3 participants 5 messages Sep 4, 2008 – Sep 13, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 s2io: enabling VLAN tag stripping at driver initialization

Actually s2io has a bug in VLAN support. VLAN doesn't work except if you'd opened the interface in promiscuous mode before.
This happens because VLAN tag stripping is not enable by default (when the device is loaded). It is only enabled when the device leaves promiscuous mode.

---

drivers/net/s2io.c +8 -0
index a2b0730..e656c80 100644
@@ -8206,6 +8206,14 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
 	/* Initialize device name */
 	sprintf(sp->name, "%s Neterion %s", dev->name, sp->product_name);
 
+	/* Initialize VLAN tag strip */
+	if (vlan_tag_strip) {
+		val64 = readq(&bar0->rx_pa_cfg);
+		val64 |= RX_PA_CFG_STRIP_VLAN_TAG;
+		writeq(val64, &bar0->rx_pa_cfg);
+		vlan_strip_flag = 1;
+	}
+
 	/*
 	 * Make Link state as off at this point, when the Link change
 	 * interrupt comes the state will be automatically changed to
#1 lore raw

Breno,

When the chip comes out of reset, it's default setting is to strip the vlan tag. So, in your patch, you will need to do this differently. The vlan_strip_flag will have to be moved to the nic structure and initialized there.

Review

Quoted 4 lines
(quoted diff) +4 -0
+	if (vlan_tag_strip)
+		sp->vlan_strip_flag = 1;
+	else 
+		sp->vlan_strip_flag = 0;

Thanks,
Ram

drivers/net/s2io.c s2io_init_nic(struct pci_dev *pdev, const

Quoted 16 lines

Actually s2io has a bug in VLAN support. VLAN doesn't work except if you'd opened the interface in promiscuous mode before.
This happens because VLAN tag stripping is not enable by default (when the device is loaded). It is only enabled when the device leaves promiscuous mode.

---

drivers/net/s2io.c +0 -0
index a2b0730..e656c80 100644
@@ -8206,6 +8206,14 @@ s2io_init_nic(struct pci_dev *pdev, const

struct

drivers/net/s2io.c s2io_init_nic(struct pci_dev *pdev, const · line 8208

Quoted 3 lines
drivers/net/s2io.c +0 -0
 pci_device_id *pre)
 	/* Initialize device name */
 	sprintf(sp->name, "%s Neterion %s", dev->name,

sp->product_name);

Quoted 16 lines
drivers/net/s2io.c +8 -1
+	/* Initialize VLAN tag strip */
+	if (vlan_tag_strip) {
+		val64 = readq(&bar0->rx_pa_cfg);
+		val64 |= RX_PA_CFG_STRIP_VLAN_TAG;
+		writeq(val64, &bar0->rx_pa_cfg);
+		vlan_strip_flag = 1;
+	}
+
 	/*
 	 * Make Link state as off at this point, when the Link change
 	 * interrupt comes the state will be automatically changed to
--

To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#2 lore raw

Actually s2io has a bug in VLAN support. VLAN doesn't work except if you'd opened the interface in promiscuous mode before. This happens because VLAN tag stripping is not correctly marked as enabled at device startup

Also, the vlan_strip_flag field was moved to the private network structure.

---

drivers/net/s2io.c +10 -8
index a2b0730..1386d76 100644
@@ -371,9 +371,6 @@ static void s2io_vlan_rx_register(struct net_device *dev,
 				flags[i]);
 }
 
-/* A flag indicating whether 'RX_PA_CFG_STRIP_VLAN_TAG' bit is set or not */
-static int vlan_strip_flag;
-
 /* Unregister the vlan */
 static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid)
 {
@@ -2303,7 +2300,7 @@ static int start_nic(struct s2io_nic *nic)
 		val64 = readq(&bar0->rx_pa_cfg);
 		val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG;
 		writeq(val64, &bar0->rx_pa_cfg);
-		vlan_strip_flag = 0;
+		nic->vlan_strip_flag = 0;
 	}
 
 	/*
@@ -5010,7 +5007,7 @@ static void s2io_set_multicast(struct net_device *dev)
 			val64 = readq(&bar0->rx_pa_cfg);
 			val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG;
 			writeq(val64, &bar0->rx_pa_cfg);
-			vlan_strip_flag = 0;
+			sp->vlan_strip_flag = 0;
 		}
 
 		val64 = readq(&bar0->mac_cfg);
@@ -5032,7 +5029,7 @@ static void s2io_set_multicast(struct net_device *dev)
 			val64 = readq(&bar0->rx_pa_cfg);
 			val64 |= RX_PA_CFG_STRIP_VLAN_TAG;
 			writeq(val64, &bar0->rx_pa_cfg);
-			vlan_strip_flag = 1;
+			sp->vlan_strip_flag = 1;
 		}
 
 		val64 = readq(&bar0->mac_cfg);
@@ -8206,6 +8203,11 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
 	/* Initialize device name */
 	sprintf(sp->name, "%s Neterion %s", dev->name, sp->product_name);
 
+	if (vlan_tag_strip)
+		sp->vlan_strip_flag = 1;
+	else
+		sp->vlan_strip_flag = 0;
+
 	/*
 	 * Make Link state as off at this point, when the Link change
 	 * interrupt comes the state will be automatically changed to
@@ -8311,7 +8313,7 @@ static int check_L2_lro_capable(u8 *buffer, struct iphdr **ip,
 		 * If vlan stripping is disabled and the frame is VLAN tagged,
 		 * shift the offset by the VLAN header size bytes.
 		 */
-		if ((!vlan_strip_flag) &&
+		if ((!sp->vlan_strip_flag) &&
 			(rxdp->Control_1 & RXD_FRAME_VLAN_TAG))
 			ip_off += HEADER_VLAN_SIZE;
 	} else {
@@ -8592,7 +8594,7 @@ static void queue_rx_frame(struct sk_buff *skb, u16 vlan_tag)
 
 	skb->protocol = eth_type_trans(skb, dev);
 	if (sp->vlgrp && vlan_tag
-		&& (vlan_strip_flag)) {
+		&& (sp->vlan_strip_flag)) {
 		/* Queueing the vlan frame to the upper layer */
 		if (sp->config.napi)
 			vlan_hwaccel_receive_skb(skb, sp->vlgrp, vlan_tag);
drivers/net/s2io.h +1 -0
index 6722a2f..55cb943 100644
@@ -962,6 +962,7 @@ struct s2io_nic {
 	int task_flag;
 	unsigned long long start_time;
 	struct vlan_group *vlgrp;
+	int vlan_strip_flag;
 #define MSIX_FLG                0xA5
 	int num_entries;
 	struct msix_entry *entries;
#3 lore raw

Breno/Jeff,
This patch looks good.

Thanks,
Ram

drivers/net/s2io.c static void s2io_vlan_rx_register(struct

Quoted 27 lines

-----Original Message-----
From: Breno Leitao [mailto:[email protected]]
Sent: Thursday, September 04, 2008 1:53 PM
To: Ramkrishna Vepa
Cc: Rastapur Santosh; Sivakumar Subramani; Sreenivasa Honnur; [email protected]; Jay Vosburgh; netdev; Lorandi
Subject: Re: [PATCH 1/1 net-2.6] s2io: enabling VLAN tag stripping at driver initialization

Actually s2io has a bug in VLAN support. VLAN doesn't work except if you'd opened the interface in promiscuous mode before. This happens because VLAN tag stripping is not correctly marked as enabled at device startup

Also, the vlan_strip_flag field was moved to the private network structure.

---

drivers/net/s2io.c +0 -0
index a2b0730..1386d76 100644
@@ -371,9 +371,6 @@ static void s2io_vlan_rx_register(struct

net_device

drivers/net/s2io.c static void s2io_vlan_rx_register(struct net_device *dev,

Quoted 5 lines
drivers/net/s2io.c +0 -1
 *dev,
 				flags[i]);
 }
 
-/* A flag indicating whether 'RX_PA_CFG_STRIP_VLAN_TAG' bit is set or

not

Quoted 5 lines
drivers/net/s2io.c +0 -2
 */
-static int vlan_strip_flag;
-
 /* Unregister the vlan */

static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned

long

drivers/net/s2io.c s2io_init_nic(struct pci_dev *pdev, const

Quoted 32 lines

vid)
{

drivers/net/s2io.c +2 -2
@@ -2303,7 +2300,7 @@ static int start_nic(struct s2io_nic *nic)
 		val64 = readq(&bar0->rx_pa_cfg);
 		val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG;
 		writeq(val64, &bar0->rx_pa_cfg);
-		vlan_strip_flag = 0;
+		nic->vlan_strip_flag = 0;
 	}
 
 	/*
@@ -5010,7 +5007,7 @@ static void s2io_set_multicast(struct net_device
 *dev)
 			val64 = readq(&bar0->rx_pa_cfg);
 			val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG;
 			writeq(val64, &bar0->rx_pa_cfg);
-			vlan_strip_flag = 0;
+			sp->vlan_strip_flag = 0;
 		}
 
drivers/net/s2io.c +1 -1
 		val64 = readq(&bar0->mac_cfg);
@@ -5032,7 +5029,7 @@ static void s2io_set_multicast(struct net_device
 *dev)
 			val64 = readq(&bar0->rx_pa_cfg);
 			val64 |= RX_PA_CFG_STRIP_VLAN_TAG;
 			writeq(val64, &bar0->rx_pa_cfg);
-			vlan_strip_flag = 1;
+			sp->vlan_strip_flag = 1;
 		}
 
drivers/net/s2io.c +0 -0
 		val64 = readq(&bar0->mac_cfg);
@@ -8206,6 +8203,11 @@ s2io_init_nic(struct pci_dev *pdev, const

struct

drivers/net/s2io.c s2io_init_nic(struct pci_dev *pdev, const · line 8205

Quoted 3 lines
drivers/net/s2io.c +0 -0
 pci_device_id *pre)
 	/* Initialize device name */
 	sprintf(sp->name, "%s Neterion %s", dev->name,

sp->product_name);

drivers/net/s2io.c static int check_L2_lro_capable(u8 *buffer,

Quoted 10 lines
drivers/net/s2io.c +5 -0
+	if (vlan_tag_strip)
+		sp->vlan_strip_flag = 1;
+	else
+		sp->vlan_strip_flag = 0;
+
 	/*
 	 * Make Link state as off at this point, when the Link change
 	 * interrupt comes the state will be automatically changed to
@@ -8311,7 +8313,7 @@ static int check_L2_lro_capable(u8 *buffer,

struct

drivers/net/s2io.c static int check_L2_lro_capable(u8 *buffer, · line 8314

Quoted 2 lines
drivers/net/s2io.c +0 -0
 iphdr **ip,
 		 * If vlan stripping is disabled and the frame is VLAN

tagged,

drivers/net/s2io.c static void queue_rx_frame(struct sk_buff *skb,

Quoted 8 lines
drivers/net/s2io.c +1 -1
 		 * shift the offset by the VLAN header size bytes.
 		 */
-		if ((!vlan_strip_flag) &&
+		if ((!sp->vlan_strip_flag) &&
 			(rxdp->Control_1 & RXD_FRAME_VLAN_TAG))
 			ip_off += HEADER_VLAN_SIZE;
drivers/net/s2io.c +0 -0
 	} else {
@@ -8592,7 +8594,7 @@ static void queue_rx_frame(struct sk_buff *skb,

u16

Quoted 9 lines
drivers/net/s2io.c +1 -1
 vlan_tag)
 
 	skb->protocol = eth_type_trans(skb, dev);
 	if (sp->vlgrp && vlan_tag
-		&& (vlan_strip_flag)) {
+		&& (sp->vlan_strip_flag)) {
 		/* Queueing the vlan frame to the upper layer */
 		if (sp->config.napi)

vlan_hwaccel_receive_skb(skb, sp->vlgrp,

vlan_tag);

Quoted 12 lines
drivers/net/s2io.h +1 -0
index 6722a2f..55cb943 100644
@@ -962,6 +962,7 @@ struct s2io_nic {
 	int task_flag;
 	unsigned long long start_time;
 	struct vlan_group *vlgrp;
+	int vlan_strip_flag;
 #define MSIX_FLG                0xA5
 	int num_entries;
 	struct msix_entry *entries;
Applied
#4 lore raw
In reply to Breno Leitao
Quoted 10 lines · Breno Leitao

Actually s2io has a bug in VLAN support. VLAN doesn't work except if you'd opened the interface in promiscuous mode before. This happens because VLAN tag stripping is not correctly marked as enabled at device startup

Also, the vlan_strip_flag field was moved to the private network structure.

applied