* [PATCH] PCI/pcieport: move EH methods to struct pcie_port_service_driver
@ 2017-06-19 18:04 Christoph Hellwig
2017-07-13 3:19 ` Bjorn Helgaas
0 siblings, 1 reply; 2+ messages in thread
From: Christoph Hellwig @ 2017-06-19 18:04 UTC (permalink / raw)
To: linux-pci
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(-)
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] PCI/pcieport: move EH methods to struct pcie_port_service_driver
2017-06-19 18:04 [PATCH] PCI/pcieport: move EH methods to struct pcie_port_service_driver Christoph Hellwig
@ 2017-07-13 3:19 ` Bjorn Helgaas
0 siblings, 0 replies; 2+ messages in thread
From: Bjorn Helgaas @ 2017-07-13 3:19 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: linux-pci
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
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-07-13 3:19 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-06-19 18:04 [PATCH] PCI/pcieport: move EH methods to struct pcie_port_service_driver Christoph Hellwig
2017-07-13 3:19 ` Bjorn Helgaas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).