e1000: Fix for e1000 kills IPMI on a tagged vlan.
authorGraham, David <david.graham@intel.com>
Mon, 31 Aug 2009 14:12:51 +0000 (14:12 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Sep 2009 00:40:11 +0000 (17:40 -0700)
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>
drivers/net/e1000/e1000_main.c

index b3063e60be6e97fdb0a5e6f913b0f7c63fdd1016..2c723b1b8820f5400f9b3e4459b20663e018e06f 100644 (file)
@@ -2402,7 +2402,9 @@ static void e1000_set_rx_mode(struct net_device *netdev)
                        rctl &= ~E1000_RCTL_MPE;
                }
                if (adapter->hw.mac_type != e1000_ich8lan)
-                       rctl |= E1000_RCTL_VFE;
+                       /* Enable VLAN filter if there is a VLAN */
+                       if (adapter->vlgrp)
+                               rctl |= E1000_RCTL_VFE;
        }
 
        if (netdev->uc.count > rar_entries - 1) {
@@ -4856,6 +4858,8 @@ static void e1000_vlan_rx_register(struct net_device *netdev,
                        /* enable VLAN receive filtering */
                        rctl = er32(RCTL);
                        rctl &= ~E1000_RCTL_CFIEN;
+                       if (!(netdev->flags & IFF_PROMISC))
+                               rctl |= E1000_RCTL_VFE;
                        ew32(RCTL, rctl);
                        e1000_update_mng_vlan(adapter);
                }
@@ -4866,6 +4870,11 @@ static void e1000_vlan_rx_register(struct net_device *netdev,
                ew32(CTRL, ctrl);
 
                if (adapter->hw.mac_type != e1000_ich8lan) {
+                       /* disable VLAN receive filtering */
+                       rctl = er32(RCTL);
+                       rctl &= ~E1000_RCTL_VFE;
+                       ew32(RCTL, rctl);
+
                        if (adapter->mng_vlan_id !=
                            (u16)E1000_MNG_VLAN_NONE) {
                                e1000_vlan_rx_kill_vid(netdev,