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 */); |
