|
@@ -1511,29 +1511,6 @@ static bool hns3_is_phys_func(struct pci_dev *pdev)
|
|
|
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
|
|
@@ -1578,9 +1555,6 @@ static int hns3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
|
|
|
hnae3_register_ae_dev(ae_dev);
|
|
|
|
|
|
- if (hns3_is_phys_func(pdev) && IS_ENABLED(CONFIG_PCI_IOV))
|
|
|
- hns3_enable_sriov(pdev);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1597,11 +1571,43 @@ static void hns3_remove(struct pci_dev *pdev)
|
|
|
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 */
|