aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex
diff options
context:
space:
mode:
authorSomnath Kotur <somnath.kotur@emulex.com>2014-02-12 05:37:54 -0500
committerDavid S. Miller <davem@davemloft.net>2014-02-13 18:19:22 -0500
commiteb0eecc136c917053c2e1b7eac8b8e8e2ebb3e6c (patch)
treed56a00bb8dcbf1c1780e3eabe951a8e93df6a027 /drivers/net/ethernet/emulex
parent886ab57c848892ebdddabca9990415176cf90679 (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.c82
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
2497static void be_msix_disable(struct be_adapter *adapter) 2497static void be_msix_disable(struct be_adapter *adapter)