]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bnxt_en: Fix Priority Bytes and Packets counters in ethtool -S.
authorMichael Chan <michael.chan@broadcom.com>
Sun, 22 Mar 2020 20:40:01 +0000 (16:40 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 1 Apr 2020 08:59:48 +0000 (10:59 +0200)
[ Upstream commit a24ec3220f369aa0b94c863b6b310685a727151c ]

There is an indexing bug in determining these ethtool priority
counters.  Instead of using the queue ID to index, we need to
normalize by modulo 10 to get the index.  This index is then used
to obtain the proper CoS queue counter.  Rename bp->pri2cos to
bp->pri2cos_idx to make this more clear.

Fixes: e37fed790335 ("bnxt_en: Add ethtool -S priority counters.")
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 05da27a64d55cb737f8276c76970f3aef6a7d501..582cf1807d0ba02728970b9f15687766cb5e9dcc 100644 (file)
@@ -7406,14 +7406,22 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp)
                pri2cos = &resp2->pri0_cos_queue_id;
                for (i = 0; i < 8; i++) {
                        u8 queue_id = pri2cos[i];
+                       u8 queue_idx;
 
+                       /* Per port queue IDs start from 0, 10, 20, etc */
+                       queue_idx = queue_id % 10;
+                       if (queue_idx > BNXT_MAX_QUEUE) {
+                               bp->pri2cos_valid = false;
+                               goto qstats_done;
+                       }
                        for (j = 0; j < bp->max_q; j++) {
                                if (bp->q_ids[j] == queue_id)
-                                       bp->pri2cos[i] = j;
+                                       bp->pri2cos_idx[i] = queue_idx;
                        }
                }
                bp->pri2cos_valid = 1;
        }
+qstats_done:
        mutex_unlock(&bp->hwrm_cmd_lock);
        return rc;
 }
index f14335433a64db8763bfc1a2d50c39973b33c1f0..c67707c1a969681cdf7525afe14d6e8b08b38005 100644 (file)
@@ -1714,7 +1714,7 @@ struct bnxt {
        u16                     fw_rx_stats_ext_size;
        u16                     fw_tx_stats_ext_size;
        u16                     hw_ring_stats_size;
-       u8                      pri2cos[8];
+       u8                      pri2cos_idx[8];
        u8                      pri2cos_valid;
 
        u16                     hwrm_max_req_len;
index 972383aefc2b32d0fe32293720f06b4e45eeb47e..7946807c99b8d19a3b7d3241d90970aa2d63e905 100644 (file)
@@ -589,25 +589,25 @@ skip_ring_stats:
                if (bp->pri2cos_valid) {
                        for (i = 0; i < 8; i++, j++) {
                                long n = bnxt_rx_bytes_pri_arr[i].base_off +
-                                        bp->pri2cos[i];
+                                        bp->pri2cos_idx[i];
 
                                buf[j] = le64_to_cpu(*(rx_port_stats_ext + n));
                        }
                        for (i = 0; i < 8; i++, j++) {
                                long n = bnxt_rx_pkts_pri_arr[i].base_off +
-                                        bp->pri2cos[i];
+                                        bp->pri2cos_idx[i];
 
                                buf[j] = le64_to_cpu(*(rx_port_stats_ext + n));
                        }
                        for (i = 0; i < 8; i++, j++) {
                                long n = bnxt_tx_bytes_pri_arr[i].base_off +
-                                        bp->pri2cos[i];
+                                        bp->pri2cos_idx[i];
 
                                buf[j] = le64_to_cpu(*(tx_port_stats_ext + n));
                        }
                        for (i = 0; i < 8; i++, j++) {
                                long n = bnxt_tx_pkts_pri_arr[i].base_off +
-                                        bp->pri2cos[i];
+                                        bp->pri2cos_idx[i];
 
                                buf[j] = le64_to_cpu(*(tx_port_stats_ext + n));
                        }