diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 11 |
2 files changed, 10 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index 07811dd6eb89..2ec6e8a11ee1 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h @@ -362,6 +362,7 @@ struct i40e_mac_filter { bool is_vf; /* filter belongs to a VF */ bool is_netdev; /* filter belongs to a netdev */ bool changed; /* filter needs to be sync'd to the HW */ + bool is_laa; /* filter is a Locally Administered Address */ }; struct i40e_veb { diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 81cbea72722e..9276ca3f43f2 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -1344,8 +1344,8 @@ static int i40e_set_mac(struct net_device *netdev, void *p) } } - if (!i40e_find_mac(vsi, addr->sa_data, false, true)) { - + f = i40e_find_mac(vsi, addr->sa_data, false, true); + if (!f) { /* In order to be sure to not drop any packets, add the * new address first then delete the old one. */ @@ -1360,6 +1360,7 @@ static int i40e_set_mac(struct net_device *netdev, void *p) i40e_sync_vsi_filters(vsi); } + f->is_laa = true; if (!ether_addr_equal(netdev->dev_addr, addr->sa_data)) ether_addr_copy(netdev->dev_addr, addr->sa_data); @@ -7378,6 +7379,12 @@ static int i40e_add_vsi(struct i40e_vsi *vsi) list_for_each_entry_safe(f, ftmp, &vsi->mac_filter_list, list) { f->changed = true; f_count++; + + if (f->is_laa && vsi->type == I40E_VSI_MAIN) { + i40e_aq_mac_address_write(&vsi->back->hw, + I40E_AQC_WRITE_TYPE_LAA_WOL, + f->macaddr, NULL); + } } if (f_count) { vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; |