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: Shannon Nelson <shannon.nelson@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
Shannon Nelson 2014-06-04 01:23:22 +00:00 committed by Jeff Kirsher
parent cc41222c55
commit 6c8ad1ba16

View File

@ -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,22 +1342,26 @@ 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.
*/
f = i40e_add_filter(vsi, addr->sa_data, I40E_VLAN_ANY, false, false);
if (!f)
return -ENOMEM;
if (!i40e_find_mac(vsi, addr->sa_data, false, true)) {
i40e_sync_vsi_filters(vsi);
i40e_del_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY, false, false);
i40e_sync_vsi_filters(vsi);
/* 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);
if (!f)
return -ENOMEM;
ether_addr_copy(netdev->dev_addr, addr->sa_data);
i40e_sync_vsi_filters(vsi);
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;
}