@@ -248,6 +248,13 @@ static int find_source_device(struct pci_dev *parent,
return 1;
}
+static struct pci_error_handlers *get_err_handler(struct pci_dev *dev)
+{
+ if (!dev || !dev->driver)
+ return NULL;
+ return dev->driver->err_handler;
+}
+
static int report_error_detected(struct pci_dev *dev, void *data)
{
pci_ers_result_t vote;
@@ -257,9 +264,8 @@ static int report_error_detected(struct pci_dev *dev, void *data)
dev->error_state = result_data->state;
- if (!dev->driver ||
- !dev->driver->err_handler ||
- !dev->driver->err_handler->error_detected) {
+ err_handler = get_err_handler(dev);
+ if (!err_handler || !err_handler->error_detected) {
if (result_data->state == pci_channel_io_frozen &&
!(dev->hdr_type & PCI_HEADER_TYPE_BRIDGE)) {
/*
@@ -276,9 +282,9 @@ static int report_error_detected(struct pci_dev *dev, void *data)
return 0;
}
- err_handler = dev->driver->err_handler;
vote = err_handler->error_detected(dev, result_data->state);
result_data->result = merge_result(result_data->result, vote);
+
return 0;
}
@@ -289,14 +295,13 @@ static int report_mmio_enabled(struct pci_dev *dev, void *data)
struct aer_broadcast_data *result_data;
result_data = (struct aer_broadcast_data *) data;
- if (!dev->driver ||
- !dev->driver->err_handler ||
- !dev->driver->err_handler->mmio_enabled)
+ err_handler = get_err_handler(dev);
+ if (!err_handler || !err_handler->mmio_enabled)
return 0;
- err_handler = dev->driver->err_handler;
vote = err_handler->mmio_enabled(dev);
result_data->result = merge_result(result_data->result, vote);
+
return 0;
}
@@ -307,14 +312,13 @@ static int report_slot_reset(struct pci_dev *dev, void *data)
struct aer_broadcast_data *result_data;
result_data = (struct aer_broadcast_data *) data;
- if (!dev->driver ||
- !dev->driver->err_handler ||
- !dev->driver->err_handler->slot_reset)
+ err_handler = get_err_handler(dev);
+ if (!err_handler || !err_handler->slot_reset)
return 0;
- err_handler = dev->driver->err_handler;
vote = err_handler->slot_reset(dev);
result_data->result = merge_result(result_data->result, vote);
+
return 0;
}
@@ -324,13 +328,12 @@ static int report_resume(struct pci_dev *dev, void *data)
dev->error_state = pci_channel_io_normal;
- if (!dev->driver ||
- !dev->driver->err_handler ||
- !dev->driver->err_handler->resume)
+ err_handler = get_err_handler(dev);
+ if (!err_handler || !err_handler->resume)
return 0;
- err_handler = dev->driver->err_handler;
err_handler->resume(dev);
+
return 0;
}