]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/bnxt/bnxt_sysctl.c
Merge llvm-project main llvmorg-18-init-15692-g007ed0dccd6a
[FreeBSD/FreeBSD.git] / sys / dev / bnxt / bnxt_sysctl.c
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
33 #include "bnxt.h"
34 #include "bnxt_hwrm.h"
35 #include "bnxt_sysctl.h"
36
37 /*
38  * We want to create:
39  * dev.bnxt.0.hwstats.txq0
40  * dev.bnxt.0.hwstats.txq0.txmbufs
41  * dev.bnxt.0.hwstats.rxq0
42  * dev.bnxt.0.hwstats.txq0.rxmbufs
43  * so the hwstats ctx list needs to be created in attach_post and populated
44  * during init.
45  *
46  * Then, it needs to be cleaned up in stop.
47  */
48
49 int
50 bnxt_init_sysctl_ctx(struct bnxt_softc *softc)
51 {
52         struct sysctl_ctx_list *ctx;
53
54         sysctl_ctx_init(&softc->hw_stats);
55         ctx = device_get_sysctl_ctx(softc->dev);
56         softc->hw_stats_oid = SYSCTL_ADD_NODE(ctx,
57             SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
58             "hwstats", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "hardware statistics");
59         if (!softc->hw_stats_oid) {
60                 sysctl_ctx_free(&softc->hw_stats);
61                 return ENOMEM;
62         }
63
64         sysctl_ctx_init(&softc->ver_info->ver_ctx);
65         ctx = device_get_sysctl_ctx(softc->dev);
66         softc->ver_info->ver_oid = SYSCTL_ADD_NODE(ctx,
67             SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
68             "ver", CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
69             "hardware/firmware version information");
70         if (!softc->ver_info->ver_oid) {
71                 sysctl_ctx_free(&softc->ver_info->ver_ctx);
72                 return ENOMEM;
73         }
74
75         if (BNXT_PF(softc)) {
76                 sysctl_ctx_init(&softc->nvm_info->nvm_ctx);
77                 ctx = device_get_sysctl_ctx(softc->dev);
78                 softc->nvm_info->nvm_oid = SYSCTL_ADD_NODE(ctx,
79                     SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
80                     "nvram", CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
81                     "nvram information");
82                 if (!softc->nvm_info->nvm_oid) {
83                         sysctl_ctx_free(&softc->nvm_info->nvm_ctx);
84                         return ENOMEM;
85                 }
86         }
87
88         sysctl_ctx_init(&softc->hw_lro_ctx);
89         ctx = device_get_sysctl_ctx(softc->dev);
90         softc->hw_lro_oid = SYSCTL_ADD_NODE(ctx,
91             SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
92             "hw_lro", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "hardware lro");
93         if (!softc->hw_lro_oid) {
94                 sysctl_ctx_free(&softc->hw_lro_ctx);
95                 return ENOMEM;
96         }
97
98         sysctl_ctx_init(&softc->flow_ctrl_ctx);
99         ctx = device_get_sysctl_ctx(softc->dev);
100         softc->flow_ctrl_oid = SYSCTL_ADD_NODE(ctx,
101             SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,
102             "fc", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "flow ctrl");
103         if (!softc->flow_ctrl_oid) {
104                 sysctl_ctx_free(&softc->flow_ctrl_ctx);
105                 return ENOMEM;
106         }
107
108         return 0;
109 }
110
111 int
112 bnxt_free_sysctl_ctx(struct bnxt_softc *softc)
113 {
114         int orc;
115         int rc = 0;
116
117         if (softc->hw_stats_oid != NULL) {
118                 orc = sysctl_ctx_free(&softc->hw_stats);
119                 if (orc)
120                         rc = orc;
121                 else
122                         softc->hw_stats_oid = NULL;
123         }
124         if (softc->ver_info->ver_oid != NULL) {
125                 orc = sysctl_ctx_free(&softc->ver_info->ver_ctx);
126                 if (orc)
127                         rc = orc;
128                 else
129                         softc->ver_info->ver_oid = NULL;
130         }
131         if (BNXT_PF(softc) && softc->nvm_info->nvm_oid != NULL) {
132                 orc = sysctl_ctx_free(&softc->nvm_info->nvm_ctx);
133                 if (orc)
134                         rc = orc;
135                 else
136                         softc->nvm_info->nvm_oid = NULL;
137         }
138         if (softc->hw_lro_oid != NULL) {
139                 orc = sysctl_ctx_free(&softc->hw_lro_ctx);
140                 if (orc)
141                         rc = orc;
142                 else
143                         softc->hw_lro_oid = NULL;
144         }
145
146         if (softc->flow_ctrl_oid != NULL) {
147                 orc = sysctl_ctx_free(&softc->flow_ctrl_ctx);
148                 if (orc)
149                         rc = orc;
150                 else
151                         softc->flow_ctrl_oid = NULL;
152         }
153
154         return rc;
155 }
156
157 int
158 bnxt_create_tx_sysctls(struct bnxt_softc *softc, int txr)
159 {
160         struct sysctl_oid *oid;
161         struct ctx_hw_stats *tx_stats = (void *)softc->tx_stats[txr].idi_vaddr;
162         char    name[32];
163         char    desc[64];
164
165         sprintf(name, "txq%d", txr);
166         sprintf(desc, "transmit queue %d", txr);
167         oid = SYSCTL_ADD_NODE(&softc->hw_stats,
168             SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name,
169             CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc);
170         if (!oid)
171                 return ENOMEM;
172
173         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
174             "ucast_pkts", CTLFLAG_RD, &tx_stats->tx_ucast_pkts,
175             "unicast packets sent");
176         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
177             "mcast_pkts", CTLFLAG_RD, &tx_stats->tx_mcast_pkts,
178             "multicast packets sent");
179         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
180             "bcast_pkts", CTLFLAG_RD, &tx_stats->tx_bcast_pkts,
181             "broadcast packets sent");
182         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
183             "discard_pkts", CTLFLAG_RD,
184             &tx_stats->tx_discard_pkts, "discarded transmit packets");
185         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
186             "error_pkts", CTLFLAG_RD, &tx_stats->tx_error_pkts,
187             "Error transmit packets");
188         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
189             "ucast_bytes", CTLFLAG_RD, &tx_stats->tx_ucast_bytes,
190             "unicast bytes sent");
191         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
192             "mcast_bytes", CTLFLAG_RD, &tx_stats->tx_mcast_bytes,
193             "multicast bytes sent");
194         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
195             "bcast_bytes", CTLFLAG_RD, &tx_stats->tx_bcast_bytes,
196             "broadcast bytes sent");
197
198         return 0;
199 }
200
201 int
202 bnxt_create_port_stats_sysctls(struct bnxt_softc *softc)
203 {
204         struct sysctl_oid *oid;
205         char    name[32];
206         char    desc[64];
207
208         sprintf(name, "port_stats");
209         sprintf(desc, "Port Stats");
210         oid = SYSCTL_ADD_NODE(&softc->hw_stats,
211             SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name,
212                 CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc);
213         if (!oid)
214                 return ENOMEM;
215
216         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
217             "tx_64b_frames", CTLFLAG_RD,
218             &softc->tx_port_stats->tx_64b_frames, "Transmitted 64b frames");
219         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
220             "tx_65b_127b_frames", CTLFLAG_RD,
221             &softc->tx_port_stats->tx_65b_127b_frames,
222             "Transmitted 65b 127b frames");
223         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
224             "tx_128b_255b_frames", CTLFLAG_RD,
225             &softc->tx_port_stats->tx_128b_255b_frames,
226             "Transmitted 128b 255b frames");
227         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
228             "tx_256b_511b_frames", CTLFLAG_RD,
229             &softc->tx_port_stats->tx_256b_511b_frames,
230             "Transmitted 256b 511b frames");
231         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
232             "tx_512b_1023b_frames", CTLFLAG_RD,
233             &softc->tx_port_stats->tx_512b_1023b_frames,
234             "Transmitted 512b 1023b frames");
235         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
236             "tx_1024b_1518b_frames", CTLFLAG_RD,
237             &softc->tx_port_stats->tx_1024b_1518b_frames,
238             "Transmitted 1024b 1518b frames");
239         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
240             "tx_good_vlan_frames", CTLFLAG_RD,
241             &softc->tx_port_stats->tx_good_vlan_frames,
242             "Transmitted good vlan frames");
243         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
244             "tx_1519b_2047b_frames", CTLFLAG_RD,
245             &softc->tx_port_stats->tx_1519b_2047b_frames,
246             "Transmitted 1519b 2047b frames");
247         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
248             "tx_2048b_4095b_frames", CTLFLAG_RD,
249             &softc->tx_port_stats->tx_2048b_4095b_frames,
250             "Transmitted 2048b 4095b frames");
251         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
252             "tx_4096b_9216b_frames", CTLFLAG_RD,
253             &softc->tx_port_stats->tx_4096b_9216b_frames,
254             "Transmitted 4096b 9216b frames");
255         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
256             "tx_9217b_16383b_frames", CTLFLAG_RD,
257             &softc->tx_port_stats->tx_9217b_16383b_frames,
258             "Transmitted 9217b 16383b frames");
259         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
260             "tx_good_frames", CTLFLAG_RD,
261             &softc->tx_port_stats->tx_good_frames, "Transmitted good frames");
262         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
263             "tx_total_frames", CTLFLAG_RD,
264             &softc->tx_port_stats->tx_total_frames, "Transmitted total frames");
265         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
266             "tx_ucast_frames", CTLFLAG_RD,
267             &softc->tx_port_stats->tx_ucast_frames, "Transmitted ucast frames");
268         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
269             "tx_mcast_frames", CTLFLAG_RD,
270             &softc->tx_port_stats->tx_mcast_frames, "Transmitted mcast frames");
271         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
272             "tx_bcast_frames", CTLFLAG_RD,
273             &softc->tx_port_stats->tx_bcast_frames, "Transmitted bcast frames");
274         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
275             "tx_pause_frames", CTLFLAG_RD,
276             &softc->tx_port_stats->tx_pause_frames, "Transmitted pause frames");
277         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
278             "tx_pfc_frames", CTLFLAG_RD,
279             &softc->tx_port_stats->tx_pfc_frames, "Transmitted pfc frames");
280         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
281             "tx_jabber_frames", CTLFLAG_RD,
282             &softc->tx_port_stats->tx_jabber_frames, "Transmitted jabber frames");
283         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
284             "tx_fcs_err_frames", CTLFLAG_RD,
285             &softc->tx_port_stats->tx_fcs_err_frames,
286             "Transmitted fcs err frames");
287         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
288             "tx_err", CTLFLAG_RD,
289             &softc->tx_port_stats->tx_err, "Transmitted err");
290         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
291             "tx_fifo_underruns", CTLFLAG_RD,
292             &softc->tx_port_stats->tx_fifo_underruns,
293             "Transmitted fifo underruns");
294         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
295             "tx_pfc_ena_frames_pri0", CTLFLAG_RD,
296             &softc->tx_port_stats->tx_pfc_ena_frames_pri0,
297             "Transmitted pfc ena frames pri0");
298         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
299             "tx_pfc_ena_frames_pri1", CTLFLAG_RD,
300             &softc->tx_port_stats->tx_pfc_ena_frames_pri1,
301             "Transmitted pfc ena frames pri1");
302         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
303             "tx_pfc_ena_frames_pri2", CTLFLAG_RD,
304             &softc->tx_port_stats->tx_pfc_ena_frames_pri2,
305             "Transmitted pfc ena frames pri2");
306         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
307             "tx_pfc_ena_frames_pri3", CTLFLAG_RD,
308             &softc->tx_port_stats->tx_pfc_ena_frames_pri3,
309             "Transmitted pfc ena frames pri3");
310         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
311             "tx_pfc_ena_frames_pri4", CTLFLAG_RD,
312             &softc->tx_port_stats->tx_pfc_ena_frames_pri4,
313             "Transmitted pfc ena frames pri4");
314         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
315             "tx_pfc_ena_frames_pri5", CTLFLAG_RD,
316             &softc->tx_port_stats->tx_pfc_ena_frames_pri5,
317             "Transmitted pfc ena frames pri5");
318         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
319             "tx_pfc_ena_frames_pri6", CTLFLAG_RD,
320             &softc->tx_port_stats->tx_pfc_ena_frames_pri6,
321             "Transmitted pfc ena frames pri6");
322         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
323             "tx_pfc_ena_frames_pri7", CTLFLAG_RD,
324             &softc->tx_port_stats->tx_pfc_ena_frames_pri7,
325             "Transmitted pfc ena frames pri7");
326         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
327             "tx_eee_lpi_events", CTLFLAG_RD,
328             &softc->tx_port_stats->tx_eee_lpi_events,
329             "Transmitted eee lpi events");
330         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
331             "tx_eee_lpi_duration", CTLFLAG_RD,
332             &softc->tx_port_stats->tx_eee_lpi_duration,
333             "Transmitted eee lpi duration");
334         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
335             "tx_llfc_logical_msgs", CTLFLAG_RD,
336             &softc->tx_port_stats->tx_llfc_logical_msgs,
337             "Transmitted llfc logical msgs");
338         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
339             "tx_hcfc_msgs", CTLFLAG_RD,
340             &softc->tx_port_stats->tx_hcfc_msgs, "Transmitted hcfc msgs");
341         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
342             "tx_total_collisions", CTLFLAG_RD,
343             &softc->tx_port_stats->tx_total_collisions,
344             "Transmitted total collisions");
345         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
346             "tx_bytes", CTLFLAG_RD,
347             &softc->tx_port_stats->tx_bytes, "Transmitted bytes");
348         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
349             "tx_xthol_frames", CTLFLAG_RD,
350             &softc->tx_port_stats->tx_xthol_frames, "Transmitted xthol frames");
351         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
352             "tx_stat_discard", CTLFLAG_RD,
353             &softc->tx_port_stats->tx_stat_discard, "Transmitted stat discard");
354         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
355             "tx_stat_error", CTLFLAG_RD,
356             &softc->tx_port_stats->tx_stat_error, "Transmitted stat error");
357         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
358             "rx_64b_frames", CTLFLAG_RD,
359             &softc->rx_port_stats->rx_64b_frames, "Received 64b frames");
360         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
361             "rx_65b_127b_frames", CTLFLAG_RD,
362             &softc->rx_port_stats->rx_65b_127b_frames, "Received 65b 127b frames");
363         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
364             "rx_128b_255b_frames", CTLFLAG_RD,
365             &softc->rx_port_stats->rx_128b_255b_frames,
366             "Received 128b 255b frames");
367         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
368             "rx_256b_511b_frames", CTLFLAG_RD,
369             &softc->rx_port_stats->rx_256b_511b_frames,
370             "Received 256b 511b frames");
371         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
372             "rx_512b_1023b_frames", CTLFLAG_RD,
373             &softc->rx_port_stats->rx_512b_1023b_frames,
374             "Received 512b 1023b frames");
375         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
376             "rx_1024b_1518b_frames", CTLFLAG_RD,
377             &softc->rx_port_stats->rx_1024b_1518b_frames,
378             "Received 1024b 1518 frames");
379         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
380             "rx_good_vlan_frames", CTLFLAG_RD,
381             &softc->rx_port_stats->rx_good_vlan_frames,
382             "Received good vlan frames");
383         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
384             "rx_1519b_2047b_frames", CTLFLAG_RD,
385             &softc->rx_port_stats->rx_1519b_2047b_frames,
386             "Received 1519b 2047b frames");
387         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
388             "rx_2048b_4095b_frames", CTLFLAG_RD,
389             &softc->rx_port_stats->rx_2048b_4095b_frames,
390             "Received 2048b 4095b frames");
391         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
392             "rx_4096b_9216b_frames", CTLFLAG_RD,
393             &softc->rx_port_stats->rx_4096b_9216b_frames,
394             "Received 4096b 9216b frames");
395         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
396             "rx_9217b_16383b_frames", CTLFLAG_RD,
397             &softc->rx_port_stats->rx_9217b_16383b_frames,
398             "Received 9217b 16383b frames");
399         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
400             "rx_total_frames", CTLFLAG_RD,
401             &softc->rx_port_stats->rx_total_frames, "Received total frames");
402         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
403             "rx_ucast_frames", CTLFLAG_RD,
404             &softc->rx_port_stats->rx_ucast_frames, "Received ucast frames");
405         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
406             "rx_mcast_frames", CTLFLAG_RD,
407             &softc->rx_port_stats->rx_mcast_frames, "Received mcast frames");
408         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
409             "rx_bcast_frames", CTLFLAG_RD,
410             &softc->rx_port_stats->rx_bcast_frames, "Received bcast frames");
411         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
412             "rx_fcs_err_frames", CTLFLAG_RD,
413             &softc->rx_port_stats->rx_fcs_err_frames, "Received fcs err frames");
414         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
415             "rx_ctrl_frames", CTLFLAG_RD,
416             &softc->rx_port_stats->rx_ctrl_frames, "Received ctrl frames");
417         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
418             "rx_pause_frames", CTLFLAG_RD,
419             &softc->rx_port_stats->rx_pause_frames, "Received pause frames");
420         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
421             "rx_pfc_frames", CTLFLAG_RD,
422             &softc->rx_port_stats->rx_pfc_frames, "Received pfc frames");
423         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
424             "rx_align_err_frames", CTLFLAG_RD,
425             &softc->rx_port_stats->rx_align_err_frames,
426             "Received align err frames");
427         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
428             "rx_ovrsz_frames", CTLFLAG_RD,
429             &softc->rx_port_stats->rx_ovrsz_frames,
430             "Received ovrsz frames");
431         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
432             "rx_jbr_frames", CTLFLAG_RD,
433             &softc->rx_port_stats->rx_jbr_frames,
434             "Received jbr frames");
435         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
436             "rx_mtu_err_frames", CTLFLAG_RD,
437             &softc->rx_port_stats->rx_mtu_err_frames,
438             "Received mtu err frames");
439         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
440             "rx_tagged_frames", CTLFLAG_RD,
441             &softc->rx_port_stats->rx_tagged_frames,
442             "Received tagged frames");
443         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
444             "rx_double_tagged_frames", CTLFLAG_RD,
445             &softc->rx_port_stats->rx_double_tagged_frames,
446             "Received double tagged frames");
447         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
448             "rx_good_frames", CTLFLAG_RD,
449             &softc->rx_port_stats->rx_good_frames,
450             "Received good frames");
451         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
452             "rx_pfc_ena_frames_pri0", CTLFLAG_RD,
453             &softc->rx_port_stats->rx_pfc_ena_frames_pri0,
454             "Received pfc ena frames pri0");
455         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
456             "rx_pfc_ena_frames_pri1", CTLFLAG_RD,
457             &softc->rx_port_stats->rx_pfc_ena_frames_pri1,
458             "Received pfc ena frames pri1");
459         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
460             "rx_pfc_ena_frames_pri2", CTLFLAG_RD,
461             &softc->rx_port_stats->rx_pfc_ena_frames_pri2,
462             "Received pfc ena frames pri2");
463         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
464             "rx_pfc_ena_frames_pri3", CTLFLAG_RD,
465             &softc->rx_port_stats->rx_pfc_ena_frames_pri3,
466             "Received pfc ena frames pri3");
467         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
468             "rx_pfc_ena_frames_pri4", CTLFLAG_RD,
469             &softc->rx_port_stats->rx_pfc_ena_frames_pri4,
470             "Received pfc ena frames pri4");
471         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
472             "rx_pfc_ena_frames_pri5", CTLFLAG_RD,
473             &softc->rx_port_stats->rx_pfc_ena_frames_pri5,
474             "Received pfc ena frames pri5");
475         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
476             "rx_pfc_ena_frames_pri6", CTLFLAG_RD,
477             &softc->rx_port_stats->rx_pfc_ena_frames_pri6,
478             "Received pfc ena frames pri6");
479         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
480             "rx_pfc_ena_frames_pri7", CTLFLAG_RD,
481             &softc->rx_port_stats->rx_pfc_ena_frames_pri7,
482             "Received pfc ena frames pri7");
483         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
484             "rx_sch_crc_err_frames", CTLFLAG_RD,
485             &softc->rx_port_stats->rx_sch_crc_err_frames,
486             "Received sch crc err frames");
487         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
488             "rx_undrsz_frames", CTLFLAG_RD,
489             &softc->rx_port_stats->rx_undrsz_frames, "Received undrsz frames");
490         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
491             "rx_eee_lpi_events", CTLFLAG_RD,
492             &softc->rx_port_stats->rx_eee_lpi_events, "Received eee lpi events");
493         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
494             "rx_eee_lpi_duration", CTLFLAG_RD,
495             &softc->rx_port_stats->rx_eee_lpi_duration,
496             "Received eee lpi duration");
497         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
498             "rx_llfc_physical_msgs", CTLFLAG_RD,
499             &softc->rx_port_stats->rx_llfc_physical_msgs,
500             "Received llfc physical msgs");
501         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
502             "rx_llfc_logical_msgs", CTLFLAG_RD,
503             &softc->rx_port_stats->rx_llfc_logical_msgs,
504             "Received llfc logical msgs");
505         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
506             "rx_llfc_msgs_with_crc_err", CTLFLAG_RD,
507             &softc->rx_port_stats->rx_llfc_msgs_with_crc_err,
508             "Received llfc msgs with crc err");
509         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
510             "rx_hcfc_msgs", CTLFLAG_RD,
511             &softc->rx_port_stats->rx_hcfc_msgs, "Received hcfc msgs");
512         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
513             "rx_hcfc_msgs_with_crc_err", CTLFLAG_RD,
514             &softc->rx_port_stats->rx_hcfc_msgs_with_crc_err,
515             "Received hcfc msgs with crc err");
516         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
517             "rx_bytes", CTLFLAG_RD,
518             &softc->rx_port_stats->rx_bytes, "Received bytes");
519         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
520             "rx_runt_bytes", CTLFLAG_RD,
521             &softc->rx_port_stats->rx_runt_bytes, "Received runt bytes");
522         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
523             "rx_runt_frames", CTLFLAG_RD,
524             &softc->rx_port_stats->rx_runt_frames, "Received runt frames");
525         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
526             "rx_stat_discard", CTLFLAG_RD,
527             &softc->rx_port_stats->rx_stat_discard, "Received stat discard");
528         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
529             "rx_stat_err", CTLFLAG_RD,
530             &softc->rx_port_stats->rx_stat_err, "Received stat err");
531
532         if (BNXT_CHIP_P5(softc) &&
533             (softc->flags & BNXT_FLAG_FW_CAP_EXT_STATS)) {
534                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
535                     "tx_bytes_cos0", CTLFLAG_RD,
536                     &softc->tx_port_stats_ext->tx_bytes_cos0, "Transmitted bytes count cos0");
537                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
538                     "tx_packets_cos0", CTLFLAG_RD,
539                     &softc->tx_port_stats_ext->tx_packets_cos0, "Transmitted packets count cos0");
540                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
541                     "tx_bytes_cos1", CTLFLAG_RD,
542                     &softc->tx_port_stats_ext->tx_bytes_cos1, "Transmitted bytes count cos1");
543                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
544                     "tx_packets_cos1", CTLFLAG_RD,
545                     &softc->tx_port_stats_ext->tx_packets_cos1, "Transmitted packets count cos1");
546                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
547                     "tx_bytes_cos2", CTLFLAG_RD,
548                     &softc->tx_port_stats_ext->tx_bytes_cos2, "Transmitted bytes count cos2");
549                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
550                     "tx_packets_cos2", CTLFLAG_RD,
551                     &softc->tx_port_stats_ext->tx_packets_cos2, "Transmitted packets count cos2");
552                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
553                     "tx_bytes_cos3", CTLFLAG_RD,
554                     &softc->tx_port_stats_ext->tx_bytes_cos3, "Transmitted bytes count cos3");
555                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
556                     "tx_packets_cos3", CTLFLAG_RD,
557                     &softc->tx_port_stats_ext->tx_packets_cos3, "Transmitted packets count cos3");
558                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
559                     "tx_bytes_cos4", CTLFLAG_RD,
560                     &softc->tx_port_stats_ext->tx_bytes_cos4, "Transmitted bytes count cos4");
561                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
562                     "tx_packets_cos4", CTLFLAG_RD,
563                     &softc->tx_port_stats_ext->tx_packets_cos4, "Transmitted packets count cos4");
564                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
565                     "tx_bytes_cos5", CTLFLAG_RD,
566                     &softc->tx_port_stats_ext->tx_bytes_cos5, "Transmitted bytes count cos5");
567                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
568                     "tx_packets_cos5", CTLFLAG_RD,
569                     &softc->tx_port_stats_ext->tx_packets_cos5, "Transmitted packets count cos5");
570                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
571                     "tx_bytes_cos6", CTLFLAG_RD,
572                     &softc->tx_port_stats_ext->tx_bytes_cos6, "Transmitted bytes count cos6");
573                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
574                     "tx_packets_cos6", CTLFLAG_RD,
575                     &softc->tx_port_stats_ext->tx_packets_cos6, "Transmitted packets count cos6");
576                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
577                     "tx_bytes_cos7", CTLFLAG_RD,
578                     &softc->tx_port_stats_ext->tx_bytes_cos7, "Transmitted bytes count cos7");
579                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
580                     "tx_packets_cos7", CTLFLAG_RD,
581                     &softc->tx_port_stats_ext->tx_packets_cos7, "Transmitted packets count cos7");
582
583                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
584                     "pfc_pri0_tx_duration_us", CTLFLAG_RD,
585                     &softc->tx_port_stats_ext->pfc_pri0_tx_duration_us, "Time duration between"
586                     "XON to XOFF and XOFF to XON for pri0");
587                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
588                     "pfc_pri0_tx_transitions", CTLFLAG_RD,
589                     &softc->tx_port_stats_ext->pfc_pri0_tx_transitions, "Num times transition"
590                     "between XON to XOFF and XOFF to XON for pri0");
591                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
592                     "pfc_pri1_tx_duration_us", CTLFLAG_RD,
593                     &softc->tx_port_stats_ext->pfc_pri1_tx_duration_us, "Time duration between"
594                     "XON to XOFF and XOFF to XON for pri1");
595                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
596                     "pfc_pri1_tx_transitions", CTLFLAG_RD,
597                     &softc->tx_port_stats_ext->pfc_pri1_tx_transitions, "Num times transition"
598                     "between XON to XOFF and XOFF to XON for pri1");
599                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
600                     "pfc_pri2_tx_duration_us", CTLFLAG_RD,
601                     &softc->tx_port_stats_ext->pfc_pri2_tx_duration_us, "Time duration between"
602                     "XON to XOFF and XOFF to XON for pri2");
603                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
604                     "pfc_pri2_tx_transitions", CTLFLAG_RD,
605                     &softc->tx_port_stats_ext->pfc_pri2_tx_transitions, "Num times transition"
606                     "between XON to XOFF and XOFF to XON for pri2");
607                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
608                     "pfc_pri3_tx_duration_us", CTLFLAG_RD,
609                     &softc->tx_port_stats_ext->pfc_pri3_tx_duration_us, "Time duration between"
610                     "XON to XOFF and XOFF to XON for pri3");
611                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
612                     "pfc_pri3_tx_transitions", CTLFLAG_RD,
613                     &softc->tx_port_stats_ext->pfc_pri3_tx_transitions, "Num times transition"
614                     "between XON to XOFF and XOFF to XON for pri3");
615                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
616                     "pfc_pri4_tx_duration_us", CTLFLAG_RD,
617                     &softc->tx_port_stats_ext->pfc_pri4_tx_duration_us, "Time duration between"
618                     "XON to XOFF and XOFF to XON for pri4");
619                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
620                     "pfc_pri4_tx_transitions", CTLFLAG_RD,
621                     &softc->tx_port_stats_ext->pfc_pri4_tx_transitions, "Num times transition"
622                     "between XON to XOFF and XOFF to XON for pri4");
623                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
624                     "pfc_pri5_tx_duration_us", CTLFLAG_RD,
625                     &softc->tx_port_stats_ext->pfc_pri5_tx_duration_us, "Time duration between"
626                     "XON to XOFF and XOFF to XON for pri5");
627                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
628                     "pfc_pri5_tx_transitions", CTLFLAG_RD,
629                     &softc->tx_port_stats_ext->pfc_pri5_tx_transitions, "Num times transition"
630                     "between XON to XOFF and XOFF to XON for pri5");
631                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
632                     "pfc_pri6_tx_duration_us", CTLFLAG_RD,
633                     &softc->tx_port_stats_ext->pfc_pri6_tx_duration_us, "Time duration between"
634                     "XON to XOFF and XOFF to XON for pri6");
635                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
636                     "pfc_pri6_tx_transitions", CTLFLAG_RD,
637                     &softc->tx_port_stats_ext->pfc_pri6_tx_transitions, "Num times transition"
638                     "between XON to XOFF and XOFF to XON for pri6");
639                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
640                     "pfc_pri7_tx_duration_us", CTLFLAG_RD,
641                     &softc->tx_port_stats_ext->pfc_pri7_tx_duration_us, "Time duration between"
642                     "XON to XOFF and XOFF to XON for pri7");
643                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
644                     "pfc_pri7_tx_transitions", CTLFLAG_RD,
645                     &softc->tx_port_stats_ext->pfc_pri7_tx_transitions, "Num times transition"
646                     "between XON to XOFF and XOFF to XON for pri7");
647
648                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
649                     "link_down_events", CTLFLAG_RD,
650                     &softc->rx_port_stats_ext->link_down_events, "Num times link states down");
651                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
652                     "continuous_pause_events", CTLFLAG_RD,
653                     &softc->rx_port_stats_ext->continuous_pause_events, "Num times pause events");
654                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
655                     "resume_pause_events", CTLFLAG_RD,
656                     &softc->rx_port_stats_ext->resume_pause_events, "Num times pause events"
657                     "resumes");
658                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
659                     "continuous_roce_pause_events", CTLFLAG_RD,
660                     &softc->rx_port_stats_ext->continuous_roce_pause_events, "Num times roce"
661                     "pause events");
662                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
663                     "resume_roce_pause_events", CTLFLAG_RD,
664                     &softc->rx_port_stats_ext->resume_roce_pause_events, "Num times roce pause"
665                     "events resumes");
666
667                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
668                     "rx_bytes_cos0", CTLFLAG_RD,
669                     &softc->rx_port_stats_ext->rx_bytes_cos0, "Received bytes count cos0");
670                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
671                     "rx_packets_cos0", CTLFLAG_RD,
672                     &softc->rx_port_stats_ext->rx_packets_cos0, "Received packets count cos0");
673                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
674                     "rx_bytes_cos1", CTLFLAG_RD,
675                     &softc->rx_port_stats_ext->rx_bytes_cos1, "Received bytes count cos1");
676                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
677                     "rx_packets_cos1", CTLFLAG_RD,
678                     &softc->rx_port_stats_ext->rx_packets_cos1, "Received packets count cos1");
679                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
680                     "rx_bytes_cos2", CTLFLAG_RD,
681                     &softc->rx_port_stats_ext->rx_bytes_cos2, "Received bytes count cos2");
682                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
683                     "rx_packets_cos2", CTLFLAG_RD,
684                     &softc->rx_port_stats_ext->rx_packets_cos2, "Received packets count cos2");
685                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
686                     "rx_bytes_cos3", CTLFLAG_RD,
687                     &softc->rx_port_stats_ext->rx_bytes_cos3, "Received bytes count cos3");
688                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
689                     "rx_packets_cos3", CTLFLAG_RD,
690                     &softc->rx_port_stats_ext->rx_packets_cos3, "Received packets count cos3");
691                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
692                     "rx_bytes_cos4", CTLFLAG_RD,
693                     &softc->rx_port_stats_ext->rx_bytes_cos4, "Received bytes count cos4");
694                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
695                     "rx_packets_cos4", CTLFLAG_RD,
696                     &softc->rx_port_stats_ext->rx_packets_cos4, "Received packets count cos4");
697                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
698                     "rx_bytes_cos5", CTLFLAG_RD,
699                     &softc->rx_port_stats_ext->rx_bytes_cos5, "Received bytes count cos5");
700                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
701                     "rx_packets_cos5", CTLFLAG_RD,
702                     &softc->rx_port_stats_ext->rx_packets_cos5, "Received packets count cos5");
703                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
704                     "rx_bytes_cos6", CTLFLAG_RD,
705                     &softc->rx_port_stats_ext->rx_bytes_cos6, "Received bytes count cos6");
706                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
707                     "rx_packets_cos6", CTLFLAG_RD,
708                     &softc->rx_port_stats_ext->rx_packets_cos6, "Received packets count cos6");
709                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
710                     "rx_bytes_cos7", CTLFLAG_RD,
711                     &softc->rx_port_stats_ext->rx_bytes_cos7, "Received bytes count cos7");
712                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
713                     "rx_packets_cos7", CTLFLAG_RD,
714                     &softc->rx_port_stats_ext->rx_packets_cos7, "Received packets count cos7");
715
716                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
717                     "pfc_pri0_rx_duration_us", CTLFLAG_RD,
718                     &softc->rx_port_stats_ext->pfc_pri0_rx_duration_us, "Time duration in receiving"
719                     "between XON to XOFF and XOFF to XON for pri0");
720                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
721                     "pfc_pri0_rx_transitions", CTLFLAG_RD,
722                     &softc->rx_port_stats_ext->pfc_pri0_rx_transitions, "Num times rx transition"
723                     "between XON to XOFF and XOFF to XON for pri0");
724                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
725                     "pfc_pri1_rx_duration_us", CTLFLAG_RD,
726                     &softc->rx_port_stats_ext->pfc_pri1_rx_duration_us, "Time duration in receiving"
727                     "between XON to XOFF and XOFF to XON for pri1");
728                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
729                     "pfc_pri1_rx_transitions", CTLFLAG_RD,
730                     &softc->rx_port_stats_ext->pfc_pri1_rx_transitions, "Num times rx transition"
731                     "between XON to XOFF and XOFF to XON for pri1");
732                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
733                     "pfc_pri2_rx_duration_us", CTLFLAG_RD,
734                     &softc->rx_port_stats_ext->pfc_pri2_rx_duration_us, "Time duration in receiving"
735                     "between XON to XOFF and XOFF to XON for pri2");
736                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
737                     "pfc_pri2_rx_transitions", CTLFLAG_RD,
738                     &softc->rx_port_stats_ext->pfc_pri2_rx_transitions, "Num times rx transition"
739                     "between XON to XOFF and XOFF to XON for pri2");
740                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
741                     "pfc_pri3_rx_duration_us", CTLFLAG_RD,
742                     &softc->rx_port_stats_ext->pfc_pri3_rx_duration_us, "Time duration in receiving"
743                     "between XON to XOFF and XOFF to XON for pri3");
744                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
745                     "pfc_pri3_rx_transitions", CTLFLAG_RD,
746                     &softc->rx_port_stats_ext->pfc_pri3_rx_transitions, "Num times rx transition"
747                     "between XON to XOFF and XOFF to XON for pri3");
748                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
749                     "pfc_pri4_rx_duration_us", CTLFLAG_RD,
750                     &softc->rx_port_stats_ext->pfc_pri4_rx_duration_us, "Time duration in receiving"
751                     "between XON to XOFF and XOFF to XON for pri4");
752                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
753                     "pfc_pri4_rx_transitions", CTLFLAG_RD,
754                     &softc->rx_port_stats_ext->pfc_pri4_rx_transitions, "Num times rx transition"
755                     "between XON to XOFF and XOFF to XON for pri4");
756                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
757                     "pfc_pri5_rx_duration_us", CTLFLAG_RD,
758                     &softc->rx_port_stats_ext->pfc_pri5_rx_duration_us, "Time duration in receiving"
759                     "between XON to XOFF and XOFF to XON for pri5");
760                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
761                     "pfc_pri5_rx_transitions", CTLFLAG_RD,
762                     &softc->rx_port_stats_ext->pfc_pri5_rx_transitions, "Num times rx transition"
763                     "between XON to XOFF and XOFF to XON for pri5");
764                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
765                     "pfc_pri6_rx_duration_us", CTLFLAG_RD,
766                     &softc->rx_port_stats_ext->pfc_pri6_rx_duration_us, "Time duration in receiving"
767                     "between XON to XOFF and XOFF to XON for pri6");
768                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
769                     "pfc_pri6_rx_transitions", CTLFLAG_RD,
770                     &softc->rx_port_stats_ext->pfc_pri6_rx_transitions, "Num times rx transition"
771                     "between XON to XOFF and XOFF to XON for pri6");
772                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
773                     "pfc_pri7_rx_duration_us", CTLFLAG_RD,
774                     &softc->rx_port_stats_ext->pfc_pri7_rx_duration_us, "Time duration in receiving"
775                     "between XON to XOFF and XOFF to XON for pri7");
776                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
777                     "pfc_pri7_rx_transitions", CTLFLAG_RD,
778                     &softc->rx_port_stats_ext->pfc_pri7_rx_transitions, "Num times rx transition"
779                     "between XON to XOFF and XOFF to XON for pri7");
780
781                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
782                     "rx_bits", CTLFLAG_RD,
783                     &softc->rx_port_stats_ext->rx_bits, "total number of received bits");
784                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
785                     "rx_buffer_passed_threshold", CTLFLAG_RD,
786                     &softc->rx_port_stats_ext->rx_buffer_passed_threshold, "num of events port"
787                     "buffer"
788                     "was over 85%");
789                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
790                     "rx_pcs_symbol_err", CTLFLAG_RD,
791                     &softc->rx_port_stats_ext->rx_pcs_symbol_err, "num of symbol errors wasn't"
792                     "corrected by FEC");
793                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
794                     "rx_corrected_bits", CTLFLAG_RD,
795                     &softc->rx_port_stats_ext->rx_corrected_bits, "num of bits corrected by FEC");
796
797                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
798                     "rx_discard_bytes_cos0", CTLFLAG_RD,
799                     &softc->rx_port_stats_ext->rx_discard_bytes_cos0, "num of rx discard bytes"
800                     "count on cos0");
801                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
802                     "rx_discard_packets_cos0", CTLFLAG_RD,
803                     &softc->rx_port_stats_ext->rx_discard_packets_cos0, "num of rx discard packets"
804                     "count on cos0");
805                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
806                     "rx_discard_bytes_cos1", CTLFLAG_RD,
807                     &softc->rx_port_stats_ext->rx_discard_bytes_cos1, "num of rx discard bytes"
808                     "count on cos1");
809                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
810                     "rx_discard_packets_cos1", CTLFLAG_RD,
811                     &softc->rx_port_stats_ext->rx_discard_packets_cos1, "num of rx discard packets"
812                     "count on cos1");
813                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
814                     "rx_discard_bytes_cos2", CTLFLAG_RD,
815                     &softc->rx_port_stats_ext->rx_discard_bytes_cos2, "num of rx discard bytes"
816                     "count on cos2");
817                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
818                     "rx_discard_packets_cos2", CTLFLAG_RD,
819                     &softc->rx_port_stats_ext->rx_discard_packets_cos2, "num of rx discard packets"
820                     "count on cos2");
821                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
822                     "rx_discard_bytes_cos3", CTLFLAG_RD,
823                     &softc->rx_port_stats_ext->rx_discard_bytes_cos3, "num of rx discard bytes"
824                     "count on cos3");
825                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
826                     "rx_discard_packets_cos3", CTLFLAG_RD,
827                     &softc->rx_port_stats_ext->rx_discard_packets_cos3, "num of rx discard packets"
828                     "count on cos3");
829                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
830                     "rx_discard_bytes_cos4", CTLFLAG_RD,
831                     &softc->rx_port_stats_ext->rx_discard_bytes_cos4, "num of rx discard bytes"
832                     "count on cos4");
833                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
834                     "rx_discard_packets_cos4", CTLFLAG_RD,
835                     &softc->rx_port_stats_ext->rx_discard_packets_cos4, "num of rx discard packets"
836                     "count on cos4");
837                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
838                     "rx_discard_bytes_cos5", CTLFLAG_RD,
839                     &softc->rx_port_stats_ext->rx_discard_bytes_cos5, "num of rx discard bytes"
840                     "count on cos5");
841                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
842                     "rx_discard_packets_cos5", CTLFLAG_RD,
843                     &softc->rx_port_stats_ext->rx_discard_packets_cos5, "num of rx discard packets"
844                     "count on cos5");
845                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
846                     "rx_discard_bytes_cos6", CTLFLAG_RD,
847                     &softc->rx_port_stats_ext->rx_discard_bytes_cos6, "num of rx discard bytes"
848                     "count on cos6");
849                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
850                     "rx_discard_packets_cos6", CTLFLAG_RD,
851                     &softc->rx_port_stats_ext->rx_discard_packets_cos6, "num of rx discard packets"
852                     "count on cos6");
853                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
854                     "rx_discard_bytes_cos7", CTLFLAG_RD,
855                     &softc->rx_port_stats_ext->rx_discard_bytes_cos7, "num of rx discard bytes"
856                     "count on cos7");
857                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
858                     "rx_discard_packets_cos7", CTLFLAG_RD,
859                     &softc->rx_port_stats_ext->rx_discard_packets_cos7, "num of rx discard packets"
860                     "count on cos7");
861         }
862
863
864         return 0;
865 }
866
867 int
868 bnxt_create_rx_sysctls(struct bnxt_softc *softc, int rxr)
869 {
870         struct sysctl_oid *oid;
871         struct ctx_hw_stats *rx_stats = (void *)softc->rx_stats[rxr].idi_vaddr;
872         char    name[32];
873         char    desc[64];
874
875         sprintf(name, "rxq%d", rxr);
876         sprintf(desc, "receive queue %d", rxr);
877         oid = SYSCTL_ADD_NODE(&softc->hw_stats,
878             SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name,
879             CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc);
880         if (!oid)
881                 return ENOMEM;
882
883         if (BNXT_CHIP_P5(softc))
884                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
885                     "nq_num_ints", CTLFLAG_RD, &softc->nq_rings[rxr].int_count,
886                     "Num Interrupts");
887         else
888                 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
889                     "rq_num_ints", CTLFLAG_RD, &softc->rx_cp_rings[rxr].int_count,
890                     "Num Interrupts");
891         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
892             "ucast_pkts", CTLFLAG_RD, &rx_stats->rx_ucast_pkts,
893             "unicast packets received");
894         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
895             "mcast_pkts", CTLFLAG_RD, &rx_stats->rx_mcast_pkts,
896             "multicast packets received");
897         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
898             "bcast_pkts", CTLFLAG_RD, &rx_stats->rx_bcast_pkts,
899             "broadcast packets received");
900         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
901             "discard_pkts", CTLFLAG_RD,
902             &rx_stats->rx_discard_pkts, "discarded receive packets");
903         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
904             "error_pkts", CTLFLAG_RD, &rx_stats->rx_error_pkts,
905             "Error receive packets");
906         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
907             "ucast_bytes", CTLFLAG_RD, &rx_stats->rx_ucast_bytes,
908             "unicast bytes received");
909         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
910             "mcast_bytes", CTLFLAG_RD, &rx_stats->rx_mcast_bytes,
911             "multicast bytes received");
912         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
913             "bcast_bytes", CTLFLAG_RD, &rx_stats->rx_bcast_bytes,
914             "broadcast bytes received");
915
916         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
917             "tpa_pkts", CTLFLAG_RD, &rx_stats->tpa_pkts,
918             "TPA packets");
919         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
920             "tpa_bytes", CTLFLAG_RD, &rx_stats->tpa_bytes,
921             "TPA bytes");
922         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
923             "tpa_events", CTLFLAG_RD, &rx_stats->tpa_events,
924             "TPA events");
925         SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,
926             "tpa_aborts", CTLFLAG_RD, &rx_stats->tpa_aborts,
927             "TPA aborts");
928
929         return 0;
930 }
931
932 static char *bnxt_chip_type[] = {
933         "ASIC",
934         "FPGA",
935         "Palladium",
936         "Unknown"
937 };
938 #define MAX_CHIP_TYPE 3
939
940 static char *bnxt_parse_pkglog(int desired_field, uint8_t *data, size_t datalen)
941 {
942         char    *retval = NULL;
943         char    *p;
944         char    *value;
945         int     field = 0;
946
947         if (datalen < 1)
948                 return NULL;
949         /* null-terminate the log data (removing last '\n'): */
950         data[datalen - 1] = 0;
951         for (p = data; *p != 0; p++) {
952                 field = 0;
953                 retval = NULL;
954                 while (*p != 0 && *p != '\n') {
955                         value = p;
956                         while (*p != 0 && *p != '\t' && *p != '\n')
957                                 p++;
958                         if (field == desired_field)
959                                 retval = value;
960                         if (*p != '\t')
961                                 break;
962                         *p = 0;
963                         field++;
964                         p++;
965                 }
966                 if (*p == 0)
967                         break;
968                 *p = 0;
969         }
970         return retval;
971 }
972
973 static int
974 bnxt_package_ver_sysctl(SYSCTL_HANDLER_ARGS)
975 {
976         struct bnxt_softc *softc = arg1;
977         struct iflib_dma_info dma_data;
978         char *pkglog = NULL;
979         char *p;
980         char unk[] = "<unknown>";
981         char *buf = unk;
982         int rc;
983         uint16_t ordinal = BNX_DIR_ORDINAL_FIRST;
984         uint16_t index;
985         uint32_t data_len;
986
987         rc = bnxt_hwrm_nvm_find_dir_entry(softc, BNX_DIR_TYPE_PKG_LOG,
988             &ordinal, BNX_DIR_EXT_NONE, &index, false,
989             HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_EQ,
990             &data_len, NULL, NULL);
991         dma_data.idi_vaddr = NULL;
992         if (rc == 0 && data_len) {
993                 rc = iflib_dma_alloc(softc->ctx, data_len, &dma_data,
994                     BUS_DMA_NOWAIT);
995                 if (rc == 0) {
996                         rc = bnxt_hwrm_nvm_read(softc, index, 0, data_len,
997                             &dma_data);
998                         if (rc == 0) {
999                                 pkglog = dma_data.idi_vaddr;
1000                                 p = bnxt_parse_pkglog(BNX_PKG_LOG_FIELD_IDX_PKG_VERSION, pkglog, data_len);
1001                                 if (p && *p != 0 && isdigit(*p))
1002                                         buf = p;
1003                         }
1004                 } else
1005                         dma_data.idi_vaddr = NULL;
1006         }
1007
1008         rc = sysctl_handle_string(oidp, buf, 0, req);
1009         if (dma_data.idi_vaddr)
1010                 iflib_dma_free(&dma_data);
1011         return rc;
1012 }
1013
1014 static int
1015 bnxt_hwrm_min_ver_sysctl(SYSCTL_HANDLER_ARGS)
1016 {
1017         struct bnxt_softc *softc = arg1;
1018         char buf[16];
1019         uint8_t newver[3];
1020         int rc;
1021
1022         sprintf(buf, "%hhu.%hhu.%hhu", softc->ver_info->hwrm_min_major,
1023             softc->ver_info->hwrm_min_minor, softc->ver_info->hwrm_min_update);
1024
1025         rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
1026         if (rc || req->newptr == NULL)
1027                 return rc;
1028         if (sscanf(buf, "%hhu.%hhu.%hhu%*c", &newver[0], &newver[1],
1029             &newver[2]) != 3)
1030                 return EINVAL;
1031         softc->ver_info->hwrm_min_major = newver[0];
1032         softc->ver_info->hwrm_min_minor = newver[1];
1033         softc->ver_info->hwrm_min_update = newver[2];
1034         bnxt_check_hwrm_version(softc);
1035
1036         return rc;
1037 }
1038
1039 int
1040 bnxt_create_ver_sysctls(struct bnxt_softc *softc)
1041 {
1042         struct bnxt_ver_info *vi = softc->ver_info;
1043         struct sysctl_oid *oid = vi->ver_oid;
1044
1045         if (!oid)
1046                 return ENOMEM;
1047
1048         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1049             "hwrm_if", CTLFLAG_RD, vi->hwrm_if_ver, 0,
1050             "HWRM interface version");
1051         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1052             "driver_hwrm_if", CTLFLAG_RD, vi->driver_hwrm_if_ver, 0,
1053             "HWRM firmware version");
1054         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1055             "hwrm_fw", CTLFLAG_RD, vi->hwrm_fw_ver, 0,
1056             "HWRM firmware version");
1057         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1058             "mgmt_fw", CTLFLAG_RD, vi->mgmt_fw_ver, 0,
1059             "management firmware version");
1060         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1061             "netctrl_fw", CTLFLAG_RD, vi->netctrl_fw_ver, 0,
1062             "network control firmware version");
1063         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1064             "roce_fw", CTLFLAG_RD, vi->roce_fw_ver, 0,
1065             "RoCE firmware version");
1066         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1067             "fw_ver", CTLFLAG_RD, vi->fw_ver_str, 0,
1068             "Firmware version");
1069         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1070             "phy", CTLFLAG_RD, vi->phy_ver, 0,
1071             "PHY version");
1072         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1073             "hwrm_fw_name", CTLFLAG_RD, vi->hwrm_fw_name, 0,
1074             "HWRM firmware name");
1075         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1076             "mgmt_fw_name", CTLFLAG_RD, vi->mgmt_fw_name, 0,
1077             "management firmware name");
1078         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1079             "netctrl_fw_name", CTLFLAG_RD, vi->netctrl_fw_name, 0,
1080             "network control firmware name");
1081         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1082             "roce_fw_name", CTLFLAG_RD, vi->roce_fw_name, 0,
1083             "RoCE firmware name");
1084         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1085             "phy_vendor", CTLFLAG_RD, vi->phy_vendor, 0,
1086             "PHY vendor name");
1087         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1088             "phy_partnumber", CTLFLAG_RD, vi->phy_partnumber, 0,
1089             "PHY vendor part number");
1090         SYSCTL_ADD_U16(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1091             "chip_num", CTLFLAG_RD, &vi->chip_num, 0, "chip number");
1092         SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1093             "chip_rev", CTLFLAG_RD, &vi->chip_rev, 0, "chip revision");
1094         SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1095             "chip_metal", CTLFLAG_RD, &vi->chip_metal, 0, "chip metal number");
1096         SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1097             "chip_bond_id", CTLFLAG_RD, &vi->chip_bond_id, 0,
1098             "chip bond id");
1099         SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1100             "chip_type", CTLFLAG_RD, vi->chip_type > MAX_CHIP_TYPE ?
1101             bnxt_chip_type[MAX_CHIP_TYPE] : bnxt_chip_type[vi->chip_type], 0,
1102             "RoCE firmware name");
1103         SYSCTL_ADD_PROC(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1104             "package_ver", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
1105             softc, 0, bnxt_package_ver_sysctl, "A",
1106             "currently installed package version");
1107         SYSCTL_ADD_PROC(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1108             "hwrm_min_ver", CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
1109             softc, 0, bnxt_hwrm_min_ver_sysctl, "A",
1110             "minimum hwrm API vesion to support");
1111
1112         return 0;
1113 }
1114
1115 int
1116 bnxt_create_nvram_sysctls(struct bnxt_nvram_info *ni)
1117 {
1118         struct sysctl_oid *oid = ni->nvm_oid;
1119
1120         if (!oid)
1121                 return ENOMEM;
1122
1123         SYSCTL_ADD_U16(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1124             "mfg_id", CTLFLAG_RD, &ni->mfg_id, 0, "manufacturer id");
1125         SYSCTL_ADD_U16(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1126             "device_id", CTLFLAG_RD, &ni->device_id, 0, "device id");
1127         SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1128             "sector_size", CTLFLAG_RD, &ni->sector_size, 0, "sector size");
1129         SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1130             "size", CTLFLAG_RD, &ni->size, 0, "nvram total size");
1131         SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1132             "reserved_size", CTLFLAG_RD, &ni->reserved_size, 0,
1133             "total reserved space");
1134         SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1135             "available_size", CTLFLAG_RD, &ni->available_size, 0,
1136             "total available space");
1137
1138         return 0;
1139 }
1140
1141 static int
1142 bnxt_rss_key_sysctl(SYSCTL_HANDLER_ARGS)
1143 {
1144         struct bnxt_softc *softc = arg1;
1145         char buf[HW_HASH_KEY_SIZE*2+1] = {0};
1146         char *p;
1147         int i;
1148         int rc;
1149
1150         for (p = buf, i=0; i<HW_HASH_KEY_SIZE; i++)
1151                 p += sprintf(p, "%02x", softc->vnic_info.rss_hash_key[i]);
1152
1153         rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
1154         if (rc || req->newptr == NULL)
1155                 return rc;
1156
1157         if (strspn(buf, "0123456789abcdefABCDEF") != (HW_HASH_KEY_SIZE * 2))
1158                 return EINVAL;
1159
1160         for (p = buf, i=0; i<HW_HASH_KEY_SIZE; i++) {
1161                 if (sscanf(p, "%02hhx", &softc->vnic_info.rss_hash_key[i]) != 1)
1162                         return EINVAL;
1163                 p += 2;
1164         }
1165
1166         if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)
1167                 bnxt_hwrm_rss_cfg(softc, &softc->vnic_info,
1168                     softc->vnic_info.rss_hash_type);
1169
1170         return rc;
1171 }
1172
1173 static const char *bnxt_hash_types[] = {"ipv4", "tcp_ipv4", "udp_ipv4", "ipv6",
1174     "tcp_ipv6", "udp_ipv6", NULL};
1175
1176 static int bnxt_get_rss_type_str_bit(char *str)
1177 {
1178         int i;
1179
1180         for (i=0; bnxt_hash_types[i]; i++)
1181                 if (strcmp(bnxt_hash_types[i], str) == 0)
1182                         return i;
1183
1184         return -1;
1185 }
1186
1187 static int
1188 bnxt_rss_type_sysctl(SYSCTL_HANDLER_ARGS)
1189 {
1190         struct bnxt_softc *softc = arg1;
1191         char buf[256] = {0};
1192         char *p;
1193         char *next;
1194         int rc;
1195         int type;
1196         int bit;
1197
1198         for (type = softc->vnic_info.rss_hash_type; type;
1199             type &= ~(1<<bit)) {
1200                 bit = ffs(type) - 1;
1201                 if (bit >= sizeof(bnxt_hash_types) / sizeof(const char *))
1202                         continue;
1203                 if (type != softc->vnic_info.rss_hash_type)
1204                         strcat(buf, ",");
1205                 strcat(buf, bnxt_hash_types[bit]);
1206         }
1207
1208         rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);
1209         if (rc || req->newptr == NULL)
1210                 return rc;
1211
1212         for (type = 0, next = buf, p = strsep(&next, " ,"); p;
1213             p = strsep(&next, " ,")) {
1214                 bit = bnxt_get_rss_type_str_bit(p);
1215                 if (bit == -1)
1216                         return EINVAL;
1217                 type |= 1<<bit;
1218         }
1219         if (type != softc->vnic_info.rss_hash_type) {
1220                 softc->vnic_info.rss_hash_type = type;
1221                 if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)
1222                         bnxt_hwrm_rss_cfg(softc, &softc->vnic_info,
1223                             softc->vnic_info.rss_hash_type);
1224         }
1225
1226         return rc;
1227 }
1228
1229 static int
1230 bnxt_rx_stall_sysctl(SYSCTL_HANDLER_ARGS) {
1231         struct bnxt_softc *softc = arg1;
1232         int rc;
1233         int val;
1234
1235         if (softc == NULL)
1236                 return EBUSY;
1237
1238         val = (bool)(softc->vnic_info.flags & BNXT_VNIC_FLAG_BD_STALL);
1239         rc = sysctl_handle_int(oidp, &val, 0, req);
1240         if (rc || !req->newptr)
1241                 return rc;
1242
1243         if (val)
1244                 softc->vnic_info.flags |= BNXT_VNIC_FLAG_BD_STALL;
1245         else
1246                 softc->vnic_info.flags &= ~BNXT_VNIC_FLAG_BD_STALL;
1247
1248         if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)
1249                 rc = bnxt_hwrm_vnic_cfg(softc, &softc->vnic_info);
1250
1251         return rc;
1252 }
1253
1254 static int
1255 bnxt_vlan_strip_sysctl(SYSCTL_HANDLER_ARGS) {
1256         struct bnxt_softc *softc = arg1;
1257         int rc;
1258         int val;
1259
1260         if (softc == NULL)
1261                 return EBUSY;
1262
1263         val = (bool)(softc->vnic_info.flags & BNXT_VNIC_FLAG_VLAN_STRIP);
1264         rc = sysctl_handle_int(oidp, &val, 0, req);
1265         if (rc || !req->newptr)
1266                 return rc;
1267
1268         if (val)
1269                 softc->vnic_info.flags |= BNXT_VNIC_FLAG_VLAN_STRIP;
1270         else
1271                 softc->vnic_info.flags &= ~BNXT_VNIC_FLAG_VLAN_STRIP;
1272
1273         if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)
1274                 rc = bnxt_hwrm_vnic_cfg(softc, &softc->vnic_info);
1275
1276         return rc;
1277 }
1278
1279 static int
1280 bnxt_set_coal_rx_usecs(SYSCTL_HANDLER_ARGS) {
1281         struct bnxt_softc *softc = arg1;
1282         int rc;
1283         int val;
1284
1285         if (softc == NULL)
1286                 return EBUSY;
1287
1288         val = softc->rx_coal_usecs;
1289         rc = sysctl_handle_int(oidp, &val, 0, req);
1290         if (rc || !req->newptr)
1291                 return rc;
1292
1293         softc->rx_coal_usecs = val;
1294         rc = bnxt_hwrm_set_coal(softc);
1295
1296         return rc;
1297 }
1298
1299 static int
1300 bnxt_set_coal_rx_frames(SYSCTL_HANDLER_ARGS) {
1301         struct bnxt_softc *softc = arg1;
1302         int rc;
1303         int val;
1304
1305         if (softc == NULL)
1306                 return EBUSY;
1307
1308         val = softc->rx_coal_frames;
1309         rc = sysctl_handle_int(oidp, &val, 0, req);
1310         if (rc || !req->newptr)
1311                 return rc;
1312
1313         softc->rx_coal_frames = val;
1314         rc = bnxt_hwrm_set_coal(softc);
1315
1316         return rc;
1317 }
1318
1319 static int
1320 bnxt_set_coal_rx_usecs_irq(SYSCTL_HANDLER_ARGS) {
1321         struct bnxt_softc *softc = arg1;
1322         int rc;
1323         int val;
1324
1325         if (softc == NULL)
1326                 return EBUSY;
1327
1328         val = softc->rx_coal_usecs_irq;
1329         rc = sysctl_handle_int(oidp, &val, 0, req);
1330         if (rc || !req->newptr)
1331                 return rc;
1332
1333         softc->rx_coal_usecs_irq = val;
1334         rc = bnxt_hwrm_set_coal(softc);
1335
1336         return rc;
1337 }
1338
1339 static int
1340 bnxt_set_coal_rx_frames_irq(SYSCTL_HANDLER_ARGS) {
1341         struct bnxt_softc *softc = arg1;
1342         int rc;
1343         int val;
1344
1345         if (softc == NULL)
1346                 return EBUSY;
1347
1348         val = softc->rx_coal_frames_irq;
1349         rc = sysctl_handle_int(oidp, &val, 0, req);
1350         if (rc || !req->newptr)
1351                 return rc;
1352
1353         softc->rx_coal_frames_irq = val;
1354         rc = bnxt_hwrm_set_coal(softc);
1355
1356         return rc;
1357 }
1358
1359 static int
1360 bnxt_set_coal_tx_usecs(SYSCTL_HANDLER_ARGS) {
1361         struct bnxt_softc *softc = arg1;
1362         int rc;
1363         int val;
1364
1365         if (softc == NULL)
1366                 return EBUSY;
1367
1368         val = softc->tx_coal_usecs;
1369         rc = sysctl_handle_int(oidp, &val, 0, req);
1370         if (rc || !req->newptr)
1371                 return rc;
1372
1373         softc->tx_coal_usecs = val;
1374         rc = bnxt_hwrm_set_coal(softc);
1375
1376         return rc;
1377 }
1378
1379 static int
1380 bnxt_set_coal_tx_frames(SYSCTL_HANDLER_ARGS) {
1381         struct bnxt_softc *softc = arg1;
1382         int rc;
1383         int val;
1384
1385         if (softc == NULL)
1386                 return EBUSY;
1387
1388         val = softc->tx_coal_frames;
1389         rc = sysctl_handle_int(oidp, &val, 0, req);
1390         if (rc || !req->newptr)
1391                 return rc;
1392
1393         softc->tx_coal_frames = val;
1394         rc = bnxt_hwrm_set_coal(softc);
1395
1396         return rc;
1397 }
1398
1399 static int
1400 bnxt_set_coal_tx_usecs_irq(SYSCTL_HANDLER_ARGS) {
1401         struct bnxt_softc *softc = arg1;
1402         int rc;
1403         int val;
1404
1405         if (softc == NULL)
1406                 return EBUSY;
1407
1408         val = softc->tx_coal_usecs_irq;
1409         rc = sysctl_handle_int(oidp, &val, 0, req);
1410         if (rc || !req->newptr)
1411                 return rc;
1412
1413         softc->tx_coal_usecs_irq = val;
1414         rc = bnxt_hwrm_set_coal(softc);
1415
1416         return rc;
1417 }
1418
1419 static int
1420 bnxt_set_coal_tx_frames_irq(SYSCTL_HANDLER_ARGS) {
1421         struct bnxt_softc *softc = arg1;
1422         int rc;
1423         int val;
1424
1425         if (softc == NULL)
1426                 return EBUSY;
1427
1428         val = softc->tx_coal_frames_irq;
1429         rc = sysctl_handle_int(oidp, &val, 0, req);
1430         if (rc || !req->newptr)
1431                 return rc;
1432
1433         softc->tx_coal_frames_irq = val;
1434         rc = bnxt_hwrm_set_coal(softc);
1435
1436         return rc;
1437 }
1438
1439 int
1440 bnxt_create_config_sysctls_pre(struct bnxt_softc *softc)
1441 {
1442         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(softc->dev);
1443         struct sysctl_oid_list *children;
1444
1445         children = SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev));
1446
1447         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rss_key",
1448             CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1449             bnxt_rss_key_sysctl, "A", "RSS key");
1450         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rss_type",
1451             CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1452             bnxt_rss_type_sysctl, "A", "RSS type bits");
1453         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rx_stall",
1454             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1455             bnxt_rx_stall_sysctl, "I",
1456             "buffer rx packets in hardware until the host posts new buffers");
1457         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "vlan_strip",
1458             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1459             bnxt_vlan_strip_sysctl, "I", "strip VLAN tag in the RX path");
1460         SYSCTL_ADD_CONST_STRING(ctx, children, OID_AUTO, "if_name", CTLFLAG_RD,
1461                 if_name(iflib_get_ifp(softc->ctx)), "interface name");
1462
1463         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_usecs",
1464             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1465             bnxt_set_coal_rx_usecs, "I", "interrupt coalescing Rx Usecs");
1466         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_frames",
1467             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1468             bnxt_set_coal_rx_frames, "I", "interrupt coalescing Rx Frames");
1469         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_usecs_irq",
1470             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1471             bnxt_set_coal_rx_usecs_irq, "I",
1472             "interrupt coalescing Rx Usecs IRQ");
1473         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_frames_irq",
1474             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1475             bnxt_set_coal_rx_frames_irq, "I",
1476             "interrupt coalescing Rx Frames IRQ");
1477         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_usecs",
1478             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1479             bnxt_set_coal_tx_usecs, "I", "interrupt coalescing Tx Usces");
1480         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_frames",
1481             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1482             bnxt_set_coal_tx_frames, "I", "interrupt coalescing Tx Frames"); 
1483         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_usecs_irq",
1484             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1485             bnxt_set_coal_tx_usecs_irq, "I",
1486             "interrupt coalescing Tx Usecs IRQ"); 
1487         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_frames_irq",
1488             CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1489             bnxt_set_coal_tx_frames_irq, "I",
1490             "interrupt coalescing Tx Frames IRQ");
1491
1492         return 0;
1493 }
1494
1495 #define BNXT_HW_LRO_FN(fn_name, arg)                                       \
1496 static int                                                                 \
1497 fn_name(SYSCTL_HANDLER_ARGS) {                                             \
1498         struct bnxt_softc *softc = arg1;                                   \
1499         int rc;                                                            \
1500         int val;                                                           \
1501                                                                            \
1502         if (softc == NULL)                                                 \
1503                 return EBUSY;                                              \
1504                                                                            \
1505         val = softc->hw_lro.arg;                                           \
1506         rc = sysctl_handle_int(oidp, &val, 0, req);                        \
1507         if (rc || !req->newptr)                                            \
1508                 return rc;                                                 \
1509                                                                            \
1510         if ((if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)) \
1511                 return EBUSY;                                              \
1512                                                                            \
1513         if (!(softc->flags & BNXT_FLAG_TPA))                               \
1514                 return EINVAL;                                             \
1515                                                                            \
1516         softc->hw_lro.arg = val;                                           \
1517         bnxt_validate_hw_lro_settings(softc);                              \
1518         rc = bnxt_hwrm_vnic_tpa_cfg(softc);                                \
1519                                                                            \
1520         return rc;                                                         \
1521 }
1522
1523 BNXT_HW_LRO_FN(bnxt_hw_lro_enable_disable, enable)
1524 BNXT_HW_LRO_FN(bnxt_hw_lro_set_mode, is_mode_gro)
1525 BNXT_HW_LRO_FN(bnxt_hw_lro_set_max_agg_segs, max_agg_segs)
1526 BNXT_HW_LRO_FN(bnxt_hw_lro_set_max_aggs, max_aggs)
1527 BNXT_HW_LRO_FN(bnxt_hw_lro_set_min_agg_len, min_agg_len)
1528
1529 #define BNXT_FLOW_CTRL_FN(fn_name, arg)                                    \
1530 static int                                                                 \
1531 fn_name(SYSCTL_HANDLER_ARGS) {                                             \
1532         struct bnxt_softc *softc = arg1;                                   \
1533         int rc;                                                            \
1534         int val;                                                           \
1535                                                                            \
1536         if (softc == NULL)                                                 \
1537                 return EBUSY;                                              \
1538                                                                            \
1539         val = softc->link_info.flow_ctrl.arg;                              \
1540         rc = sysctl_handle_int(oidp, &val, 0, req);                        \
1541         if (rc || !req->newptr)                                            \
1542                 return rc;                                                 \
1543                                                                            \
1544         if (val)                                                           \
1545                 val = 1;                                                   \
1546                                                                            \
1547         if (softc->link_info.flow_ctrl.arg != val) {                       \
1548                 softc->link_info.flow_ctrl.arg = val;                      \
1549                 rc = bnxt_hwrm_set_link_setting(softc, true, false, false);\
1550                 rc = bnxt_hwrm_port_phy_qcfg(softc);                       \
1551         }                                                                  \
1552                                                                            \
1553         return rc;                                                         \
1554 }
1555
1556 BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_tx, tx)
1557 BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_rx, rx)
1558 BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_autoneg, autoneg)
1559 int
1560 bnxt_create_pause_fc_sysctls(struct bnxt_softc *softc)
1561 {
1562         struct sysctl_oid *oid = softc->flow_ctrl_oid;
1563
1564         if (!oid)
1565                 return ENOMEM;
1566
1567         SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1568             "tx", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1569             bnxt_flow_ctrl_tx, "A", "Enable or Disable Tx Flow Ctrl: 0 / 1");
1570
1571         SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1572             "rx", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,
1573             bnxt_flow_ctrl_rx, "A", "Enable or Disable Tx Flow Ctrl: 0 / 1");
1574
1575         SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1576             "autoneg", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc,
1577             0, bnxt_flow_ctrl_autoneg, "A",
1578             "Enable or Disable Autoneg Flow Ctrl: 0 / 1");
1579
1580         return 0;
1581 }
1582
1583 int
1584 bnxt_create_hw_lro_sysctls(struct bnxt_softc *softc)
1585 {
1586         struct sysctl_oid *oid = softc->hw_lro_oid;
1587
1588         if (!oid)
1589                 return ENOMEM;
1590
1591         SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1592             "enable", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc,
1593             0, bnxt_hw_lro_enable_disable, "A",
1594             "Enable or Disable HW LRO: 0 / 1");
1595
1596         SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1597             "gro_mode", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc,
1598             0, bnxt_hw_lro_set_mode, "A",
1599             "Set mode: 1 = GRO mode, 0 = RSC mode");
1600
1601         SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1602             "max_agg_segs", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
1603             softc, 0, bnxt_hw_lro_set_max_agg_segs, "A",
1604             "Set Max Agg Seg Value (unit is Log2): "
1605             "0 (= 1 seg) / 1 (= 2 segs) /  ... / 31 (= 2^31 segs)");
1606
1607         SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1608             "max_aggs", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
1609             softc, 0, bnxt_hw_lro_set_max_aggs, "A",
1610             "Set Max Aggs Value (unit is Log2): "
1611             "0 (= 1 agg) / 1 (= 2 aggs) /  ... / 7 (= 2^7 segs)");
1612
1613         SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
1614             "min_agg_len", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
1615             softc, 0, bnxt_hw_lro_set_min_agg_len, "A",
1616             "Min Agg Len: 1 to 9000");
1617
1618         return 0;
1619 }
1620
1621 int
1622 bnxt_create_config_sysctls_post(struct bnxt_softc *softc)
1623 {
1624         /* Nothing for now, meant for future expansion */
1625         return 0;
1626 }