return ice_vsi_setup(pf, ¶ms);
 }
 
-/**
- * ice_eswitch_napi_del - remove NAPI handle for all port representors
- * @reprs: xarray of reprs
- */
-static void ice_eswitch_napi_del(struct xarray *reprs)
-{
-       struct ice_repr *repr;
-       unsigned long id;
-
-       xa_for_each(reprs, id, repr)
-               netif_napi_del(&repr->q_vector->napi);
-}
-
 /**
  * ice_eswitch_napi_enable - enable NAPI for all port representors
  * @reprs: xarray of reprs
        ice_eswitch_add_sp_rules(pf);
 }
 
-/**
- * ice_eswitch_rebuild - rebuild eswitch
- * @pf: pointer to PF structure
- */
-int ice_eswitch_rebuild(struct ice_pf *pf)
-{
-       struct ice_vsi *ctrl_vsi = pf->eswitch.control_vsi;
-       int status;
-
-       ice_eswitch_napi_disable(&pf->eswitch.reprs);
-       ice_eswitch_napi_del(&pf->eswitch.reprs);
-
-       status = ice_eswitch_setup_env(pf);
-       if (status)
-               return status;
-
-       ice_eswitch_remap_rings_to_vectors(&pf->eswitch);
-
-       ice_replay_tc_fltrs(pf);
-
-       status = ice_vsi_open(ctrl_vsi);
-       if (status)
-               return status;
-
-       ice_eswitch_napi_enable(&pf->eswitch.reprs);
-       ice_eswitch_start_all_tx_queues(pf);
-
-       return 0;
-}
-
 static void
 ice_eswitch_cp_change_queues(struct ice_eswitch *eswitch, int change)
 {
                ice_eswitch_start_reprs(pf);
        }
 }
+
+/**
+ * ice_eswitch_rebuild - rebuild eswitch
+ * @pf: pointer to PF structure
+ */
+int ice_eswitch_rebuild(struct ice_pf *pf)
+{
+       struct ice_repr *repr;
+       unsigned long id;
+       int err;
+
+       if (!ice_is_switchdev_running(pf))
+               return 0;
+
+       err = ice_vsi_rebuild(pf->eswitch.control_vsi, ICE_VSI_FLAG_INIT);
+       if (err)
+               return err;
+
+       xa_for_each(&pf->eswitch.reprs, id, repr)
+               ice_eswitch_detach(pf, repr->vf);
+
+       return 0;
+}
 
                        ice_ptp_cfg_timestamp(pf, true);
        }
 
-       err = ice_vsi_rebuild_by_type(pf, ICE_VSI_SWITCHDEV_CTRL);
+       err = ice_eswitch_rebuild(pf);
        if (err) {
-               dev_err(dev, "Switchdev CTRL VSI rebuild failed: %d\n", err);
+               dev_err(dev, "Switchdev rebuild failed: %d\n", err);
                goto err_vsi_rebuild;
        }
 
 
        ice_for_each_vf(pf, bkt, vf) {
                mutex_lock(&vf->cfg_lock);
 
+               ice_eswitch_detach(pf, vf);
                vf->driver_caps = 0;
                ice_vc_set_default_allowlist(vf);
 
                ice_vf_rebuild_vsi(vf);
                ice_vf_post_vsi_rebuild(vf);
 
+               ice_eswitch_attach(pf, vf);
+
                mutex_unlock(&vf->cfg_lock);
        }
 
-       if (ice_is_eswitch_mode_switchdev(pf))
-               if (ice_eswitch_rebuild(pf))
-                       dev_warn(dev, "eswitch rebuild failed\n");
-
        ice_flush(hw);
        clear_bit(ICE_VF_DIS, pf->state);