diff options
author | Somnath Kotur <somnath.kotur@emulex.com> | 2014-02-12 05:37:54 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-13 18:19:22 -0500 |
commit | eb0eecc136c917053c2e1b7eac8b8e8e2ebb3e6c (patch) | |
tree | d56a00bb8dcbf1c1780e3eabe951a8e93df6a027 /drivers/net/ethernet/emulex | |
parent | 886ab57c848892ebdddabca9990415176cf90679 (diff) |
be2net: Log a kernel message when UE is detected in BE & Skyhawk
This patch logs a kernel message when a HW error(SLIPORT_ERROR in Lancer and UE
in BEx/Skyhawk) is detected. The log message for BE3 was missing earlier.
This patch also refactors the code by segregating error-detection and reporting
code for Lancer and BEx/SH.
Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 82 |
1 files changed, 41 insertions, 41 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 04ac9c6a0d39..7057545c5f2f 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2423,6 +2423,9 @@ void be_detect_error(struct be_adapter *adapter) | |||
2423 | u32 ue_lo = 0, ue_hi = 0, ue_lo_mask = 0, ue_hi_mask = 0; | 2423 | u32 ue_lo = 0, ue_hi = 0, ue_lo_mask = 0, ue_hi_mask = 0; |
2424 | u32 sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0; | 2424 | u32 sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0; |
2425 | u32 i; | 2425 | u32 i; |
2426 | bool error_detected = false; | ||
2427 | struct device *dev = &adapter->pdev->dev; | ||
2428 | struct net_device *netdev = adapter->netdev; | ||
2426 | 2429 | ||
2427 | if (be_hw_error(adapter)) | 2430 | if (be_hw_error(adapter)) |
2428 | return; | 2431 | return; |
@@ -2434,6 +2437,21 @@ void be_detect_error(struct be_adapter *adapter) | |||
2434 | SLIPORT_ERROR1_OFFSET); | 2437 | SLIPORT_ERROR1_OFFSET); |
2435 | sliport_err2 = ioread32(adapter->db + | 2438 | sliport_err2 = ioread32(adapter->db + |
2436 | SLIPORT_ERROR2_OFFSET); | 2439 | SLIPORT_ERROR2_OFFSET); |
2440 | adapter->hw_error = true; | ||
2441 | /* Do not log error messages if its a FW reset */ | ||
2442 | if (sliport_err1 == SLIPORT_ERROR_FW_RESET1 && | ||
2443 | sliport_err2 == SLIPORT_ERROR_FW_RESET2) { | ||
2444 | dev_info(dev, "Firmware update in progress\n"); | ||
2445 | } else { | ||
2446 | error_detected = true; | ||
2447 | dev_err(dev, "Error detected in the card\n"); | ||
2448 | dev_err(dev, "ERR: sliport status 0x%x\n", | ||
2449 | sliport_status); | ||
2450 | dev_err(dev, "ERR: sliport error1 0x%x\n", | ||
2451 | sliport_err1); | ||
2452 | dev_err(dev, "ERR: sliport error2 0x%x\n", | ||
2453 | sliport_err2); | ||
2454 | } | ||
2437 | } | 2455 | } |
2438 | } else { | 2456 | } else { |
2439 | pci_read_config_dword(adapter->pdev, | 2457 | pci_read_config_dword(adapter->pdev, |
@@ -2447,51 +2465,33 @@ void be_detect_error(struct be_adapter *adapter) | |||
2447 | 2465 | ||
2448 | ue_lo = (ue_lo & ~ue_lo_mask); | 2466 | ue_lo = (ue_lo & ~ue_lo_mask); |
2449 | ue_hi = (ue_hi & ~ue_hi_mask); | 2467 | ue_hi = (ue_hi & ~ue_hi_mask); |
2450 | } | ||
2451 | |||
2452 | /* On certain platforms BE hardware can indicate spurious UEs. | ||
2453 | * Allow the h/w to stop working completely in case of a real UE. | ||
2454 | * Hence not setting the hw_error for UE detection. | ||
2455 | */ | ||
2456 | if (sliport_status & SLIPORT_STATUS_ERR_MASK) { | ||
2457 | adapter->hw_error = true; | ||
2458 | /* Do not log error messages if its a FW reset */ | ||
2459 | if (sliport_err1 == SLIPORT_ERROR_FW_RESET1 && | ||
2460 | sliport_err2 == SLIPORT_ERROR_FW_RESET2) { | ||
2461 | dev_info(&adapter->pdev->dev, | ||
2462 | "Firmware update in progress\n"); | ||
2463 | return; | ||
2464 | } else { | ||
2465 | dev_err(&adapter->pdev->dev, | ||
2466 | "Error detected in the card\n"); | ||
2467 | } | ||
2468 | } | ||
2469 | 2468 | ||
2470 | if (sliport_status & SLIPORT_STATUS_ERR_MASK) { | 2469 | /* On certain platforms BE hardware can indicate spurious UEs. |
2471 | dev_err(&adapter->pdev->dev, | 2470 | * Allow HW to stop working completely in case of a real UE. |
2472 | "ERR: sliport status 0x%x\n", sliport_status); | 2471 | * Hence not setting the hw_error for UE detection. |
2473 | dev_err(&adapter->pdev->dev, | 2472 | */ |
2474 | "ERR: sliport error1 0x%x\n", sliport_err1); | ||
2475 | dev_err(&adapter->pdev->dev, | ||
2476 | "ERR: sliport error2 0x%x\n", sliport_err2); | ||
2477 | } | ||
2478 | |||
2479 | if (ue_lo) { | ||
2480 | for (i = 0; ue_lo; ue_lo >>= 1, i++) { | ||
2481 | if (ue_lo & 1) | ||
2482 | dev_err(&adapter->pdev->dev, | ||
2483 | "UE: %s bit set\n", ue_status_low_desc[i]); | ||
2484 | } | ||
2485 | } | ||
2486 | 2473 | ||
2487 | if (ue_hi) { | 2474 | if (ue_lo || ue_hi) { |
2488 | for (i = 0; ue_hi; ue_hi >>= 1, i++) { | 2475 | error_detected = true; |
2489 | if (ue_hi & 1) | 2476 | dev_err(dev, |
2490 | dev_err(&adapter->pdev->dev, | 2477 | "Unrecoverable Error detected in the adapter"); |
2491 | "UE: %s bit set\n", ue_status_hi_desc[i]); | 2478 | dev_err(dev, "Please reboot server to recover"); |
2479 | if (skyhawk_chip(adapter)) | ||
2480 | adapter->hw_error = true; | ||
2481 | for (i = 0; ue_lo; ue_lo >>= 1, i++) { | ||
2482 | if (ue_lo & 1) | ||
2483 | dev_err(dev, "UE: %s bit set\n", | ||
2484 | ue_status_low_desc[i]); | ||
2485 | } | ||
2486 | for (i = 0; ue_hi; ue_hi >>= 1, i++) { | ||
2487 | if (ue_hi & 1) | ||
2488 | dev_err(dev, "UE: %s bit set\n", | ||
2489 | ue_status_hi_desc[i]); | ||
2490 | } | ||
2492 | } | 2491 | } |
2493 | } | 2492 | } |
2494 | 2493 | if (error_detected) | |
2494 | netif_carrier_off(netdev); | ||
2495 | } | 2495 | } |
2496 | 2496 | ||
2497 | static void be_msix_disable(struct be_adapter *adapter) | 2497 | static void be_msix_disable(struct be_adapter *adapter) |