| From 767add5fb33efb864e3efea3508281684d9d3c5d Mon Sep 17 00:00:00 2001 |
| From: Michael Chan <michael.chan@broadcom.com> |
| Date: Sun, 22 Mar 2020 16:40:01 -0400 |
| Subject: [PATCH] bnxt_en: Fix Priority Bytes and Packets counters in ethtool |
| -S. |
| |
| commit a24ec3220f369aa0b94c863b6b310685a727151c upstream. |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
| index 363129baf72f..360df39b182d 100644 |
| --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
| +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
| @@ -6902,14 +6902,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; |
| } |
| diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h |
| index d3feea85a09f..f2c1b7d7a89b 100644 |
| --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h |
| +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h |
| @@ -1517,7 +1517,7 @@ struct bnxt { |
| int hw_port_stats_size; |
| u16 fw_rx_stats_ext_size; |
| u16 fw_tx_stats_ext_size; |
| - u8 pri2cos[8]; |
| + u8 pri2cos_idx[8]; |
| u8 pri2cos_valid; |
| |
| u16 hwrm_max_req_len; |
| diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c |
| index e6705f7cae40..214cd635bfdd 100644 |
| --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c |
| +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c |
| @@ -514,25 +514,25 @@ static void bnxt_get_ethtool_stats(struct net_device *dev, |
| 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)); |
| } |
| -- |
| 2.7.4 |
| |