]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.3-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 May 2012 22:30:40 +0000 (15:30 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 May 2012 22:30:40 +0000 (15:30 -0700)
added patches:
e1000-fix-vlan-processing-regression.patch

queue-3.3/e1000-fix-vlan-processing-regression.patch [new file with mode: 0644]
queue-3.3/series

diff --git a/queue-3.3/e1000-fix-vlan-processing-regression.patch b/queue-3.3/e1000-fix-vlan-processing-regression.patch
new file mode 100644 (file)
index 0000000..2cbc2a1
--- /dev/null
@@ -0,0 +1,106 @@
+From 52f5509fe8ccb607ff9b84ad618f244262336475 Mon Sep 17 00:00:00 2001
+From: Jiri Pirko <jpirko@redhat.com>
+Date: Tue, 20 Mar 2012 18:10:01 +0000
+Subject: e1000: fix vlan processing regression
+
+From: Jiri Pirko <jpirko@redhat.com>
+
+commit 52f5509fe8ccb607ff9b84ad618f244262336475 upstream.
+
+This patch fixes a regression introduced by commit "e1000: do vlan
+cleanup (799d531)".
+
+Apparently some e1000 chips (not mine) are sensitive about the order of
+setting vlan filter and vlan stripping/inserting functionality. So this
+patch changes the order so it's the same as before vlan cleanup.
+
+Reported-by: Ben Greear <greearb@candelatech.com>
+Signed-off-by: Jiri Pirko <jpirko@redhat.com>
+Tested-by: Ben Greear <greearb@candelatech.com>
+Tested-by: Aaron Brown <aaron.f.brown@intel.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
+Cc: David Ward <david.ward@ll.mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/intel/e1000/e1000_main.c |   35 ++++++++++++++++----------
+ 1 file changed, 22 insertions(+), 13 deletions(-)
+
+--- a/drivers/net/ethernet/intel/e1000/e1000_main.c
++++ b/drivers/net/ethernet/intel/e1000/e1000_main.c
+@@ -164,6 +164,8 @@ static int e1000_82547_fifo_workaround(s
+ static bool e1000_vlan_used(struct e1000_adapter *adapter);
+ static void e1000_vlan_mode(struct net_device *netdev,
+                           netdev_features_t features);
++static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter,
++                                   bool filter_on);
+ static int e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
+ static int e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
+ static void e1000_restore_vlan(struct e1000_adapter *adapter);
+@@ -1213,7 +1215,7 @@ static int __devinit e1000_probe(struct
+       if (err)
+               goto err_register;
+-      e1000_vlan_mode(netdev, netdev->features);
++      e1000_vlan_filter_on_off(adapter, false);
+       /* print bus type/speed/width info */
+       e_info(probe, "(PCI%s:%dMHz:%d-bit) %pM\n",
+@@ -4549,6 +4551,22 @@ static bool e1000_vlan_used(struct e1000
+       return false;
+ }
++static void __e1000_vlan_mode(struct e1000_adapter *adapter,
++                            netdev_features_t features)
++{
++      struct e1000_hw *hw = &adapter->hw;
++      u32 ctrl;
++
++      ctrl = er32(CTRL);
++      if (features & NETIF_F_HW_VLAN_RX) {
++              /* enable VLAN tag insert/strip */
++              ctrl |= E1000_CTRL_VME;
++      } else {
++              /* disable VLAN tag insert/strip */
++              ctrl &= ~E1000_CTRL_VME;
++      }
++      ew32(CTRL, ctrl);
++}
+ static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter,
+                                    bool filter_on)
+ {
+@@ -4558,6 +4576,7 @@ static void e1000_vlan_filter_on_off(str
+       if (!test_bit(__E1000_DOWN, &adapter->flags))
+               e1000_irq_disable(adapter);
++      __e1000_vlan_mode(adapter, adapter->netdev->features);
+       if (filter_on) {
+               /* enable VLAN receive filtering */
+               rctl = er32(RCTL);
+@@ -4578,24 +4597,14 @@ static void e1000_vlan_filter_on_off(str
+ }
+ static void e1000_vlan_mode(struct net_device *netdev,
+-      netdev_features_t features)
++                          netdev_features_t features)
+ {
+       struct e1000_adapter *adapter = netdev_priv(netdev);
+-      struct e1000_hw *hw = &adapter->hw;
+-      u32 ctrl;
+       if (!test_bit(__E1000_DOWN, &adapter->flags))
+               e1000_irq_disable(adapter);
+-      ctrl = er32(CTRL);
+-      if (features & NETIF_F_HW_VLAN_RX) {
+-              /* enable VLAN tag insert/strip */
+-              ctrl |= E1000_CTRL_VME;
+-      } else {
+-              /* disable VLAN tag insert/strip */
+-              ctrl &= ~E1000_CTRL_VME;
+-      }
+-      ew32(CTRL, ctrl);
++      __e1000_vlan_mode(adapter, features);
+       if (!test_bit(__E1000_DOWN, &adapter->flags))
+               e1000_irq_enable(adapter);
index 71cfc427318c51874bd9136b20a856e063753ce1..362093b06ef0aee7cf64bf21e877c6b97f222f29 100644 (file)
@@ -1,2 +1,3 @@
 drm-i915-enable-dip-before-writing-data-on-gen4.patch
 smsc95xx-mark-link-down-on-startup-and-let-phy-interrupt.patch
+e1000-fix-vlan-processing-regression.patch