lkml.org 
[lkml]   [2012]   [Oct]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    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@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>
    [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@gmail.com>
    Tested-by: Andrey Jr. Melnikov <temnota@kmv.ru>
    Signed-off-by: Ben Hutchings <ben@decadent.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);



    \
     
     \ /
      Last update: 2012-10-29 02:01    [W:4.168 / U:0.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site