return false;
 }
 
-static int get_num_req_vfs(struct pci_dev *pdev)
-{
-       /* a variable vf num will be supported later */
-       return pci_sriov_get_totalvfs(pdev);
-}
-
-static void hns3_enable_sriov(struct pci_dev *pdev)
-{
-       int num_req_vfs = get_num_req_vfs(pdev);
-       int ret;
-
-       /* Enable SRIOV */
-       if (!num_req_vfs)
-               return;
-
-       dev_info(&pdev->dev, "active VFs(%d) found, enabling SRIOV\n",
-                num_req_vfs);
-
-       ret = pci_enable_sriov(pdev, num_req_vfs);
-       if (ret)
-               dev_err(&pdev->dev, "SRIOV enable failed %d\n", ret);
-}
-
 static void hns3_disable_sriov(struct pci_dev *pdev)
 {
        /* If our VFs are assigned we cannot shut down SR-IOV
 
        hnae3_register_ae_dev(ae_dev);
 
-       if (hns3_is_phys_func(pdev) && IS_ENABLED(CONFIG_PCI_IOV))
-               hns3_enable_sriov(pdev);
-
        return 0;
 }
 
        hnae3_unregister_ae_dev(ae_dev);
 }
 
+/**
+ * hns3_pci_sriov_configure
+ * @pdev: pointer to a pci_dev structure
+ * @num_vfs: number of VFs to allocate
+ *
+ * Enable or change the number of VFs. Called when the user updates the number
+ * of VFs in sysfs.
+ **/
+int hns3_pci_sriov_configure(struct pci_dev *pdev, int num_vfs)
+{
+       int ret;
+
+       if (!(hns3_is_phys_func(pdev) && IS_ENABLED(CONFIG_PCI_IOV))) {
+               dev_warn(&pdev->dev, "Can not config SRIOV\n");
+               return -EINVAL;
+       }
+
+       if (num_vfs) {
+               ret = pci_enable_sriov(pdev, num_vfs);
+               if (ret)
+                       dev_err(&pdev->dev, "SRIOV enable failed %d\n", ret);
+       } else if (!pci_vfs_assigned(pdev)) {
+               pci_disable_sriov(pdev);
+       } else {
+               dev_warn(&pdev->dev,
+                        "Unable to free VFs because some are assigned to VMs.\n");
+       }
+
+       return 0;
+}
+
 static struct pci_driver hns3_driver = {
        .name     = hns3_driver_name,
        .id_table = hns3_pci_tbl,
        .probe    = hns3_probe,
        .remove   = hns3_remove,
+       .sriov_configure = hns3_pci_sriov_configure,
 };
 
 /* set default feature to hns3 */