lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sun, 28 Oct 2012 23:15:43 +0000 From: Ben Hutchings <ben@...adent.org.uk> To: linux-kernel@...r.kernel.org, stable@...r.kernel.org Cc: akpm@...ux-foundation.org, alan@...rguk.ukuu.org.uk, Jiri Pirko <jpirko@...hat.com>, Ben Greear <greearb@...delatech.com>, Aaron Brown <aaron.f.brown@...el.com>, Jeff Kirsher <jeffrey.t.kirsher@...el.com>, Jonathan Nieder <jrnieder@...il.com>, "Andrey Jr. Melnikov" <temnota@....ru> Subject: [ 007/105] e1000: fix vlan processing regression 3.2-stable review patch. If anyone has any objections, please let me know. ------------------ From: Jiri Pirko <jpirko@...hat.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@...delatech.com> Signed-off-by: Jiri Pirko <jpirko@...hat.com> Tested-by: Ben Greear <greearb@...delatech.com> Tested-by: Aaron Brown <aaron.f.brown@...el.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@...el.com> [Jonathan Nieder: It doesn't apply cleanly to kernels before v3.3-rc1~182^2~581 (net: introduce and use netdev_features_t for device features sets) but a backport is straightforward.] Signed-off-by: Jonathan Nieder <jrnieder@...il.com> Tested-by: Andrey Jr. Melnikov <temnota@....ru> Signed-off-by: Ben Hutchings <ben@...adent.org.uk> --- drivers/net/ethernet/intel/e1000/e1000_main.c | 76 +++++++++++++++------------ 1 file changed, 42 insertions(+), 34 deletions(-) --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c @@ -168,6 +168,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, u32 features); +static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, + bool filter_on); static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid); static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid); static void e1000_restore_vlan(struct e1000_adapter *adapter); @@ -1219,7 +1221,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", @@ -4553,6 +4555,21 @@ static bool e1000_vlan_used(struct e1000 return false; } +static void __e1000_vlan_mode(struct e1000_adapter *adapter, u32 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) { @@ -4562,6 +4579,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); @@ -4584,21 +4602,11 @@ static void e1000_vlan_filter_on_off(str static void e1000_vlan_mode(struct net_device *netdev, u32 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); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists