On Mon, Jun 19, 2017 at 08:04:58PM +0200, Christoph Hellwig wrote: > And avoid the detour throught the mostly unused pci_error_handlers > structure. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Applied to pci/aer for v4.14, thanks! > --- > > Note: this is based on the pci/virtualization branch. > > drivers/pci/pcie/aer/aerdrv.c | 25 +--------- > drivers/pci/pcie/portdrv_pci.c | 105 +++-------------------------------------- > include/linux/pcieport_if.h | 4 +- > 3 files changed, 9 insertions(+), 125 deletions(-) > > diff --git a/drivers/pci/pcie/aer/aerdrv.c b/drivers/pci/pcie/aer/aerdrv.c > index dea186a9d6b6..6ff5f5b4f5e6 100644 > --- a/drivers/pci/pcie/aer/aerdrv.c > +++ b/drivers/pci/pcie/aer/aerdrv.c > @@ -32,16 +32,9 @@ > > static int aer_probe(struct pcie_device *dev); > static void aer_remove(struct pcie_device *dev); > -static pci_ers_result_t aer_error_detected(struct pci_dev *dev, > - enum pci_channel_state error); > static void aer_error_resume(struct pci_dev *dev); > static pci_ers_result_t aer_root_reset(struct pci_dev *dev); > > -static const struct pci_error_handlers aer_error_handlers = { > - .error_detected = aer_error_detected, > - .resume = aer_error_resume, > -}; > - > static struct pcie_port_service_driver aerdriver = { > .name = "aer", > .port_type = PCI_EXP_TYPE_ROOT_PORT, > @@ -49,9 +42,7 @@ static struct pcie_port_service_driver aerdriver = { > > .probe = aer_probe, > .remove = aer_remove, > - > - .err_handler = &aer_error_handlers, > - > + .error_resume = aer_error_resume, > .reset_link = aer_root_reset, > }; > > @@ -350,20 +341,6 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev) > } > > /** > - * aer_error_detected - update severity status > - * @dev: pointer to Root Port's pci_dev data structure > - * @error: error severity being notified by port bus > - * > - * Invoked by Port Bus driver during error recovery. > - */ > -static pci_ers_result_t aer_error_detected(struct pci_dev *dev, > - enum pci_channel_state error) > -{ > - /* Root Port has no impact. Always recovers. */ > - return PCI_ERS_RESULT_CAN_RECOVER; > -} > - > -/** > * aer_error_resume - clean up corresponding error status bits > * @dev: pointer to Root Port's pci_dev data structure > * > diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c > index 8aa3f14bc87d..be635f017756 100644 > --- a/drivers/pci/pcie/portdrv_pci.c > +++ b/drivers/pci/pcie/portdrv_pci.c > @@ -21,7 +21,6 @@ > > #include "../pci.h" > #include "portdrv.h" > -#include "aer/aerdrv.h" > > /* If this switch is set, PCIe port native services should not be enabled. */ > bool pcie_ports_disabled; > @@ -177,108 +176,20 @@ static void pcie_portdrv_remove(struct pci_dev *dev) > pcie_port_device_remove(dev); > } > > -static int error_detected_iter(struct device *device, void *data) > -{ > - struct pcie_device *pcie_device; > - struct pcie_port_service_driver *driver; > - struct aer_broadcast_data *result_data; > - pci_ers_result_t status; > - > - result_data = (struct aer_broadcast_data *) data; > - > - if (device->bus == &pcie_port_bus_type && device->driver) { > - driver = to_service_driver(device->driver); > - if (!driver || > - !driver->err_handler || > - !driver->err_handler->error_detected) > - return 0; > - > - pcie_device = to_pcie_device(device); > - > - /* Forward error detected message to service drivers */ > - status = driver->err_handler->error_detected( > - pcie_device->port, > - result_data->state); > - result_data->result = > - merge_result(result_data->result, status); > - } > - > - return 0; > -} > - > static pci_ers_result_t pcie_portdrv_error_detected(struct pci_dev *dev, > enum pci_channel_state error) > { > - struct aer_broadcast_data data = {error, PCI_ERS_RESULT_CAN_RECOVER}; > - > - /* get true return value from &data */ > - device_for_each_child(&dev->dev, &data, error_detected_iter); > - return data.result; > -} > - > -static int mmio_enabled_iter(struct device *device, void *data) > -{ > - struct pcie_device *pcie_device; > - struct pcie_port_service_driver *driver; > - pci_ers_result_t status, *result; > - > - result = (pci_ers_result_t *) data; > - > - if (device->bus == &pcie_port_bus_type && device->driver) { > - driver = to_service_driver(device->driver); > - if (driver && > - driver->err_handler && > - driver->err_handler->mmio_enabled) { > - pcie_device = to_pcie_device(device); > - > - /* Forward error message to service drivers */ > - status = driver->err_handler->mmio_enabled( > - pcie_device->port); > - *result = merge_result(*result, status); > - } > - } > - > - return 0; > + /* Root Port has no impact. Always recovers. */ > + return PCI_ERS_RESULT_CAN_RECOVER; > } > > static pci_ers_result_t pcie_portdrv_mmio_enabled(struct pci_dev *dev) > { > - pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED; > - > - /* get true return value from &status */ > - device_for_each_child(&dev->dev, &status, mmio_enabled_iter); > - return status; > -} > - > -static int slot_reset_iter(struct device *device, void *data) > -{ > - struct pcie_device *pcie_device; > - struct pcie_port_service_driver *driver; > - pci_ers_result_t status, *result; > - > - result = (pci_ers_result_t *) data; > - > - if (device->bus == &pcie_port_bus_type && device->driver) { > - driver = to_service_driver(device->driver); > - if (driver && > - driver->err_handler && > - driver->err_handler->slot_reset) { > - pcie_device = to_pcie_device(device); > - > - /* Forward error message to service drivers */ > - status = driver->err_handler->slot_reset( > - pcie_device->port); > - *result = merge_result(*result, status); > - } > - } > - > - return 0; > + return PCI_ERS_RESULT_RECOVERED; > } > > static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev) > { > - pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED; > - > /* If fatal, restore cfg space for possible link reset at upstream */ > if (dev->error_state == pci_channel_io_frozen) { > dev->state_saved = true; > @@ -287,9 +198,7 @@ static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev) > pci_enable_pcie_error_reporting(dev); > } > > - /* get true return value from &status */ > - device_for_each_child(&dev->dev, &status, slot_reset_iter); > - return status; > + return PCI_ERS_RESULT_RECOVERED; > } > > static int resume_iter(struct device *device, void *data) > @@ -299,13 +208,11 @@ static int resume_iter(struct device *device, void *data) > > if (device->bus == &pcie_port_bus_type && device->driver) { > driver = to_service_driver(device->driver); > - if (driver && > - driver->err_handler && > - driver->err_handler->resume) { > + if (driver && driver->error_resume) { > pcie_device = to_pcie_device(device); > > /* Forward error message to service drivers */ > - driver->err_handler->resume(pcie_device->port); > + driver->error_resume(pcie_device->port); > } > } > > diff --git a/include/linux/pcieport_if.h b/include/linux/pcieport_if.h > index afcd130ab3a9..18edc651c070 100644 > --- a/include/linux/pcieport_if.h > +++ b/include/linux/pcieport_if.h > @@ -50,8 +50,8 @@ struct pcie_port_service_driver { > int (*suspend) (struct pcie_device *dev); > int (*resume) (struct pcie_device *dev); > > - /* Service Error Recovery Handler */ > - const struct pci_error_handlers *err_handler; > + /* Device driver may resume normal operations */ > + void (*error_resume)(struct pci_dev *dev); > > /* Link Reset Capability - AER service driver specific */ > pci_ers_result_t (*reset_link) (struct pci_dev *dev); > -- > 2.11.0 >