static int find_aer_service_iter(struct device *device, void *data) { struct device_driver *driver; struct pcie_port_service_driver *service_driver; struct find_aer_service_data *result; result = (struct find_aer_service_data *) data; if (device->bus == &pcie_port_bus_type) { struct pcie_device *pcie = to_pcie_device(device); if (pcie->port->pcie_type == PCI_EXP_TYPE_DOWNSTREAM) result->is_downstream = 1; driver = device->driver; if (driver) { service_driver = to_service_driver(driver); if (service_driver->service == PCIE_PORT_SERVICE_AER) { result->aer_driver = service_driver; return 1; } } } return 0; }
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 struct dpc_dev *to_dpc_dev(struct pci_dev *dev) { struct device *device; device = pcie_port_find_device(dev, PCIE_PORT_SERVICE_DPC); if (!device) return NULL; return get_service_data(to_pcie_device(device)); }
static int pcie_port_bus_resume(struct device *dev) { struct pcie_device *pciedev; struct pcie_port_service_driver *driver; if (!dev || !dev->driver) return 0; pciedev = to_pcie_device(dev); driver = to_service_driver(dev->driver); if (driver && driver->resume) driver->resume(pciedev); return 0; }
static int pcie_port_bus_suspend(struct device *dev, pm_message_t state) { struct pcie_device *pciedev; struct pcie_port_service_driver *driver; if (!dev || !dev->driver) return 0; pciedev = to_pcie_device(dev); driver = to_service_driver(dev->driver); if (driver && driver->suspend) driver->suspend(pciedev, state); return 0; }
static int resume_iter(struct device *device, void *data) { struct pcie_device *pcie_device; struct pcie_port_service_driver *driver; if (device->bus == &pcie_port_bus_type && device->driver) { driver = to_service_driver(device->driver); if (driver && driver->err_handler && driver->err_handler->resume) { pcie_device = to_pcie_device(device); /* Forward error message to service drivers */ driver->err_handler->resume(pcie_device->port); } } return 0; }
static int pcie_port_bus_match(struct device *dev, struct device_driver *drv) { struct pcie_device *pciedev; struct pcie_port_service_driver *driver; if (drv->bus != &pcie_port_bus_type || dev->bus != &pcie_port_bus_type) return 0; pciedev = to_pcie_device(dev); driver = to_service_driver(drv); if (driver->service != pciedev->service) return 0; if ((driver->port_type != PCIE_ANY_PORT) && (driver->port_type != pci_pcie_type(pciedev->port))) return 0; return 1; }
static int pcie_port_bus_match(struct device *dev, struct device_driver *drv) { struct pcie_device *pciedev; struct pcie_port_service_driver *driver; if (drv->bus != &pcie_port_bus_type || dev->bus != &pcie_port_bus_type) return 0; pciedev = to_pcie_device(dev); driver = to_service_driver(drv); if ( (driver->id_table->vendor != PCI_ANY_ID && driver->id_table->vendor != pciedev->id.vendor) || (driver->id_table->device != PCI_ANY_ID && driver->id_table->device != pciedev->id.device) || (driver->id_table->port_type != PCIE_ANY_PORT && driver->id_table->port_type != pciedev->id.port_type) || driver->id_table->service_type != pciedev->id.service_type ) return 0; return 1; }
static int pcie_port_bus_match(struct device *dev, struct device_driver *drv) { struct pcie_device *pciedev; struct pcie_port_data *port_data; struct pcie_port_service_driver *driver; if (drv->bus != &pcie_port_bus_type || dev->bus != &pcie_port_bus_type) return 0; pciedev = to_pcie_device(dev); driver = to_service_driver(drv); if (driver->service != pciedev->service) return 0; port_data = pci_get_drvdata(pciedev->port); if (driver->port_type != PCIE_ANY_PORT && driver->port_type != port_data->port_type) return 0; return 1; }
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 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); status = driver->err_handler->mmio_enabled( pcie_device->port); *result = merge_result(*result, status); } } return 0; }
/** * release_pcie_device - free PCI Express port service device structure * @dev: Port service device to release * * Invoked automatically when device is being removed in response to * device_unregister(dev). Release all resources being claimed. */ static void release_pcie_device(struct device *dev) { kfree(to_pcie_device(dev)); }