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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@
#include "iavf_txrx.h"
#include "iavf_fdir.h"
#include "iavf_adv_rss.h"
#include <linux/bitmap.h>

#define DEFAULT_DEBUG_LEVEL_SHIFT 3
#define PFX "iavf: "
+30 −5
Original line number Diff line number Diff line
@@ -696,6 +696,23 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, u16 vlan)
	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
 * @netdev: network device struct
@@ -709,8 +726,11 @@ static int iavf_vlan_rx_add_vid(struct net_device *netdev,

	if (!VLAN_ALLOWED(adapter))
		return -EIO;

	if (iavf_add_vlan(adapter, vid) == NULL)
		return -ENOMEM;

	set_bit(vid, adapter->vsi.active_vlans);
	return 0;
}

@@ -725,12 +745,14 @@ static int iavf_vlan_rx_kill_vid(struct net_device *netdev,
{
	struct iavf_adapter *adapter = netdev_priv(netdev);

	if (VLAN_ALLOWED(adapter)) {
	if (!VLAN_ALLOWED(adapter))
		return -EIO;

	iavf_del_vlan(adapter, vid);
	clear_bit(vid, adapter->vsi.active_vlans);

	return 0;
}
	return -EIO;
}

/**
 * iavf_find_filter - Search filter list for specific mac filter
@@ -3309,6 +3331,9 @@ static int iavf_open(struct net_device *netdev)

	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_up_complete(adapter);