|
@@ -220,6 +220,11 @@ static void virtfn_remove(struct pci_dev *dev, int id, int reset)
|
|
|
pci_dev_put(dev);
|
|
|
}
|
|
|
|
|
|
+int __weak pcibios_sriov_enable(struct pci_dev *pdev, u16 num_vfs)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|
|
{
|
|
|
int rc;
|
|
@@ -231,6 +236,7 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|
|
struct pci_sriov *iov = dev->sriov;
|
|
|
int bars = 0;
|
|
|
int bus;
|
|
|
+ int retval;
|
|
|
|
|
|
if (!nr_virtfn)
|
|
|
return 0;
|
|
@@ -307,6 +313,12 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|
|
if (nr_virtfn < initial)
|
|
|
initial = nr_virtfn;
|
|
|
|
|
|
+ if ((retval = pcibios_sriov_enable(dev, initial))) {
|
|
|
+ dev_err(&dev->dev, "failure %d from pcibios_sriov_enable()\n",
|
|
|
+ retval);
|
|
|
+ return retval;
|
|
|
+ }
|
|
|
+
|
|
|
for (i = 0; i < initial; i++) {
|
|
|
rc = virtfn_add(dev, i, 0);
|
|
|
if (rc)
|
|
@@ -335,6 +347,11 @@ failed:
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
+int __weak pcibios_sriov_disable(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static void sriov_disable(struct pci_dev *dev)
|
|
|
{
|
|
|
int i;
|
|
@@ -346,6 +363,8 @@ static void sriov_disable(struct pci_dev *dev)
|
|
|
for (i = 0; i < iov->num_VFs; i++)
|
|
|
virtfn_remove(dev, i, 0);
|
|
|
|
|
|
+ pcibios_sriov_disable(dev);
|
|
|
+
|
|
|
iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE);
|
|
|
pci_cfg_access_lock(dev);
|
|
|
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
|