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