diff options
author | Keith Busch <keith.busch@intel.com> | 2018-10-11 14:34:10 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2018-10-18 20:42:54 -0400 |
commit | 0e98db259fd8760fde556e640b447dadeceefc96 (patch) | |
tree | f862c1a7816fbca9cf2f865b072320fd1e24bbb4 | |
parent | 369fd7b00fce169570d6a74cb369e60dbfc95fb4 (diff) |
PCI/AER: Reuse existing pcie_port_find_device() interface
The port services driver already provides a method to find the pcie_device
for a service. Export that function, use it from the aer_inject module,
and remove the duplicate functionality.
Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-rw-r--r-- | drivers/pci/pcie/aer_inject.c | 25 | ||||
-rw-r--r-- | drivers/pci/pcie/portdrv_core.c | 1 |
2 files changed, 5 insertions, 21 deletions
diff --git a/drivers/pci/pcie/aer_inject.c b/drivers/pci/pcie/aer_inject.c index 0eb24346cad3..f40ed5867c89 100644 --- a/drivers/pci/pcie/aer_inject.c +++ b/drivers/pci/pcie/aer_inject.c | |||
@@ -303,32 +303,13 @@ out: | |||
303 | return 0; | 303 | return 0; |
304 | } | 304 | } |
305 | 305 | ||
306 | static int find_aer_device_iter(struct device *device, void *data) | ||
307 | { | ||
308 | struct pcie_device **result = data; | ||
309 | struct pcie_device *pcie_dev; | ||
310 | |||
311 | if (device->bus == &pcie_port_bus_type) { | ||
312 | pcie_dev = to_pcie_device(device); | ||
313 | if (pcie_dev->service & PCIE_PORT_SERVICE_AER) { | ||
314 | *result = pcie_dev; | ||
315 | return 1; | ||
316 | } | ||
317 | } | ||
318 | return 0; | ||
319 | } | ||
320 | |||
321 | static int find_aer_device(struct pci_dev *dev, struct pcie_device **result) | ||
322 | { | ||
323 | return device_for_each_child(&dev->dev, result, find_aer_device_iter); | ||
324 | } | ||
325 | |||
326 | static int aer_inject(struct aer_error_inj *einj) | 306 | static int aer_inject(struct aer_error_inj *einj) |
327 | { | 307 | { |
328 | struct aer_error *err, *rperr; | 308 | struct aer_error *err, *rperr; |
329 | struct aer_error *err_alloc = NULL, *rperr_alloc = NULL; | 309 | struct aer_error *err_alloc = NULL, *rperr_alloc = NULL; |
330 | struct pci_dev *dev, *rpdev; | 310 | struct pci_dev *dev, *rpdev; |
331 | struct pcie_device *edev; | 311 | struct pcie_device *edev; |
312 | struct device *device; | ||
332 | unsigned long flags; | 313 | unsigned long flags; |
333 | unsigned int devfn = PCI_DEVFN(einj->dev, einj->fn); | 314 | unsigned int devfn = PCI_DEVFN(einj->dev, einj->fn); |
334 | int pos_cap_err, rp_pos_cap_err; | 315 | int pos_cap_err, rp_pos_cap_err; |
@@ -464,7 +445,9 @@ static int aer_inject(struct aer_error_inj *einj) | |||
464 | if (ret) | 445 | if (ret) |
465 | goto out_put; | 446 | goto out_put; |
466 | 447 | ||
467 | if (find_aer_device(rpdev, &edev)) { | 448 | device = pcie_port_find_device(rpdev, PCIE_PORT_SERVICE_AER); |
449 | if (device) { | ||
450 | edev = to_pcie_device(device); | ||
468 | if (!get_service_data(edev)) { | 451 | if (!get_service_data(edev)) { |
469 | dev_warn(&edev->device, | 452 | dev_warn(&edev->device, |
470 | "aer_inject: AER service is not initialized\n"); | 453 | "aer_inject: AER service is not initialized\n"); |
diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c index 6542c48c7f59..f458ac9cb70c 100644 --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c | |||
@@ -486,6 +486,7 @@ struct device *pcie_port_find_device(struct pci_dev *dev, | |||
486 | device = pdrvs.dev; | 486 | device = pdrvs.dev; |
487 | return device; | 487 | return device; |
488 | } | 488 | } |
489 | EXPORT_SYMBOL_GPL(pcie_port_find_device); | ||
489 | 490 | ||
490 | /** | 491 | /** |
491 | * pcie_port_device_remove - unregister PCI Express port service devices | 492 | * pcie_port_device_remove - unregister PCI Express port service devices |