diff mbox

PCI/pcieport: move EH methods to struct pcie_port_service_driver

Message ID 20170619180458.28377-1-hch@lst.de (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show

Commit Message

Christoph Hellwig June 19, 2017, 6:04 p.m. UTC
And avoid the detour throught the mostly unused pci_error_handlers
structure.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---

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(-)

Comments

Bjorn Helgaas July 13, 2017, 3:19 a.m. UTC | #1
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@lst.de>

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
>
diff mbox

Patch

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);