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)
                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);
 }
 
                                           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);
                        __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 */