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