Commit a24ec322 authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnxt_en: Fix Priority Bytes and Packets counters in ethtool -S.

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: e37fed79 ("bnxt_en: Add ethtool -S priority counters.")
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b06d072c
...@@ -7406,14 +7406,22 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp) ...@@ -7406,14 +7406,22 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp)
pri2cos = &resp2->pri0_cos_queue_id; pri2cos = &resp2->pri0_cos_queue_id;
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
u8 queue_id = pri2cos[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++) { for (j = 0; j < bp->max_q; j++) {
if (bp->q_ids[j] == queue_id) if (bp->q_ids[j] == queue_id)
bp->pri2cos[i] = j; bp->pri2cos_idx[i] = queue_idx;
} }
} }
bp->pri2cos_valid = 1; bp->pri2cos_valid = 1;
} }
qstats_done:
mutex_unlock(&bp->hwrm_cmd_lock); mutex_unlock(&bp->hwrm_cmd_lock);
return rc; return rc;
} }
......
...@@ -1716,7 +1716,7 @@ struct bnxt { ...@@ -1716,7 +1716,7 @@ struct bnxt {
u16 fw_rx_stats_ext_size; u16 fw_rx_stats_ext_size;
u16 fw_tx_stats_ext_size; u16 fw_tx_stats_ext_size;
u16 hw_ring_stats_size; u16 hw_ring_stats_size;
u8 pri2cos[8]; u8 pri2cos_idx[8];
u8 pri2cos_valid; u8 pri2cos_valid;
u16 hwrm_max_req_len; u16 hwrm_max_req_len;
......
...@@ -589,25 +589,25 @@ static void bnxt_get_ethtool_stats(struct net_device *dev, ...@@ -589,25 +589,25 @@ static void bnxt_get_ethtool_stats(struct net_device *dev,
if (bp->pri2cos_valid) { if (bp->pri2cos_valid) {
for (i = 0; i < 8; i++, j++) { for (i = 0; i < 8; i++, j++) {
long n = bnxt_rx_bytes_pri_arr[i].base_off + 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)); buf[j] = le64_to_cpu(*(rx_port_stats_ext + n));
} }
for (i = 0; i < 8; i++, j++) { for (i = 0; i < 8; i++, j++) {
long n = bnxt_rx_pkts_pri_arr[i].base_off + 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)); buf[j] = le64_to_cpu(*(rx_port_stats_ext + n));
} }
for (i = 0; i < 8; i++, j++) { for (i = 0; i < 8; i++, j++) {
long n = bnxt_tx_bytes_pri_arr[i].base_off + 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)); buf[j] = le64_to_cpu(*(tx_port_stats_ext + n));
} }
for (i = 0; i < 8; i++, j++) { for (i = 0; i < 8; i++, j++) {
long n = bnxt_tx_pkts_pri_arr[i].base_off + 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)); buf[j] = le64_to_cpu(*(tx_port_stats_ext + n));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment