diff options
author | Shannon Nelson <shannon.nelson@intel.com> | 2014-06-03 21:23:22 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2014-06-24 21:19:10 -0400 |
commit | 6c8ad1ba1650e6c22dcaa5fe288c6236c3b25ae5 (patch) | |
tree | 35c72338eb868d610611c8d9d9d0e4eb5d5a383d | |
parent | cc41222c55e9ec44d148dee67e6ad407e3b79e46 (diff) |
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>
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 44789c2e3f50..81cbea72722e 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -1327,9 +1327,6 @@ static int i40e_set_mac(struct net_device *netdev, void *p) | |||
1327 | 1327 | ||
1328 | netdev_info(netdev, "set mac address=%pM\n", addr->sa_data); | 1328 | netdev_info(netdev, "set mac address=%pM\n", addr->sa_data); |
1329 | 1329 | ||
1330 | if (ether_addr_equal(netdev->dev_addr, addr->sa_data)) | ||
1331 | return 0; | ||
1332 | |||
1333 | if (test_bit(__I40E_DOWN, &vsi->back->state) || | 1330 | if (test_bit(__I40E_DOWN, &vsi->back->state) || |
1334 | test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state)) | 1331 | test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state)) |
1335 | return -EADDRNOTAVAIL; | 1332 | return -EADDRNOTAVAIL; |
@@ -1345,22 +1342,26 @@ static int i40e_set_mac(struct net_device *netdev, void *p) | |||
1345 | ret); | 1342 | ret); |
1346 | return -EADDRNOTAVAIL; | 1343 | return -EADDRNOTAVAIL; |
1347 | } | 1344 | } |
1348 | |||
1349 | ether_addr_copy(vsi->back->hw.mac.addr, addr->sa_data); | ||
1350 | } | 1345 | } |
1351 | 1346 | ||
1352 | /* In order to be sure to not drop any packets, add the new address | 1347 | if (!i40e_find_mac(vsi, addr->sa_data, false, true)) { |
1353 | * then delete the old one. | ||
1354 | */ | ||
1355 | f = i40e_add_filter(vsi, addr->sa_data, I40E_VLAN_ANY, false, false); | ||
1356 | if (!f) | ||
1357 | return -ENOMEM; | ||
1358 | 1348 | ||
1359 | i40e_sync_vsi_filters(vsi); | 1349 | /* In order to be sure to not drop any packets, add the |
1360 | i40e_del_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY, false, false); | 1350 | * new address first then delete the old one. |
1361 | i40e_sync_vsi_filters(vsi); | 1351 | */ |
1352 | f = i40e_add_filter(vsi, addr->sa_data, I40E_VLAN_ANY, | ||
1353 | false, false); | ||
1354 | if (!f) | ||
1355 | return -ENOMEM; | ||
1356 | |||
1357 | i40e_sync_vsi_filters(vsi); | ||
1358 | i40e_del_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY, | ||
1359 | false, false); | ||
1360 | i40e_sync_vsi_filters(vsi); | ||
1361 | } | ||
1362 | 1362 | ||
1363 | ether_addr_copy(netdev->dev_addr, addr->sa_data); | 1363 | if (!ether_addr_equal(netdev->dev_addr, addr->sa_data)) |
1364 | ether_addr_copy(netdev->dev_addr, addr->sa_data); | ||
1364 | 1365 | ||
1365 | return 0; | 1366 | return 0; |
1366 | } | 1367 | } |