aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Busch <keith.busch@intel.com>2018-10-11 14:34:10 -0400
committerBjorn Helgaas <bhelgaas@google.com>2018-10-18 20:42:54 -0400
commit0e98db259fd8760fde556e640b447dadeceefc96 (patch)
treef862c1a7816fbca9cf2f865b072320fd1e24bbb4
parent369fd7b00fce169570d6a74cb369e60dbfc95fb4 (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.c25
-rw-r--r--drivers/pci/pcie/portdrv_core.c1
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
306static 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
321static 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
326static int aer_inject(struct aer_error_inj *einj) 306static 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}
489EXPORT_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