mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 05:04:20 +00:00
PCI/portdrv: Move error handler methods to struct pcie_port_service_driver
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>
This commit is contained in:
parent
16f73eb02d
commit
c5dc3c69f1
3 changed files with 9 additions and 125 deletions
|
@ -32,16 +32,9 @@
|
||||||
|
|
||||||
static int aer_probe(struct pcie_device *dev);
|
static int aer_probe(struct pcie_device *dev);
|
||||||
static void aer_remove(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 void aer_error_resume(struct pci_dev *dev);
|
||||||
static pci_ers_result_t aer_root_reset(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 = {
|
static struct pcie_port_service_driver aerdriver = {
|
||||||
.name = "aer",
|
.name = "aer",
|
||||||
.port_type = PCI_EXP_TYPE_ROOT_PORT,
|
.port_type = PCI_EXP_TYPE_ROOT_PORT,
|
||||||
|
@ -49,9 +42,7 @@ static struct pcie_port_service_driver aerdriver = {
|
||||||
|
|
||||||
.probe = aer_probe,
|
.probe = aer_probe,
|
||||||
.remove = aer_remove,
|
.remove = aer_remove,
|
||||||
|
.error_resume = aer_error_resume,
|
||||||
.err_handler = &aer_error_handlers,
|
|
||||||
|
|
||||||
.reset_link = aer_root_reset,
|
.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;
|
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
|
* aer_error_resume - clean up corresponding error status bits
|
||||||
* @dev: pointer to Root Port's pci_dev data structure
|
* @dev: pointer to Root Port's pci_dev data structure
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
|
|
||||||
#include "../pci.h"
|
#include "../pci.h"
|
||||||
#include "portdrv.h"
|
#include "portdrv.h"
|
||||||
#include "aer/aerdrv.h"
|
|
||||||
|
|
||||||
/* If this switch is set, PCIe port native services should not be enabled. */
|
/* If this switch is set, PCIe port native services should not be enabled. */
|
||||||
bool pcie_ports_disabled;
|
bool pcie_ports_disabled;
|
||||||
|
@ -177,108 +176,20 @@ static void pcie_portdrv_remove(struct pci_dev *dev)
|
||||||
pcie_port_device_remove(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,
|
static pci_ers_result_t pcie_portdrv_error_detected(struct pci_dev *dev,
|
||||||
enum pci_channel_state error)
|
enum pci_channel_state error)
|
||||||
{
|
{
|
||||||
struct aer_broadcast_data data = {error, PCI_ERS_RESULT_CAN_RECOVER};
|
/* Root Port has no impact. Always recovers. */
|
||||||
|
return 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static pci_ers_result_t pcie_portdrv_mmio_enabled(struct pci_dev *dev)
|
static pci_ers_result_t pcie_portdrv_mmio_enabled(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED;
|
return 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev)
|
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 fatal, restore cfg space for possible link reset at upstream */
|
||||||
if (dev->error_state == pci_channel_io_frozen) {
|
if (dev->error_state == pci_channel_io_frozen) {
|
||||||
dev->state_saved = true;
|
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);
|
pci_enable_pcie_error_reporting(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get true return value from &status */
|
return PCI_ERS_RESULT_RECOVERED;
|
||||||
device_for_each_child(&dev->dev, &status, slot_reset_iter);
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int resume_iter(struct device *device, void *data)
|
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) {
|
if (device->bus == &pcie_port_bus_type && device->driver) {
|
||||||
driver = to_service_driver(device->driver);
|
driver = to_service_driver(device->driver);
|
||||||
if (driver &&
|
if (driver && driver->error_resume) {
|
||||||
driver->err_handler &&
|
|
||||||
driver->err_handler->resume) {
|
|
||||||
pcie_device = to_pcie_device(device);
|
pcie_device = to_pcie_device(device);
|
||||||
|
|
||||||
/* Forward error message to service drivers */
|
/* Forward error message to service drivers */
|
||||||
driver->err_handler->resume(pcie_device->port);
|
driver->error_resume(pcie_device->port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,8 @@ struct pcie_port_service_driver {
|
||||||
int (*suspend) (struct pcie_device *dev);
|
int (*suspend) (struct pcie_device *dev);
|
||||||
int (*resume) (struct pcie_device *dev);
|
int (*resume) (struct pcie_device *dev);
|
||||||
|
|
||||||
/* Service Error Recovery Handler */
|
/* Device driver may resume normal operations */
|
||||||
const struct pci_error_handlers *err_handler;
|
void (*error_resume)(struct pci_dev *dev);
|
||||||
|
|
||||||
/* Link Reset Capability - AER service driver specific */
|
/* Link Reset Capability - AER service driver specific */
|
||||||
pci_ers_result_t (*reset_link) (struct pci_dev *dev);
|
pci_ers_result_t (*reset_link) (struct pci_dev *dev);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue