]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bnxt_en: Improve RX buffer error handling.
authorMichael Chan <michael.chan@broadcom.com>
Mon, 18 Nov 2019 08:56:36 +0000 (03:56 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 31 Dec 2019 15:45:41 +0000 (16:45 +0100)
[ Upstream commit 19b3751ffa713d04290effb26fe01009010f2206 ]

When hardware reports RX buffer errors, the latest 57500 chips do not
require reset.  The packet is discarded by the hardware and the
ring will continue to operate.

Also, add an rx_buf_errors counter for this type of error.  It can help
the user to identify if the aggregation ring is too small.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 04ec909e06dfd72ec197871f8aff2701a3fc64bb..527e1bf93116059934120134abd83d65ec986042 100644 (file)
@@ -1767,8 +1767,12 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
 
                rc = -EIO;
                if (rx_err & RX_CMPL_ERRORS_BUFFER_ERROR_MASK) {
-                       netdev_warn(bp->dev, "RX buffer error %x\n", rx_err);
-                       bnxt_sched_reset(bp, rxr);
+                       bnapi->cp_ring.rx_buf_errors++;
+                       if (!(bp->flags & BNXT_FLAG_CHIP_P5)) {
+                               netdev_warn(bp->dev, "RX buffer error %x\n",
+                                           rx_err);
+                               bnxt_sched_reset(bp, rxr);
+                       }
                }
                goto next_rx_no_len;
        }
index d333589811a53237b992decb15c63a77d1585cf4..5163bb848618fe3a5af52393f647f9f6f88866a7 100644 (file)
@@ -927,6 +927,7 @@ struct bnxt_cp_ring_info {
        dma_addr_t              hw_stats_map;
        u32                     hw_stats_ctx_id;
        u64                     rx_l4_csum_errors;
+       u64                     rx_buf_errors;
        u64                     missed_irqs;
 
        struct bnxt_ring_struct cp_ring_struct;
index 51c1404767178d7e3ba2bb72db95d76de5588372..89f95428556ebb007e61af51d664ee5599dcde80 100644 (file)
@@ -173,6 +173,7 @@ static const char * const bnxt_ring_tpa2_stats_str[] = {
 
 static const char * const bnxt_ring_sw_stats_str[] = {
        "rx_l4_csum_errors",
+       "rx_buf_errors",
        "missed_irqs",
 };
 
@@ -552,6 +553,7 @@ static void bnxt_get_ethtool_stats(struct net_device *dev,
                for (k = 0; k < stat_fields; j++, k++)
                        buf[j] = le64_to_cpu(hw_stats[k]);
                buf[j++] = cpr->rx_l4_csum_errors;
+               buf[j++] = cpr->rx_buf_errors;
                buf[j++] = cpr->missed_irqs;
 
                bnxt_sw_func_stats[RX_TOTAL_DISCARDS].counter +=