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