s2io: enabling VLAN tag stripping at driver initialization
Subsystems (2)
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
@@ -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
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.Signed-off-by Breno Leitao <[email protected]>Signed-off-by Jay Vosburgh <[email protected]>---
drivers/net/s2io.c +0
-0@@ -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
-0pci_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
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
@@ -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
@@ -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 0xA5int num_entries;struct msix_entry *entries;
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 initializationActually 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_flagfield was moved to the private network structure.Signed-off-by Breno Leitao <[email protected]>Signed-off-by Jay Vosburgh <[email protected]>---
drivers/net/s2io.c +0
-0@@ -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
-1val64 =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
-0val64 =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
-0pci_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
-0iphdr **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
-1vlan_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@@ -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 0xA5int num_entries;struct msix_entry *entries;
Jeff Garzik
AppliedQuoted 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_flagfield was moved to the private network structure.Signed-off-by Breno Leitao <[email protected]>Signed-off-by Jay Vosburgh <[email protected]>
applied