Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/dev/bnxt/bnxt_en/bnxt_sysctl.c
39536 views
1
/*-
2
* Broadcom NetXtreme-C/E network driver.
3
*
4
* Copyright (c) 2016 Broadcom, All Rights Reserved.
5
* The term Broadcom refers to Broadcom Limited and/or its subsidiaries
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
17
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26
* THE POSSIBILITY OF SUCH DAMAGE.
27
*/
28
29
#include <sys/types.h>
30
#include <sys/sysctl.h>
31
#include <sys/ctype.h>
32
#include <linux/delay.h>
33
34
#include "bnxt.h"
35
#include "bnxt_hwrm.h"
36
#include "bnxt_sysctl.h"
37
38
DEFINE_MUTEX(tmp_mutex); /* mutex lock for driver */
39
extern void bnxt_fw_reset(struct bnxt_softc *bp);
40
extern void bnxt_queue_sp_work(struct bnxt_softc *bp);
41
extern void
42
process_nq(struct bnxt_softc *softc, uint16_t nqid);
43
/*
44
* We want to create:
45
* dev.bnxt.0.hwstats.txq0
46
* dev.bnxt.0.hwstats.txq0.txmbufs
47
* dev.bnxt.0.hwstats.rxq0
48
* dev.bnxt.0.hwstats.txq0.rxmbufs
49
* so the hwstats ctx list needs to be created in attach_post and populated
50
* during init.
51
*
52
* Then, it needs to be cleaned up in stop.
53
*/
54
55
int
56
bnxt_init_sysctl_ctx(struct bnxt_softc *softc)
57
{
58
struct sysctl_ctx_list *ctx;
59
60
sysctl_ctx_init(&softc->hw_stats);
61
ctx = device_get_sysctl_ctx(softc->dev);
62
softc->hw_stats_oid = SYSCTL_ADD_NODE(ctx,
63
SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
64
"hwstats", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "hardware statistics");
65
if (!softc->hw_stats_oid) {
66
sysctl_ctx_free(&softc->hw_stats);
67
return ENOMEM;
68
}
69
70
sysctl_ctx_init(&softc->ver_info->ver_ctx);
71
ctx = device_get_sysctl_ctx(softc->dev);
72
softc->ver_info->ver_oid = SYSCTL_ADD_NODE(ctx,
73
SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
74
"ver", CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
75
"hardware/firmware version information");
76
if (!softc->ver_info->ver_oid) {
77
sysctl_ctx_free(&softc->ver_info->ver_ctx);
78
return ENOMEM;
79
}
80
81
if (BNXT_PF(softc)) {
82
sysctl_ctx_init(&softc->nvm_info->nvm_ctx);
83
ctx = device_get_sysctl_ctx(softc->dev);
84
softc->nvm_info->nvm_oid = SYSCTL_ADD_NODE(ctx,
85
SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
86
"nvram", CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
87
"nvram information");
88
if (!softc->nvm_info->nvm_oid) {
89
sysctl_ctx_free(&softc->nvm_info->nvm_ctx);
90
return ENOMEM;
91
}
92
}
93
94
sysctl_ctx_init(&softc->hw_lro_ctx);
95
ctx = device_get_sysctl_ctx(softc->dev);
96
softc->hw_lro_oid = SYSCTL_ADD_NODE(ctx,
97
SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
98
"hw_lro", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "hardware lro");
99
if (!softc->hw_lro_oid) {
100
sysctl_ctx_free(&softc->hw_lro_ctx);
101
return ENOMEM;
102
}
103
104
sysctl_ctx_init(&softc->flow_ctrl_ctx);
105
ctx = device_get_sysctl_ctx(softc->dev);
106
softc->flow_ctrl_oid = SYSCTL_ADD_NODE(ctx,
107
SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
108
"fc", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "flow ctrl");
109
if (!softc->flow_ctrl_oid) {
110
sysctl_ctx_free(&softc->flow_ctrl_ctx);
111
return ENOMEM;
112
}
113
114
sysctl_ctx_init(&softc->dcb_ctx);
115
ctx = device_get_sysctl_ctx(softc->dev);
116
softc->dcb_oid = SYSCTL_ADD_NODE(ctx,
117
SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
118
"dcb", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Data Center Bridging");
119
if (!softc->dcb_oid) {
120
sysctl_ctx_free(&softc->dcb_ctx);
121
return ENOMEM;
122
}
123
124
return 0;
125
}
126
127
int
128
bnxt_free_sysctl_ctx(struct bnxt_softc *softc)
129
{
130
int orc;
131
int rc = 0;
132
133
if (softc->hw_stats_oid != NULL) {
134
orc = sysctl_ctx_free(&softc->hw_stats);
135
if (orc)
136
rc = orc;
137
else
138
softc->hw_stats_oid = NULL;
139
}
140
if (softc->ver_info->ver_oid != NULL) {
141
orc = sysctl_ctx_free(&softc->ver_info->ver_ctx);
142
if (orc)
143
rc = orc;
144
else
145
softc->ver_info->ver_oid = NULL;
146
}
147
if (BNXT_PF(softc) && softc->nvm_info->nvm_oid != NULL) {
148
orc = sysctl_ctx_free(&softc->nvm_info->nvm_ctx);
149
if (orc)
150
rc = orc;
151
else
152
softc->nvm_info->nvm_oid = NULL;
153
}
154
if (softc->hw_lro_oid != NULL) {
155
orc = sysctl_ctx_free(&softc->hw_lro_ctx);
156
if (orc)
157
rc = orc;
158
else
159
softc->hw_lro_oid = NULL;
160
}
161
162
if (softc->flow_ctrl_oid != NULL) {
163
orc = sysctl_ctx_free(&softc->flow_ctrl_ctx);
164
if (orc)
165
rc = orc;
166
else
167
softc->flow_ctrl_oid = NULL;
168
}
169
170
if (softc->dcb_oid != NULL) {
171
orc = sysctl_ctx_free(&softc->dcb_ctx);
172
if (orc)
173
rc = orc;
174
else
175
softc->dcb_oid = NULL;
176
}
177
178
return rc;
179
}
180
181
int
182
bnxt_create_tx_sysctls(struct bnxt_softc *softc, int txr)
183
{
184
struct sysctl_oid *oid;
185
struct ctx_hw_stats *tx_stats = (void *)softc->tx_stats[txr].idi_vaddr;
186
char name[32];
187
char desc[64];
188
189
sprintf(name, "txq%d", txr);
190
sprintf(desc, "transmit queue %d", txr);
191
oid = SYSCTL_ADD_NODE(&softc->hw_stats,
192
SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name,
193
CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc);
194
if (!oid)
195
return ENOMEM;
196
197
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
198
"ucast_pkts", CTLFLAG_RD, &tx_stats->tx_ucast_pkts,
199
"unicast packets sent");
200
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
201
"mcast_pkts", CTLFLAG_RD, &tx_stats->tx_mcast_pkts,
202
"multicast packets sent");
203
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
204
"bcast_pkts", CTLFLAG_RD, &tx_stats->tx_bcast_pkts,
205
"broadcast packets sent");
206
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
207
"discard_pkts", CTLFLAG_RD,
208
&tx_stats->tx_discard_pkts, "discarded transmit packets");
209
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
210
"error_pkts", CTLFLAG_RD, &tx_stats->tx_error_pkts,
211
"Error transmit packets");
212
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
213
"ucast_bytes", CTLFLAG_RD, &tx_stats->tx_ucast_bytes,
214
"unicast bytes sent");
215
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
216
"mcast_bytes", CTLFLAG_RD, &tx_stats->tx_mcast_bytes,
217
"multicast bytes sent");
218
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
219
"bcast_bytes", CTLFLAG_RD, &tx_stats->tx_bcast_bytes,
220
"broadcast bytes sent");
221
222
return 0;
223
}
224
225
int
226
bnxt_create_port_stats_sysctls(struct bnxt_softc *softc)
227
{
228
struct sysctl_oid *oid;
229
char name[32];
230
char desc[64];
231
232
sprintf(name, "port_stats");
233
sprintf(desc, "Port Stats");
234
oid = SYSCTL_ADD_NODE(&softc->hw_stats,
235
SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name,
236
CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc);
237
if (!oid)
238
return ENOMEM;
239
240
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
241
"tx_64b_frames", CTLFLAG_RD,
242
&softc->tx_port_stats->tx_64b_frames, "Transmitted 64b frames");
243
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
244
"tx_65b_127b_frames", CTLFLAG_RD,
245
&softc->tx_port_stats->tx_65b_127b_frames,
246
"Transmitted 65b 127b frames");
247
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
248
"tx_128b_255b_frames", CTLFLAG_RD,
249
&softc->tx_port_stats->tx_128b_255b_frames,
250
"Transmitted 128b 255b frames");
251
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
252
"tx_256b_511b_frames", CTLFLAG_RD,
253
&softc->tx_port_stats->tx_256b_511b_frames,
254
"Transmitted 256b 511b frames");
255
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
256
"tx_512b_1023b_frames", CTLFLAG_RD,
257
&softc->tx_port_stats->tx_512b_1023b_frames,
258
"Transmitted 512b 1023b frames");
259
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
260
"tx_1024b_1518b_frames", CTLFLAG_RD,
261
&softc->tx_port_stats->tx_1024b_1518b_frames,
262
"Transmitted 1024b 1518b frames");
263
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
264
"tx_good_vlan_frames", CTLFLAG_RD,
265
&softc->tx_port_stats->tx_good_vlan_frames,
266
"Transmitted good vlan frames");
267
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
268
"tx_1519b_2047b_frames", CTLFLAG_RD,
269
&softc->tx_port_stats->tx_1519b_2047b_frames,
270
"Transmitted 1519b 2047b frames");
271
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
272
"tx_2048b_4095b_frames", CTLFLAG_RD,
273
&softc->tx_port_stats->tx_2048b_4095b_frames,
274
"Transmitted 2048b 4095b frames");
275
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
276
"tx_4096b_9216b_frames", CTLFLAG_RD,
277
&softc->tx_port_stats->tx_4096b_9216b_frames,
278
"Transmitted 4096b 9216b frames");
279
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
280
"tx_9217b_16383b_frames", CTLFLAG_RD,
281
&softc->tx_port_stats->tx_9217b_16383b_frames,
282
"Transmitted 9217b 16383b frames");
283
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
284
"tx_good_frames", CTLFLAG_RD,
285
&softc->tx_port_stats->tx_good_frames, "Transmitted good frames");
286
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
287
"tx_total_frames", CTLFLAG_RD,
288
&softc->tx_port_stats->tx_total_frames, "Transmitted total frames");
289
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
290
"tx_ucast_frames", CTLFLAG_RD,
291
&softc->tx_port_stats->tx_ucast_frames, "Transmitted ucast frames");
292
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
293
"tx_mcast_frames", CTLFLAG_RD,
294
&softc->tx_port_stats->tx_mcast_frames, "Transmitted mcast frames");
295
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
296
"tx_bcast_frames", CTLFLAG_RD,
297
&softc->tx_port_stats->tx_bcast_frames, "Transmitted bcast frames");
298
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
299
"tx_pause_frames", CTLFLAG_RD,
300
&softc->tx_port_stats->tx_pause_frames, "Transmitted pause frames");
301
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
302
"tx_pfc_frames", CTLFLAG_RD,
303
&softc->tx_port_stats->tx_pfc_frames, "Transmitted pfc frames");
304
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
305
"tx_jabber_frames", CTLFLAG_RD,
306
&softc->tx_port_stats->tx_jabber_frames, "Transmitted jabber frames");
307
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
308
"tx_fcs_err_frames", CTLFLAG_RD,
309
&softc->tx_port_stats->tx_fcs_err_frames,
310
"Transmitted fcs err frames");
311
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
312
"tx_err", CTLFLAG_RD,
313
&softc->tx_port_stats->tx_err, "Transmitted err");
314
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
315
"tx_fifo_underruns", CTLFLAG_RD,
316
&softc->tx_port_stats->tx_fifo_underruns,
317
"Transmitted fifo underruns");
318
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
319
"tx_pfc_ena_frames_pri0", CTLFLAG_RD,
320
&softc->tx_port_stats->tx_pfc_ena_frames_pri0,
321
"Transmitted pfc ena frames pri0");
322
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
323
"tx_pfc_ena_frames_pri1", CTLFLAG_RD,
324
&softc->tx_port_stats->tx_pfc_ena_frames_pri1,
325
"Transmitted pfc ena frames pri1");
326
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
327
"tx_pfc_ena_frames_pri2", CTLFLAG_RD,
328
&softc->tx_port_stats->tx_pfc_ena_frames_pri2,
329
"Transmitted pfc ena frames pri2");
330
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
331
"tx_pfc_ena_frames_pri3", CTLFLAG_RD,
332
&softc->tx_port_stats->tx_pfc_ena_frames_pri3,
333
"Transmitted pfc ena frames pri3");
334
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
335
"tx_pfc_ena_frames_pri4", CTLFLAG_RD,
336
&softc->tx_port_stats->tx_pfc_ena_frames_pri4,
337
"Transmitted pfc ena frames pri4");
338
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
339
"tx_pfc_ena_frames_pri5", CTLFLAG_RD,
340
&softc->tx_port_stats->tx_pfc_ena_frames_pri5,
341
"Transmitted pfc ena frames pri5");
342
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
343
"tx_pfc_ena_frames_pri6", CTLFLAG_RD,
344
&softc->tx_port_stats->tx_pfc_ena_frames_pri6,
345
"Transmitted pfc ena frames pri6");
346
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
347
"tx_pfc_ena_frames_pri7", CTLFLAG_RD,
348
&softc->tx_port_stats->tx_pfc_ena_frames_pri7,
349
"Transmitted pfc ena frames pri7");
350
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
351
"tx_eee_lpi_events", CTLFLAG_RD,
352
&softc->tx_port_stats->tx_eee_lpi_events,
353
"Transmitted eee lpi events");
354
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
355
"tx_eee_lpi_duration", CTLFLAG_RD,
356
&softc->tx_port_stats->tx_eee_lpi_duration,
357
"Transmitted eee lpi duration");
358
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
359
"tx_llfc_logical_msgs", CTLFLAG_RD,
360
&softc->tx_port_stats->tx_llfc_logical_msgs,
361
"Transmitted llfc logical msgs");
362
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
363
"tx_hcfc_msgs", CTLFLAG_RD,
364
&softc->tx_port_stats->tx_hcfc_msgs, "Transmitted hcfc msgs");
365
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
366
"tx_total_collisions", CTLFLAG_RD,
367
&softc->tx_port_stats->tx_total_collisions,
368
"Transmitted total collisions");
369
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
370
"tx_bytes", CTLFLAG_RD,
371
&softc->tx_port_stats->tx_bytes, "Transmitted bytes");
372
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
373
"tx_xthol_frames", CTLFLAG_RD,
374
&softc->tx_port_stats->tx_xthol_frames, "Transmitted xthol frames");
375
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
376
"tx_stat_discard", CTLFLAG_RD,
377
&softc->tx_port_stats->tx_stat_discard, "Transmitted stat discard");
378
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
379
"tx_stat_error", CTLFLAG_RD,
380
&softc->tx_port_stats->tx_stat_error, "Transmitted stat error");
381
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
382
"rx_64b_frames", CTLFLAG_RD,
383
&softc->rx_port_stats->rx_64b_frames, "Received 64b frames");
384
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
385
"rx_65b_127b_frames", CTLFLAG_RD,
386
&softc->rx_port_stats->rx_65b_127b_frames, "Received 65b 127b frames");
387
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
388
"rx_128b_255b_frames", CTLFLAG_RD,
389
&softc->rx_port_stats->rx_128b_255b_frames,
390
"Received 128b 255b frames");
391
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
392
"rx_256b_511b_frames", CTLFLAG_RD,
393
&softc->rx_port_stats->rx_256b_511b_frames,
394
"Received 256b 511b frames");
395
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
396
"rx_512b_1023b_frames", CTLFLAG_RD,
397
&softc->rx_port_stats->rx_512b_1023b_frames,
398
"Received 512b 1023b frames");
399
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
400
"rx_1024b_1518b_frames", CTLFLAG_RD,
401
&softc->rx_port_stats->rx_1024b_1518b_frames,
402
"Received 1024b 1518 frames");
403
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
404
"rx_good_vlan_frames", CTLFLAG_RD,
405
&softc->rx_port_stats->rx_good_vlan_frames,
406
"Received good vlan frames");
407
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
408
"rx_1519b_2047b_frames", CTLFLAG_RD,
409
&softc->rx_port_stats->rx_1519b_2047b_frames,
410
"Received 1519b 2047b frames");
411
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
412
"rx_2048b_4095b_frames", CTLFLAG_RD,
413
&softc->rx_port_stats->rx_2048b_4095b_frames,
414
"Received 2048b 4095b frames");
415
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
416
"rx_4096b_9216b_frames", CTLFLAG_RD,
417
&softc->rx_port_stats->rx_4096b_9216b_frames,
418
"Received 4096b 9216b frames");
419
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
420
"rx_9217b_16383b_frames", CTLFLAG_RD,
421
&softc->rx_port_stats->rx_9217b_16383b_frames,
422
"Received 9217b 16383b frames");
423
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
424
"rx_total_frames", CTLFLAG_RD,
425
&softc->rx_port_stats->rx_total_frames, "Received total frames");
426
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
427
"rx_ucast_frames", CTLFLAG_RD,
428
&softc->rx_port_stats->rx_ucast_frames, "Received ucast frames");
429
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
430
"rx_mcast_frames", CTLFLAG_RD,
431
&softc->rx_port_stats->rx_mcast_frames, "Received mcast frames");
432
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
433
"rx_bcast_frames", CTLFLAG_RD,
434
&softc->rx_port_stats->rx_bcast_frames, "Received bcast frames");
435
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
436
"rx_fcs_err_frames", CTLFLAG_RD,
437
&softc->rx_port_stats->rx_fcs_err_frames, "Received fcs err frames");
438
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
439
"rx_ctrl_frames", CTLFLAG_RD,
440
&softc->rx_port_stats->rx_ctrl_frames, "Received ctrl frames");
441
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
442
"rx_pause_frames", CTLFLAG_RD,
443
&softc->rx_port_stats->rx_pause_frames, "Received pause frames");
444
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
445
"rx_pfc_frames", CTLFLAG_RD,
446
&softc->rx_port_stats->rx_pfc_frames, "Received pfc frames");
447
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
448
"rx_align_err_frames", CTLFLAG_RD,
449
&softc->rx_port_stats->rx_align_err_frames,
450
"Received align err frames");
451
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
452
"rx_ovrsz_frames", CTLFLAG_RD,
453
&softc->rx_port_stats->rx_ovrsz_frames,
454
"Received ovrsz frames");
455
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
456
"rx_jbr_frames", CTLFLAG_RD,
457
&softc->rx_port_stats->rx_jbr_frames,
458
"Received jbr frames");
459
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
460
"rx_mtu_err_frames", CTLFLAG_RD,
461
&softc->rx_port_stats->rx_mtu_err_frames,
462
"Received mtu err frames");
463
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
464
"rx_tagged_frames", CTLFLAG_RD,
465
&softc->rx_port_stats->rx_tagged_frames,
466
"Received tagged frames");
467
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
468
"rx_double_tagged_frames", CTLFLAG_RD,
469
&softc->rx_port_stats->rx_double_tagged_frames,
470
"Received double tagged frames");
471
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
472
"rx_good_frames", CTLFLAG_RD,
473
&softc->rx_port_stats->rx_good_frames,
474
"Received good frames");
475
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
476
"rx_pfc_ena_frames_pri0", CTLFLAG_RD,
477
&softc->rx_port_stats->rx_pfc_ena_frames_pri0,
478
"Received pfc ena frames pri0");
479
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
480
"rx_pfc_ena_frames_pri1", CTLFLAG_RD,
481
&softc->rx_port_stats->rx_pfc_ena_frames_pri1,
482
"Received pfc ena frames pri1");
483
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
484
"rx_pfc_ena_frames_pri2", CTLFLAG_RD,
485
&softc->rx_port_stats->rx_pfc_ena_frames_pri2,
486
"Received pfc ena frames pri2");
487
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
488
"rx_pfc_ena_frames_pri3", CTLFLAG_RD,
489
&softc->rx_port_stats->rx_pfc_ena_frames_pri3,
490
"Received pfc ena frames pri3");
491
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
492
"rx_pfc_ena_frames_pri4", CTLFLAG_RD,
493
&softc->rx_port_stats->rx_pfc_ena_frames_pri4,
494
"Received pfc ena frames pri4");
495
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
496
"rx_pfc_ena_frames_pri5", CTLFLAG_RD,
497
&softc->rx_port_stats->rx_pfc_ena_frames_pri5,
498
"Received pfc ena frames pri5");
499
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
500
"rx_pfc_ena_frames_pri6", CTLFLAG_RD,
501
&softc->rx_port_stats->rx_pfc_ena_frames_pri6,
502
"Received pfc ena frames pri6");
503
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
504
"rx_pfc_ena_frames_pri7", CTLFLAG_RD,
505
&softc->rx_port_stats->rx_pfc_ena_frames_pri7,
506
"Received pfc ena frames pri7");
507
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
508
"rx_sch_crc_err_frames", CTLFLAG_RD,
509
&softc->rx_port_stats->rx_sch_crc_err_frames,
510
"Received sch crc err frames");
511
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
512
"rx_undrsz_frames", CTLFLAG_RD,
513
&softc->rx_port_stats->rx_undrsz_frames, "Received undrsz frames");
514
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
515
"rx_eee_lpi_events", CTLFLAG_RD,
516
&softc->rx_port_stats->rx_eee_lpi_events, "Received eee lpi events");
517
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
518
"rx_eee_lpi_duration", CTLFLAG_RD,
519
&softc->rx_port_stats->rx_eee_lpi_duration,
520
"Received eee lpi duration");
521
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
522
"rx_llfc_physical_msgs", CTLFLAG_RD,
523
&softc->rx_port_stats->rx_llfc_physical_msgs,
524
"Received llfc physical msgs");
525
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
526
"rx_llfc_logical_msgs", CTLFLAG_RD,
527
&softc->rx_port_stats->rx_llfc_logical_msgs,
528
"Received llfc logical msgs");
529
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
530
"rx_llfc_msgs_with_crc_err", CTLFLAG_RD,
531
&softc->rx_port_stats->rx_llfc_msgs_with_crc_err,
532
"Received llfc msgs with crc err");
533
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
534
"rx_hcfc_msgs", CTLFLAG_RD,
535
&softc->rx_port_stats->rx_hcfc_msgs, "Received hcfc msgs");
536
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
537
"rx_hcfc_msgs_with_crc_err", CTLFLAG_RD,
538
&softc->rx_port_stats->rx_hcfc_msgs_with_crc_err,
539
"Received hcfc msgs with crc err");
540
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
541
"rx_bytes", CTLFLAG_RD,
542
&softc->rx_port_stats->rx_bytes, "Received bytes");
543
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
544
"rx_runt_bytes", CTLFLAG_RD,
545
&softc->rx_port_stats->rx_runt_bytes, "Received runt bytes");
546
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
547
"rx_runt_frames", CTLFLAG_RD,
548
&softc->rx_port_stats->rx_runt_frames, "Received runt frames");
549
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
550
"rx_stat_discard", CTLFLAG_RD,
551
&softc->rx_port_stats->rx_stat_discard, "Received stat discard");
552
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
553
"rx_stat_err", CTLFLAG_RD,
554
&softc->rx_port_stats->rx_stat_err, "Received stat err");
555
556
if (BNXT_CHIP_P5_PLUS(softc) &&
557
(softc->flags & BNXT_FLAG_FW_CAP_EXT_STATS)) {
558
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
559
"tx_bytes_cos0", CTLFLAG_RD,
560
&softc->tx_port_stats_ext->tx_bytes_cos0, "Transmitted bytes count cos0");
561
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
562
"tx_packets_cos0", CTLFLAG_RD,
563
&softc->tx_port_stats_ext->tx_packets_cos0, "Transmitted packets count cos0");
564
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
565
"tx_bytes_cos1", CTLFLAG_RD,
566
&softc->tx_port_stats_ext->tx_bytes_cos1, "Transmitted bytes count cos1");
567
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
568
"tx_packets_cos1", CTLFLAG_RD,
569
&softc->tx_port_stats_ext->tx_packets_cos1, "Transmitted packets count cos1");
570
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
571
"tx_bytes_cos2", CTLFLAG_RD,
572
&softc->tx_port_stats_ext->tx_bytes_cos2, "Transmitted bytes count cos2");
573
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
574
"tx_packets_cos2", CTLFLAG_RD,
575
&softc->tx_port_stats_ext->tx_packets_cos2, "Transmitted packets count cos2");
576
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
577
"tx_bytes_cos3", CTLFLAG_RD,
578
&softc->tx_port_stats_ext->tx_bytes_cos3, "Transmitted bytes count cos3");
579
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
580
"tx_packets_cos3", CTLFLAG_RD,
581
&softc->tx_port_stats_ext->tx_packets_cos3, "Transmitted packets count cos3");
582
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
583
"tx_bytes_cos4", CTLFLAG_RD,
584
&softc->tx_port_stats_ext->tx_bytes_cos4, "Transmitted bytes count cos4");
585
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
586
"tx_packets_cos4", CTLFLAG_RD,
587
&softc->tx_port_stats_ext->tx_packets_cos4, "Transmitted packets count cos4");
588
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
589
"tx_bytes_cos5", CTLFLAG_RD,
590
&softc->tx_port_stats_ext->tx_bytes_cos5, "Transmitted bytes count cos5");
591
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
592
"tx_packets_cos5", CTLFLAG_RD,
593
&softc->tx_port_stats_ext->tx_packets_cos5, "Transmitted packets count cos5");
594
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
595
"tx_bytes_cos6", CTLFLAG_RD,
596
&softc->tx_port_stats_ext->tx_bytes_cos6, "Transmitted bytes count cos6");
597
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
598
"tx_packets_cos6", CTLFLAG_RD,
599
&softc->tx_port_stats_ext->tx_packets_cos6, "Transmitted packets count cos6");
600
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
601
"tx_bytes_cos7", CTLFLAG_RD,
602
&softc->tx_port_stats_ext->tx_bytes_cos7, "Transmitted bytes count cos7");
603
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
604
"tx_packets_cos7", CTLFLAG_RD,
605
&softc->tx_port_stats_ext->tx_packets_cos7, "Transmitted packets count cos7");
606
607
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
608
"tx_bytes_pri0", CTLFLAG_RD,
609
&softc->tx_bytes_pri[0], "Transmitted bytes count pri0");
610
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
611
"tx_packets_pri0", CTLFLAG_RD,
612
&softc->tx_packets_pri[0], "Transmitted packets count pri0");
613
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
614
"tx_bytes_pri1", CTLFLAG_RD,
615
&softc->tx_bytes_pri[1], "Transmitted bytes count pri1");
616
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
617
"tx_packets_pri1", CTLFLAG_RD,
618
&softc->tx_packets_pri[1], "Transmitted packets count pri1");
619
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
620
"tx_bytes_pri2", CTLFLAG_RD,
621
&softc->tx_bytes_pri[2], "Transmitted bytes count pri2");
622
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
623
"tx_packets_pri2", CTLFLAG_RD,
624
&softc->tx_packets_pri[2], "Transmitted packets count pri2");
625
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
626
"tx_bytes_pri3", CTLFLAG_RD,
627
&softc->tx_bytes_pri[3], "Transmitted bytes count pri3");
628
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
629
"tx_packets_pri3", CTLFLAG_RD,
630
&softc->tx_packets_pri[3], "Transmitted packets count pri3");
631
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
632
"tx_bytes_pri4", CTLFLAG_RD,
633
&softc->tx_bytes_pri[4], "Transmitted bytes count pri4");
634
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
635
"tx_packets_pri4", CTLFLAG_RD,
636
&softc->tx_packets_pri[4], "Transmitted packets count pri4");
637
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
638
"tx_bytes_pri5", CTLFLAG_RD,
639
&softc->tx_bytes_pri[5], "Transmitted bytes count pri5");
640
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
641
"tx_packets_pri5", CTLFLAG_RD,
642
&softc->tx_packets_pri[5], "Transmitted packets count pri5");
643
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
644
"tx_bytes_pri6", CTLFLAG_RD,
645
&softc->tx_bytes_pri[6], "Transmitted bytes count pri6");
646
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
647
"tx_packets_pri6", CTLFLAG_RD,
648
&softc->tx_packets_pri[6], "Transmitted packets count pri6");
649
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
650
"tx_bytes_pri7", CTLFLAG_RD,
651
&softc->tx_bytes_pri[7], "Transmitted bytes count pri7");
652
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
653
"tx_packets_pri7", CTLFLAG_RD,
654
&softc->tx_packets_pri[7], "Transmitted packets count pri7");
655
656
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
657
"pfc_pri0_tx_duration_us", CTLFLAG_RD,
658
&softc->tx_port_stats_ext->pfc_pri0_tx_duration_us, "Time duration between"
659
"XON to XOFF and XOFF to XON for pri0");
660
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
661
"pfc_pri0_tx_transitions", CTLFLAG_RD,
662
&softc->tx_port_stats_ext->pfc_pri0_tx_transitions, "Num times transition"
663
"between XON to XOFF and XOFF to XON for pri0");
664
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
665
"pfc_pri1_tx_duration_us", CTLFLAG_RD,
666
&softc->tx_port_stats_ext->pfc_pri1_tx_duration_us, "Time duration between"
667
"XON to XOFF and XOFF to XON for pri1");
668
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
669
"pfc_pri1_tx_transitions", CTLFLAG_RD,
670
&softc->tx_port_stats_ext->pfc_pri1_tx_transitions, "Num times transition"
671
"between XON to XOFF and XOFF to XON for pri1");
672
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
673
"pfc_pri2_tx_duration_us", CTLFLAG_RD,
674
&softc->tx_port_stats_ext->pfc_pri2_tx_duration_us, "Time duration between"
675
"XON to XOFF and XOFF to XON for pri2");
676
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
677
"pfc_pri2_tx_transitions", CTLFLAG_RD,
678
&softc->tx_port_stats_ext->pfc_pri2_tx_transitions, "Num times transition"
679
"between XON to XOFF and XOFF to XON for pri2");
680
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
681
"pfc_pri3_tx_duration_us", CTLFLAG_RD,
682
&softc->tx_port_stats_ext->pfc_pri3_tx_duration_us, "Time duration between"
683
"XON to XOFF and XOFF to XON for pri3");
684
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
685
"pfc_pri3_tx_transitions", CTLFLAG_RD,
686
&softc->tx_port_stats_ext->pfc_pri3_tx_transitions, "Num times transition"
687
"between XON to XOFF and XOFF to XON for pri3");
688
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
689
"pfc_pri4_tx_duration_us", CTLFLAG_RD,
690
&softc->tx_port_stats_ext->pfc_pri4_tx_duration_us, "Time duration between"
691
"XON to XOFF and XOFF to XON for pri4");
692
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
693
"pfc_pri4_tx_transitions", CTLFLAG_RD,
694
&softc->tx_port_stats_ext->pfc_pri4_tx_transitions, "Num times transition"
695
"between XON to XOFF and XOFF to XON for pri4");
696
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
697
"pfc_pri5_tx_duration_us", CTLFLAG_RD,
698
&softc->tx_port_stats_ext->pfc_pri5_tx_duration_us, "Time duration between"
699
"XON to XOFF and XOFF to XON for pri5");
700
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
701
"pfc_pri5_tx_transitions", CTLFLAG_RD,
702
&softc->tx_port_stats_ext->pfc_pri5_tx_transitions, "Num times transition"
703
"between XON to XOFF and XOFF to XON for pri5");
704
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
705
"pfc_pri6_tx_duration_us", CTLFLAG_RD,
706
&softc->tx_port_stats_ext->pfc_pri6_tx_duration_us, "Time duration between"
707
"XON to XOFF and XOFF to XON for pri6");
708
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
709
"pfc_pri6_tx_transitions", CTLFLAG_RD,
710
&softc->tx_port_stats_ext->pfc_pri6_tx_transitions, "Num times transition"
711
"between XON to XOFF and XOFF to XON for pri6");
712
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
713
"pfc_pri7_tx_duration_us", CTLFLAG_RD,
714
&softc->tx_port_stats_ext->pfc_pri7_tx_duration_us, "Time duration between"
715
"XON to XOFF and XOFF to XON for pri7");
716
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
717
"pfc_pri7_tx_transitions", CTLFLAG_RD,
718
&softc->tx_port_stats_ext->pfc_pri7_tx_transitions, "Num times transition"
719
"between XON to XOFF and XOFF to XON for pri7");
720
721
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
722
"link_down_events", CTLFLAG_RD,
723
&softc->rx_port_stats_ext->link_down_events, "Num times link states down");
724
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
725
"continuous_pause_events", CTLFLAG_RD,
726
&softc->rx_port_stats_ext->continuous_pause_events, "Num times pause events");
727
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
728
"resume_pause_events", CTLFLAG_RD,
729
&softc->rx_port_stats_ext->resume_pause_events, "Num times pause events"
730
"resumes");
731
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
732
"continuous_roce_pause_events", CTLFLAG_RD,
733
&softc->rx_port_stats_ext->continuous_roce_pause_events, "Num times roce"
734
"pause events");
735
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
736
"resume_roce_pause_events", CTLFLAG_RD,
737
&softc->rx_port_stats_ext->resume_roce_pause_events, "Num times roce pause"
738
"events resumes");
739
740
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
741
"rx_bytes_cos0", CTLFLAG_RD,
742
&softc->rx_port_stats_ext->rx_bytes_cos0, "Received bytes count cos0");
743
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
744
"rx_packets_cos0", CTLFLAG_RD,
745
&softc->rx_port_stats_ext->rx_packets_cos0, "Received packets count cos0");
746
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
747
"rx_bytes_cos1", CTLFLAG_RD,
748
&softc->rx_port_stats_ext->rx_bytes_cos1, "Received bytes count cos1");
749
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
750
"rx_packets_cos1", CTLFLAG_RD,
751
&softc->rx_port_stats_ext->rx_packets_cos1, "Received packets count cos1");
752
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
753
"rx_bytes_cos2", CTLFLAG_RD,
754
&softc->rx_port_stats_ext->rx_bytes_cos2, "Received bytes count cos2");
755
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
756
"rx_packets_cos2", CTLFLAG_RD,
757
&softc->rx_port_stats_ext->rx_packets_cos2, "Received packets count cos2");
758
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
759
"rx_bytes_cos3", CTLFLAG_RD,
760
&softc->rx_port_stats_ext->rx_bytes_cos3, "Received bytes count cos3");
761
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
762
"rx_packets_cos3", CTLFLAG_RD,
763
&softc->rx_port_stats_ext->rx_packets_cos3, "Received packets count cos3");
764
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
765
"rx_bytes_cos4", CTLFLAG_RD,
766
&softc->rx_port_stats_ext->rx_bytes_cos4, "Received bytes count cos4");
767
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
768
"rx_packets_cos4", CTLFLAG_RD,
769
&softc->rx_port_stats_ext->rx_packets_cos4, "Received packets count cos4");
770
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
771
"rx_bytes_cos5", CTLFLAG_RD,
772
&softc->rx_port_stats_ext->rx_bytes_cos5, "Received bytes count cos5");
773
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
774
"rx_packets_cos5", CTLFLAG_RD,
775
&softc->rx_port_stats_ext->rx_packets_cos5, "Received packets count cos5");
776
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
777
"rx_bytes_cos6", CTLFLAG_RD,
778
&softc->rx_port_stats_ext->rx_bytes_cos6, "Received bytes count cos6");
779
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
780
"rx_packets_cos6", CTLFLAG_RD,
781
&softc->rx_port_stats_ext->rx_packets_cos6, "Received packets count cos6");
782
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
783
"rx_bytes_cos7", CTLFLAG_RD,
784
&softc->rx_port_stats_ext->rx_bytes_cos7, "Received bytes count cos7");
785
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
786
"rx_packets_cos7", CTLFLAG_RD,
787
&softc->rx_port_stats_ext->rx_packets_cos7, "Received packets count cos7");
788
789
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
790
"rx_bytes_pri0", CTLFLAG_RD,
791
&softc->rx_bytes_pri[0], "Received bytes count pri0");
792
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
793
"rx_packets_pri0", CTLFLAG_RD,
794
&softc->rx_packets_pri[0], "Received packets count pri0");
795
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
796
"rx_bytes_pri1", CTLFLAG_RD,
797
&softc->rx_bytes_pri[1], "Received bytes count pri1");
798
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
799
"rx_packets_pri1", CTLFLAG_RD,
800
&softc->rx_packets_pri[1], "Received packets count pri1");
801
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
802
"rx_bytes_pri2", CTLFLAG_RD,
803
&softc->rx_bytes_pri[2], "Received bytes count pri2");
804
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
805
"rx_packets_pri2", CTLFLAG_RD,
806
&softc->rx_packets_pri[2], "Received packets count pri2");
807
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
808
"rx_bytes_pri3", CTLFLAG_RD,
809
&softc->rx_bytes_pri[3], "Received bytes count pri3");
810
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
811
"rx_packets_pri3", CTLFLAG_RD,
812
&softc->rx_packets_pri[3], "Received packets count pri3");
813
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
814
"rx_bytes_pri4", CTLFLAG_RD,
815
&softc->rx_bytes_pri[4], "Received bytes count pri4");
816
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
817
"rx_packets_pri4", CTLFLAG_RD,
818
&softc->rx_packets_pri[4], "Received packets count pri4");
819
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
820
"rx_bytes_pri5", CTLFLAG_RD,
821
&softc->rx_bytes_pri[5], "Received bytes count pri5");
822
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
823
"rx_packets_pri5", CTLFLAG_RD,
824
&softc->rx_packets_pri[5], "Received packets count pri5");
825
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
826
"rx_bytes_pri6", CTLFLAG_RD,
827
&softc->rx_bytes_pri[6], "Received bytes count pri6");
828
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
829
"rx_packets_pri6", CTLFLAG_RD,
830
&softc->rx_packets_pri[6], "Received packets count pri6");
831
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
832
"rx_bytes_pri7", CTLFLAG_RD,
833
&softc->rx_bytes_pri[7], "Received bytes count pri7");
834
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
835
"rx_packets_pri7", CTLFLAG_RD,
836
&softc->rx_packets_pri[7], "Received packets count pri7");
837
838
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
839
"pfc_pri0_rx_duration_us", CTLFLAG_RD,
840
&softc->rx_port_stats_ext->pfc_pri0_rx_duration_us, "Time duration in receiving"
841
"between XON to XOFF and XOFF to XON for pri0");
842
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
843
"pfc_pri0_rx_transitions", CTLFLAG_RD,
844
&softc->rx_port_stats_ext->pfc_pri0_rx_transitions, "Num times rx transition"
845
"between XON to XOFF and XOFF to XON for pri0");
846
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
847
"pfc_pri1_rx_duration_us", CTLFLAG_RD,
848
&softc->rx_port_stats_ext->pfc_pri1_rx_duration_us, "Time duration in receiving"
849
"between XON to XOFF and XOFF to XON for pri1");
850
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
851
"pfc_pri1_rx_transitions", CTLFLAG_RD,
852
&softc->rx_port_stats_ext->pfc_pri1_rx_transitions, "Num times rx transition"
853
"between XON to XOFF and XOFF to XON for pri1");
854
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
855
"pfc_pri2_rx_duration_us", CTLFLAG_RD,
856
&softc->rx_port_stats_ext->pfc_pri2_rx_duration_us, "Time duration in receiving"
857
"between XON to XOFF and XOFF to XON for pri2");
858
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
859
"pfc_pri2_rx_transitions", CTLFLAG_RD,
860
&softc->rx_port_stats_ext->pfc_pri2_rx_transitions, "Num times rx transition"
861
"between XON to XOFF and XOFF to XON for pri2");
862
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
863
"pfc_pri3_rx_duration_us", CTLFLAG_RD,
864
&softc->rx_port_stats_ext->pfc_pri3_rx_duration_us, "Time duration in receiving"
865
"between XON to XOFF and XOFF to XON for pri3");
866
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
867
"pfc_pri3_rx_transitions", CTLFLAG_RD,
868
&softc->rx_port_stats_ext->pfc_pri3_rx_transitions, "Num times rx transition"
869
"between XON to XOFF and XOFF to XON for pri3");
870
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
871
"pfc_pri4_rx_duration_us", CTLFLAG_RD,
872
&softc->rx_port_stats_ext->pfc_pri4_rx_duration_us, "Time duration in receiving"
873
"between XON to XOFF and XOFF to XON for pri4");
874
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
875
"pfc_pri4_rx_transitions", CTLFLAG_RD,
876
&softc->rx_port_stats_ext->pfc_pri4_rx_transitions, "Num times rx transition"
877
"between XON to XOFF and XOFF to XON for pri4");
878
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
879
"pfc_pri5_rx_duration_us", CTLFLAG_RD,
880
&softc->rx_port_stats_ext->pfc_pri5_rx_duration_us, "Time duration in receiving"
881
"between XON to XOFF and XOFF to XON for pri5");
882
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
883
"pfc_pri5_rx_transitions", CTLFLAG_RD,
884
&softc->rx_port_stats_ext->pfc_pri5_rx_transitions, "Num times rx transition"
885
"between XON to XOFF and XOFF to XON for pri5");
886
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
887
"pfc_pri6_rx_duration_us", CTLFLAG_RD,
888
&softc->rx_port_stats_ext->pfc_pri6_rx_duration_us, "Time duration in receiving"
889
"between XON to XOFF and XOFF to XON for pri6");
890
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
891
"pfc_pri6_rx_transitions", CTLFLAG_RD,
892
&softc->rx_port_stats_ext->pfc_pri6_rx_transitions, "Num times rx transition"
893
"between XON to XOFF and XOFF to XON for pri6");
894
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
895
"pfc_pri7_rx_duration_us", CTLFLAG_RD,
896
&softc->rx_port_stats_ext->pfc_pri7_rx_duration_us, "Time duration in receiving"
897
"between XON to XOFF and XOFF to XON for pri7");
898
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
899
"pfc_pri7_rx_transitions", CTLFLAG_RD,
900
&softc->rx_port_stats_ext->pfc_pri7_rx_transitions, "Num times rx transition"
901
"between XON to XOFF and XOFF to XON for pri7");
902
903
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
904
"rx_bits", CTLFLAG_RD,
905
&softc->rx_port_stats_ext->rx_bits, "total number of received bits");
906
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
907
"rx_buffer_passed_threshold", CTLFLAG_RD,
908
&softc->rx_port_stats_ext->rx_buffer_passed_threshold, "num of events port"
909
"buffer"
910
"was over 85%");
911
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
912
"rx_pcs_symbol_err", CTLFLAG_RD,
913
&softc->rx_port_stats_ext->rx_pcs_symbol_err, "num of symbol errors wasn't"
914
"corrected by FEC");
915
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
916
"rx_corrected_bits", CTLFLAG_RD,
917
&softc->rx_port_stats_ext->rx_corrected_bits, "num of bits corrected by FEC");
918
919
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
920
"rx_discard_bytes_cos0", CTLFLAG_RD,
921
&softc->rx_port_stats_ext->rx_discard_bytes_cos0, "num of rx discard bytes"
922
"count on cos0");
923
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
924
"rx_discard_packets_cos0", CTLFLAG_RD,
925
&softc->rx_port_stats_ext->rx_discard_packets_cos0, "num of rx discard packets"
926
"count on cos0");
927
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
928
"rx_discard_bytes_cos1", CTLFLAG_RD,
929
&softc->rx_port_stats_ext->rx_discard_bytes_cos1, "num of rx discard bytes"
930
"count on cos1");
931
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
932
"rx_discard_packets_cos1", CTLFLAG_RD,
933
&softc->rx_port_stats_ext->rx_discard_packets_cos1, "num of rx discard packets"
934
"count on cos1");
935
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
936
"rx_discard_bytes_cos2", CTLFLAG_RD,
937
&softc->rx_port_stats_ext->rx_discard_bytes_cos2, "num of rx discard bytes"
938
"count on cos2");
939
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
940
"rx_discard_packets_cos2", CTLFLAG_RD,
941
&softc->rx_port_stats_ext->rx_discard_packets_cos2, "num of rx discard packets"
942
"count on cos2");
943
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
944
"rx_discard_bytes_cos3", CTLFLAG_RD,
945
&softc->rx_port_stats_ext->rx_discard_bytes_cos3, "num of rx discard bytes"
946
"count on cos3");
947
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
948
"rx_discard_packets_cos3", CTLFLAG_RD,
949
&softc->rx_port_stats_ext->rx_discard_packets_cos3, "num of rx discard packets"
950
"count on cos3");
951
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
952
"rx_discard_bytes_cos4", CTLFLAG_RD,
953
&softc->rx_port_stats_ext->rx_discard_bytes_cos4, "num of rx discard bytes"
954
"count on cos4");
955
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
956
"rx_discard_packets_cos4", CTLFLAG_RD,
957
&softc->rx_port_stats_ext->rx_discard_packets_cos4, "num of rx discard packets"
958
"count on cos4");
959
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
960
"rx_discard_bytes_cos5", CTLFLAG_RD,
961
&softc->rx_port_stats_ext->rx_discard_bytes_cos5, "num of rx discard bytes"
962
"count on cos5");
963
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
964
"rx_discard_packets_cos5", CTLFLAG_RD,
965
&softc->rx_port_stats_ext->rx_discard_packets_cos5, "num of rx discard packets"
966
"count on cos5");
967
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
968
"rx_discard_bytes_cos6", CTLFLAG_RD,
969
&softc->rx_port_stats_ext->rx_discard_bytes_cos6, "num of rx discard bytes"
970
"count on cos6");
971
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
972
"rx_discard_packets_cos6", CTLFLAG_RD,
973
&softc->rx_port_stats_ext->rx_discard_packets_cos6, "num of rx discard packets"
974
"count on cos6");
975
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
976
"rx_discard_bytes_cos7", CTLFLAG_RD,
977
&softc->rx_port_stats_ext->rx_discard_bytes_cos7, "num of rx discard bytes"
978
"count on cos7");
979
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
980
"rx_discard_packets_cos7", CTLFLAG_RD,
981
&softc->rx_port_stats_ext->rx_discard_packets_cos7, "num of rx discard packets"
982
"count on cos7");
983
}
984
985
986
return 0;
987
}
988
989
int
990
bnxt_create_rx_sysctls(struct bnxt_softc *softc, int rxr)
991
{
992
struct sysctl_oid *oid;
993
struct ctx_hw_stats *rx_stats = (void *)softc->rx_stats[rxr].idi_vaddr;
994
char name[32];
995
char desc[64];
996
997
sprintf(name, "rxq%d", rxr);
998
sprintf(desc, "receive queue %d", rxr);
999
oid = SYSCTL_ADD_NODE(&softc->hw_stats,
1000
SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name,
1001
CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc);
1002
if (!oid)
1003
return ENOMEM;
1004
1005
if (BNXT_CHIP_P5_PLUS(softc))
1006
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1007
"nq_num_ints", CTLFLAG_RD, &softc->nq_rings[rxr].int_count,
1008
"Num Interrupts");
1009
else
1010
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1011
"rq_num_ints", CTLFLAG_RD, &softc->rx_cp_rings[rxr].int_count,
1012
"Num Interrupts");
1013
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1014
"ucast_pkts", CTLFLAG_RD, &rx_stats->rx_ucast_pkts,
1015
"unicast packets received");
1016
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1017
"mcast_pkts", CTLFLAG_RD, &rx_stats->rx_mcast_pkts,
1018
"multicast packets received");
1019
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1020
"bcast_pkts", CTLFLAG_RD, &rx_stats->rx_bcast_pkts,
1021
"broadcast packets received");
1022
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1023
"discard_pkts", CTLFLAG_RD,
1024
&rx_stats->rx_discard_pkts, "discarded receive packets");
1025
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1026
"error_pkts", CTLFLAG_RD, &rx_stats->rx_error_pkts,
1027
"Error receive packets");
1028
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1029
"ucast_bytes", CTLFLAG_RD, &rx_stats->rx_ucast_bytes,
1030
"unicast bytes received");
1031
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1032
"mcast_bytes", CTLFLAG_RD, &rx_stats->rx_mcast_bytes,
1033
"multicast bytes received");
1034
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1035
"bcast_bytes", CTLFLAG_RD, &rx_stats->rx_bcast_bytes,
1036
"broadcast bytes received");
1037
1038
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1039
"tpa_pkts", CTLFLAG_RD, &rx_stats->tpa_pkts,
1040
"TPA packets");
1041
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1042
"tpa_bytes", CTLFLAG_RD, &rx_stats->tpa_bytes,
1043
"TPA bytes");
1044
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1045
"tpa_events", CTLFLAG_RD, &rx_stats->tpa_events,
1046
"TPA events");
1047
SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
1048
"tpa_aborts", CTLFLAG_RD, &rx_stats->tpa_aborts,
1049
"TPA aborts");
1050
1051
return 0;
1052
}
1053
1054
static char *bnxt_chip_type[] = {
1055
"ASIC",
1056
"FPGA",
1057
"Palladium",
1058
"Unknown"
1059
};
1060
#define MAX_CHIP_TYPE 3
1061
1062
static char *bnxt_parse_pkglog(int desired_field, uint8_t *data, size_t datalen)
1063
{
1064
char *retval = NULL;
1065
char *p;
1066
char *value;
1067
int field = 0;
1068
1069
if (datalen < 1)
1070
return NULL;
1071
/* null-terminate the log data (removing last '\n'): */
1072
data[datalen - 1] = 0;
1073
for (p = data; *p != 0; p++) {
1074
field = 0;
1075
retval = NULL;
1076
while (*p != 0 && *p != '\n') {
1077
value = p;
1078
while (*p != 0 && *p != '\t' && *p != '\n')
1079
p++;
1080
if (field == desired_field)
1081
retval = value;
1082
if (*p != '\t')
1083
break;
1084
*p = 0;
1085
field++;
1086
p++;
1087
}
1088
if (*p == 0)
1089
break;
1090
*p = 0;
1091
}
1092
return retval;
1093
}
1094
1095
static int
1096
bnxt_package_ver_sysctl(SYSCTL_HANDLER_ARGS)
1097
{
1098
struct bnxt_softc *softc = arg1;
1099
struct iflib_dma_info dma_data;
1100
char *pkglog = NULL;
1101
char *p;
1102
char unk[] = "<unknown>";
1103
char *buf = unk;
1104
int rc;
1105
uint16_t ordinal = BNX_DIR_ORDINAL_FIRST;
1106
uint16_t index;
1107
uint32_t data_len;
1108
1109
rc = bnxt_hwrm_nvm_find_dir_entry(softc, BNX_DIR_TYPE_PKG_LOG,
1110
&ordinal, BNX_DIR_EXT_NONE, &index, false,
1111
HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_EQ,
1112
&data_len, NULL, NULL);
1113
dma_data.idi_vaddr = NULL;
1114
if (rc == 0 && data_len) {
1115
rc = iflib_dma_alloc(softc->ctx, data_len, &dma_data,
1116
BUS_DMA_NOWAIT);
1117
if (rc == 0) {
1118
rc = bnxt_hwrm_nvm_read(softc, index, 0, data_len,
1119
&dma_data);
1120
if (rc == 0) {
1121
pkglog = dma_data.idi_vaddr;
1122
p = bnxt_parse_pkglog(BNX_PKG_LOG_FIELD_IDX_PKG_VERSION, pkglog, data_len);
1123
if (p && *p != 0 && isdigit(*p))
1124
buf = p;
1125
}
1126
} else
1127
dma_data.idi_vaddr = NULL;
1128
}
1129
1130
rc = sysctl_handle_string(oidp, buf, 0, req);
1131
if (dma_data.idi_vaddr)
1132
iflib_dma_free(&dma_data);
1133
return rc;
1134
}
1135
1136
static int
1137
bnxt_hwrm_min_ver_sysctl(SYSCTL_HANDLER_ARGS)
1138
{
1139
struct bnxt_softc *softc = arg1;
1140
char buf[16];
1141
uint8_t newver[3];
1142
int rc;
1143
1144
sprintf(buf, "%hhu.%hhu.%hhu", softc->ver_info->hwrm_min_major,
1145
softc->ver_info->hwrm_min_minor, softc->ver_info->hwrm_min_update);
1146
1147
rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
1148
if (rc || req->newptr == NULL)
1149
return rc;
1150
if (sscanf(buf, "%hhu.%hhu.%hhu%*c", &newver[0], &newver[1],
1151
&newver[2]) != 3)
1152
return EINVAL;
1153
softc->ver_info->hwrm_min_major = newver[0];
1154
softc->ver_info->hwrm_min_minor = newver[1];
1155
softc->ver_info->hwrm_min_update = newver[2];
1156
bnxt_check_hwrm_version(softc);
1157
1158
return rc;
1159
}
1160
1161
int
1162
bnxt_create_ver_sysctls(struct bnxt_softc *softc)
1163
{
1164
struct bnxt_ver_info *vi = softc->ver_info;
1165
struct sysctl_oid *oid = vi->ver_oid;
1166
1167
if (!oid)
1168
return ENOMEM;
1169
1170
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1171
"hwrm_if", CTLFLAG_RD, vi->hwrm_if_ver, 0,
1172
"HWRM interface version");
1173
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1174
"driver_hwrm_if", CTLFLAG_RD, vi->driver_hwrm_if_ver, 0,
1175
"HWRM firmware version");
1176
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1177
"mgmt_fw", CTLFLAG_RD, vi->mgmt_fw_ver, 0,
1178
"management firmware version");
1179
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1180
"netctrl_fw", CTLFLAG_RD, vi->netctrl_fw_ver, 0,
1181
"network control firmware version");
1182
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1183
"roce_fw", CTLFLAG_RD, vi->roce_fw_ver, 0,
1184
"RoCE firmware version");
1185
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1186
"fw_ver", CTLFLAG_RD, vi->fw_ver_str, 0,
1187
"Firmware version");
1188
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1189
"phy", CTLFLAG_RD, vi->phy_ver, 0,
1190
"PHY version");
1191
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1192
"hwrm_fw_name", CTLFLAG_RD, vi->hwrm_fw_name, 0,
1193
"HWRM firmware name");
1194
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1195
"mgmt_fw_name", CTLFLAG_RD, vi->mgmt_fw_name, 0,
1196
"management firmware name");
1197
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1198
"netctrl_fw_name", CTLFLAG_RD, vi->netctrl_fw_name, 0,
1199
"network control firmware name");
1200
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1201
"roce_fw_name", CTLFLAG_RD, vi->roce_fw_name, 0,
1202
"RoCE firmware name");
1203
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1204
"phy_vendor", CTLFLAG_RD, vi->phy_vendor, 0,
1205
"PHY vendor name");
1206
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1207
"phy_partnumber", CTLFLAG_RD, vi->phy_partnumber, 0,
1208
"PHY vendor part number");
1209
SYSCTL_ADD_U16(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1210
"chip_num", CTLFLAG_RD, &vi->chip_num, 0, "chip number");
1211
SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1212
"chip_rev", CTLFLAG_RD, &vi->chip_rev, 0, "chip revision");
1213
SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1214
"chip_metal", CTLFLAG_RD, &vi->chip_metal, 0, "chip metal number");
1215
SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1216
"chip_bond_id", CTLFLAG_RD, &vi->chip_bond_id, 0,
1217
"chip bond id");
1218
SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1219
"chip_type", CTLFLAG_RD, vi->chip_type > MAX_CHIP_TYPE ?
1220
bnxt_chip_type[MAX_CHIP_TYPE] : bnxt_chip_type[vi->chip_type], 0,
1221
"RoCE firmware name");
1222
SYSCTL_ADD_PROC(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1223
"package_ver", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
1224
softc, 0, bnxt_package_ver_sysctl, "A",
1225
"currently installed package version");
1226
SYSCTL_ADD_PROC(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1227
"hwrm_min_ver", CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
1228
softc, 0, bnxt_hwrm_min_ver_sysctl, "A",
1229
"minimum hwrm API vesion to support");
1230
1231
return 0;
1232
}
1233
1234
int
1235
bnxt_create_nvram_sysctls(struct bnxt_nvram_info *ni)
1236
{
1237
struct sysctl_oid *oid = ni->nvm_oid;
1238
1239
if (!oid)
1240
return ENOMEM;
1241
1242
SYSCTL_ADD_U16(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1243
"mfg_id", CTLFLAG_RD, &ni->mfg_id, 0, "manufacturer id");
1244
SYSCTL_ADD_U16(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1245
"device_id", CTLFLAG_RD, &ni->device_id, 0, "device id");
1246
SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1247
"sector_size", CTLFLAG_RD, &ni->sector_size, 0, "sector size");
1248
SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1249
"size", CTLFLAG_RD, &ni->size, 0, "nvram total size");
1250
SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1251
"reserved_size", CTLFLAG_RD, &ni->reserved_size, 0,
1252
"total reserved space");
1253
SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1254
"available_size", CTLFLAG_RD, &ni->available_size, 0,
1255
"total available space");
1256
1257
return 0;
1258
}
1259
1260
static int
1261
bnxt_rss_key_sysctl(SYSCTL_HANDLER_ARGS)
1262
{
1263
struct bnxt_softc *softc = arg1;
1264
char buf[HW_HASH_KEY_SIZE*2+1] = {0};
1265
char *p;
1266
int i;
1267
int rc;
1268
1269
for (p = buf, i=0; i<HW_HASH_KEY_SIZE; i++)
1270
p += sprintf(p, "%02x", softc->vnic_info.rss_hash_key[i]);
1271
1272
rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
1273
if (rc || req->newptr == NULL)
1274
return rc;
1275
1276
if (strspn(buf, "0123456789abcdefABCDEF") != (HW_HASH_KEY_SIZE * 2))
1277
return EINVAL;
1278
1279
for (p = buf, i=0; i<HW_HASH_KEY_SIZE; i++) {
1280
if (sscanf(p, "%02hhx", &softc->vnic_info.rss_hash_key[i]) != 1)
1281
return EINVAL;
1282
p += 2;
1283
}
1284
1285
if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)
1286
bnxt_hwrm_rss_cfg(softc, &softc->vnic_info,
1287
softc->vnic_info.rss_hash_type);
1288
1289
return rc;
1290
}
1291
1292
static const char *bnxt_hash_types[] = {"ipv4", "tcp_ipv4", "udp_ipv4", "ipv6",
1293
"tcp_ipv6", "udp_ipv6", NULL};
1294
1295
static int bnxt_get_rss_type_str_bit(char *str)
1296
{
1297
int i;
1298
1299
for (i=0; bnxt_hash_types[i]; i++)
1300
if (strcmp(bnxt_hash_types[i], str) == 0)
1301
return i;
1302
1303
return -1;
1304
}
1305
1306
static int
1307
bnxt_rss_type_sysctl(SYSCTL_HANDLER_ARGS)
1308
{
1309
struct bnxt_softc *softc = arg1;
1310
char buf[256] = {0};
1311
char *p;
1312
char *next;
1313
int rc;
1314
int type;
1315
int bit;
1316
1317
for (type = softc->vnic_info.rss_hash_type; type;
1318
type &= ~(1<<bit)) {
1319
bit = ffs(type) - 1;
1320
if (bit >= sizeof(bnxt_hash_types) / sizeof(const char *))
1321
continue;
1322
if (type != softc->vnic_info.rss_hash_type)
1323
strcat(buf, ",");
1324
strcat(buf, bnxt_hash_types[bit]);
1325
}
1326
1327
rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
1328
if (rc || req->newptr == NULL)
1329
return rc;
1330
1331
for (type = 0, next = buf, p = strsep(&next, " ,"); p;
1332
p = strsep(&next, " ,")) {
1333
bit = bnxt_get_rss_type_str_bit(p);
1334
if (bit == -1)
1335
return EINVAL;
1336
type |= 1<<bit;
1337
}
1338
if (type != softc->vnic_info.rss_hash_type) {
1339
softc->vnic_info.rss_hash_type = type;
1340
if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)
1341
bnxt_hwrm_rss_cfg(softc, &softc->vnic_info,
1342
softc->vnic_info.rss_hash_type);
1343
}
1344
1345
return rc;
1346
}
1347
1348
static int
1349
bnxt_rx_stall_sysctl(SYSCTL_HANDLER_ARGS) {
1350
struct bnxt_softc *softc = arg1;
1351
int rc;
1352
int val;
1353
1354
if (softc == NULL)
1355
return EBUSY;
1356
1357
val = (bool)(softc->vnic_info.flags & BNXT_VNIC_FLAG_BD_STALL);
1358
rc = sysctl_handle_int(oidp, &val, 0, req);
1359
if (rc || !req->newptr)
1360
return rc;
1361
1362
if (val)
1363
softc->vnic_info.flags |= BNXT_VNIC_FLAG_BD_STALL;
1364
else
1365
softc->vnic_info.flags &= ~BNXT_VNIC_FLAG_BD_STALL;
1366
1367
if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)
1368
rc = bnxt_hwrm_vnic_cfg(softc, &softc->vnic_info);
1369
1370
return rc;
1371
}
1372
1373
static int
1374
bnxt_vlan_strip_sysctl(SYSCTL_HANDLER_ARGS) {
1375
struct bnxt_softc *softc = arg1;
1376
int rc;
1377
int val;
1378
1379
if (softc == NULL)
1380
return EBUSY;
1381
1382
val = (bool)(softc->vnic_info.flags & BNXT_VNIC_FLAG_VLAN_STRIP);
1383
rc = sysctl_handle_int(oidp, &val, 0, req);
1384
if (rc || !req->newptr)
1385
return rc;
1386
1387
if (val)
1388
softc->vnic_info.flags |= BNXT_VNIC_FLAG_VLAN_STRIP;
1389
else
1390
softc->vnic_info.flags &= ~BNXT_VNIC_FLAG_VLAN_STRIP;
1391
1392
if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)
1393
rc = bnxt_hwrm_vnic_cfg(softc, &softc->vnic_info);
1394
1395
return rc;
1396
}
1397
1398
static int
1399
bnxt_set_coal_rx_usecs(SYSCTL_HANDLER_ARGS) {
1400
struct bnxt_softc *softc = arg1;
1401
int rc;
1402
int val;
1403
1404
if (softc == NULL)
1405
return EBUSY;
1406
1407
val = softc->rx_coal_usecs;
1408
rc = sysctl_handle_int(oidp, &val, 0, req);
1409
if (rc || !req->newptr)
1410
return rc;
1411
1412
softc->rx_coal_usecs = val;
1413
rc = bnxt_hwrm_set_coal(softc);
1414
1415
return rc;
1416
}
1417
1418
static int
1419
bnxt_set_coal_rx_frames(SYSCTL_HANDLER_ARGS) {
1420
struct bnxt_softc *softc = arg1;
1421
int rc;
1422
int val;
1423
1424
if (softc == NULL)
1425
return EBUSY;
1426
1427
val = softc->rx_coal_frames;
1428
rc = sysctl_handle_int(oidp, &val, 0, req);
1429
if (rc || !req->newptr)
1430
return rc;
1431
1432
softc->rx_coal_frames = val;
1433
rc = bnxt_hwrm_set_coal(softc);
1434
1435
return rc;
1436
}
1437
1438
static int
1439
bnxt_set_coal_rx_usecs_irq(SYSCTL_HANDLER_ARGS) {
1440
struct bnxt_softc *softc = arg1;
1441
int rc;
1442
int val;
1443
1444
if (softc == NULL)
1445
return EBUSY;
1446
1447
val = softc->rx_coal_usecs_irq;
1448
rc = sysctl_handle_int(oidp, &val, 0, req);
1449
if (rc || !req->newptr)
1450
return rc;
1451
1452
softc->rx_coal_usecs_irq = val;
1453
rc = bnxt_hwrm_set_coal(softc);
1454
1455
return rc;
1456
}
1457
1458
static int
1459
bnxt_set_coal_rx_frames_irq(SYSCTL_HANDLER_ARGS) {
1460
struct bnxt_softc *softc = arg1;
1461
int rc;
1462
int val;
1463
1464
if (softc == NULL)
1465
return EBUSY;
1466
1467
val = softc->rx_coal_frames_irq;
1468
rc = sysctl_handle_int(oidp, &val, 0, req);
1469
if (rc || !req->newptr)
1470
return rc;
1471
1472
softc->rx_coal_frames_irq = val;
1473
rc = bnxt_hwrm_set_coal(softc);
1474
1475
return rc;
1476
}
1477
1478
static int
1479
bnxt_set_coal_tx_usecs(SYSCTL_HANDLER_ARGS) {
1480
struct bnxt_softc *softc = arg1;
1481
int rc;
1482
int val;
1483
1484
if (softc == NULL)
1485
return EBUSY;
1486
1487
val = softc->tx_coal_usecs;
1488
rc = sysctl_handle_int(oidp, &val, 0, req);
1489
if (rc || !req->newptr)
1490
return rc;
1491
1492
softc->tx_coal_usecs = val;
1493
rc = bnxt_hwrm_set_coal(softc);
1494
1495
return rc;
1496
}
1497
1498
static int
1499
bnxt_set_coal_tx_frames(SYSCTL_HANDLER_ARGS) {
1500
struct bnxt_softc *softc = arg1;
1501
int rc;
1502
int val;
1503
1504
if (softc == NULL)
1505
return EBUSY;
1506
1507
val = softc->tx_coal_frames;
1508
rc = sysctl_handle_int(oidp, &val, 0, req);
1509
if (rc || !req->newptr)
1510
return rc;
1511
1512
softc->tx_coal_frames = val;
1513
rc = bnxt_hwrm_set_coal(softc);
1514
1515
return rc;
1516
}
1517
1518
static int
1519
bnxt_set_coal_tx_usecs_irq(SYSCTL_HANDLER_ARGS) {
1520
struct bnxt_softc *softc = arg1;
1521
int rc;
1522
int val;
1523
1524
if (softc == NULL)
1525
return EBUSY;
1526
1527
val = softc->tx_coal_usecs_irq;
1528
rc = sysctl_handle_int(oidp, &val, 0, req);
1529
if (rc || !req->newptr)
1530
return rc;
1531
1532
softc->tx_coal_usecs_irq = val;
1533
rc = bnxt_hwrm_set_coal(softc);
1534
1535
return rc;
1536
}
1537
1538
static int
1539
bnxt_set_coal_tx_frames_irq(SYSCTL_HANDLER_ARGS) {
1540
struct bnxt_softc *softc = arg1;
1541
int rc;
1542
int val;
1543
1544
if (softc == NULL)
1545
return EBUSY;
1546
1547
val = softc->tx_coal_frames_irq;
1548
rc = sysctl_handle_int(oidp, &val, 0, req);
1549
if (rc || !req->newptr)
1550
return rc;
1551
1552
softc->tx_coal_frames_irq = val;
1553
rc = bnxt_hwrm_set_coal(softc);
1554
1555
return rc;
1556
}
1557
1558
static
1559
void simulate_reset(struct bnxt_softc *bp, char *fwcli_string)
1560
{
1561
struct hwrm_dbg_fw_cli_input req = {0};
1562
int rc = 0;
1563
1564
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_DBG_FW_CLI);
1565
req.cmpl_ring = -1;
1566
req.target_id = -1;
1567
req.cli_cmd_len = strlen(fwcli_string);
1568
req.host_buf_len = 64 * 1024;
1569
strcpy((char *)req.cli_cmd, fwcli_string);
1570
1571
BNXT_HWRM_LOCK(bp);
1572
rc = _hwrm_send_message(bp, &req, sizeof(req));
1573
if (rc) {
1574
device_printf(bp->dev, " Manual FW fault failed, rc:%x\n", rc);
1575
}
1576
BNXT_HWRM_UNLOCK(bp);
1577
}
1578
1579
static int
1580
bnxt_reset_ctrl(SYSCTL_HANDLER_ARGS) {
1581
struct bnxt_softc *softc = arg1;
1582
int rc = 0;
1583
char buf[50] = {0};
1584
1585
if (softc == NULL)
1586
return EBUSY;
1587
1588
rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
1589
if (rc || req->newptr == NULL)
1590
return rc;
1591
1592
if (BNXT_CHIP_P5_PLUS(softc))
1593
simulate_reset(softc, buf);
1594
1595
return rc;
1596
}
1597
1598
int
1599
bnxt_create_config_sysctls_pre(struct bnxt_softc *softc)
1600
{
1601
struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(softc->dev);
1602
struct sysctl_oid_list *children;
1603
1604
children = SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev));
1605
1606
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rss_key",
1607
CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1608
bnxt_rss_key_sysctl, "A", "RSS key");
1609
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rss_type",
1610
CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1611
bnxt_rss_type_sysctl, "A", "RSS type bits");
1612
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rx_stall",
1613
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1614
bnxt_rx_stall_sysctl, "I",
1615
"buffer rx packets in hardware until the host posts new buffers");
1616
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "vlan_strip",
1617
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1618
bnxt_vlan_strip_sysctl, "I", "strip VLAN tag in the RX path");
1619
SYSCTL_ADD_CONST_STRING(ctx, children, OID_AUTO, "if_name", CTLFLAG_RD,
1620
if_name(iflib_get_ifp(softc->ctx)), "interface name");
1621
1622
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_usecs",
1623
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1624
bnxt_set_coal_rx_usecs, "I", "interrupt coalescing Rx Usecs");
1625
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_frames",
1626
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1627
bnxt_set_coal_rx_frames, "I", "interrupt coalescing Rx Frames");
1628
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_usecs_irq",
1629
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1630
bnxt_set_coal_rx_usecs_irq, "I",
1631
"interrupt coalescing Rx Usecs IRQ");
1632
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_frames_irq",
1633
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1634
bnxt_set_coal_rx_frames_irq, "I",
1635
"interrupt coalescing Rx Frames IRQ");
1636
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_usecs",
1637
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1638
bnxt_set_coal_tx_usecs, "I", "interrupt coalescing Tx Usces");
1639
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_frames",
1640
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1641
bnxt_set_coal_tx_frames, "I", "interrupt coalescing Tx Frames");
1642
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_usecs_irq",
1643
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1644
bnxt_set_coal_tx_usecs_irq, "I",
1645
"interrupt coalescing Tx Usecs IRQ");
1646
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_frames_irq",
1647
CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1648
bnxt_set_coal_tx_frames_irq, "I",
1649
"interrupt coalescing Tx Frames IRQ");
1650
SYSCTL_ADD_U32(ctx, children, OID_AUTO, "flags", CTLFLAG_RD,
1651
&softc->flags, 0, "flags");
1652
SYSCTL_ADD_U64(ctx, children, OID_AUTO, "fw_cap", CTLFLAG_RD,
1653
&softc->fw_cap, 0, "FW caps");
1654
1655
SYSCTL_ADD_PROC(ctx, children, OID_AUTO,
1656
"reset_ctrl", CTLTYPE_STRING | CTLFLAG_RWTUN, softc,
1657
0, bnxt_reset_ctrl, "A",
1658
"Issue controller reset: 0 / 1");
1659
return 0;
1660
}
1661
1662
#define BNXT_HW_LRO_FN(fn_name, arg) \
1663
static int \
1664
fn_name(SYSCTL_HANDLER_ARGS) { \
1665
struct bnxt_softc *softc = arg1; \
1666
int rc; \
1667
int val; \
1668
\
1669
if (softc == NULL) \
1670
return EBUSY; \
1671
\
1672
val = softc->hw_lro.arg; \
1673
rc = sysctl_handle_int(oidp, &val, 0, req); \
1674
if (rc || !req->newptr) \
1675
return rc; \
1676
\
1677
if ((if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)) \
1678
return EBUSY; \
1679
\
1680
if (!(softc->flags & BNXT_FLAG_TPA)) \
1681
return EINVAL; \
1682
\
1683
softc->hw_lro.arg = val; \
1684
bnxt_validate_hw_lro_settings(softc); \
1685
rc = bnxt_hwrm_vnic_tpa_cfg(softc); \
1686
\
1687
return rc; \
1688
}
1689
1690
BNXT_HW_LRO_FN(bnxt_hw_lro_enable_disable, enable)
1691
BNXT_HW_LRO_FN(bnxt_hw_lro_set_mode, is_mode_gro)
1692
BNXT_HW_LRO_FN(bnxt_hw_lro_set_max_agg_segs, max_agg_segs)
1693
BNXT_HW_LRO_FN(bnxt_hw_lro_set_max_aggs, max_aggs)
1694
BNXT_HW_LRO_FN(bnxt_hw_lro_set_min_agg_len, min_agg_len)
1695
1696
#define BNXT_FLOW_CTRL_FN(fn_name, arg) \
1697
static int \
1698
fn_name(SYSCTL_HANDLER_ARGS) { \
1699
struct bnxt_softc *softc = arg1; \
1700
int rc; \
1701
int val; \
1702
\
1703
if (softc == NULL) \
1704
return EBUSY; \
1705
\
1706
val = softc->link_info.flow_ctrl.arg; \
1707
rc = sysctl_handle_int(oidp, &val, 0, req); \
1708
if (rc || !req->newptr) \
1709
return rc; \
1710
\
1711
if (val) \
1712
val = 1; \
1713
\
1714
if (softc->link_info.flow_ctrl.arg != val) { \
1715
softc->link_info.flow_ctrl.arg = val; \
1716
rc = bnxt_hwrm_set_link_setting(softc, true, false, false);\
1717
rc = bnxt_hwrm_port_phy_qcfg(softc); \
1718
} \
1719
\
1720
return rc; \
1721
}
1722
1723
BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_tx, tx)
1724
BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_rx, rx)
1725
BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_autoneg, autoneg)
1726
int
1727
bnxt_create_pause_fc_sysctls(struct bnxt_softc *softc)
1728
{
1729
struct sysctl_oid *oid = softc->flow_ctrl_oid;
1730
1731
if (!oid)
1732
return ENOMEM;
1733
1734
SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1735
"tx", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1736
bnxt_flow_ctrl_tx, "A", "Enable or Disable Tx Flow Ctrl: 0 / 1");
1737
1738
SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1739
"rx", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1740
bnxt_flow_ctrl_rx, "A", "Enable or Disable Tx Flow Ctrl: 0 / 1");
1741
1742
SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1743
"autoneg", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc,
1744
0, bnxt_flow_ctrl_autoneg, "A",
1745
"Enable or Disable Autoneg Flow Ctrl: 0 / 1");
1746
1747
return 0;
1748
}
1749
1750
int
1751
bnxt_create_hw_lro_sysctls(struct bnxt_softc *softc)
1752
{
1753
struct sysctl_oid *oid = softc->hw_lro_oid;
1754
1755
if (!oid)
1756
return ENOMEM;
1757
1758
SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1759
"enable", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc,
1760
0, bnxt_hw_lro_enable_disable, "A",
1761
"Enable or Disable HW LRO: 0 / 1");
1762
1763
SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1764
"gro_mode", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc,
1765
0, bnxt_hw_lro_set_mode, "A",
1766
"Set mode: 1 = GRO mode, 0 = RSC mode");
1767
1768
SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1769
"max_agg_segs", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
1770
softc, 0, bnxt_hw_lro_set_max_agg_segs, "A",
1771
"Set Max Agg Seg Value (unit is Log2): "
1772
"0 (= 1 seg) / 1 (= 2 segs) / ... / 31 (= 2^31 segs)");
1773
1774
SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1775
"max_aggs", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
1776
softc, 0, bnxt_hw_lro_set_max_aggs, "A",
1777
"Set Max Aggs Value (unit is Log2): "
1778
"0 (= 1 agg) / 1 (= 2 aggs) / ... / 7 (= 2^7 segs)");
1779
1780
SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1781
"min_agg_len", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
1782
softc, 0, bnxt_hw_lro_set_min_agg_len, "A",
1783
"Min Agg Len: 1 to 9000");
1784
1785
return 0;
1786
}
1787
1788
static int
1789
bnxt_dcb_dcbx_cap(SYSCTL_HANDLER_ARGS)
1790
{
1791
struct bnxt_softc *softc = arg1;
1792
int val;
1793
int rc;
1794
1795
val = bnxt_dcb_getdcbx(softc);
1796
rc = sysctl_handle_int(oidp, &val, 0, req);
1797
if (rc || !req->newptr)
1798
return rc;
1799
1800
bnxt_dcb_setdcbx(softc, val);
1801
1802
return rc;
1803
}
1804
1805
static char
1806
bnxt_ets_tsa_to_str(struct bnxt_softc *softc, uint32_t tc)
1807
{
1808
switch (softc->ieee_ets->tc_tsa[tc]) {
1809
case BNXT_IEEE_8021QAZ_TSA_STRICT:
1810
return 's';
1811
case BNXT_IEEE_8021QAZ_TSA_ETS:
1812
return 'e';
1813
default:
1814
return 'X';
1815
1816
}
1817
}
1818
1819
static uint32_t
1820
bnxt_ets_str_to_tsa(char tsa_str)
1821
{
1822
switch (tsa_str) {
1823
case 's':
1824
return BNXT_IEEE_8021QAZ_TSA_STRICT;
1825
case 'e':
1826
return BNXT_IEEE_8021QAZ_TSA_ETS;
1827
default:
1828
return -1;
1829
}
1830
}
1831
1832
static int
1833
bnxt_ets_get_val(struct bnxt_softc *softc, uint32_t type, uint32_t tc)
1834
{
1835
switch (type) {
1836
case BNXT_TYPE_ETS_TSA:
1837
if (softc->ieee_ets)
1838
return softc->ieee_ets->tc_tsa[tc];
1839
break;
1840
case BNXT_TYPE_ETS_PRI2TC:
1841
if (softc->ieee_ets)
1842
return softc->ieee_ets->prio_tc[tc];
1843
break;
1844
case BNXT_TYPE_ETS_TCBW:
1845
if (softc->ieee_ets)
1846
return softc->ieee_ets->tc_tx_bw[tc];
1847
break;
1848
default:
1849
break;
1850
}
1851
1852
return -1;
1853
}
1854
1855
static void
1856
bnxt_pfc_get_string(struct bnxt_softc *softc, char *buf, struct bnxt_ieee_pfc *pfc)
1857
{
1858
uint32_t i;
1859
bool found = false;
1860
1861
for (i = 0; i < BNXT_IEEE_8021QAZ_MAX_TCS; i++) {
1862
if (pfc->pfc_en & (1 << i)) {
1863
if (found)
1864
buf += sprintf(buf, ", ");
1865
buf += sprintf(buf, "%d", i);
1866
found = true;
1867
}
1868
}
1869
1870
if (!found)
1871
buf += sprintf(buf, "none");
1872
}
1873
1874
static const char *bnxt_get_tlv_selector_str(uint8_t selector)
1875
{
1876
switch (selector) {
1877
case BNXT_IEEE_8021QAZ_APP_SEL_ETHERTYPE:
1878
return "Ethertype";
1879
case BNXT_IEEE_8021QAZ_APP_SEL_DGRAM:
1880
return "UDP or DCCP";
1881
case BNXT_IEEE_8021QAZ_APP_SEL_DSCP:
1882
return "DSCP";
1883
default:
1884
return "Unknown";
1885
}
1886
}
1887
1888
static void
1889
bnxt_app_tlv_get_string(struct sbuf *sb, struct bnxt_dcb_app *app, int num)
1890
{
1891
int i;
1892
1893
if (num == 0) {
1894
sbuf_printf(sb, " None");
1895
return;
1896
}
1897
1898
sbuf_putc(sb, '\n');
1899
for (i = 0; i < num; i++) {
1900
sbuf_printf(sb, "\tAPP#%0d:\tpri: %d,\tSel: %d,\t%s: %d\n",
1901
i,
1902
app[i].priority,
1903
app[i].selector,
1904
bnxt_get_tlv_selector_str(app[i].selector),
1905
app[i].protocol);
1906
}
1907
}
1908
1909
static void
1910
bnxt_ets_get_string(struct bnxt_softc *softc, char *buf)
1911
{
1912
uint32_t type, i;
1913
1914
type = BNXT_TYPE_ETS_TSA;
1915
for (type = 0; type < BNXT_TYPE_ETS_MAX; type++) {
1916
for (i = 0; i < BNXT_IEEE_8021QAZ_MAX_TCS; i++) {
1917
if (i == 0)
1918
buf += sprintf(buf, "%s:", BNXT_ETS_TYPE_STR[type]);
1919
1920
if (!softc->ieee_ets)
1921
buf += sprintf(buf, "x");
1922
else if (type == BNXT_TYPE_ETS_TSA)
1923
buf += sprintf(buf, "%c", bnxt_ets_tsa_to_str(softc, i));
1924
else
1925
buf += sprintf(buf, "%d", bnxt_ets_get_val(softc, type, i));
1926
1927
if (i != BNXT_IEEE_8021QAZ_MAX_TCS - 1)
1928
buf += sprintf(buf, ",");
1929
}
1930
if (type != BNXT_TYPE_ETS_MAX - 1)
1931
buf += sprintf(buf, "#");
1932
}
1933
}
1934
1935
static int
1936
bnxt_dcb_list_app(SYSCTL_HANDLER_ARGS)
1937
{
1938
struct sbuf sb;
1939
struct bnxt_dcb_app app[128] = {0};
1940
struct bnxt_softc *softc = arg1;
1941
int rc, num_inputs = 0;
1942
1943
sbuf_new_for_sysctl(&sb, NULL, 128, req);
1944
bnxt_dcb_ieee_listapp(softc, app, nitems(app), &num_inputs);
1945
bnxt_app_tlv_get_string(&sb, app, num_inputs);
1946
rc = sbuf_finish(&sb);
1947
sbuf_delete(&sb);
1948
return rc;
1949
}
1950
1951
static int
1952
bnxt_dcb_del_app(SYSCTL_HANDLER_ARGS)
1953
{
1954
struct bnxt_softc *softc = arg1;
1955
struct bnxt_dcb_app app = {0};
1956
char buf[256] = {0};
1957
int rc, num_inputs;
1958
1959
rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
1960
if (rc || req->newptr == NULL)
1961
return rc;
1962
1963
num_inputs = sscanf(buf, "%hhu,%hhu,%hd", &app.priority, &app.selector, &app.protocol);
1964
1965
if (num_inputs != 3) {
1966
device_printf(softc->dev,
1967
"Invalid app tlv syntax, inputs = %d\n", num_inputs);
1968
return EINVAL;
1969
}
1970
1971
bnxt_dcb_ieee_delapp(softc, &app);
1972
1973
return rc;
1974
}
1975
static int
1976
bnxt_dcb_set_app(SYSCTL_HANDLER_ARGS)
1977
{
1978
struct bnxt_softc *softc = arg1;
1979
struct bnxt_dcb_app app = {0};
1980
char buf[256] = {0};
1981
int rc, num_inputs;
1982
1983
rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
1984
if (rc || req->newptr == NULL)
1985
return rc;
1986
1987
num_inputs = sscanf(buf, "%hhu,%hhu,%hd", &app.priority, &app.selector, &app.protocol);
1988
1989
if (num_inputs != 3) {
1990
device_printf(softc->dev,
1991
"Invalid app tlv syntax, inputs = %d\n", num_inputs);
1992
return EINVAL;
1993
}
1994
1995
bnxt_dcb_ieee_setapp(softc, &app);
1996
1997
return rc;
1998
}
1999
2000
static int
2001
bnxt_dcb_pfc(SYSCTL_HANDLER_ARGS)
2002
{
2003
struct bnxt_softc *softc = arg1;
2004
struct bnxt_ieee_pfc pfc = {0};
2005
int rc, i, num_inputs;
2006
char buf[256] = {0};
2007
int pri_mask = 0;
2008
char pri[8];
2009
2010
rc = bnxt_dcb_ieee_getpfc(softc, &pfc);
2011
if (!rc)
2012
bnxt_pfc_get_string(softc, buf, &pfc);
2013
else
2014
sprintf(buf, "## getpfc failed with error %d ##", rc);
2015
2016
rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
2017
if (rc || req->newptr == NULL)
2018
return rc;
2019
2020
/* Check for 'none' string first */
2021
if (sscanf(buf, "%s", buf) == 1) {
2022
if (strncmp(buf, "none", 8) == 0) {
2023
goto configure;
2024
}
2025
}
2026
num_inputs = sscanf(buf, "%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu",
2027
&pri[0], &pri[1], &pri[2], &pri[3], &pri[4],
2028
&pri[5], &pri[6], &pri[7]);
2029
2030
if (num_inputs < 1 || num_inputs > 8) {
2031
device_printf(softc->dev,
2032
"Invalid pfc syntax, inputs = %d\n", num_inputs);
2033
return EINVAL;
2034
}
2035
2036
for (i = 0; i < num_inputs; i++) {
2037
if (pri[i] > 7 || pri[i] < 0) {
2038
device_printf(softc->dev,
2039
"Invalid priority %d. Valid priorties are "
2040
"from 0 to 7 and string \"none\".\n", pri[i]);
2041
return EINVAL;
2042
}
2043
2044
pri_mask |= (1 << pri[i]) & 0xFF;
2045
}
2046
2047
configure:
2048
pfc.pfc_en = pri_mask;
2049
rc = bnxt_dcb_ieee_setpfc(softc, &pfc);
2050
if (rc)
2051
device_printf(softc->dev,
2052
"setpfc failed with status %d\n", rc);
2053
return rc;
2054
}
2055
2056
static int
2057
bnxt_dcb_ets(SYSCTL_HANDLER_ARGS)
2058
{
2059
struct bnxt_softc *softc = arg1;
2060
struct bnxt_ieee_ets ets = {0};
2061
int rc = 0, i, num_inputs;
2062
char buf[256] = {0};
2063
char tsa[8];
2064
2065
rc = bnxt_dcb_ieee_getets(softc, &ets);
2066
if (!rc)
2067
bnxt_ets_get_string(softc, buf);
2068
else
2069
sprintf(buf, "## getets failed with error %d ##", rc);
2070
2071
rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
2072
if (rc || req->newptr == NULL)
2073
return rc;
2074
2075
num_inputs = sscanf(buf, "tsa:%c,%c,%c,%c,%c,%c,%c,%c#"
2076
"pri2tc:%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu#"
2077
"tcbw:%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu",
2078
&tsa[0], &tsa[1], &tsa[2], &tsa[3], &tsa[4], &tsa[5], &tsa[6], &tsa[7],
2079
&ets.prio_tc[0], &ets.prio_tc[1], &ets.prio_tc[2], &ets.prio_tc[3],
2080
&ets.prio_tc[4], &ets.prio_tc[5], &ets.prio_tc[6], &ets.prio_tc[7],
2081
&ets.tc_tx_bw[0], &ets.tc_tx_bw[1], &ets.tc_tx_bw[2], &ets.tc_tx_bw[3],
2082
&ets.tc_tx_bw[4], &ets.tc_tx_bw[5], &ets.tc_tx_bw[6], &ets.tc_tx_bw[7]);
2083
2084
if (num_inputs != 24)
2085
return EINVAL;
2086
2087
for ( i= 0; i < 8; i++)
2088
ets.tc_tsa[i] = bnxt_ets_str_to_tsa(tsa[i]);
2089
2090
rc = bnxt_dcb_ieee_setets(softc, &ets);
2091
2092
return rc;
2093
}
2094
2095
int
2096
bnxt_create_dcb_sysctls(struct bnxt_softc *softc)
2097
{
2098
struct sysctl_oid *oid = softc->dcb_oid;
2099
2100
if (!oid)
2101
return ENOMEM;
2102
2103
SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
2104
"dcbx_cap", CTLTYPE_INT | CTLFLAG_RWTUN, softc,
2105
0, bnxt_dcb_dcbx_cap, "A",
2106
"Enable DCB Capability Exchange Protocol (DCBX) capabilities");
2107
2108
SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "ets",
2109
CTLTYPE_STRING | CTLFLAG_RWTUN, softc, 0,
2110
bnxt_dcb_ets, "A", "Enhanced Transmission Selection (ETS)");
2111
2112
SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "pfc",
2113
CTLTYPE_STRING | CTLFLAG_RWTUN, softc, 0,
2114
bnxt_dcb_pfc, "A", "Enhanced Transmission Selection (ETS)");
2115
2116
SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "set_apptlv",
2117
CTLTYPE_STRING | CTLFLAG_WR, softc, 0,
2118
bnxt_dcb_set_app, "A", "Set App TLV");
2119
2120
SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "del_apptlv",
2121
CTLTYPE_STRING | CTLFLAG_WR, softc, 0,
2122
bnxt_dcb_del_app, "A", "Delete App TLV");
2123
2124
SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "list_apptlv",
2125
CTLTYPE_STRING | CTLFLAG_RD, softc, 0,
2126
bnxt_dcb_list_app, "A", "List all App TLVs");
2127
2128
return 0;
2129
}
2130
2131
int
2132
bnxt_create_config_sysctls_post(struct bnxt_softc *softc)
2133
{
2134
/* Nothing for now, meant for future expansion */
2135
return 0;
2136
}
2137
2138