| @@ -21,7 +21,6 @@ · 20 unmodified lines |
| 21 | 21 | |
| 22 | 22 | #include "../pci.h" |
| 23 | 23 | #include "portdrv.h" |
| 24 | | −#include "aer/aerdrv.h" |
| 25 | 24 | |
| 26 | 25 | /* If this switch is set, PCIe port native services should not be enabled. */ |
| 27 | 26 | bool pcie_ports_disabled; |
| @@ -177,108 +176,20 @@ static void pcie_portdrv_remove(struct pci_dev *dev) · 149 unmodified lines |
| 177 | 176 | pcie_port_device_remove(dev); |
| 178 | 177 | } |
| 179 | 178 | |
| 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 | | − |
| 209 | 179 | static pci_ers_result_t pcie_portdrv_error_detected(struct pci_dev *dev, |
| 210 | 180 | enum pci_channel_state error) |
| 211 | 181 | { |
| 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; |
| 242 | 184 | } |
| 243 | 185 | |
| 244 | 186 | static pci_ers_result_t pcie_portdrv_mmio_enabled(struct pci_dev *dev) |
| 245 | 187 | { |
| 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; |
| 276 | 189 | } |
| 277 | 190 | |
| 278 | 191 | static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev) |
| 279 | 192 | { |
| 280 | | − pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED; |
| 281 | | − |
| 282 | 193 | /* If fatal, restore cfg space for possible link reset at upstream */ |
| 283 | 194 | if (dev->error_state == pci_channel_io_frozen) { |
| 284 | 195 | dev->state_saved = true; |
| @@ -287,9 +198,7 @@ static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev) · 2 unmodified lines |
| 287 | 198 | pci_enable_pcie_error_reporting(dev); |
| 288 | 199 | } |
| 289 | 200 | |
| 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; |
| 293 | 202 | } |
| 294 | 203 | |
| 295 | 204 | 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 |
| 299 | 208 | |
| 300 | 209 | if (device->bus == &pcie_port_bus_type && device->driver) { |
| 301 | 210 | driver = to_service_driver(device->driver); |
| 302 | | − if (driver && |
| 303 | | − driver->err_handler && |
| 304 | | − driver->err_handler->resume) { |
| 211 | + if (driver && driver->error_resume) { |
| 305 | 212 | pcie_device = to_pcie_device(device); |
| 306 | 213 | |
| 307 | 214 | /* Forward error message to service drivers */ |
| 308 | | − driver->err_handler->resume(pcie_device->port); |
| 215 | + driver->error_resume(pcie_device->port); |
| 309 | 216 | } |
| 310 | 217 | } |
| 311 | 218 | |