Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36844e25 authored by Karen Sornek's avatar Karen Sornek Committed by Greg Kroah-Hartman
Browse files

igb: Fix removal of unicast MAC filters of VFs



[ Upstream commit 584af82154f56e6b2740160fcc84a2966d969e15 ]

Move checking condition of VF MAC filter before clearing
or adding MAC filter to VF to prevent potential blackout caused
by removal of necessary and working VF's MAC filter.

Fixes: 1b8b062a ("igb: add VF trust infrastructure")
Signed-off-by: default avatarKaren Sornek <karen.sornek@intel.com>
Tested-by: default avatarKonrad Jankowski <konrad0.jankowski@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent bca4a53e
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -7374,19 +7374,6 @@ static int igb_set_vf_mac_filter(struct igb_adapter *adapter, const int vf,
	struct vf_mac_filter *entry = NULL;
	int ret = 0;

	switch (info) {
	case E1000_VF_MAC_FILTER_CLR:
		/* remove all unicast MAC filters related to the current VF */
		list_for_each(pos, &adapter->vf_macs.l) {
			entry = list_entry(pos, struct vf_mac_filter, l);
			if (entry->vf == vf) {
				entry->vf = -1;
				entry->free = true;
				igb_del_mac_filter(adapter, entry->vf_mac, vf);
			}
		}
		break;
	case E1000_VF_MAC_FILTER_ADD:
	if ((vf_data->flags & IGB_VF_FLAG_PF_SET_MAC) &&
	    !vf_data->trusted) {
		dev_warn(&pdev->dev,
@@ -7401,6 +7388,19 @@ static int igb_set_vf_mac_filter(struct igb_adapter *adapter, const int vf,
		return -EINVAL;
	}

	switch (info) {
	case E1000_VF_MAC_FILTER_CLR:
		/* remove all unicast MAC filters related to the current VF */
		list_for_each(pos, &adapter->vf_macs.l) {
			entry = list_entry(pos, struct vf_mac_filter, l);
			if (entry->vf == vf) {
				entry->vf = -1;
				entry->free = true;
				igb_del_mac_filter(adapter, entry->vf_mac, vf);
			}
		}
		break;
	case E1000_VF_MAC_FILTER_ADD:
		/* try to find empty slot in the list */
		list_for_each(pos, &adapter->vf_macs.l) {
			entry = list_entry(pos, struct vf_mac_filter, l);