aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGraham, David <david.graham@intel.com>2009-08-31 10:12:51 -0400
committerDavid S. Miller <davem@davemloft.net>2009-09-01 20:40:11 -0400
commitfd38d7a0a0618656e491ed67af735bc4e3600367 (patch)
tree0afca5e748ec6fac988b340dfce3ed2883d93ef4
parent6fa12c85031485dff38ce550c24f10da23b0adaa (diff)
e1000: Fix for e1000 kills IPMI on a tagged vlan.
Enabling VLAN filters (VFE) when the primary interface is brought up (per commit 78ed11a) has caused problems for some users who manage their systems using IPMI over a VLAN. This is because when the driver enables the VLAN filter, this same filter table is enabled for the management channel, and the table is initially empty, which means that the IPMI/VLAN packets are filtered out and not received by the BMC. This is a problem only on e1000 class adapters, as it is only on e1000 that the filter table is common to the management and host streams. With this change, filtering is only enabled when one or more host VLANs exist, and is disabled when the last host VLAN is removed. VLAN filtering is always disabled when the primary interface is in promiscuous mode, and will be (re)enabled if VLANs exist when the interface exits promiscuous mode. Note that this does not completely resolve the issue for those using VLAN management, because if the host adds a VLAN, then the above problem occurs when that VLAN is enabled. However, it does mean the there is no problem for configurations where management is on a VLAN and the host is not. A complete solution to this issue would require further driver changes. The driver would need to discover if (and which) management VLANs are active before enabling VLAN filtering, so that it could ensure that the managed VLANs are included in the VLAN filter table. This discovery requires that the BMC identifies its VLAN in registers accessible to the driver, and at least on Dell PE2850 systems the BMC does not identify its VLAN to allow such discovery. Intel is pursuing this issue with the BMC vendor. Signed-off-by: Dave Graham <david.graham@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Tested-by: Krzysztof Piotr Oledzki <ole@ans.pl> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/e1000/e1000_main.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index b3063e60be6e..2c723b1b8820 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -2402,7 +2402,9 @@ static void e1000_set_rx_mode(struct net_device *netdev)
2402 rctl &= ~E1000_RCTL_MPE; 2402 rctl &= ~E1000_RCTL_MPE;
2403 } 2403 }
2404 if (adapter->hw.mac_type != e1000_ich8lan) 2404 if (adapter->hw.mac_type != e1000_ich8lan)
2405 rctl |= E1000_RCTL_VFE; 2405 /* Enable VLAN filter if there is a VLAN */
2406 if (adapter->vlgrp)
2407 rctl |= E1000_RCTL_VFE;
2406 } 2408 }
2407 2409
2408 if (netdev->uc.count > rar_entries - 1) { 2410 if (netdev->uc.count > rar_entries - 1) {
@@ -4856,6 +4858,8 @@ static void e1000_vlan_rx_register(struct net_device *netdev,
4856 /* enable VLAN receive filtering */ 4858 /* enable VLAN receive filtering */
4857 rctl = er32(RCTL); 4859 rctl = er32(RCTL);
4858 rctl &= ~E1000_RCTL_CFIEN; 4860 rctl &= ~E1000_RCTL_CFIEN;
4861 if (!(netdev->flags & IFF_PROMISC))
4862 rctl |= E1000_RCTL_VFE;
4859 ew32(RCTL, rctl); 4863 ew32(RCTL, rctl);
4860 e1000_update_mng_vlan(adapter); 4864 e1000_update_mng_vlan(adapter);
4861 } 4865 }
@@ -4866,6 +4870,11 @@ static void e1000_vlan_rx_register(struct net_device *netdev,
4866 ew32(CTRL, ctrl); 4870 ew32(CTRL, ctrl);
4867 4871
4868 if (adapter->hw.mac_type != e1000_ich8lan) { 4872 if (adapter->hw.mac_type != e1000_ich8lan) {
4873 /* disable VLAN receive filtering */
4874 rctl = er32(RCTL);
4875 rctl &= ~E1000_RCTL_VFE;
4876 ew32(RCTL, rctl);
4877
4869 if (adapter->mng_vlan_id != 4878 if (adapter->mng_vlan_id !=
4870 (u16)E1000_MNG_VLAN_NONE) { 4879 (u16)E1000_MNG_VLAN_NONE) {
4871 e1000_vlan_rx_kill_vid(netdev, 4880 e1000_vlan_rx_kill_vid(netdev,