aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShannon Nelson <shannon.nelson@intel.com>2014-06-03 21:23:22 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-06-24 21:19:10 -0400
commit6c8ad1ba1650e6c22dcaa5fe288c6236c3b25ae5 (patch)
tree35c72338eb868d610611c8d9d9d0e4eb5d5a383d
parentcc41222c55e9ec44d148dee67e6ad407e3b79e46 (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.c31
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}