History

Merge branch 'pci/aer' into next

* pci/aer: PCI/AER: Reformat AER register definitions PCI/portdrv: Move error handler methods to struct pcie_port_service_driver

Bjorn Helgaas committed 9 years ago

Commit f1901322 parents 3a749ea 8fc614c4 files · +19 −141Browse files

Unified · Split

4 files
  1. drivers/pci/pcie/aer/aerdrv.c +1 −24
  2. drivers/pci/pcie/portdrv_pci.c +6 −99
  3. include/linux/pcieport_if.h +2 −2
  4. include/uapi/linux/pci_regs.h +10 −16
drivers/pci/pcie/aer/aerdrv.c+1−24
@@ -32,16 +32,9 @@ · 31 unmodified lines
3232
3333 static int aer_probe(struct pcie_device *dev);
3434 static void aer_remove(struct pcie_device *dev);
35−static pci_ers_result_t aer_error_detected(struct pci_dev *dev,
36− enum pci_channel_state error);
3735 static void aer_error_resume(struct pci_dev *dev);
3836 static pci_ers_result_t aer_root_reset(struct pci_dev *dev);
3937
40−static const struct pci_error_handlers aer_error_handlers = {
41− .error_detected = aer_error_detected,
42− .resume = aer_error_resume,
43−};
44−
4538 static struct pcie_port_service_driver aerdriver = {
4639 .name = "aer",
4740 .port_type = PCI_EXP_TYPE_ROOT_PORT,
@@ -49,9 +42,7 @@ static struct pcie_port_service_driver aerdriver = { · 1 unmodified line
4942
5043 .probe = aer_probe,
5144 .remove = aer_remove,
52−
53− .err_handler = &aer_error_handlers,
54−
45+ .error_resume = aer_error_resume,
5546 .reset_link = aer_root_reset,
5647 };
5748
@@ -349,20 +340,6 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev) · 291 unmodified lines
349340 return PCI_ERS_RESULT_RECOVERED;
350341 }
351342
352−/**
353− * aer_error_detected - update severity status
354− * @dev: pointer to Root Port's pci_dev data structure
355− * @error: error severity being notified by port bus
356− *
357− * Invoked by Port Bus driver during error recovery.
358− */
359−static pci_ers_result_t aer_error_detected(struct pci_dev *dev,
360− enum pci_channel_state error)
361−{
362− /* Root Port has no impact. Always recovers. */
363− return PCI_ERS_RESULT_CAN_RECOVER;
364−}
365−
366343 /**
367344 * aer_error_resume - clean up corresponding error status bits
368345 * @dev: pointer to Root Port's pci_dev data structure
drivers/pci/pcie/portdrv_pci.c+6−99
@@ -21,7 +21,6 @@ · 20 unmodified lines
2121
2222 #include "../pci.h"
2323 #include "portdrv.h"
24−#include "aer/aerdrv.h"
2524
2625 /* If this switch is set, PCIe port native services should not be enabled. */
2726 bool pcie_ports_disabled;
@@ -177,108 +176,20 @@ static void pcie_portdrv_remove(struct pci_dev *dev) · 149 unmodified lines
177176 pcie_port_device_remove(dev);
178177 }
179178
180−static int error_detected_iter(struct device *device, void *data)
181−{
182− struct pcie_device *pcie_device;
183− struct pcie_port_service_driver *driver;
184− struct aer_broadcast_data *result_data;
185− pci_ers_result_t status;
186−
187− result_data = (struct aer_broadcast_data *) data;
188−
189− if (device->bus == &pcie_port_bus_type && device->driver) {
190− driver = to_service_driver(device->driver);
191− if (!driver ||
192− !driver->err_handler ||
193− !driver->err_handler->error_detected)
194− return 0;
195−
196− pcie_device = to_pcie_device(device);
197−
198− /* Forward error detected message to service drivers */
199− status = driver->err_handler->error_detected(
200− pcie_device->port,
201− result_data->state);
202− result_data->result =
203− merge_result(result_data->result, status);
204− }
205−
206− return 0;
207−}
208−
209179 static pci_ers_result_t pcie_portdrv_error_detected(struct pci_dev *dev,
210180 enum pci_channel_state error)
211181 {
212− struct aer_broadcast_data data = {error, PCI_ERS_RESULT_CAN_RECOVER};
213−
214− /* get true return value from &data */
215− device_for_each_child(&dev->dev, &data, error_detected_iter);
216− return data.result;
217−}
218−
219−static int mmio_enabled_iter(struct device *device, void *data)
220−{
221− struct pcie_device *pcie_device;
222− struct pcie_port_service_driver *driver;
223− pci_ers_result_t status, *result;
224−
225− result = (pci_ers_result_t *) data;
226−
227− if (device->bus == &pcie_port_bus_type && device->driver) {
228− driver = to_service_driver(device->driver);
229− if (driver &&
230− driver->err_handler &&
231− driver->err_handler->mmio_enabled) {
232− pcie_device = to_pcie_device(device);
233−
234− /* Forward error message to service drivers */
235− status = driver->err_handler->mmio_enabled(
236− pcie_device->port);
237− *result = merge_result(*result, status);
238− }
239− }
240−
241− return 0;
182+ /* Root Port has no impact. Always recovers. */
183+ return PCI_ERS_RESULT_CAN_RECOVER;
242184 }
243185
244186 static pci_ers_result_t pcie_portdrv_mmio_enabled(struct pci_dev *dev)
245187 {
246− pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED;
247−
248− /* get true return value from &status */
249− device_for_each_child(&dev->dev, &status, mmio_enabled_iter);
250− return status;
251−}
252−
253−static int slot_reset_iter(struct device *device, void *data)
254−{
255− struct pcie_device *pcie_device;
256− struct pcie_port_service_driver *driver;
257− pci_ers_result_t status, *result;
258−
259− result = (pci_ers_result_t *) data;
260−
261− if (device->bus == &pcie_port_bus_type && device->driver) {
262− driver = to_service_driver(device->driver);
263− if (driver &&
264− driver->err_handler &&
265− driver->err_handler->slot_reset) {
266− pcie_device = to_pcie_device(device);
267−
268− /* Forward error message to service drivers */
269− status = driver->err_handler->slot_reset(
270− pcie_device->port);
271− *result = merge_result(*result, status);
272− }
273− }
274−
275− return 0;
188+ return PCI_ERS_RESULT_RECOVERED;
276189 }
277190
278191 static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev)
279192 {
280− pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED;
281−
282193 /* If fatal, restore cfg space for possible link reset at upstream */
283194 if (dev->error_state == pci_channel_io_frozen) {
284195 dev->state_saved = true;
@@ -287,9 +198,7 @@ static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev) · 2 unmodified lines
287198 pci_enable_pcie_error_reporting(dev);
288199 }
289200
290− /* get true return value from &status */
291− device_for_each_child(&dev->dev, &status, slot_reset_iter);
292− return status;
201+ return PCI_ERS_RESULT_RECOVERED;
293202 }
294203
295204 static int resume_iter(struct device *device, void *data)
@@ -299,13 +208,11 @@ static int resume_iter(struct device *device, void *data) · 3 unmodified lines
299208
300209 if (device->bus == &pcie_port_bus_type && device->driver) {
301210 driver = to_service_driver(device->driver);
302− if (driver &&
303− driver->err_handler &&
304− driver->err_handler->resume) {
211+ if (driver && driver->error_resume) {
305212 pcie_device = to_pcie_device(device);
306213
307214 /* Forward error message to service drivers */
308− driver->err_handler->resume(pcie_device->port);
215+ driver->error_resume(pcie_device->port);
309216 }
310217 }
311218
include/linux/pcieport_if.h+2−2
@@ -50,8 +50,8 @@ struct pcie_port_service_driver { · 49 unmodified lines
5050 int (*suspend) (struct pcie_device *dev);
5151 int (*resume) (struct pcie_device *dev);
5252
53− /* Service Error Recovery Handler */
54− const struct pci_error_handlers *err_handler;
53+ /* Device driver may resume normal operations */
54+ void (*error_resume)(struct pci_dev *dev);
5555
5656 /* Link Reset Capability - AER service driver specific */
5757 pci_ers_result_t (*reset_link) (struct pci_dev *dev);
include/uapi/linux/pci_regs.h+10−16
@@ -733,23 +733,17 @@ · 732 unmodified lines
733733 #define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */
734734 #define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */
735735 #define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */
736−/* Correctable Err Reporting Enable */
737−#define PCI_ERR_ROOT_CMD_COR_EN 0x00000001
738−/* Non-fatal Err Reporting Enable */
739−#define PCI_ERR_ROOT_CMD_NONFATAL_EN 0x00000002
740−/* Fatal Err Reporting Enable */
741−#define PCI_ERR_ROOT_CMD_FATAL_EN 0x00000004
736+#define PCI_ERR_ROOT_CMD_COR_EN 0x00000001 /* Correctable Err Reporting Enable */
737+#define PCI_ERR_ROOT_CMD_NONFATAL_EN 0x00000002 /* Non-Fatal Err Reporting Enable */
738+#define PCI_ERR_ROOT_CMD_FATAL_EN 0x00000004 /* Fatal Err Reporting Enable */
742739 #define PCI_ERR_ROOT_STATUS 48
743−#define PCI_ERR_ROOT_COR_RCV 0x00000001 /* ERR_COR Received */
744−/* Multi ERR_COR Received */
745−#define PCI_ERR_ROOT_MULTI_COR_RCV 0x00000002
746−/* ERR_FATAL/NONFATAL Received */
747−#define PCI_ERR_ROOT_UNCOR_RCV 0x00000004
748−/* Multi ERR_FATAL/NONFATAL Received */
749−#define PCI_ERR_ROOT_MULTI_UNCOR_RCV 0x00000008
750−#define PCI_ERR_ROOT_FIRST_FATAL 0x00000010 /* First Fatal */
751−#define PCI_ERR_ROOT_NONFATAL_RCV 0x00000020 /* Non-Fatal Received */
752−#define PCI_ERR_ROOT_FATAL_RCV 0x00000040 /* Fatal Received */
740+#define PCI_ERR_ROOT_COR_RCV 0x00000001 /* ERR_COR Received */
741+#define PCI_ERR_ROOT_MULTI_COR_RCV 0x00000002 /* Multiple ERR_COR */
742+#define PCI_ERR_ROOT_UNCOR_RCV 0x00000004 /* ERR_FATAL/NONFATAL */
743+#define PCI_ERR_ROOT_MULTI_UNCOR_RCV 0x00000008 /* Multiple FATAL/NONFATAL */
744+#define PCI_ERR_ROOT_FIRST_FATAL 0x00000010 /* First UNC is Fatal */
745+#define PCI_ERR_ROOT_NONFATAL_RCV 0x00000020 /* Non-Fatal Received */
746+#define PCI_ERR_ROOT_FATAL_RCV 0x00000040 /* Fatal Received */
753747 #define PCI_ERR_ROOT_ERR_SRC 52 /* Error Source Identification */
754748
755749 /* Virtual Channel */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t