diff options
author | Linas Vepstas <linas@austin.ibm.com> | 2006-06-19 16:07:40 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-06-21 01:01:32 -0400 |
commit | 0aa8d15b01881ccaab5f2fb31eef33ced97ccb5f (patch) | |
tree | 398d2b5c20d56073ade09e2e3bc1032bf6130324 | |
parent | 379507181a1e330d4f5b0fabe61cd43eccf09763 (diff) |
[POWERPC] pseries: Print PCI slot location code on failure
The PCI error recovery code will printk diagnostic info when
a PCI error event occurs. Change the messages to include the slot
location code, which is how most sysadmins will know the device.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/platforms/pseries/eeh_driver.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/platforms/pseries/eeh_driver.c index 4d45347afabc..0ec9a5445b95 100644 --- a/arch/powerpc/platforms/pseries/eeh_driver.c +++ b/arch/powerpc/platforms/pseries/eeh_driver.c | |||
@@ -261,16 +261,22 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event) | |||
261 | struct pci_bus *frozen_bus; | 261 | struct pci_bus *frozen_bus; |
262 | int rc = 0; | 262 | int rc = 0; |
263 | enum pci_ers_result result = PCI_ERS_RESULT_NONE; | 263 | enum pci_ers_result result = PCI_ERS_RESULT_NONE; |
264 | const char *pci_str, *drv_str; | 264 | const char *location, *pci_str, *drv_str; |
265 | 265 | ||
266 | frozen_dn = find_device_pe(event->dn); | 266 | frozen_dn = find_device_pe(event->dn); |
267 | frozen_bus = pcibios_find_pci_bus(frozen_dn); | 267 | frozen_bus = pcibios_find_pci_bus(frozen_dn); |
268 | 268 | ||
269 | if (!frozen_dn) { | 269 | if (!frozen_dn) { |
270 | printk(KERN_ERR "EEH: Error: Cannot find partition endpoint for %s\n", | 270 | |
271 | pci_name(event->dev)); | 271 | location = (char *) get_property(event->dn, "ibm,loc-code", NULL); |
272 | location = location ? location : "unknown"; | ||
273 | printk(KERN_ERR "EEH: Error: Cannot find partition endpoint " | ||
274 | "for location=%s pci addr=%s\n", | ||
275 | location, pci_name(event->dev)); | ||
272 | return NULL; | 276 | return NULL; |
273 | } | 277 | } |
278 | location = (char *) get_property(frozen_dn, "ibm,loc-code", NULL); | ||
279 | location = location ? location : "unknown"; | ||
274 | 280 | ||
275 | /* There are two different styles for coming up with the PE. | 281 | /* There are two different styles for coming up with the PE. |
276 | * In the old style, it was the highest EEH-capable device | 282 | * In the old style, it was the highest EEH-capable device |
@@ -282,8 +288,9 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event) | |||
282 | frozen_bus = pcibios_find_pci_bus (frozen_dn->parent); | 288 | frozen_bus = pcibios_find_pci_bus (frozen_dn->parent); |
283 | 289 | ||
284 | if (!frozen_bus) { | 290 | if (!frozen_bus) { |
285 | printk(KERN_ERR "EEH: Cannot find PCI bus for %s\n", | 291 | printk(KERN_ERR "EEH: Cannot find PCI bus " |
286 | frozen_dn->full_name); | 292 | "for location=%s dn=%s\n", |
293 | location, frozen_dn->full_name); | ||
287 | return NULL; | 294 | return NULL; |
288 | } | 295 | } |
289 | 296 | ||
@@ -318,8 +325,9 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event) | |||
318 | 325 | ||
319 | eeh_slot_error_detail(frozen_pdn, 1 /* Temporary Error */); | 326 | eeh_slot_error_detail(frozen_pdn, 1 /* Temporary Error */); |
320 | printk(KERN_WARNING | 327 | printk(KERN_WARNING |
321 | "EEH: This PCI device has failed %d times since last reboot: %s - %s\n", | 328 | "EEH: This PCI device has failed %d times since last reboot: " |
322 | frozen_pdn->eeh_freeze_count, drv_str, pci_str); | 329 | "location=%s driver=%s pci addr=%s\n", |
330 | frozen_pdn->eeh_freeze_count, location, drv_str, pci_str); | ||
323 | 331 | ||
324 | /* Walk the various device drivers attached to this slot through | 332 | /* Walk the various device drivers attached to this slot through |
325 | * a reset sequence, giving each an opportunity to do what it needs | 333 | * a reset sequence, giving each an opportunity to do what it needs |
@@ -368,17 +376,18 @@ excess_failures: | |||
368 | * due to actual, failed cards. | 376 | * due to actual, failed cards. |
369 | */ | 377 | */ |
370 | printk(KERN_ERR | 378 | printk(KERN_ERR |
371 | "EEH: PCI device %s - %s has failed %d times \n" | 379 | "EEH: PCI device at location=%s driver=%s pci addr=%s \n" |
372 | "and has been permanently disabled. Please try reseating\n" | 380 | "has failed %d times and has been permanently disabled. \n" |
373 | "this device or replacing it.\n", | 381 | "Please try reseating this device or replacing it.\n", |
374 | drv_str, pci_str, frozen_pdn->eeh_freeze_count); | 382 | location, drv_str, pci_str, frozen_pdn->eeh_freeze_count); |
375 | goto perm_error; | 383 | goto perm_error; |
376 | 384 | ||
377 | hard_fail: | 385 | hard_fail: |
378 | printk(KERN_ERR | 386 | printk(KERN_ERR |
379 | "EEH: Unable to recover from failure of PCI device %s - %s\n" | 387 | "EEH: Unable to recover from failure of PCI device " |
388 | "at location=%s driver=%s pci addr=%s \n" | ||
380 | "Please try reseating this device or replacing it.\n", | 389 | "Please try reseating this device or replacing it.\n", |
381 | drv_str, pci_str); | 390 | location, drv_str, pci_str); |
382 | 391 | ||
383 | perm_error: | 392 | perm_error: |
384 | eeh_slot_error_detail(frozen_pdn, 2 /* Permanent Error */); | 393 | eeh_slot_error_detail(frozen_pdn, 2 /* Permanent Error */); |