fm10k: update xcast mode before synchronizing multicast addresses
authorJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 3 Apr 2015 20:27:11 +0000 (13:27 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 14 Apr 2015 22:49:04 +0000 (15:49 -0700)
When the PF receives a request to update a multicast address for the VF,
it checks the enabled multicast mode first. Fix a bug where the VF tried
to set a multicast address before requesting the required xcast mode.
This ensures the multicast addresses are honored as long as the xcast
mode was allowed.

Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Acked-by: Matthew Vick <matthew.vick@intel.com>
Tested-by: Krishneil Singh <krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/fm10k/fm10k_netdev.c

index 6981964a14d270b449e5d6517280f5be498f02f6..2f4f41b7eae7b4090c9fbf1c3d59691e026f6364 100644 (file)
@@ -970,14 +970,7 @@ static void fm10k_set_rx_mode(struct net_device *dev)
 
        fm10k_mbx_lock(interface);
 
-       /* synchronize all of the addresses */
-       if (xcast_mode != FM10K_XCAST_MODE_PROMISC) {
-               __dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync);
-               if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI)
-                       __dev_mc_sync(dev, fm10k_mc_sync, fm10k_mc_unsync);
-       }
-
-       /* if we aren't changing modes there is nothing to do */
+       /* update xcast mode first, but only if it changed */
        if (interface->xcast_mode != xcast_mode) {
                /* update VLAN table */
                if (xcast_mode == FM10K_XCAST_MODE_PROMISC)
@@ -992,6 +985,13 @@ static void fm10k_set_rx_mode(struct net_device *dev)
                interface->xcast_mode = xcast_mode;
        }
 
+       /* synchronize all of the addresses */
+       if (xcast_mode != FM10K_XCAST_MODE_PROMISC) {
+               __dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync);
+               if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI)
+                       __dev_mc_sync(dev, fm10k_mc_sync, fm10k_mc_unsync);
+       }
+
        fm10k_mbx_unlock(interface);
 }
 
@@ -1051,6 +1051,9 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface)
                                           vid, true, 0);
        }
 
+       /* update xcast mode before syncronizing addresses */
+       hw->mac.ops.update_xcast_mode(hw, glort, xcast_mode);
+
        /* synchronize all of the addresses */
        if (xcast_mode != FM10K_XCAST_MODE_PROMISC) {
                __dev_uc_sync(netdev, fm10k_uc_sync, fm10k_uc_unsync);
@@ -1058,9 +1061,6 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface)
                        __dev_mc_sync(netdev, fm10k_mc_sync, fm10k_mc_unsync);
        }
 
-       /* update xcast mode */
-       hw->mac.ops.update_xcast_mode(hw, glort, xcast_mode);
-
        fm10k_mbx_unlock(interface);
 
        /* record updated xcast mode state */