i40e: reapply LAA after reset
authorShannon Nelson <shannon.nelson@intel.com>
Wed, 4 Jun 2014 01:23:23 +0000 (01:23 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 25 Jun 2014 01:19:14 +0000 (18:19 -0700)
The LAA is lost on a reset, so be sure to replay it when rebuilding
the switch after any reset.

Change-ID: I6e643f9a59dfd899b6cbdf84d93b4bc9c37bb949
Signed-off-by: Shannon Nelson <shannon.nelson@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e.h
drivers/net/ethernet/intel/i40e/i40e_main.c

index 07811dd..2ec6e8a 100644 (file)
@@ -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 {
index 81cbea7..9276ca3 100644 (file)
@@ -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;