|
@@ -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 */
|