提交 75980905 编写于 作者: K Keith Busch 提交者: Caspar Zhang

PCI/AER: Reuse existing pcie_port_find_device() interface

task #29600094

commit 0e98db259fd8760fde556e640b447dadeceefc96 upstream.
Backport summary: for 4.19 kernel ICX PCIe Gen4 support.

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: NKeith Busch <keith.busch@intel.com>
Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
(cherry picked from commit 0e98db259fd8760fde556e640b447dadeceefc96)
Signed-off-by: NEthan Zhao <haifeng.zhao@intel.com>
Signed-off-by: NArtie Ding <artie.ding@linux.alibaba.com>
Acked-by: NCaspar Zhang <caspar@linux.alibaba.com>
上级 039bb71a
...@@ -303,32 +303,13 @@ static int pci_bus_set_aer_ops(struct pci_bus *bus) ...@@ -303,32 +303,13 @@ static int pci_bus_set_aer_ops(struct pci_bus *bus)
return 0; return 0;
} }
static int find_aer_device_iter(struct device *device, void *data)
{
struct pcie_device **result = data;
struct pcie_device *pcie_dev;
if (device->bus == &pcie_port_bus_type) {
pcie_dev = to_pcie_device(device);
if (pcie_dev->service & PCIE_PORT_SERVICE_AER) {
*result = pcie_dev;
return 1;
}
}
return 0;
}
static int find_aer_device(struct pci_dev *dev, struct pcie_device **result)
{
return device_for_each_child(&dev->dev, result, find_aer_device_iter);
}
static int aer_inject(struct aer_error_inj *einj) static int aer_inject(struct aer_error_inj *einj)
{ {
struct aer_error *err, *rperr; struct aer_error *err, *rperr;
struct aer_error *err_alloc = NULL, *rperr_alloc = NULL; struct aer_error *err_alloc = NULL, *rperr_alloc = NULL;
struct pci_dev *dev, *rpdev; struct pci_dev *dev, *rpdev;
struct pcie_device *edev; struct pcie_device *edev;
struct device *device;
unsigned long flags; unsigned long flags;
unsigned int devfn = PCI_DEVFN(einj->dev, einj->fn); unsigned int devfn = PCI_DEVFN(einj->dev, einj->fn);
int pos_cap_err, rp_pos_cap_err; int pos_cap_err, rp_pos_cap_err;
...@@ -464,7 +445,9 @@ static int aer_inject(struct aer_error_inj *einj) ...@@ -464,7 +445,9 @@ static int aer_inject(struct aer_error_inj *einj)
if (ret) if (ret)
goto out_put; goto out_put;
if (find_aer_device(rpdev, &edev)) { device = pcie_port_find_device(rpdev, PCIE_PORT_SERVICE_AER);
if (device) {
edev = to_pcie_device(device);
if (!get_service_data(edev)) { if (!get_service_data(edev)) {
dev_warn(&edev->device, dev_warn(&edev->device,
"aer_inject: AER service is not initialized\n"); "aer_inject: AER service is not initialized\n");
......
...@@ -466,6 +466,7 @@ struct device *pcie_port_find_device(struct pci_dev *dev, ...@@ -466,6 +466,7 @@ struct device *pcie_port_find_device(struct pci_dev *dev,
device = pdrvs.dev; device = pdrvs.dev;
return device; return device;
} }
EXPORT_SYMBOL_GPL(pcie_port_find_device);
/** /**
* pcie_port_device_remove - unregister PCI Express port service devices * pcie_port_device_remove - unregister PCI Express port service devices
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册