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 09:01:40 +0000 (11:01 +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 57c88e1..1e78ea0 100644 (file)
@@ -7387,14 +7387,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 2e6ad53..cda7ba3 100644 (file)
@@ -1688,7 +1688,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 cfa647d..fb1ab58 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));
                        }