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

Commit 6c8ad1ba authored by Shannon Nelson's avatar Shannon Nelson Committed by Jeff Kirsher
Browse files

i40e: allow user to set LAA again



Don't short-circuit the LAA assignment when the driver thinks it has
already been done - it is possible that the user might want to force
the address setting again.  At the same time, this requires a little
re-ordering of the filter management.

Change-ID: Ia0d71e3bc04edd7b68cf67edecc00abe7b9f6639
Signed-off-by: default avatarShannon Nelson <shannon.nelson@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent cc41222c
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -1327,9 +1327,6 @@ static int i40e_set_mac(struct net_device *netdev, void *p)

	netdev_info(netdev, "set mac address=%pM\n", addr->sa_data);

	if (ether_addr_equal(netdev->dev_addr, addr->sa_data))
		return 0;

	if (test_bit(__I40E_DOWN, &vsi->back->state) ||
	    test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state))
		return -EADDRNOTAVAIL;
@@ -1345,21 +1342,25 @@ static int i40e_set_mac(struct net_device *netdev, void *p)
				    ret);
			return -EADDRNOTAVAIL;
		}

		ether_addr_copy(vsi->back->hw.mac.addr, addr->sa_data);
	}

	/* In order to be sure to not drop any packets, add the new address
	 * then delete the old one.
	if (!i40e_find_mac(vsi, addr->sa_data, false, true)) {

		/* In order to be sure to not drop any packets, add the
		 * new address first then delete the old one.
		 */
	f = i40e_add_filter(vsi, addr->sa_data, I40E_VLAN_ANY, false, false);
		f = i40e_add_filter(vsi, addr->sa_data, I40E_VLAN_ANY,
				    false, false);
		if (!f)
			return -ENOMEM;

		i40e_sync_vsi_filters(vsi);
	i40e_del_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY, false, false);
		i40e_del_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY,
				false, false);
		i40e_sync_vsi_filters(vsi);
	}

	if (!ether_addr_equal(netdev->dev_addr, addr->sa_data))
		ether_addr_copy(netdev->dev_addr, addr->sa_data);

	return 0;