diff options
author | Breno Leitao <leitao@linux.vnet.ibm.com> | 2008-09-04 16:52:54 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-09-24 18:49:04 -0400 |
commit | cd0fce0322cd10ab39ace584be12f809988a1b9a (patch) | |
tree | 0eb4f09a6b9c79c87c222df11e9b89064b364038 /drivers/net/s2io.c | |
parent | 52845c3fd80c09f8ceac54513ae9cffac219cff7 (diff) |
s2io: Fix enabling VLAN tag stripping at driver initialization
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.
Signed-off-by: Breno Leitao <leitao@linux.vnet.ibm.com>
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net/s2io.c')
-rw-r--r-- | drivers/net/s2io.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 243db33042a8..a2d50fad61a1 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -371,9 +371,6 @@ static void s2io_vlan_rx_register(struct net_device *dev, | |||
371 | flags[i]); | 371 | flags[i]); |
372 | } | 372 | } |
373 | 373 | ||
374 | /* A flag indicating whether 'RX_PA_CFG_STRIP_VLAN_TAG' bit is set or not */ | ||
375 | static int vlan_strip_flag; | ||
376 | |||
377 | /* Unregister the vlan */ | 374 | /* Unregister the vlan */ |
378 | static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid) | 375 | static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid) |
379 | { | 376 | { |
@@ -2303,7 +2300,7 @@ static int start_nic(struct s2io_nic *nic) | |||
2303 | val64 = readq(&bar0->rx_pa_cfg); | 2300 | val64 = readq(&bar0->rx_pa_cfg); |
2304 | val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG; | 2301 | val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG; |
2305 | writeq(val64, &bar0->rx_pa_cfg); | 2302 | writeq(val64, &bar0->rx_pa_cfg); |
2306 | vlan_strip_flag = 0; | 2303 | nic->vlan_strip_flag = 0; |
2307 | } | 2304 | } |
2308 | 2305 | ||
2309 | /* | 2306 | /* |
@@ -5010,7 +5007,7 @@ static void s2io_set_multicast(struct net_device *dev) | |||
5010 | val64 = readq(&bar0->rx_pa_cfg); | 5007 | val64 = readq(&bar0->rx_pa_cfg); |
5011 | val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG; | 5008 | val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG; |
5012 | writeq(val64, &bar0->rx_pa_cfg); | 5009 | writeq(val64, &bar0->rx_pa_cfg); |
5013 | vlan_strip_flag = 0; | 5010 | sp->vlan_strip_flag = 0; |
5014 | } | 5011 | } |
5015 | 5012 | ||
5016 | val64 = readq(&bar0->mac_cfg); | 5013 | val64 = readq(&bar0->mac_cfg); |
@@ -5032,7 +5029,7 @@ static void s2io_set_multicast(struct net_device *dev) | |||
5032 | val64 = readq(&bar0->rx_pa_cfg); | 5029 | val64 = readq(&bar0->rx_pa_cfg); |
5033 | val64 |= RX_PA_CFG_STRIP_VLAN_TAG; | 5030 | val64 |= RX_PA_CFG_STRIP_VLAN_TAG; |
5034 | writeq(val64, &bar0->rx_pa_cfg); | 5031 | writeq(val64, &bar0->rx_pa_cfg); |
5035 | vlan_strip_flag = 1; | 5032 | sp->vlan_strip_flag = 1; |
5036 | } | 5033 | } |
5037 | 5034 | ||
5038 | val64 = readq(&bar0->mac_cfg); | 5035 | val64 = readq(&bar0->mac_cfg); |
@@ -8206,6 +8203,11 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
8206 | /* Initialize device name */ | 8203 | /* Initialize device name */ |
8207 | sprintf(sp->name, "%s Neterion %s", dev->name, sp->product_name); | 8204 | sprintf(sp->name, "%s Neterion %s", dev->name, sp->product_name); |
8208 | 8205 | ||
8206 | if (vlan_tag_strip) | ||
8207 | sp->vlan_strip_flag = 1; | ||
8208 | else | ||
8209 | sp->vlan_strip_flag = 0; | ||
8210 | |||
8209 | /* | 8211 | /* |
8210 | * Make Link state as off at this point, when the Link change | 8212 | * Make Link state as off at this point, when the Link change |
8211 | * interrupt comes the state will be automatically changed to | 8213 | * interrupt comes the state will be automatically changed to |
@@ -8311,7 +8313,7 @@ static int check_L2_lro_capable(u8 *buffer, struct iphdr **ip, | |||
8311 | * If vlan stripping is disabled and the frame is VLAN tagged, | 8313 | * If vlan stripping is disabled and the frame is VLAN tagged, |
8312 | * shift the offset by the VLAN header size bytes. | 8314 | * shift the offset by the VLAN header size bytes. |
8313 | */ | 8315 | */ |
8314 | if ((!vlan_strip_flag) && | 8316 | if ((!sp->vlan_strip_flag) && |
8315 | (rxdp->Control_1 & RXD_FRAME_VLAN_TAG)) | 8317 | (rxdp->Control_1 & RXD_FRAME_VLAN_TAG)) |
8316 | ip_off += HEADER_VLAN_SIZE; | 8318 | ip_off += HEADER_VLAN_SIZE; |
8317 | } else { | 8319 | } else { |
@@ -8592,7 +8594,7 @@ static void queue_rx_frame(struct sk_buff *skb, u16 vlan_tag) | |||
8592 | 8594 | ||
8593 | skb->protocol = eth_type_trans(skb, dev); | 8595 | skb->protocol = eth_type_trans(skb, dev); |
8594 | if (sp->vlgrp && vlan_tag | 8596 | if (sp->vlgrp && vlan_tag |
8595 | && (vlan_strip_flag)) { | 8597 | && (sp->vlan_strip_flag)) { |
8596 | /* Queueing the vlan frame to the upper layer */ | 8598 | /* Queueing the vlan frame to the upper layer */ |
8597 | if (sp->config.napi) | 8599 | if (sp->config.napi) |
8598 | vlan_hwaccel_receive_skb(skb, sp->vlgrp, vlan_tag); | 8600 | vlan_hwaccel_receive_skb(skb, sp->vlgrp, vlan_tag); |