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