diff options
Diffstat (limited to 'drivers/pci/iov.c')
-rw-r--r-- | drivers/pci/iov.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 0321fa3b4226..6554e1a0f634 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c | |||
@@ -142,7 +142,7 @@ failed2: | |||
142 | failed1: | 142 | failed1: |
143 | pci_dev_put(dev); | 143 | pci_dev_put(dev); |
144 | mutex_lock(&iov->dev->sriov->lock); | 144 | mutex_lock(&iov->dev->sriov->lock); |
145 | pci_remove_bus_device(virtfn); | 145 | pci_stop_and_remove_bus_device(virtfn); |
146 | virtfn_remove_bus(dev->bus, virtfn_bus(dev, id)); | 146 | virtfn_remove_bus(dev->bus, virtfn_bus(dev, id)); |
147 | mutex_unlock(&iov->dev->sriov->lock); | 147 | mutex_unlock(&iov->dev->sriov->lock); |
148 | 148 | ||
@@ -173,10 +173,16 @@ static void virtfn_remove(struct pci_dev *dev, int id, int reset) | |||
173 | 173 | ||
174 | sprintf(buf, "virtfn%u", id); | 174 | sprintf(buf, "virtfn%u", id); |
175 | sysfs_remove_link(&dev->dev.kobj, buf); | 175 | sysfs_remove_link(&dev->dev.kobj, buf); |
176 | sysfs_remove_link(&virtfn->dev.kobj, "physfn"); | 176 | /* |
177 | * pci_stop_dev() could have been called for this virtfn already, | ||
178 | * so the directory for the virtfn may have been removed before. | ||
179 | * Double check to avoid spurious sysfs warnings. | ||
180 | */ | ||
181 | if (virtfn->dev.kobj.sd) | ||
182 | sysfs_remove_link(&virtfn->dev.kobj, "physfn"); | ||
177 | 183 | ||
178 | mutex_lock(&iov->dev->sriov->lock); | 184 | mutex_lock(&iov->dev->sriov->lock); |
179 | pci_remove_bus_device(virtfn); | 185 | pci_stop_and_remove_bus_device(virtfn); |
180 | virtfn_remove_bus(dev->bus, virtfn_bus(dev, id)); | 186 | virtfn_remove_bus(dev->bus, virtfn_bus(dev, id)); |
181 | mutex_unlock(&iov->dev->sriov->lock); | 187 | mutex_unlock(&iov->dev->sriov->lock); |
182 | 188 | ||
@@ -347,8 +353,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
347 | return rc; | 353 | return rc; |
348 | } | 354 | } |
349 | 355 | ||
350 | pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz); | ||
351 | |||
352 | iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE; | 356 | iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE; |
353 | pci_cfg_access_lock(dev); | 357 | pci_cfg_access_lock(dev); |
354 | pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); | 358 | pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); |
@@ -466,6 +470,7 @@ found: | |||
466 | return -EIO; | 470 | return -EIO; |
467 | 471 | ||
468 | pgsz &= ~(pgsz - 1); | 472 | pgsz &= ~(pgsz - 1); |
473 | pci_write_config_dword(dev, pos + PCI_SRIOV_SYS_PGSIZE, pgsz); | ||
469 | 474 | ||
470 | nres = 0; | 475 | nres = 0; |
471 | for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { | 476 | for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { |