Skip to content

Commit 36e5334

Browse files
Michael Chandavem330
authored andcommitted
bnxt_en: Add additional extended port statistics.
Latest firmware spec. has some additional rx extended port stats and new tx extended port stats added. We now need to check the size of the returned rx and tx extended stats and determine how many counters are valid. New counters added include CoS byte and packet counts for rx and tx. Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 31d357c commit 36e5334

File tree

3 files changed

+121
-7
lines changed

3 files changed

+121
-7
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3078,6 +3078,13 @@ static void bnxt_free_stats(struct bnxt *bp)
30783078
bp->hw_rx_port_stats = NULL;
30793079
}
30803080

3081+
if (bp->hw_tx_port_stats_ext) {
3082+
dma_free_coherent(&pdev->dev, sizeof(struct tx_port_stats_ext),
3083+
bp->hw_tx_port_stats_ext,
3084+
bp->hw_tx_port_stats_ext_map);
3085+
bp->hw_tx_port_stats_ext = NULL;
3086+
}
3087+
30813088
if (bp->hw_rx_port_stats_ext) {
30823089
dma_free_coherent(&pdev->dev, sizeof(struct rx_port_stats_ext),
30833090
bp->hw_rx_port_stats_ext,
@@ -3152,6 +3159,13 @@ static int bnxt_alloc_stats(struct bnxt *bp)
31523159
if (!bp->hw_rx_port_stats_ext)
31533160
return 0;
31543161

3162+
if (bp->hwrm_spec_code >= 0x10902) {
3163+
bp->hw_tx_port_stats_ext =
3164+
dma_zalloc_coherent(&pdev->dev,
3165+
sizeof(struct tx_port_stats_ext),
3166+
&bp->hw_tx_port_stats_ext_map,
3167+
GFP_KERNEL);
3168+
}
31553169
bp->flags |= BNXT_FLAG_PORT_STATS_EXT;
31563170
}
31573171
return 0;
@@ -5425,8 +5439,10 @@ static int bnxt_hwrm_port_qstats(struct bnxt *bp)
54255439

54265440
static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp)
54275441
{
5442+
struct hwrm_port_qstats_ext_output *resp = bp->hwrm_cmd_resp_addr;
54285443
struct hwrm_port_qstats_ext_input req = {0};
54295444
struct bnxt_pf_info *pf = &bp->pf;
5445+
int rc;
54305446

54315447
if (!(bp->flags & BNXT_FLAG_PORT_STATS_EXT))
54325448
return 0;
@@ -5435,7 +5451,19 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp)
54355451
req.port_id = cpu_to_le16(pf->port_id);
54365452
req.rx_stat_size = cpu_to_le16(sizeof(struct rx_port_stats_ext));
54375453
req.rx_stat_host_addr = cpu_to_le64(bp->hw_rx_port_stats_ext_map);
5438-
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
5454+
req.tx_stat_size = cpu_to_le16(sizeof(struct tx_port_stats_ext));
5455+
req.tx_stat_host_addr = cpu_to_le64(bp->hw_tx_port_stats_ext_map);
5456+
mutex_lock(&bp->hwrm_cmd_lock);
5457+
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
5458+
if (!rc) {
5459+
bp->fw_rx_stats_ext_size = le16_to_cpu(resp->rx_stat_size) / 8;
5460+
bp->fw_tx_stats_ext_size = le16_to_cpu(resp->tx_stat_size) / 8;
5461+
} else {
5462+
bp->fw_rx_stats_ext_size = 0;
5463+
bp->fw_tx_stats_ext_size = 0;
5464+
}
5465+
mutex_unlock(&bp->hwrm_cmd_lock);
5466+
return rc;
54395467
}
54405468

54415469
static void bnxt_hwrm_free_tunnel_ports(struct bnxt *bp)

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,10 +1305,14 @@ struct bnxt {
13051305
struct rx_port_stats *hw_rx_port_stats;
13061306
struct tx_port_stats *hw_tx_port_stats;
13071307
struct rx_port_stats_ext *hw_rx_port_stats_ext;
1308+
struct rx_port_stats_ext *hw_tx_port_stats_ext;
13081309
dma_addr_t hw_rx_port_stats_map;
13091310
dma_addr_t hw_tx_port_stats_map;
13101311
dma_addr_t hw_rx_port_stats_ext_map;
1312+
dma_addr_t hw_tx_port_stats_ext_map;
13111313
int hw_port_stats_size;
1314+
u16 fw_rx_stats_ext_size;
1315+
u16 fw_tx_stats_ext_size;
13121316

13131317
u16 hwrm_max_req_len;
13141318
int hwrm_cmd_timeout;
@@ -1425,6 +1429,9 @@ struct bnxt {
14251429
#define BNXT_RX_STATS_EXT_OFFSET(counter) \
14261430
(offsetof(struct rx_port_stats_ext, counter) / 8)
14271431

1432+
#define BNXT_TX_STATS_EXT_OFFSET(counter) \
1433+
(offsetof(struct tx_port_stats_ext, counter) / 8)
1434+
14281435
#define I2C_DEV_ADDR_A0 0xa0
14291436
#define I2C_DEV_ADDR_A2 0xa2
14301437
#define SFF_DIAG_SUPPORT_OFFSET 0x5c

drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

Lines changed: 85 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,65 @@ static int bnxt_set_coalesce(struct net_device *dev,
148148
#define BNXT_RX_STATS_EXT_ENTRY(counter) \
149149
{ BNXT_RX_STATS_EXT_OFFSET(counter), __stringify(counter) }
150150

151+
#define BNXT_TX_STATS_EXT_ENTRY(counter) \
152+
{ BNXT_TX_STATS_EXT_OFFSET(counter), __stringify(counter) }
153+
154+
#define BNXT_RX_STATS_EXT_PFC_ENTRY(n) \
155+
BNXT_RX_STATS_EXT_ENTRY(pfc_pri##n##_rx_duration_us), \
156+
BNXT_RX_STATS_EXT_ENTRY(pfc_pri##n##_rx_transitions)
157+
158+
#define BNXT_TX_STATS_EXT_PFC_ENTRY(n) \
159+
BNXT_TX_STATS_EXT_ENTRY(pfc_pri##n##_tx_duration_us), \
160+
BNXT_TX_STATS_EXT_ENTRY(pfc_pri##n##_tx_transitions)
161+
162+
#define BNXT_RX_STATS_EXT_PFC_ENTRIES \
163+
BNXT_RX_STATS_EXT_PFC_ENTRY(0), \
164+
BNXT_RX_STATS_EXT_PFC_ENTRY(1), \
165+
BNXT_RX_STATS_EXT_PFC_ENTRY(2), \
166+
BNXT_RX_STATS_EXT_PFC_ENTRY(3), \
167+
BNXT_RX_STATS_EXT_PFC_ENTRY(4), \
168+
BNXT_RX_STATS_EXT_PFC_ENTRY(5), \
169+
BNXT_RX_STATS_EXT_PFC_ENTRY(6), \
170+
BNXT_RX_STATS_EXT_PFC_ENTRY(7)
171+
172+
#define BNXT_TX_STATS_EXT_PFC_ENTRIES \
173+
BNXT_TX_STATS_EXT_PFC_ENTRY(0), \
174+
BNXT_TX_STATS_EXT_PFC_ENTRY(1), \
175+
BNXT_TX_STATS_EXT_PFC_ENTRY(2), \
176+
BNXT_TX_STATS_EXT_PFC_ENTRY(3), \
177+
BNXT_TX_STATS_EXT_PFC_ENTRY(4), \
178+
BNXT_TX_STATS_EXT_PFC_ENTRY(5), \
179+
BNXT_TX_STATS_EXT_PFC_ENTRY(6), \
180+
BNXT_TX_STATS_EXT_PFC_ENTRY(7)
181+
182+
#define BNXT_RX_STATS_EXT_COS_ENTRY(n) \
183+
BNXT_RX_STATS_EXT_ENTRY(rx_bytes_cos##n), \
184+
BNXT_RX_STATS_EXT_ENTRY(rx_packets_cos##n)
185+
186+
#define BNXT_TX_STATS_EXT_COS_ENTRY(n) \
187+
BNXT_TX_STATS_EXT_ENTRY(tx_bytes_cos##n), \
188+
BNXT_TX_STATS_EXT_ENTRY(tx_packets_cos##n)
189+
190+
#define BNXT_RX_STATS_EXT_COS_ENTRIES \
191+
BNXT_RX_STATS_EXT_COS_ENTRY(0), \
192+
BNXT_RX_STATS_EXT_COS_ENTRY(1), \
193+
BNXT_RX_STATS_EXT_COS_ENTRY(2), \
194+
BNXT_RX_STATS_EXT_COS_ENTRY(3), \
195+
BNXT_RX_STATS_EXT_COS_ENTRY(4), \
196+
BNXT_RX_STATS_EXT_COS_ENTRY(5), \
197+
BNXT_RX_STATS_EXT_COS_ENTRY(6), \
198+
BNXT_RX_STATS_EXT_COS_ENTRY(7) \
199+
200+
#define BNXT_TX_STATS_EXT_COS_ENTRIES \
201+
BNXT_TX_STATS_EXT_COS_ENTRY(0), \
202+
BNXT_TX_STATS_EXT_COS_ENTRY(1), \
203+
BNXT_TX_STATS_EXT_COS_ENTRY(2), \
204+
BNXT_TX_STATS_EXT_COS_ENTRY(3), \
205+
BNXT_TX_STATS_EXT_COS_ENTRY(4), \
206+
BNXT_TX_STATS_EXT_COS_ENTRY(5), \
207+
BNXT_TX_STATS_EXT_COS_ENTRY(6), \
208+
BNXT_TX_STATS_EXT_COS_ENTRY(7) \
209+
151210
enum {
152211
RX_TOTAL_DISCARDS,
153212
TX_TOTAL_DISCARDS,
@@ -256,11 +315,20 @@ static const struct {
256315
BNXT_RX_STATS_EXT_ENTRY(resume_pause_events),
257316
BNXT_RX_STATS_EXT_ENTRY(continuous_roce_pause_events),
258317
BNXT_RX_STATS_EXT_ENTRY(resume_roce_pause_events),
318+
BNXT_RX_STATS_EXT_COS_ENTRIES,
319+
BNXT_RX_STATS_EXT_PFC_ENTRIES,
320+
};
321+
322+
static const struct {
323+
long offset;
324+
char string[ETH_GSTRING_LEN];
325+
} bnxt_tx_port_stats_ext_arr[] = {
326+
BNXT_TX_STATS_EXT_COS_ENTRIES,
327+
BNXT_TX_STATS_EXT_PFC_ENTRIES,
259328
};
260329

261330
#define BNXT_NUM_SW_FUNC_STATS ARRAY_SIZE(bnxt_sw_func_stats)
262331
#define BNXT_NUM_PORT_STATS ARRAY_SIZE(bnxt_port_stats_arr)
263-
#define BNXT_NUM_PORT_STATS_EXT ARRAY_SIZE(bnxt_port_stats_ext_arr)
264332

265333
static int bnxt_get_num_stats(struct bnxt *bp)
266334
{
@@ -272,7 +340,8 @@ static int bnxt_get_num_stats(struct bnxt *bp)
272340
num_stats += BNXT_NUM_PORT_STATS;
273341

274342
if (bp->flags & BNXT_FLAG_PORT_STATS_EXT)
275-
num_stats += BNXT_NUM_PORT_STATS_EXT;
343+
num_stats += bp->fw_rx_stats_ext_size +
344+
bp->fw_tx_stats_ext_size;
276345

277346
return num_stats;
278347
}
@@ -334,12 +403,17 @@ static void bnxt_get_ethtool_stats(struct net_device *dev,
334403
}
335404
}
336405
if (bp->flags & BNXT_FLAG_PORT_STATS_EXT) {
337-
__le64 *port_stats_ext = (__le64 *)bp->hw_rx_port_stats_ext;
406+
__le64 *rx_port_stats_ext = (__le64 *)bp->hw_rx_port_stats_ext;
407+
__le64 *tx_port_stats_ext = (__le64 *)bp->hw_tx_port_stats_ext;
338408

339-
for (i = 0; i < BNXT_NUM_PORT_STATS_EXT; i++, j++) {
340-
buf[j] = le64_to_cpu(*(port_stats_ext +
409+
for (i = 0; i < bp->fw_rx_stats_ext_size; i++, j++) {
410+
buf[j] = le64_to_cpu(*(rx_port_stats_ext +
341411
bnxt_port_stats_ext_arr[i].offset));
342412
}
413+
for (i = 0; i < bp->fw_tx_stats_ext_size; i++, j++) {
414+
buf[j] = le64_to_cpu(*(tx_port_stats_ext +
415+
bnxt_tx_port_stats_ext_arr[i].offset));
416+
}
343417
}
344418
}
345419

@@ -407,10 +481,15 @@ static void bnxt_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
407481
}
408482
}
409483
if (bp->flags & BNXT_FLAG_PORT_STATS_EXT) {
410-
for (i = 0; i < BNXT_NUM_PORT_STATS_EXT; i++) {
484+
for (i = 0; i < bp->fw_rx_stats_ext_size; i++) {
411485
strcpy(buf, bnxt_port_stats_ext_arr[i].string);
412486
buf += ETH_GSTRING_LEN;
413487
}
488+
for (i = 0; i < bp->fw_tx_stats_ext_size; i++) {
489+
strcpy(buf,
490+
bnxt_tx_port_stats_ext_arr[i].string);
491+
buf += ETH_GSTRING_LEN;
492+
}
414493
}
415494
break;
416495
case ETH_SS_TEST:

0 commit comments

Comments
 (0)