bnx2x: Recoverable and unrecoverable error statistics
authorAriel Elior <ariele@broadcom.com>
Thu, 26 Jan 2012 06:01:53 +0000 (06:01 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 26 Jan 2012 18:39:52 +0000 (13:39 -0500)
Add statistics for tracking parity errors from which we successfully
recovered and those which were deemed unrecoverable.

Signed-off-by: Ariel Elior <ariele@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h

index 37a5c52197eb3b610fc0f2a555da7c081a83bb2e..06cb2442c8ff1ef7b668cbfe73f48c4417737662 100644 (file)
@@ -175,7 +175,11 @@ static const struct {
        { STATS_OFFSET32(total_tpa_aggregated_frames_hi),
                        8, STATS_FLAGS_FUNC, "tpa_aggregated_frames"},
        { STATS_OFFSET32(total_tpa_bytes_hi),
-                       8, STATS_FLAGS_FUNC, "tpa_bytes"}
+                       8, STATS_FLAGS_FUNC, "tpa_bytes"},
+       { STATS_OFFSET32(recoverable_error),
+                       4, STATS_FLAGS_FUNC, "recoverable_errors" },
+       { STATS_OFFSET32(unrecoverable_error),
+                       4, STATS_FLAGS_FUNC, "unrecoverable_errors" },
 };
 
 #define BNX2X_NUM_STATS                ARRAY_SIZE(bnx2x_stats_arr)
@@ -1388,7 +1392,8 @@ static int bnx2x_set_ringparam(struct net_device *dev,
        struct bnx2x *bp = netdev_priv(dev);
 
        if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
-               pr_err("Handling parity error recovery. Try again later\n");
+               netdev_err(dev, "Handling parity error recovery. "
+                               "Try again later\n");
                return -EAGAIN;
        }
 
@@ -2042,7 +2047,8 @@ static void bnx2x_self_test(struct net_device *dev,
        struct bnx2x *bp = netdev_priv(dev);
        u8 is_serdes;
        if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
-               pr_err("Handling parity error recovery. Try again later\n");
+               netdev_err(bp->dev, "Handling parity error recovery. "
+                                   "Try again later\n");
                etest->flags |= ETH_TEST_FL_FAILED;
                return;
        }
index c945df06161836815585d5c22fb3639b1ea72506..cdce7663efd5a70b5139bd256b5f2c050032aaab 100644 (file)
@@ -784,6 +784,7 @@ void bnx2x_panic_dump(struct bnx2x *bp)
 #endif
 
        bp->stats_state = STATS_STATE_DISABLED;
+       bp->eth_stats.unrecoverable_error++;
        DP(BNX2X_MSG_STATS, "stats_state - DISABLED\n");
 
        BNX2X_ERR("begin crash dump -----------------\n");
@@ -5441,6 +5442,7 @@ static void bnx2x_init_eth_fp(struct bnx2x *bp, int fp_idx)
 
        /* init shortcut */
        fp->ustorm_rx_prods_offset = bnx2x_rx_ustorm_prods_offset(fp);
+
        /* Setup SB indicies */
        fp->rx_cons_sb = BNX2X_RX_SB_INDEX;
 
@@ -8563,6 +8565,7 @@ static inline void bnx2x_recovery_failed(struct bnx2x *bp)
 static void bnx2x_parity_recover(struct bnx2x *bp)
 {
        bool global = false;
+       u32 error_recovered, error_unrecovered;
        bool is_parity;
 
        DP(NETIF_MSG_HW, "Handling parity\n");
@@ -8678,9 +8681,14 @@ static void bnx2x_parity_recover(struct bnx2x *bp)
                                                return;
                                        }
 
+                                       error_recovered =
+                                         bp->eth_stats.recoverable_error;
+                                       error_unrecovered =
+                                         bp->eth_stats.unrecoverable_error;
                                        bp->recovery_state =
                                                BNX2X_RECOVERY_NIC_LOADING;
                                        if (bnx2x_nic_load(bp, LOAD_NORMAL)) {
+                                               error_unrecovered++;
                                                netdev_err(bp->dev,
                                                           "Recovery failed. "
                                                           "Power cycle "
@@ -8694,8 +8702,13 @@ static void bnx2x_parity_recover(struct bnx2x *bp)
                                        } else {
                                                bp->recovery_state =
                                                        BNX2X_RECOVERY_DONE;
+                                               error_recovered++;
                                                smp_mb();
                                        }
+                                       bp->eth_stats.recoverable_error =
+                                               error_recovered;
+                                       bp->eth_stats.unrecoverable_error =
+                                               error_unrecovered;
 
                                        return;
                                }
index 683deb053109d817aa578906f4f6874c0ec994b5..9c28db167fa75ada9d0a36a3c1bc7fa9bf1ef6e8 100644 (file)
@@ -199,6 +199,10 @@ struct bnx2x_eth_stats {
        u32 pfc_frames_received_lo;
        u32 pfc_frames_sent_hi;
        u32 pfc_frames_sent_lo;
+
+       /* Recovery */
+       u32 recoverable_error;
+       u32 unrecoverable_error;
 };