diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2021-11-11 15:10:18 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2021-11-11 15:10:18 -0800 |
commit | 5833291ab6de9c3e2374336b51c814e515e8f3a5 (patch) | |
tree | 65eaac2536356b0741266926ae70b2924d2565d3 /drivers/pci/iov.c | |
parent | ca2ef2d9f2aad7a28d346522bb4c473a0aa05249 (diff) | |
parent | e0217c5ba10d7bf640f038b2feae58e630f2f958 (diff) |
Merge tag 'pci-v5.16-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
Pull PCI fixes from Bjorn Helgaas:
"Revert conversion to struct device.driver instead of struct
pci_dev.driver.
The device.driver is set earlier, and using it caused the PCI core to
call driver PM entry points before .probe() and after .remove(), when
the driver isn't prepared.
This caused NULL pointer dereferences in i2c_designware_pci and
probably other driver issues"
* tag 'pci-v5.16-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci:
Revert "PCI: Use to_pci_driver() instead of pci_dev->driver"
Revert "PCI: Remove struct pci_dev->driver"
Diffstat (limited to 'drivers/pci/iov.c')
-rw-r--r-- | drivers/pci/iov.c | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 1d7a7c5b5307..0267977c9f17 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -164,15 +164,13 @@ static ssize_t sriov_vf_total_msix_show(struct device *dev, char *buf) { struct pci_dev *pdev = to_pci_dev(dev); - struct pci_driver *pdrv; u32 vf_total_msix = 0; device_lock(dev); - pdrv = to_pci_driver(dev->driver); - if (!pdrv || !pdrv->sriov_get_vf_total_msix) + if (!pdev->driver || !pdev->driver->sriov_get_vf_total_msix) goto unlock; - vf_total_msix = pdrv->sriov_get_vf_total_msix(pdev); + vf_total_msix = pdev->driver->sriov_get_vf_total_msix(pdev); unlock: device_unlock(dev); return sysfs_emit(buf, "%u\n", vf_total_msix); @@ -185,7 +183,6 @@ static ssize_t sriov_vf_msix_count_store(struct device *dev, { struct pci_dev *vf_dev = to_pci_dev(dev); struct pci_dev *pdev = pci_physfn(vf_dev); - struct pci_driver *pdrv; int val, ret = 0; if (kstrtoint(buf, 0, &val) < 0) @@ -195,14 +192,13 @@ static ssize_t sriov_vf_msix_count_store(struct device *dev, return -EINVAL; device_lock(&pdev->dev); - pdrv = to_pci_driver(dev->driver); - if (!pdrv || !pdrv->sriov_set_msix_vec_count) { + if (!pdev->driver || !pdev->driver->sriov_set_msix_vec_count) { ret = -EOPNOTSUPP; goto err_pdev; } device_lock(&vf_dev->dev); - if (to_pci_driver(vf_dev->dev.driver)) { + if (vf_dev->driver) { /* * A driver is already attached to this VF and has configured * itself based on the current MSI-X vector count. Changing @@ -212,7 +208,7 @@ static ssize_t sriov_vf_msix_count_store(struct device *dev, goto err_dev; } - ret = pdrv->sriov_set_msix_vec_count(vf_dev, val); + ret = pdev->driver->sriov_set_msix_vec_count(vf_dev, val); err_dev: device_unlock(&vf_dev->dev); @@ -379,7 +375,6 @@ static ssize_t sriov_numvfs_store(struct device *dev, const char *buf, size_t count) { struct pci_dev *pdev = to_pci_dev(dev); - struct pci_driver *pdrv; int ret = 0; u16 num_vfs; @@ -395,15 +390,14 @@ static ssize_t sriov_numvfs_store(struct device *dev, goto exit; /* is PF driver loaded */ - pdrv = to_pci_driver(dev->driver); - if (!pdrv) { + if (!pdev->driver) { pci_info(pdev, "no driver bound to device; cannot configure SR-IOV\n"); ret = -ENOENT; goto exit; } /* is PF driver loaded w/callback */ - if (!pdrv->sriov_configure) { + if (!pdev->driver->sriov_configure) { pci_info(pdev, "driver does not support SR-IOV configuration via sysfs\n"); ret = -ENOENT; goto exit; @@ -411,7 +405,7 @@ static ssize_t sriov_numvfs_store(struct device *dev, if (num_vfs == 0) { /* disable VFs */ - ret = pdrv->sriov_configure(pdev, 0); + ret = pdev->driver->sriov_configure(pdev, 0); goto exit; } @@ -423,7 +417,7 @@ static ssize_t sriov_numvfs_store(struct device *dev, goto exit; } - ret = pdrv->sriov_configure(pdev, num_vfs); + ret = pdev->driver->sriov_configure(pdev, num_vfs); if (ret < 0) goto exit; |