ice_flush(hw);
 }
 
-/**
- * ice_sriov_create_vsi - Create a new VSI for a VF
- * @vf: VF to create the VSI for
- *
- * This is called by ice_vf_recreate_vsi to create the new VSI after the old
- * VSI has been released.
- */
-static int ice_sriov_create_vsi(struct ice_vf *vf)
-{
-       struct ice_vsi *vsi;
-
-       vsi = ice_vf_vsi_setup(vf);
-       if (!vsi)
-               return -ENOMEM;
-
-       return 0;
-}
-
 /**
  * ice_sriov_post_vsi_rebuild - tasks to do after the VF's VSI have been rebuilt
  * @vf: VF to perform tasks on
        .poll_reset_status = ice_sriov_poll_reset_status,
        .clear_reset_trigger = ice_sriov_clear_reset_trigger,
        .irq_close = NULL,
-       .create_vsi = ice_sriov_create_vsi,
        .post_vsi_rebuild = ice_sriov_post_vsi_rebuild,
 };
 
        if (vf->first_vector_idx < 0)
                goto unroll;
 
-       ice_vf_vsi_release(vf);
-       if (vf->vf_ops->create_vsi(vf)) {
+       if (ice_vf_reconfig_vsi(vf)) {
                /* Try to rebuild with previous values */
                needs_rebuild = true;
                goto unroll;
                return -EINVAL;
 
        if (needs_rebuild)
-               vf->vf_ops->create_vsi(vf);
+               ice_vf_reconfig_vsi(vf);
 
        ice_ena_vf_mappings(vf);
        ice_put_vf(vf);
 
 }
 
 /**
- * ice_vf_recreate_vsi - Release and re-create the VF's VSI
- * @vf: VF to recreate the VSI for
+ * ice_vf_reconfig_vsi - Reconfigure a VF VSI with the device
+ * @vf: VF to reconfigure the VSI for
  *
- * This is only called when a single VF is being reset (i.e. VVF, VFLR, host
- * VF configuration change, etc)
+ * This is called when a single VF is being reset (i.e. VVF, VFLR, host VF
+ * configuration change, etc).
  *
- * It releases and then re-creates a new VSI.
+ * It brings the VSI down and then reconfigures it with the hardware.
  */
-static int ice_vf_recreate_vsi(struct ice_vf *vf)
+int ice_vf_reconfig_vsi(struct ice_vf *vf)
 {
+       struct ice_vsi *vsi = ice_get_vf_vsi(vf);
+       struct ice_vsi_cfg_params params = {};
        struct ice_pf *pf = vf->pf;
        int err;
 
-       ice_vf_vsi_release(vf);
+       if (WARN_ON(!vsi))
+               return -EINVAL;
+
+       params = ice_vsi_to_params(vsi);
+       params.flags = ICE_VSI_FLAG_NO_INIT;
 
-       err = vf->vf_ops->create_vsi(vf);
+       ice_vsi_decfg(vsi);
+       ice_fltr_remove_all(vsi);
+
+       err = ice_vsi_cfg(vsi, ¶ms);
        if (err) {
                dev_err(ice_pf_to_dev(pf),
-                       "Failed to recreate the VF%u's VSI, error %d\n",
+                       "Failed to reconfigure the VF%u's VSI, error %d\n",
                        vf->vf_id, err);
                return err;
        }
 
+       /* Update the lan_vsi_num field since it might have been changed. The
+        * PF lan_vsi_idx number remains the same so we don't need to change
+        * that.
+        */
+       vf->lan_vsi_num = vsi->vsi_num;
+
        return 0;
 }
 
 
        ice_vf_pre_vsi_rebuild(vf);
 
-       if (ice_vf_recreate_vsi(vf)) {
+       if (ice_vf_reconfig_vsi(vf)) {
                dev_err(dev, "Failed to release and setup the VF%u's VSI\n",
                        vf->vf_id);
                err = -EFAULT;