PCI/portdrv: Move error handler methods to struct pcie_port_service_driver
authorChristoph Hellwig <hch@lst.de>
Mon, 19 Jun 2017 18:04:58 +0000 (20:04 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 31 Jul 2017 19:29:17 +0000 (14:29 -0500)
Move the error handler methods to struct pcie_port_service_driver and avoid
the detour through the mostly unused pci_error_handlers structure.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pcie/aer/aerdrv.c
drivers/pci/pcie/portdrv_pci.c
include/linux/pcieport_if.h

index dea186a9d6b698488384153348389f7c9715e775..6ff5f5b4f5e6ffe14f2df6536b173f8f8664fda2 100644 (file)
 
 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,
 };
 
@@ -349,20 +340,6 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev)
        return PCI_ERS_RESULT_RECOVERED;
 }
 
-/**
- * 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
index 8aa3f14bc87d59cc4c7461a5f071539af2394dbf..be635f01775616c44fcca8c57e378df6446d4595 100644 (file)
@@ -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);
                }
        }
 
index afcd130ab3a914c6a8af4736ae8cdc6cac11b703..18edc651c070d8d57a4e101bdc7124449bf1714c 100644 (file)
@@ -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);