Commit 42930142 authored by Akeem G Abodunrin's avatar Akeem G Abodunrin Committed by Tony Nguyen

iavf: Restore VLAN filters after link down

Restore VLAN filters after the link is brought down, and up - since all
filters are deleted from HW during the netdev link down routine.

Fixes: ed1f5b58 ("i40evf: remove VLAN filters on close")
Signed-off-by: default avatarAkeem G Abodunrin <akeem.g.abodunrin@intel.com>
Tested-by: default avatarGeorge Kuruvinakunnel <george.kuruvinakunnel@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 9a6e9e48
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include "iavf_txrx.h" #include "iavf_txrx.h"
#include "iavf_fdir.h" #include "iavf_fdir.h"
#include "iavf_adv_rss.h" #include "iavf_adv_rss.h"
#include <linux/bitmap.h>
#define DEFAULT_DEBUG_LEVEL_SHIFT 3 #define DEFAULT_DEBUG_LEVEL_SHIFT 3
#define PFX "iavf: " #define PFX "iavf: "
......
...@@ -696,6 +696,23 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, u16 vlan) ...@@ -696,6 +696,23 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, u16 vlan)
spin_unlock_bh(&adapter->mac_vlan_list_lock); spin_unlock_bh(&adapter->mac_vlan_list_lock);
} }
/**
* iavf_restore_filters
* @adapter: board private structure
*
* Restore existing non MAC filters when VF netdev comes back up
**/
static void iavf_restore_filters(struct iavf_adapter *adapter)
{
/* re-add all VLAN filters */
if (VLAN_ALLOWED(adapter)) {
u16 vid;
for_each_set_bit(vid, adapter->vsi.active_vlans, VLAN_N_VID)
iavf_add_vlan(adapter, vid);
}
}
/** /**
* iavf_vlan_rx_add_vid - Add a VLAN filter to a device * iavf_vlan_rx_add_vid - Add a VLAN filter to a device
* @netdev: network device struct * @netdev: network device struct
...@@ -709,8 +726,11 @@ static int iavf_vlan_rx_add_vid(struct net_device *netdev, ...@@ -709,8 +726,11 @@ static int iavf_vlan_rx_add_vid(struct net_device *netdev,
if (!VLAN_ALLOWED(adapter)) if (!VLAN_ALLOWED(adapter))
return -EIO; return -EIO;
if (iavf_add_vlan(adapter, vid) == NULL) if (iavf_add_vlan(adapter, vid) == NULL)
return -ENOMEM; return -ENOMEM;
set_bit(vid, adapter->vsi.active_vlans);
return 0; return 0;
} }
...@@ -725,11 +745,13 @@ static int iavf_vlan_rx_kill_vid(struct net_device *netdev, ...@@ -725,11 +745,13 @@ static int iavf_vlan_rx_kill_vid(struct net_device *netdev,
{ {
struct iavf_adapter *adapter = netdev_priv(netdev); struct iavf_adapter *adapter = netdev_priv(netdev);
if (VLAN_ALLOWED(adapter)) { if (!VLAN_ALLOWED(adapter))
iavf_del_vlan(adapter, vid); return -EIO;
return 0;
} iavf_del_vlan(adapter, vid);
return -EIO; clear_bit(vid, adapter->vsi.active_vlans);
return 0;
} }
/** /**
...@@ -3309,6 +3331,9 @@ static int iavf_open(struct net_device *netdev) ...@@ -3309,6 +3331,9 @@ static int iavf_open(struct net_device *netdev)
spin_unlock_bh(&adapter->mac_vlan_list_lock); spin_unlock_bh(&adapter->mac_vlan_list_lock);
/* Restore VLAN filters that were removed with IFF_DOWN */
iavf_restore_filters(adapter);
iavf_configure(adapter); iavf_configure(adapter);
iavf_up_complete(adapter); iavf_up_complete(adapter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment