}
        if (test_bit(ICE_FLAG_LEGACY_RX, change_flags)) {
                /* down and up VSI so that changes of Rx cfg are reflected. */
-               ice_down(vsi);
-               ice_up(vsi);
+               if (!test_and_set_bit(ICE_VSI_DOWN, vsi->state)) {
+                       ice_down(vsi);
+                       ice_up(vsi);
+               }
        }
        /* don't allow modification of this flag when a single VF is in
         * promiscuous mode because it's not supported
 
 /**
  * ice_down - Shutdown the connection
  * @vsi: The VSI being stopped
+ *
+ * Caller of this function is expected to set the vsi->state ICE_DOWN bit
  */
 int ice_down(struct ice_vsi *vsi)
 {
        int i, tx_err, rx_err, link_err = 0;
 
-       /* Caller of this function is expected to set the
-        * vsi->state ICE_DOWN bit
-        */
+       WARN_ON(!test_bit(ICE_VSI_DOWN, vsi->state));
+
        if (vsi->netdev && vsi->type == ICE_VSI_PF) {
                netif_carrier_off(vsi->netdev);
                netif_tx_disable(vsi->netdev);