1 /*- 2 * Broadcom NetXtreme-C/E network driver. 3 * 4 * Copyright (c) 2016 Broadcom, All Rights Reserved. 5 * The term Broadcom refers to Broadcom Limited and/or its subsidiaries 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS' 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 26 * THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <sys/types.h> 30 #include <sys/sysctl.h> 31 #include <sys/ctype.h> 32 #include <linux/delay.h> 33 34 #include "bnxt.h" 35 #include "bnxt_hwrm.h" 36 #include "bnxt_sysctl.h" 37 38 DEFINE_MUTEX(tmp_mutex); /* mutex lock for driver */ 39 extern void bnxt_fw_reset(struct bnxt_softc *bp); 40 extern void bnxt_queue_sp_work(struct bnxt_softc *bp); 41 extern void 42 process_nq(struct bnxt_softc *softc, uint16_t nqid); 43 /* 44 * We want to create: 45 * dev.bnxt.0.hwstats.txq0 46 * dev.bnxt.0.hwstats.txq0.txmbufs 47 * dev.bnxt.0.hwstats.rxq0 48 * dev.bnxt.0.hwstats.txq0.rxmbufs 49 * so the hwstats ctx list needs to be created in attach_post and populated 50 * during init. 51 * 52 * Then, it needs to be cleaned up in stop. 53 */ 54 55 int 56 bnxt_init_sysctl_ctx(struct bnxt_softc *softc) 57 { 58 struct sysctl_ctx_list *ctx; 59 60 sysctl_ctx_init(&softc->hw_stats); 61 ctx = device_get_sysctl_ctx(softc->dev); 62 softc->hw_stats_oid = SYSCTL_ADD_NODE(ctx, 63 SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO, 64 "hwstats", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "hardware statistics"); 65 if (!softc->hw_stats_oid) { 66 sysctl_ctx_free(&softc->hw_stats); 67 return ENOMEM; 68 } 69 70 sysctl_ctx_init(&softc->ver_info->ver_ctx); 71 ctx = device_get_sysctl_ctx(softc->dev); 72 softc->ver_info->ver_oid = SYSCTL_ADD_NODE(ctx, 73 SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO, 74 "ver", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 75 "hardware/firmware version information"); 76 if (!softc->ver_info->ver_oid) { 77 sysctl_ctx_free(&softc->ver_info->ver_ctx); 78 return ENOMEM; 79 } 80 81 if (BNXT_PF(softc)) { 82 sysctl_ctx_init(&softc->nvm_info->nvm_ctx); 83 ctx = device_get_sysctl_ctx(softc->dev); 84 softc->nvm_info->nvm_oid = SYSCTL_ADD_NODE(ctx, 85 SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO, 86 "nvram", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 87 "nvram information"); 88 if (!softc->nvm_info->nvm_oid) { 89 sysctl_ctx_free(&softc->nvm_info->nvm_ctx); 90 return ENOMEM; 91 } 92 } 93 94 sysctl_ctx_init(&softc->hw_lro_ctx); 95 ctx = device_get_sysctl_ctx(softc->dev); 96 softc->hw_lro_oid = SYSCTL_ADD_NODE(ctx, 97 SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO, 98 "hw_lro", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "hardware lro"); 99 if (!softc->hw_lro_oid) { 100 sysctl_ctx_free(&softc->hw_lro_ctx); 101 return ENOMEM; 102 } 103 104 sysctl_ctx_init(&softc->flow_ctrl_ctx); 105 ctx = device_get_sysctl_ctx(softc->dev); 106 softc->flow_ctrl_oid = SYSCTL_ADD_NODE(ctx, 107 SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO, 108 "fc", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "flow ctrl"); 109 if (!softc->flow_ctrl_oid) { 110 sysctl_ctx_free(&softc->flow_ctrl_ctx); 111 return ENOMEM; 112 } 113 114 sysctl_ctx_init(&softc->dcb_ctx); 115 ctx = device_get_sysctl_ctx(softc->dev); 116 softc->dcb_oid = SYSCTL_ADD_NODE(ctx, 117 SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO, 118 "dcb", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "dcb"); 119 if (!softc->dcb_oid) { 120 sysctl_ctx_free(&softc->dcb_ctx); 121 return ENOMEM; 122 } 123 124 return 0; 125 } 126 127 int 128 bnxt_free_sysctl_ctx(struct bnxt_softc *softc) 129 { 130 int orc; 131 int rc = 0; 132 133 if (softc->hw_stats_oid != NULL) { 134 orc = sysctl_ctx_free(&softc->hw_stats); 135 if (orc) 136 rc = orc; 137 else 138 softc->hw_stats_oid = NULL; 139 } 140 if (softc->ver_info->ver_oid != NULL) { 141 orc = sysctl_ctx_free(&softc->ver_info->ver_ctx); 142 if (orc) 143 rc = orc; 144 else 145 softc->ver_info->ver_oid = NULL; 146 } 147 if (BNXT_PF(softc) && softc->nvm_info->nvm_oid != NULL) { 148 orc = sysctl_ctx_free(&softc->nvm_info->nvm_ctx); 149 if (orc) 150 rc = orc; 151 else 152 softc->nvm_info->nvm_oid = NULL; 153 } 154 if (softc->hw_lro_oid != NULL) { 155 orc = sysctl_ctx_free(&softc->hw_lro_ctx); 156 if (orc) 157 rc = orc; 158 else 159 softc->hw_lro_oid = NULL; 160 } 161 162 if (softc->flow_ctrl_oid != NULL) { 163 orc = sysctl_ctx_free(&softc->flow_ctrl_ctx); 164 if (orc) 165 rc = orc; 166 else 167 softc->flow_ctrl_oid = NULL; 168 } 169 170 if (softc->dcb_oid != NULL) { 171 orc = sysctl_ctx_free(&softc->dcb_ctx); 172 if (orc) 173 rc = orc; 174 else 175 softc->dcb_oid = NULL; 176 } 177 178 return rc; 179 } 180 181 int 182 bnxt_create_tx_sysctls(struct bnxt_softc *softc, int txr) 183 { 184 struct sysctl_oid *oid; 185 struct ctx_hw_stats *tx_stats = (void *)softc->tx_stats[txr].idi_vaddr; 186 char name[32]; 187 char desc[64]; 188 189 sprintf(name, "txq%d", txr); 190 sprintf(desc, "transmit queue %d", txr); 191 oid = SYSCTL_ADD_NODE(&softc->hw_stats, 192 SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name, 193 CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc); 194 if (!oid) 195 return ENOMEM; 196 197 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 198 "ucast_pkts", CTLFLAG_RD, &tx_stats->tx_ucast_pkts, 199 "unicast packets sent"); 200 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 201 "mcast_pkts", CTLFLAG_RD, &tx_stats->tx_mcast_pkts, 202 "multicast packets sent"); 203 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 204 "bcast_pkts", CTLFLAG_RD, &tx_stats->tx_bcast_pkts, 205 "broadcast packets sent"); 206 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 207 "discard_pkts", CTLFLAG_RD, 208 &tx_stats->tx_discard_pkts, "discarded transmit packets"); 209 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 210 "error_pkts", CTLFLAG_RD, &tx_stats->tx_error_pkts, 211 "Error transmit packets"); 212 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 213 "ucast_bytes", CTLFLAG_RD, &tx_stats->tx_ucast_bytes, 214 "unicast bytes sent"); 215 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 216 "mcast_bytes", CTLFLAG_RD, &tx_stats->tx_mcast_bytes, 217 "multicast bytes sent"); 218 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 219 "bcast_bytes", CTLFLAG_RD, &tx_stats->tx_bcast_bytes, 220 "broadcast bytes sent"); 221 222 return 0; 223 } 224 225 int 226 bnxt_create_port_stats_sysctls(struct bnxt_softc *softc) 227 { 228 struct sysctl_oid *oid; 229 char name[32]; 230 char desc[64]; 231 232 sprintf(name, "port_stats"); 233 sprintf(desc, "Port Stats"); 234 oid = SYSCTL_ADD_NODE(&softc->hw_stats, 235 SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name, 236 CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc); 237 if (!oid) 238 return ENOMEM; 239 240 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 241 "tx_64b_frames", CTLFLAG_RD, 242 &softc->tx_port_stats->tx_64b_frames, "Transmitted 64b frames"); 243 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 244 "tx_65b_127b_frames", CTLFLAG_RD, 245 &softc->tx_port_stats->tx_65b_127b_frames, 246 "Transmitted 65b 127b frames"); 247 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 248 "tx_128b_255b_frames", CTLFLAG_RD, 249 &softc->tx_port_stats->tx_128b_255b_frames, 250 "Transmitted 128b 255b frames"); 251 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 252 "tx_256b_511b_frames", CTLFLAG_RD, 253 &softc->tx_port_stats->tx_256b_511b_frames, 254 "Transmitted 256b 511b frames"); 255 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 256 "tx_512b_1023b_frames", CTLFLAG_RD, 257 &softc->tx_port_stats->tx_512b_1023b_frames, 258 "Transmitted 512b 1023b frames"); 259 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 260 "tx_1024b_1518b_frames", CTLFLAG_RD, 261 &softc->tx_port_stats->tx_1024b_1518b_frames, 262 "Transmitted 1024b 1518b frames"); 263 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 264 "tx_good_vlan_frames", CTLFLAG_RD, 265 &softc->tx_port_stats->tx_good_vlan_frames, 266 "Transmitted good vlan frames"); 267 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 268 "tx_1519b_2047b_frames", CTLFLAG_RD, 269 &softc->tx_port_stats->tx_1519b_2047b_frames, 270 "Transmitted 1519b 2047b frames"); 271 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 272 "tx_2048b_4095b_frames", CTLFLAG_RD, 273 &softc->tx_port_stats->tx_2048b_4095b_frames, 274 "Transmitted 2048b 4095b frames"); 275 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 276 "tx_4096b_9216b_frames", CTLFLAG_RD, 277 &softc->tx_port_stats->tx_4096b_9216b_frames, 278 "Transmitted 4096b 9216b frames"); 279 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 280 "tx_9217b_16383b_frames", CTLFLAG_RD, 281 &softc->tx_port_stats->tx_9217b_16383b_frames, 282 "Transmitted 9217b 16383b frames"); 283 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 284 "tx_good_frames", CTLFLAG_RD, 285 &softc->tx_port_stats->tx_good_frames, "Transmitted good frames"); 286 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 287 "tx_total_frames", CTLFLAG_RD, 288 &softc->tx_port_stats->tx_total_frames, "Transmitted total frames"); 289 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 290 "tx_ucast_frames", CTLFLAG_RD, 291 &softc->tx_port_stats->tx_ucast_frames, "Transmitted ucast frames"); 292 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 293 "tx_mcast_frames", CTLFLAG_RD, 294 &softc->tx_port_stats->tx_mcast_frames, "Transmitted mcast frames"); 295 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 296 "tx_bcast_frames", CTLFLAG_RD, 297 &softc->tx_port_stats->tx_bcast_frames, "Transmitted bcast frames"); 298 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 299 "tx_pause_frames", CTLFLAG_RD, 300 &softc->tx_port_stats->tx_pause_frames, "Transmitted pause frames"); 301 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 302 "tx_pfc_frames", CTLFLAG_RD, 303 &softc->tx_port_stats->tx_pfc_frames, "Transmitted pfc frames"); 304 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 305 "tx_jabber_frames", CTLFLAG_RD, 306 &softc->tx_port_stats->tx_jabber_frames, "Transmitted jabber frames"); 307 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 308 "tx_fcs_err_frames", CTLFLAG_RD, 309 &softc->tx_port_stats->tx_fcs_err_frames, 310 "Transmitted fcs err frames"); 311 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 312 "tx_err", CTLFLAG_RD, 313 &softc->tx_port_stats->tx_err, "Transmitted err"); 314 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 315 "tx_fifo_underruns", CTLFLAG_RD, 316 &softc->tx_port_stats->tx_fifo_underruns, 317 "Transmitted fifo underruns"); 318 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 319 "tx_pfc_ena_frames_pri0", CTLFLAG_RD, 320 &softc->tx_port_stats->tx_pfc_ena_frames_pri0, 321 "Transmitted pfc ena frames pri0"); 322 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 323 "tx_pfc_ena_frames_pri1", CTLFLAG_RD, 324 &softc->tx_port_stats->tx_pfc_ena_frames_pri1, 325 "Transmitted pfc ena frames pri1"); 326 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 327 "tx_pfc_ena_frames_pri2", CTLFLAG_RD, 328 &softc->tx_port_stats->tx_pfc_ena_frames_pri2, 329 "Transmitted pfc ena frames pri2"); 330 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 331 "tx_pfc_ena_frames_pri3", CTLFLAG_RD, 332 &softc->tx_port_stats->tx_pfc_ena_frames_pri3, 333 "Transmitted pfc ena frames pri3"); 334 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 335 "tx_pfc_ena_frames_pri4", CTLFLAG_RD, 336 &softc->tx_port_stats->tx_pfc_ena_frames_pri4, 337 "Transmitted pfc ena frames pri4"); 338 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 339 "tx_pfc_ena_frames_pri5", CTLFLAG_RD, 340 &softc->tx_port_stats->tx_pfc_ena_frames_pri5, 341 "Transmitted pfc ena frames pri5"); 342 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 343 "tx_pfc_ena_frames_pri6", CTLFLAG_RD, 344 &softc->tx_port_stats->tx_pfc_ena_frames_pri6, 345 "Transmitted pfc ena frames pri6"); 346 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 347 "tx_pfc_ena_frames_pri7", CTLFLAG_RD, 348 &softc->tx_port_stats->tx_pfc_ena_frames_pri7, 349 "Transmitted pfc ena frames pri7"); 350 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 351 "tx_eee_lpi_events", CTLFLAG_RD, 352 &softc->tx_port_stats->tx_eee_lpi_events, 353 "Transmitted eee lpi events"); 354 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 355 "tx_eee_lpi_duration", CTLFLAG_RD, 356 &softc->tx_port_stats->tx_eee_lpi_duration, 357 "Transmitted eee lpi duration"); 358 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 359 "tx_llfc_logical_msgs", CTLFLAG_RD, 360 &softc->tx_port_stats->tx_llfc_logical_msgs, 361 "Transmitted llfc logical msgs"); 362 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 363 "tx_hcfc_msgs", CTLFLAG_RD, 364 &softc->tx_port_stats->tx_hcfc_msgs, "Transmitted hcfc msgs"); 365 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 366 "tx_total_collisions", CTLFLAG_RD, 367 &softc->tx_port_stats->tx_total_collisions, 368 "Transmitted total collisions"); 369 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 370 "tx_bytes", CTLFLAG_RD, 371 &softc->tx_port_stats->tx_bytes, "Transmitted bytes"); 372 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 373 "tx_xthol_frames", CTLFLAG_RD, 374 &softc->tx_port_stats->tx_xthol_frames, "Transmitted xthol frames"); 375 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 376 "tx_stat_discard", CTLFLAG_RD, 377 &softc->tx_port_stats->tx_stat_discard, "Transmitted stat discard"); 378 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 379 "tx_stat_error", CTLFLAG_RD, 380 &softc->tx_port_stats->tx_stat_error, "Transmitted stat error"); 381 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 382 "rx_64b_frames", CTLFLAG_RD, 383 &softc->rx_port_stats->rx_64b_frames, "Received 64b frames"); 384 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 385 "rx_65b_127b_frames", CTLFLAG_RD, 386 &softc->rx_port_stats->rx_65b_127b_frames, "Received 65b 127b frames"); 387 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 388 "rx_128b_255b_frames", CTLFLAG_RD, 389 &softc->rx_port_stats->rx_128b_255b_frames, 390 "Received 128b 255b frames"); 391 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 392 "rx_256b_511b_frames", CTLFLAG_RD, 393 &softc->rx_port_stats->rx_256b_511b_frames, 394 "Received 256b 511b frames"); 395 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 396 "rx_512b_1023b_frames", CTLFLAG_RD, 397 &softc->rx_port_stats->rx_512b_1023b_frames, 398 "Received 512b 1023b frames"); 399 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 400 "rx_1024b_1518b_frames", CTLFLAG_RD, 401 &softc->rx_port_stats->rx_1024b_1518b_frames, 402 "Received 1024b 1518 frames"); 403 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 404 "rx_good_vlan_frames", CTLFLAG_RD, 405 &softc->rx_port_stats->rx_good_vlan_frames, 406 "Received good vlan frames"); 407 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 408 "rx_1519b_2047b_frames", CTLFLAG_RD, 409 &softc->rx_port_stats->rx_1519b_2047b_frames, 410 "Received 1519b 2047b frames"); 411 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 412 "rx_2048b_4095b_frames", CTLFLAG_RD, 413 &softc->rx_port_stats->rx_2048b_4095b_frames, 414 "Received 2048b 4095b frames"); 415 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 416 "rx_4096b_9216b_frames", CTLFLAG_RD, 417 &softc->rx_port_stats->rx_4096b_9216b_frames, 418 "Received 4096b 9216b frames"); 419 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 420 "rx_9217b_16383b_frames", CTLFLAG_RD, 421 &softc->rx_port_stats->rx_9217b_16383b_frames, 422 "Received 9217b 16383b frames"); 423 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 424 "rx_total_frames", CTLFLAG_RD, 425 &softc->rx_port_stats->rx_total_frames, "Received total frames"); 426 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 427 "rx_ucast_frames", CTLFLAG_RD, 428 &softc->rx_port_stats->rx_ucast_frames, "Received ucast frames"); 429 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 430 "rx_mcast_frames", CTLFLAG_RD, 431 &softc->rx_port_stats->rx_mcast_frames, "Received mcast frames"); 432 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 433 "rx_bcast_frames", CTLFLAG_RD, 434 &softc->rx_port_stats->rx_bcast_frames, "Received bcast frames"); 435 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 436 "rx_fcs_err_frames", CTLFLAG_RD, 437 &softc->rx_port_stats->rx_fcs_err_frames, "Received fcs err frames"); 438 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 439 "rx_ctrl_frames", CTLFLAG_RD, 440 &softc->rx_port_stats->rx_ctrl_frames, "Received ctrl frames"); 441 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 442 "rx_pause_frames", CTLFLAG_RD, 443 &softc->rx_port_stats->rx_pause_frames, "Received pause frames"); 444 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 445 "rx_pfc_frames", CTLFLAG_RD, 446 &softc->rx_port_stats->rx_pfc_frames, "Received pfc frames"); 447 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 448 "rx_align_err_frames", CTLFLAG_RD, 449 &softc->rx_port_stats->rx_align_err_frames, 450 "Received align err frames"); 451 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 452 "rx_ovrsz_frames", CTLFLAG_RD, 453 &softc->rx_port_stats->rx_ovrsz_frames, 454 "Received ovrsz frames"); 455 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 456 "rx_jbr_frames", CTLFLAG_RD, 457 &softc->rx_port_stats->rx_jbr_frames, 458 "Received jbr frames"); 459 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 460 "rx_mtu_err_frames", CTLFLAG_RD, 461 &softc->rx_port_stats->rx_mtu_err_frames, 462 "Received mtu err frames"); 463 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 464 "rx_tagged_frames", CTLFLAG_RD, 465 &softc->rx_port_stats->rx_tagged_frames, 466 "Received tagged frames"); 467 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 468 "rx_double_tagged_frames", CTLFLAG_RD, 469 &softc->rx_port_stats->rx_double_tagged_frames, 470 "Received double tagged frames"); 471 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 472 "rx_good_frames", CTLFLAG_RD, 473 &softc->rx_port_stats->rx_good_frames, 474 "Received good frames"); 475 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 476 "rx_pfc_ena_frames_pri0", CTLFLAG_RD, 477 &softc->rx_port_stats->rx_pfc_ena_frames_pri0, 478 "Received pfc ena frames pri0"); 479 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 480 "rx_pfc_ena_frames_pri1", CTLFLAG_RD, 481 &softc->rx_port_stats->rx_pfc_ena_frames_pri1, 482 "Received pfc ena frames pri1"); 483 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 484 "rx_pfc_ena_frames_pri2", CTLFLAG_RD, 485 &softc->rx_port_stats->rx_pfc_ena_frames_pri2, 486 "Received pfc ena frames pri2"); 487 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 488 "rx_pfc_ena_frames_pri3", CTLFLAG_RD, 489 &softc->rx_port_stats->rx_pfc_ena_frames_pri3, 490 "Received pfc ena frames pri3"); 491 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 492 "rx_pfc_ena_frames_pri4", CTLFLAG_RD, 493 &softc->rx_port_stats->rx_pfc_ena_frames_pri4, 494 "Received pfc ena frames pri4"); 495 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 496 "rx_pfc_ena_frames_pri5", CTLFLAG_RD, 497 &softc->rx_port_stats->rx_pfc_ena_frames_pri5, 498 "Received pfc ena frames pri5"); 499 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 500 "rx_pfc_ena_frames_pri6", CTLFLAG_RD, 501 &softc->rx_port_stats->rx_pfc_ena_frames_pri6, 502 "Received pfc ena frames pri6"); 503 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 504 "rx_pfc_ena_frames_pri7", CTLFLAG_RD, 505 &softc->rx_port_stats->rx_pfc_ena_frames_pri7, 506 "Received pfc ena frames pri7"); 507 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 508 "rx_sch_crc_err_frames", CTLFLAG_RD, 509 &softc->rx_port_stats->rx_sch_crc_err_frames, 510 "Received sch crc err frames"); 511 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 512 "rx_undrsz_frames", CTLFLAG_RD, 513 &softc->rx_port_stats->rx_undrsz_frames, "Received undrsz frames"); 514 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 515 "rx_eee_lpi_events", CTLFLAG_RD, 516 &softc->rx_port_stats->rx_eee_lpi_events, "Received eee lpi events"); 517 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 518 "rx_eee_lpi_duration", CTLFLAG_RD, 519 &softc->rx_port_stats->rx_eee_lpi_duration, 520 "Received eee lpi duration"); 521 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 522 "rx_llfc_physical_msgs", CTLFLAG_RD, 523 &softc->rx_port_stats->rx_llfc_physical_msgs, 524 "Received llfc physical msgs"); 525 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 526 "rx_llfc_logical_msgs", CTLFLAG_RD, 527 &softc->rx_port_stats->rx_llfc_logical_msgs, 528 "Received llfc logical msgs"); 529 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 530 "rx_llfc_msgs_with_crc_err", CTLFLAG_RD, 531 &softc->rx_port_stats->rx_llfc_msgs_with_crc_err, 532 "Received llfc msgs with crc err"); 533 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 534 "rx_hcfc_msgs", CTLFLAG_RD, 535 &softc->rx_port_stats->rx_hcfc_msgs, "Received hcfc msgs"); 536 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 537 "rx_hcfc_msgs_with_crc_err", CTLFLAG_RD, 538 &softc->rx_port_stats->rx_hcfc_msgs_with_crc_err, 539 "Received hcfc msgs with crc err"); 540 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 541 "rx_bytes", CTLFLAG_RD, 542 &softc->rx_port_stats->rx_bytes, "Received bytes"); 543 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 544 "rx_runt_bytes", CTLFLAG_RD, 545 &softc->rx_port_stats->rx_runt_bytes, "Received runt bytes"); 546 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 547 "rx_runt_frames", CTLFLAG_RD, 548 &softc->rx_port_stats->rx_runt_frames, "Received runt frames"); 549 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 550 "rx_stat_discard", CTLFLAG_RD, 551 &softc->rx_port_stats->rx_stat_discard, "Received stat discard"); 552 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 553 "rx_stat_err", CTLFLAG_RD, 554 &softc->rx_port_stats->rx_stat_err, "Received stat err"); 555 556 if (BNXT_CHIP_P5(softc) && 557 (softc->flags & BNXT_FLAG_FW_CAP_EXT_STATS)) { 558 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 559 "tx_bytes_cos0", CTLFLAG_RD, 560 &softc->tx_port_stats_ext->tx_bytes_cos0, "Transmitted bytes count cos0"); 561 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 562 "tx_packets_cos0", CTLFLAG_RD, 563 &softc->tx_port_stats_ext->tx_packets_cos0, "Transmitted packets count cos0"); 564 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 565 "tx_bytes_cos1", CTLFLAG_RD, 566 &softc->tx_port_stats_ext->tx_bytes_cos1, "Transmitted bytes count cos1"); 567 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 568 "tx_packets_cos1", CTLFLAG_RD, 569 &softc->tx_port_stats_ext->tx_packets_cos1, "Transmitted packets count cos1"); 570 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 571 "tx_bytes_cos2", CTLFLAG_RD, 572 &softc->tx_port_stats_ext->tx_bytes_cos2, "Transmitted bytes count cos2"); 573 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 574 "tx_packets_cos2", CTLFLAG_RD, 575 &softc->tx_port_stats_ext->tx_packets_cos2, "Transmitted packets count cos2"); 576 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 577 "tx_bytes_cos3", CTLFLAG_RD, 578 &softc->tx_port_stats_ext->tx_bytes_cos3, "Transmitted bytes count cos3"); 579 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 580 "tx_packets_cos3", CTLFLAG_RD, 581 &softc->tx_port_stats_ext->tx_packets_cos3, "Transmitted packets count cos3"); 582 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 583 "tx_bytes_cos4", CTLFLAG_RD, 584 &softc->tx_port_stats_ext->tx_bytes_cos4, "Transmitted bytes count cos4"); 585 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 586 "tx_packets_cos4", CTLFLAG_RD, 587 &softc->tx_port_stats_ext->tx_packets_cos4, "Transmitted packets count cos4"); 588 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 589 "tx_bytes_cos5", CTLFLAG_RD, 590 &softc->tx_port_stats_ext->tx_bytes_cos5, "Transmitted bytes count cos5"); 591 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 592 "tx_packets_cos5", CTLFLAG_RD, 593 &softc->tx_port_stats_ext->tx_packets_cos5, "Transmitted packets count cos5"); 594 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 595 "tx_bytes_cos6", CTLFLAG_RD, 596 &softc->tx_port_stats_ext->tx_bytes_cos6, "Transmitted bytes count cos6"); 597 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 598 "tx_packets_cos6", CTLFLAG_RD, 599 &softc->tx_port_stats_ext->tx_packets_cos6, "Transmitted packets count cos6"); 600 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 601 "tx_bytes_cos7", CTLFLAG_RD, 602 &softc->tx_port_stats_ext->tx_bytes_cos7, "Transmitted bytes count cos7"); 603 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 604 "tx_packets_cos7", CTLFLAG_RD, 605 &softc->tx_port_stats_ext->tx_packets_cos7, "Transmitted packets count cos7"); 606 607 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 608 "tx_bytes_pri0", CTLFLAG_RD, 609 &softc->tx_bytes_pri[0], "Transmitted bytes count pri0"); 610 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 611 "tx_packets_pri0", CTLFLAG_RD, 612 &softc->tx_packets_pri[0], "Transmitted packets count pri0"); 613 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 614 "tx_bytes_pri1", CTLFLAG_RD, 615 &softc->tx_bytes_pri[1], "Transmitted bytes count pri1"); 616 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 617 "tx_packets_pri1", CTLFLAG_RD, 618 &softc->tx_packets_pri[1], "Transmitted packets count pri1"); 619 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 620 "tx_bytes_pri2", CTLFLAG_RD, 621 &softc->tx_bytes_pri[2], "Transmitted bytes count pri2"); 622 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 623 "tx_packets_pri2", CTLFLAG_RD, 624 &softc->tx_packets_pri[2], "Transmitted packets count pri2"); 625 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 626 "tx_bytes_pri3", CTLFLAG_RD, 627 &softc->tx_bytes_pri[3], "Transmitted bytes count pri3"); 628 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 629 "tx_packets_pri3", CTLFLAG_RD, 630 &softc->tx_packets_pri[3], "Transmitted packets count pri3"); 631 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 632 "tx_bytes_pri4", CTLFLAG_RD, 633 &softc->tx_bytes_pri[4], "Transmitted bytes count pri4"); 634 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 635 "tx_packets_pri4", CTLFLAG_RD, 636 &softc->tx_packets_pri[4], "Transmitted packets count pri4"); 637 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 638 "tx_bytes_pri5", CTLFLAG_RD, 639 &softc->tx_bytes_pri[5], "Transmitted bytes count pri5"); 640 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 641 "tx_packets_pri5", CTLFLAG_RD, 642 &softc->tx_packets_pri[5], "Transmitted packets count pri5"); 643 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 644 "tx_bytes_pri6", CTLFLAG_RD, 645 &softc->tx_bytes_pri[6], "Transmitted bytes count pri6"); 646 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 647 "tx_packets_pri6", CTLFLAG_RD, 648 &softc->tx_packets_pri[6], "Transmitted packets count pri6"); 649 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 650 "tx_bytes_pri7", CTLFLAG_RD, 651 &softc->tx_bytes_pri[7], "Transmitted bytes count pri7"); 652 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 653 "tx_packets_pri7", CTLFLAG_RD, 654 &softc->tx_packets_pri[7], "Transmitted packets count pri7"); 655 656 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 657 "pfc_pri0_tx_duration_us", CTLFLAG_RD, 658 &softc->tx_port_stats_ext->pfc_pri0_tx_duration_us, "Time duration between" 659 "XON to XOFF and XOFF to XON for pri0"); 660 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 661 "pfc_pri0_tx_transitions", CTLFLAG_RD, 662 &softc->tx_port_stats_ext->pfc_pri0_tx_transitions, "Num times transition" 663 "between XON to XOFF and XOFF to XON for pri0"); 664 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 665 "pfc_pri1_tx_duration_us", CTLFLAG_RD, 666 &softc->tx_port_stats_ext->pfc_pri1_tx_duration_us, "Time duration between" 667 "XON to XOFF and XOFF to XON for pri1"); 668 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 669 "pfc_pri1_tx_transitions", CTLFLAG_RD, 670 &softc->tx_port_stats_ext->pfc_pri1_tx_transitions, "Num times transition" 671 "between XON to XOFF and XOFF to XON for pri1"); 672 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 673 "pfc_pri2_tx_duration_us", CTLFLAG_RD, 674 &softc->tx_port_stats_ext->pfc_pri2_tx_duration_us, "Time duration between" 675 "XON to XOFF and XOFF to XON for pri2"); 676 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 677 "pfc_pri2_tx_transitions", CTLFLAG_RD, 678 &softc->tx_port_stats_ext->pfc_pri2_tx_transitions, "Num times transition" 679 "between XON to XOFF and XOFF to XON for pri2"); 680 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 681 "pfc_pri3_tx_duration_us", CTLFLAG_RD, 682 &softc->tx_port_stats_ext->pfc_pri3_tx_duration_us, "Time duration between" 683 "XON to XOFF and XOFF to XON for pri3"); 684 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 685 "pfc_pri3_tx_transitions", CTLFLAG_RD, 686 &softc->tx_port_stats_ext->pfc_pri3_tx_transitions, "Num times transition" 687 "between XON to XOFF and XOFF to XON for pri3"); 688 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 689 "pfc_pri4_tx_duration_us", CTLFLAG_RD, 690 &softc->tx_port_stats_ext->pfc_pri4_tx_duration_us, "Time duration between" 691 "XON to XOFF and XOFF to XON for pri4"); 692 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 693 "pfc_pri4_tx_transitions", CTLFLAG_RD, 694 &softc->tx_port_stats_ext->pfc_pri4_tx_transitions, "Num times transition" 695 "between XON to XOFF and XOFF to XON for pri4"); 696 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 697 "pfc_pri5_tx_duration_us", CTLFLAG_RD, 698 &softc->tx_port_stats_ext->pfc_pri5_tx_duration_us, "Time duration between" 699 "XON to XOFF and XOFF to XON for pri5"); 700 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 701 "pfc_pri5_tx_transitions", CTLFLAG_RD, 702 &softc->tx_port_stats_ext->pfc_pri5_tx_transitions, "Num times transition" 703 "between XON to XOFF and XOFF to XON for pri5"); 704 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 705 "pfc_pri6_tx_duration_us", CTLFLAG_RD, 706 &softc->tx_port_stats_ext->pfc_pri6_tx_duration_us, "Time duration between" 707 "XON to XOFF and XOFF to XON for pri6"); 708 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 709 "pfc_pri6_tx_transitions", CTLFLAG_RD, 710 &softc->tx_port_stats_ext->pfc_pri6_tx_transitions, "Num times transition" 711 "between XON to XOFF and XOFF to XON for pri6"); 712 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 713 "pfc_pri7_tx_duration_us", CTLFLAG_RD, 714 &softc->tx_port_stats_ext->pfc_pri7_tx_duration_us, "Time duration between" 715 "XON to XOFF and XOFF to XON for pri7"); 716 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 717 "pfc_pri7_tx_transitions", CTLFLAG_RD, 718 &softc->tx_port_stats_ext->pfc_pri7_tx_transitions, "Num times transition" 719 "between XON to XOFF and XOFF to XON for pri7"); 720 721 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 722 "link_down_events", CTLFLAG_RD, 723 &softc->rx_port_stats_ext->link_down_events, "Num times link states down"); 724 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 725 "continuous_pause_events", CTLFLAG_RD, 726 &softc->rx_port_stats_ext->continuous_pause_events, "Num times pause events"); 727 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 728 "resume_pause_events", CTLFLAG_RD, 729 &softc->rx_port_stats_ext->resume_pause_events, "Num times pause events" 730 "resumes"); 731 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 732 "continuous_roce_pause_events", CTLFLAG_RD, 733 &softc->rx_port_stats_ext->continuous_roce_pause_events, "Num times roce" 734 "pause events"); 735 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 736 "resume_roce_pause_events", CTLFLAG_RD, 737 &softc->rx_port_stats_ext->resume_roce_pause_events, "Num times roce pause" 738 "events resumes"); 739 740 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 741 "rx_bytes_cos0", CTLFLAG_RD, 742 &softc->rx_port_stats_ext->rx_bytes_cos0, "Received bytes count cos0"); 743 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 744 "rx_packets_cos0", CTLFLAG_RD, 745 &softc->rx_port_stats_ext->rx_packets_cos0, "Received packets count cos0"); 746 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 747 "rx_bytes_cos1", CTLFLAG_RD, 748 &softc->rx_port_stats_ext->rx_bytes_cos1, "Received bytes count cos1"); 749 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 750 "rx_packets_cos1", CTLFLAG_RD, 751 &softc->rx_port_stats_ext->rx_packets_cos1, "Received packets count cos1"); 752 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 753 "rx_bytes_cos2", CTLFLAG_RD, 754 &softc->rx_port_stats_ext->rx_bytes_cos2, "Received bytes count cos2"); 755 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 756 "rx_packets_cos2", CTLFLAG_RD, 757 &softc->rx_port_stats_ext->rx_packets_cos2, "Received packets count cos2"); 758 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 759 "rx_bytes_cos3", CTLFLAG_RD, 760 &softc->rx_port_stats_ext->rx_bytes_cos3, "Received bytes count cos3"); 761 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 762 "rx_packets_cos3", CTLFLAG_RD, 763 &softc->rx_port_stats_ext->rx_packets_cos3, "Received packets count cos3"); 764 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 765 "rx_bytes_cos4", CTLFLAG_RD, 766 &softc->rx_port_stats_ext->rx_bytes_cos4, "Received bytes count cos4"); 767 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 768 "rx_packets_cos4", CTLFLAG_RD, 769 &softc->rx_port_stats_ext->rx_packets_cos4, "Received packets count cos4"); 770 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 771 "rx_bytes_cos5", CTLFLAG_RD, 772 &softc->rx_port_stats_ext->rx_bytes_cos5, "Received bytes count cos5"); 773 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 774 "rx_packets_cos5", CTLFLAG_RD, 775 &softc->rx_port_stats_ext->rx_packets_cos5, "Received packets count cos5"); 776 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 777 "rx_bytes_cos6", CTLFLAG_RD, 778 &softc->rx_port_stats_ext->rx_bytes_cos6, "Received bytes count cos6"); 779 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 780 "rx_packets_cos6", CTLFLAG_RD, 781 &softc->rx_port_stats_ext->rx_packets_cos6, "Received packets count cos6"); 782 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 783 "rx_bytes_cos7", CTLFLAG_RD, 784 &softc->rx_port_stats_ext->rx_bytes_cos7, "Received bytes count cos7"); 785 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 786 "rx_packets_cos7", CTLFLAG_RD, 787 &softc->rx_port_stats_ext->rx_packets_cos7, "Received packets count cos7"); 788 789 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 790 "rx_bytes_pri0", CTLFLAG_RD, 791 &softc->rx_bytes_pri[0], "Received bytes count pri0"); 792 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 793 "rx_packets_pri0", CTLFLAG_RD, 794 &softc->rx_packets_pri[0], "Received packets count pri0"); 795 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 796 "rx_bytes_pri1", CTLFLAG_RD, 797 &softc->rx_bytes_pri[1], "Received bytes count pri1"); 798 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 799 "rx_packets_pri1", CTLFLAG_RD, 800 &softc->rx_packets_pri[1], "Received packets count pri1"); 801 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 802 "rx_bytes_pri2", CTLFLAG_RD, 803 &softc->rx_bytes_pri[2], "Received bytes count pri2"); 804 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 805 "rx_packets_pri2", CTLFLAG_RD, 806 &softc->rx_packets_pri[2], "Received packets count pri2"); 807 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 808 "rx_bytes_pri3", CTLFLAG_RD, 809 &softc->rx_bytes_pri[3], "Received bytes count pri3"); 810 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 811 "rx_packets_pri3", CTLFLAG_RD, 812 &softc->rx_packets_pri[3], "Received packets count pri3"); 813 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 814 "rx_bytes_pri4", CTLFLAG_RD, 815 &softc->rx_bytes_pri[4], "Received bytes count pri4"); 816 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 817 "rx_packets_pri4", CTLFLAG_RD, 818 &softc->rx_packets_pri[4], "Received packets count pri4"); 819 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 820 "rx_bytes_pri5", CTLFLAG_RD, 821 &softc->rx_bytes_pri[5], "Received bytes count pri5"); 822 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 823 "rx_packets_pri5", CTLFLAG_RD, 824 &softc->rx_packets_pri[5], "Received packets count pri5"); 825 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 826 "rx_bytes_pri6", CTLFLAG_RD, 827 &softc->rx_bytes_pri[6], "Received bytes count pri6"); 828 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 829 "rx_packets_pri6", CTLFLAG_RD, 830 &softc->rx_packets_pri[6], "Received packets count pri6"); 831 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 832 "rx_bytes_pri7", CTLFLAG_RD, 833 &softc->rx_bytes_pri[7], "Received bytes count pri7"); 834 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 835 "rx_packets_pri7", CTLFLAG_RD, 836 &softc->rx_packets_pri[7], "Received packets count pri7"); 837 838 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 839 "pfc_pri0_rx_duration_us", CTLFLAG_RD, 840 &softc->rx_port_stats_ext->pfc_pri0_rx_duration_us, "Time duration in receiving" 841 "between XON to XOFF and XOFF to XON for pri0"); 842 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 843 "pfc_pri0_rx_transitions", CTLFLAG_RD, 844 &softc->rx_port_stats_ext->pfc_pri0_rx_transitions, "Num times rx transition" 845 "between XON to XOFF and XOFF to XON for pri0"); 846 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 847 "pfc_pri1_rx_duration_us", CTLFLAG_RD, 848 &softc->rx_port_stats_ext->pfc_pri1_rx_duration_us, "Time duration in receiving" 849 "between XON to XOFF and XOFF to XON for pri1"); 850 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 851 "pfc_pri1_rx_transitions", CTLFLAG_RD, 852 &softc->rx_port_stats_ext->pfc_pri1_rx_transitions, "Num times rx transition" 853 "between XON to XOFF and XOFF to XON for pri1"); 854 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 855 "pfc_pri2_rx_duration_us", CTLFLAG_RD, 856 &softc->rx_port_stats_ext->pfc_pri2_rx_duration_us, "Time duration in receiving" 857 "between XON to XOFF and XOFF to XON for pri2"); 858 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 859 "pfc_pri2_rx_transitions", CTLFLAG_RD, 860 &softc->rx_port_stats_ext->pfc_pri2_rx_transitions, "Num times rx transition" 861 "between XON to XOFF and XOFF to XON for pri2"); 862 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 863 "pfc_pri3_rx_duration_us", CTLFLAG_RD, 864 &softc->rx_port_stats_ext->pfc_pri3_rx_duration_us, "Time duration in receiving" 865 "between XON to XOFF and XOFF to XON for pri3"); 866 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 867 "pfc_pri3_rx_transitions", CTLFLAG_RD, 868 &softc->rx_port_stats_ext->pfc_pri3_rx_transitions, "Num times rx transition" 869 "between XON to XOFF and XOFF to XON for pri3"); 870 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 871 "pfc_pri4_rx_duration_us", CTLFLAG_RD, 872 &softc->rx_port_stats_ext->pfc_pri4_rx_duration_us, "Time duration in receiving" 873 "between XON to XOFF and XOFF to XON for pri4"); 874 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 875 "pfc_pri4_rx_transitions", CTLFLAG_RD, 876 &softc->rx_port_stats_ext->pfc_pri4_rx_transitions, "Num times rx transition" 877 "between XON to XOFF and XOFF to XON for pri4"); 878 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 879 "pfc_pri5_rx_duration_us", CTLFLAG_RD, 880 &softc->rx_port_stats_ext->pfc_pri5_rx_duration_us, "Time duration in receiving" 881 "between XON to XOFF and XOFF to XON for pri5"); 882 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 883 "pfc_pri5_rx_transitions", CTLFLAG_RD, 884 &softc->rx_port_stats_ext->pfc_pri5_rx_transitions, "Num times rx transition" 885 "between XON to XOFF and XOFF to XON for pri5"); 886 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 887 "pfc_pri6_rx_duration_us", CTLFLAG_RD, 888 &softc->rx_port_stats_ext->pfc_pri6_rx_duration_us, "Time duration in receiving" 889 "between XON to XOFF and XOFF to XON for pri6"); 890 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 891 "pfc_pri6_rx_transitions", CTLFLAG_RD, 892 &softc->rx_port_stats_ext->pfc_pri6_rx_transitions, "Num times rx transition" 893 "between XON to XOFF and XOFF to XON for pri6"); 894 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 895 "pfc_pri7_rx_duration_us", CTLFLAG_RD, 896 &softc->rx_port_stats_ext->pfc_pri7_rx_duration_us, "Time duration in receiving" 897 "between XON to XOFF and XOFF to XON for pri7"); 898 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 899 "pfc_pri7_rx_transitions", CTLFLAG_RD, 900 &softc->rx_port_stats_ext->pfc_pri7_rx_transitions, "Num times rx transition" 901 "between XON to XOFF and XOFF to XON for pri7"); 902 903 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 904 "rx_bits", CTLFLAG_RD, 905 &softc->rx_port_stats_ext->rx_bits, "total number of received bits"); 906 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 907 "rx_buffer_passed_threshold", CTLFLAG_RD, 908 &softc->rx_port_stats_ext->rx_buffer_passed_threshold, "num of events port" 909 "buffer" 910 "was over 85%"); 911 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 912 "rx_pcs_symbol_err", CTLFLAG_RD, 913 &softc->rx_port_stats_ext->rx_pcs_symbol_err, "num of symbol errors wasn't" 914 "corrected by FEC"); 915 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 916 "rx_corrected_bits", CTLFLAG_RD, 917 &softc->rx_port_stats_ext->rx_corrected_bits, "num of bits corrected by FEC"); 918 919 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 920 "rx_discard_bytes_cos0", CTLFLAG_RD, 921 &softc->rx_port_stats_ext->rx_discard_bytes_cos0, "num of rx discard bytes" 922 "count on cos0"); 923 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 924 "rx_discard_packets_cos0", CTLFLAG_RD, 925 &softc->rx_port_stats_ext->rx_discard_packets_cos0, "num of rx discard packets" 926 "count on cos0"); 927 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 928 "rx_discard_bytes_cos1", CTLFLAG_RD, 929 &softc->rx_port_stats_ext->rx_discard_bytes_cos1, "num of rx discard bytes" 930 "count on cos1"); 931 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 932 "rx_discard_packets_cos1", CTLFLAG_RD, 933 &softc->rx_port_stats_ext->rx_discard_packets_cos1, "num of rx discard packets" 934 "count on cos1"); 935 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 936 "rx_discard_bytes_cos2", CTLFLAG_RD, 937 &softc->rx_port_stats_ext->rx_discard_bytes_cos2, "num of rx discard bytes" 938 "count on cos2"); 939 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 940 "rx_discard_packets_cos2", CTLFLAG_RD, 941 &softc->rx_port_stats_ext->rx_discard_packets_cos2, "num of rx discard packets" 942 "count on cos2"); 943 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 944 "rx_discard_bytes_cos3", CTLFLAG_RD, 945 &softc->rx_port_stats_ext->rx_discard_bytes_cos3, "num of rx discard bytes" 946 "count on cos3"); 947 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 948 "rx_discard_packets_cos3", CTLFLAG_RD, 949 &softc->rx_port_stats_ext->rx_discard_packets_cos3, "num of rx discard packets" 950 "count on cos3"); 951 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 952 "rx_discard_bytes_cos4", CTLFLAG_RD, 953 &softc->rx_port_stats_ext->rx_discard_bytes_cos4, "num of rx discard bytes" 954 "count on cos4"); 955 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 956 "rx_discard_packets_cos4", CTLFLAG_RD, 957 &softc->rx_port_stats_ext->rx_discard_packets_cos4, "num of rx discard packets" 958 "count on cos4"); 959 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 960 "rx_discard_bytes_cos5", CTLFLAG_RD, 961 &softc->rx_port_stats_ext->rx_discard_bytes_cos5, "num of rx discard bytes" 962 "count on cos5"); 963 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 964 "rx_discard_packets_cos5", CTLFLAG_RD, 965 &softc->rx_port_stats_ext->rx_discard_packets_cos5, "num of rx discard packets" 966 "count on cos5"); 967 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 968 "rx_discard_bytes_cos6", CTLFLAG_RD, 969 &softc->rx_port_stats_ext->rx_discard_bytes_cos6, "num of rx discard bytes" 970 "count on cos6"); 971 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 972 "rx_discard_packets_cos6", CTLFLAG_RD, 973 &softc->rx_port_stats_ext->rx_discard_packets_cos6, "num of rx discard packets" 974 "count on cos6"); 975 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 976 "rx_discard_bytes_cos7", CTLFLAG_RD, 977 &softc->rx_port_stats_ext->rx_discard_bytes_cos7, "num of rx discard bytes" 978 "count on cos7"); 979 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 980 "rx_discard_packets_cos7", CTLFLAG_RD, 981 &softc->rx_port_stats_ext->rx_discard_packets_cos7, "num of rx discard packets" 982 "count on cos7"); 983 } 984 985 986 return 0; 987 } 988 989 int 990 bnxt_create_rx_sysctls(struct bnxt_softc *softc, int rxr) 991 { 992 struct sysctl_oid *oid; 993 struct ctx_hw_stats *rx_stats = (void *)softc->rx_stats[rxr].idi_vaddr; 994 char name[32]; 995 char desc[64]; 996 997 sprintf(name, "rxq%d", rxr); 998 sprintf(desc, "receive queue %d", rxr); 999 oid = SYSCTL_ADD_NODE(&softc->hw_stats, 1000 SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name, 1001 CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc); 1002 if (!oid) 1003 return ENOMEM; 1004 1005 if (BNXT_CHIP_P5(softc)) 1006 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1007 "nq_num_ints", CTLFLAG_RD, &softc->nq_rings[rxr].int_count, 1008 "Num Interrupts"); 1009 else 1010 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1011 "rq_num_ints", CTLFLAG_RD, &softc->rx_cp_rings[rxr].int_count, 1012 "Num Interrupts"); 1013 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1014 "ucast_pkts", CTLFLAG_RD, &rx_stats->rx_ucast_pkts, 1015 "unicast packets received"); 1016 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1017 "mcast_pkts", CTLFLAG_RD, &rx_stats->rx_mcast_pkts, 1018 "multicast packets received"); 1019 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1020 "bcast_pkts", CTLFLAG_RD, &rx_stats->rx_bcast_pkts, 1021 "broadcast packets received"); 1022 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1023 "discard_pkts", CTLFLAG_RD, 1024 &rx_stats->rx_discard_pkts, "discarded receive packets"); 1025 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1026 "error_pkts", CTLFLAG_RD, &rx_stats->rx_error_pkts, 1027 "Error receive packets"); 1028 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1029 "ucast_bytes", CTLFLAG_RD, &rx_stats->rx_ucast_bytes, 1030 "unicast bytes received"); 1031 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1032 "mcast_bytes", CTLFLAG_RD, &rx_stats->rx_mcast_bytes, 1033 "multicast bytes received"); 1034 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1035 "bcast_bytes", CTLFLAG_RD, &rx_stats->rx_bcast_bytes, 1036 "broadcast bytes received"); 1037 1038 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1039 "tpa_pkts", CTLFLAG_RD, &rx_stats->tpa_pkts, 1040 "TPA packets"); 1041 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1042 "tpa_bytes", CTLFLAG_RD, &rx_stats->tpa_bytes, 1043 "TPA bytes"); 1044 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1045 "tpa_events", CTLFLAG_RD, &rx_stats->tpa_events, 1046 "TPA events"); 1047 SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO, 1048 "tpa_aborts", CTLFLAG_RD, &rx_stats->tpa_aborts, 1049 "TPA aborts"); 1050 1051 return 0; 1052 } 1053 1054 static char *bnxt_chip_type[] = { 1055 "ASIC", 1056 "FPGA", 1057 "Palladium", 1058 "Unknown" 1059 }; 1060 #define MAX_CHIP_TYPE 3 1061 1062 static char *bnxt_parse_pkglog(int desired_field, uint8_t *data, size_t datalen) 1063 { 1064 char *retval = NULL; 1065 char *p; 1066 char *value; 1067 int field = 0; 1068 1069 if (datalen < 1) 1070 return NULL; 1071 /* null-terminate the log data (removing last '\n'): */ 1072 data[datalen - 1] = 0; 1073 for (p = data; *p != 0; p++) { 1074 field = 0; 1075 retval = NULL; 1076 while (*p != 0 && *p != '\n') { 1077 value = p; 1078 while (*p != 0 && *p != '\t' && *p != '\n') 1079 p++; 1080 if (field == desired_field) 1081 retval = value; 1082 if (*p != '\t') 1083 break; 1084 *p = 0; 1085 field++; 1086 p++; 1087 } 1088 if (*p == 0) 1089 break; 1090 *p = 0; 1091 } 1092 return retval; 1093 } 1094 1095 static int 1096 bnxt_package_ver_sysctl(SYSCTL_HANDLER_ARGS) 1097 { 1098 struct bnxt_softc *softc = arg1; 1099 struct iflib_dma_info dma_data; 1100 char *pkglog = NULL; 1101 char *p; 1102 char unk[] = "<unknown>"; 1103 char *buf = unk; 1104 int rc; 1105 uint16_t ordinal = BNX_DIR_ORDINAL_FIRST; 1106 uint16_t index; 1107 uint32_t data_len; 1108 1109 rc = bnxt_hwrm_nvm_find_dir_entry(softc, BNX_DIR_TYPE_PKG_LOG, 1110 &ordinal, BNX_DIR_EXT_NONE, &index, false, 1111 HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_EQ, 1112 &data_len, NULL, NULL); 1113 dma_data.idi_vaddr = NULL; 1114 if (rc == 0 && data_len) { 1115 rc = iflib_dma_alloc(softc->ctx, data_len, &dma_data, 1116 BUS_DMA_NOWAIT); 1117 if (rc == 0) { 1118 rc = bnxt_hwrm_nvm_read(softc, index, 0, data_len, 1119 &dma_data); 1120 if (rc == 0) { 1121 pkglog = dma_data.idi_vaddr; 1122 p = bnxt_parse_pkglog(BNX_PKG_LOG_FIELD_IDX_PKG_VERSION, pkglog, data_len); 1123 if (p && *p != 0 && isdigit(*p)) 1124 buf = p; 1125 } 1126 } else 1127 dma_data.idi_vaddr = NULL; 1128 } 1129 1130 rc = sysctl_handle_string(oidp, buf, 0, req); 1131 if (dma_data.idi_vaddr) 1132 iflib_dma_free(&dma_data); 1133 return rc; 1134 } 1135 1136 static int 1137 bnxt_hwrm_min_ver_sysctl(SYSCTL_HANDLER_ARGS) 1138 { 1139 struct bnxt_softc *softc = arg1; 1140 char buf[16]; 1141 uint8_t newver[3]; 1142 int rc; 1143 1144 sprintf(buf, "%hhu.%hhu.%hhu", softc->ver_info->hwrm_min_major, 1145 softc->ver_info->hwrm_min_minor, softc->ver_info->hwrm_min_update); 1146 1147 rc = sysctl_handle_string(oidp, buf, sizeof(buf), req); 1148 if (rc || req->newptr == NULL) 1149 return rc; 1150 if (sscanf(buf, "%hhu.%hhu.%hhu%*c", &newver[0], &newver[1], 1151 &newver[2]) != 3) 1152 return EINVAL; 1153 softc->ver_info->hwrm_min_major = newver[0]; 1154 softc->ver_info->hwrm_min_minor = newver[1]; 1155 softc->ver_info->hwrm_min_update = newver[2]; 1156 bnxt_check_hwrm_version(softc); 1157 1158 return rc; 1159 } 1160 1161 int 1162 bnxt_create_ver_sysctls(struct bnxt_softc *softc) 1163 { 1164 struct bnxt_ver_info *vi = softc->ver_info; 1165 struct sysctl_oid *oid = vi->ver_oid; 1166 1167 if (!oid) 1168 return ENOMEM; 1169 1170 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1171 "hwrm_if", CTLFLAG_RD, vi->hwrm_if_ver, 0, 1172 "HWRM interface version"); 1173 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1174 "driver_hwrm_if", CTLFLAG_RD, vi->driver_hwrm_if_ver, 0, 1175 "HWRM firmware version"); 1176 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1177 "mgmt_fw", CTLFLAG_RD, vi->mgmt_fw_ver, 0, 1178 "management firmware version"); 1179 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1180 "netctrl_fw", CTLFLAG_RD, vi->netctrl_fw_ver, 0, 1181 "network control firmware version"); 1182 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1183 "roce_fw", CTLFLAG_RD, vi->roce_fw_ver, 0, 1184 "RoCE firmware version"); 1185 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1186 "fw_ver", CTLFLAG_RD, vi->fw_ver_str, 0, 1187 "Firmware version"); 1188 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1189 "phy", CTLFLAG_RD, vi->phy_ver, 0, 1190 "PHY version"); 1191 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1192 "hwrm_fw_name", CTLFLAG_RD, vi->hwrm_fw_name, 0, 1193 "HWRM firmware name"); 1194 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1195 "mgmt_fw_name", CTLFLAG_RD, vi->mgmt_fw_name, 0, 1196 "management firmware name"); 1197 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1198 "netctrl_fw_name", CTLFLAG_RD, vi->netctrl_fw_name, 0, 1199 "network control firmware name"); 1200 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1201 "roce_fw_name", CTLFLAG_RD, vi->roce_fw_name, 0, 1202 "RoCE firmware name"); 1203 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1204 "phy_vendor", CTLFLAG_RD, vi->phy_vendor, 0, 1205 "PHY vendor name"); 1206 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1207 "phy_partnumber", CTLFLAG_RD, vi->phy_partnumber, 0, 1208 "PHY vendor part number"); 1209 SYSCTL_ADD_U16(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1210 "chip_num", CTLFLAG_RD, &vi->chip_num, 0, "chip number"); 1211 SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1212 "chip_rev", CTLFLAG_RD, &vi->chip_rev, 0, "chip revision"); 1213 SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1214 "chip_metal", CTLFLAG_RD, &vi->chip_metal, 0, "chip metal number"); 1215 SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1216 "chip_bond_id", CTLFLAG_RD, &vi->chip_bond_id, 0, 1217 "chip bond id"); 1218 SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1219 "chip_type", CTLFLAG_RD, vi->chip_type > MAX_CHIP_TYPE ? 1220 bnxt_chip_type[MAX_CHIP_TYPE] : bnxt_chip_type[vi->chip_type], 0, 1221 "RoCE firmware name"); 1222 SYSCTL_ADD_PROC(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1223 "package_ver", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, 1224 softc, 0, bnxt_package_ver_sysctl, "A", 1225 "currently installed package version"); 1226 SYSCTL_ADD_PROC(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1227 "hwrm_min_ver", CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 1228 softc, 0, bnxt_hwrm_min_ver_sysctl, "A", 1229 "minimum hwrm API vesion to support"); 1230 1231 return 0; 1232 } 1233 1234 int 1235 bnxt_create_nvram_sysctls(struct bnxt_nvram_info *ni) 1236 { 1237 struct sysctl_oid *oid = ni->nvm_oid; 1238 1239 if (!oid) 1240 return ENOMEM; 1241 1242 SYSCTL_ADD_U16(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1243 "mfg_id", CTLFLAG_RD, &ni->mfg_id, 0, "manufacturer id"); 1244 SYSCTL_ADD_U16(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1245 "device_id", CTLFLAG_RD, &ni->device_id, 0, "device id"); 1246 SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1247 "sector_size", CTLFLAG_RD, &ni->sector_size, 0, "sector size"); 1248 SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1249 "size", CTLFLAG_RD, &ni->size, 0, "nvram total size"); 1250 SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1251 "reserved_size", CTLFLAG_RD, &ni->reserved_size, 0, 1252 "total reserved space"); 1253 SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1254 "available_size", CTLFLAG_RD, &ni->available_size, 0, 1255 "total available space"); 1256 1257 return 0; 1258 } 1259 1260 static int 1261 bnxt_rss_key_sysctl(SYSCTL_HANDLER_ARGS) 1262 { 1263 struct bnxt_softc *softc = arg1; 1264 char buf[HW_HASH_KEY_SIZE*2+1] = {0}; 1265 char *p; 1266 int i; 1267 int rc; 1268 1269 for (p = buf, i=0; i<HW_HASH_KEY_SIZE; i++) 1270 p += sprintf(p, "%02x", softc->vnic_info.rss_hash_key[i]); 1271 1272 rc = sysctl_handle_string(oidp, buf, sizeof(buf), req); 1273 if (rc || req->newptr == NULL) 1274 return rc; 1275 1276 if (strspn(buf, "0123456789abcdefABCDEF") != (HW_HASH_KEY_SIZE * 2)) 1277 return EINVAL; 1278 1279 for (p = buf, i=0; i<HW_HASH_KEY_SIZE; i++) { 1280 if (sscanf(p, "%02hhx", &softc->vnic_info.rss_hash_key[i]) != 1) 1281 return EINVAL; 1282 p += 2; 1283 } 1284 1285 if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING) 1286 bnxt_hwrm_rss_cfg(softc, &softc->vnic_info, 1287 softc->vnic_info.rss_hash_type); 1288 1289 return rc; 1290 } 1291 1292 static const char *bnxt_hash_types[] = {"ipv4", "tcp_ipv4", "udp_ipv4", "ipv6", 1293 "tcp_ipv6", "udp_ipv6", NULL}; 1294 1295 static int bnxt_get_rss_type_str_bit(char *str) 1296 { 1297 int i; 1298 1299 for (i=0; bnxt_hash_types[i]; i++) 1300 if (strcmp(bnxt_hash_types[i], str) == 0) 1301 return i; 1302 1303 return -1; 1304 } 1305 1306 static int 1307 bnxt_rss_type_sysctl(SYSCTL_HANDLER_ARGS) 1308 { 1309 struct bnxt_softc *softc = arg1; 1310 char buf[256] = {0}; 1311 char *p; 1312 char *next; 1313 int rc; 1314 int type; 1315 int bit; 1316 1317 for (type = softc->vnic_info.rss_hash_type; type; 1318 type &= ~(1<<bit)) { 1319 bit = ffs(type) - 1; 1320 if (bit >= sizeof(bnxt_hash_types) / sizeof(const char *)) 1321 continue; 1322 if (type != softc->vnic_info.rss_hash_type) 1323 strcat(buf, ","); 1324 strcat(buf, bnxt_hash_types[bit]); 1325 } 1326 1327 rc = sysctl_handle_string(oidp, buf, sizeof(buf), req); 1328 if (rc || req->newptr == NULL) 1329 return rc; 1330 1331 for (type = 0, next = buf, p = strsep(&next, " ,"); p; 1332 p = strsep(&next, " ,")) { 1333 bit = bnxt_get_rss_type_str_bit(p); 1334 if (bit == -1) 1335 return EINVAL; 1336 type |= 1<<bit; 1337 } 1338 if (type != softc->vnic_info.rss_hash_type) { 1339 softc->vnic_info.rss_hash_type = type; 1340 if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING) 1341 bnxt_hwrm_rss_cfg(softc, &softc->vnic_info, 1342 softc->vnic_info.rss_hash_type); 1343 } 1344 1345 return rc; 1346 } 1347 1348 static int 1349 bnxt_rx_stall_sysctl(SYSCTL_HANDLER_ARGS) { 1350 struct bnxt_softc *softc = arg1; 1351 int rc; 1352 int val; 1353 1354 if (softc == NULL) 1355 return EBUSY; 1356 1357 val = (bool)(softc->vnic_info.flags & BNXT_VNIC_FLAG_BD_STALL); 1358 rc = sysctl_handle_int(oidp, &val, 0, req); 1359 if (rc || !req->newptr) 1360 return rc; 1361 1362 if (val) 1363 softc->vnic_info.flags |= BNXT_VNIC_FLAG_BD_STALL; 1364 else 1365 softc->vnic_info.flags &= ~BNXT_VNIC_FLAG_BD_STALL; 1366 1367 if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING) 1368 rc = bnxt_hwrm_vnic_cfg(softc, &softc->vnic_info); 1369 1370 return rc; 1371 } 1372 1373 static int 1374 bnxt_vlan_strip_sysctl(SYSCTL_HANDLER_ARGS) { 1375 struct bnxt_softc *softc = arg1; 1376 int rc; 1377 int val; 1378 1379 if (softc == NULL) 1380 return EBUSY; 1381 1382 val = (bool)(softc->vnic_info.flags & BNXT_VNIC_FLAG_VLAN_STRIP); 1383 rc = sysctl_handle_int(oidp, &val, 0, req); 1384 if (rc || !req->newptr) 1385 return rc; 1386 1387 if (val) 1388 softc->vnic_info.flags |= BNXT_VNIC_FLAG_VLAN_STRIP; 1389 else 1390 softc->vnic_info.flags &= ~BNXT_VNIC_FLAG_VLAN_STRIP; 1391 1392 if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING) 1393 rc = bnxt_hwrm_vnic_cfg(softc, &softc->vnic_info); 1394 1395 return rc; 1396 } 1397 1398 static int 1399 bnxt_set_coal_rx_usecs(SYSCTL_HANDLER_ARGS) { 1400 struct bnxt_softc *softc = arg1; 1401 int rc; 1402 int val; 1403 1404 if (softc == NULL) 1405 return EBUSY; 1406 1407 val = softc->rx_coal_usecs; 1408 rc = sysctl_handle_int(oidp, &val, 0, req); 1409 if (rc || !req->newptr) 1410 return rc; 1411 1412 softc->rx_coal_usecs = val; 1413 rc = bnxt_hwrm_set_coal(softc); 1414 1415 return rc; 1416 } 1417 1418 static int 1419 bnxt_set_coal_rx_frames(SYSCTL_HANDLER_ARGS) { 1420 struct bnxt_softc *softc = arg1; 1421 int rc; 1422 int val; 1423 1424 if (softc == NULL) 1425 return EBUSY; 1426 1427 val = softc->rx_coal_frames; 1428 rc = sysctl_handle_int(oidp, &val, 0, req); 1429 if (rc || !req->newptr) 1430 return rc; 1431 1432 softc->rx_coal_frames = val; 1433 rc = bnxt_hwrm_set_coal(softc); 1434 1435 return rc; 1436 } 1437 1438 static int 1439 bnxt_set_coal_rx_usecs_irq(SYSCTL_HANDLER_ARGS) { 1440 struct bnxt_softc *softc = arg1; 1441 int rc; 1442 int val; 1443 1444 if (softc == NULL) 1445 return EBUSY; 1446 1447 val = softc->rx_coal_usecs_irq; 1448 rc = sysctl_handle_int(oidp, &val, 0, req); 1449 if (rc || !req->newptr) 1450 return rc; 1451 1452 softc->rx_coal_usecs_irq = val; 1453 rc = bnxt_hwrm_set_coal(softc); 1454 1455 return rc; 1456 } 1457 1458 static int 1459 bnxt_set_coal_rx_frames_irq(SYSCTL_HANDLER_ARGS) { 1460 struct bnxt_softc *softc = arg1; 1461 int rc; 1462 int val; 1463 1464 if (softc == NULL) 1465 return EBUSY; 1466 1467 val = softc->rx_coal_frames_irq; 1468 rc = sysctl_handle_int(oidp, &val, 0, req); 1469 if (rc || !req->newptr) 1470 return rc; 1471 1472 softc->rx_coal_frames_irq = val; 1473 rc = bnxt_hwrm_set_coal(softc); 1474 1475 return rc; 1476 } 1477 1478 static int 1479 bnxt_set_coal_tx_usecs(SYSCTL_HANDLER_ARGS) { 1480 struct bnxt_softc *softc = arg1; 1481 int rc; 1482 int val; 1483 1484 if (softc == NULL) 1485 return EBUSY; 1486 1487 val = softc->tx_coal_usecs; 1488 rc = sysctl_handle_int(oidp, &val, 0, req); 1489 if (rc || !req->newptr) 1490 return rc; 1491 1492 softc->tx_coal_usecs = val; 1493 rc = bnxt_hwrm_set_coal(softc); 1494 1495 return rc; 1496 } 1497 1498 static int 1499 bnxt_set_coal_tx_frames(SYSCTL_HANDLER_ARGS) { 1500 struct bnxt_softc *softc = arg1; 1501 int rc; 1502 int val; 1503 1504 if (softc == NULL) 1505 return EBUSY; 1506 1507 val = softc->tx_coal_frames; 1508 rc = sysctl_handle_int(oidp, &val, 0, req); 1509 if (rc || !req->newptr) 1510 return rc; 1511 1512 softc->tx_coal_frames = val; 1513 rc = bnxt_hwrm_set_coal(softc); 1514 1515 return rc; 1516 } 1517 1518 static int 1519 bnxt_set_coal_tx_usecs_irq(SYSCTL_HANDLER_ARGS) { 1520 struct bnxt_softc *softc = arg1; 1521 int rc; 1522 int val; 1523 1524 if (softc == NULL) 1525 return EBUSY; 1526 1527 val = softc->tx_coal_usecs_irq; 1528 rc = sysctl_handle_int(oidp, &val, 0, req); 1529 if (rc || !req->newptr) 1530 return rc; 1531 1532 softc->tx_coal_usecs_irq = val; 1533 rc = bnxt_hwrm_set_coal(softc); 1534 1535 return rc; 1536 } 1537 1538 static int 1539 bnxt_set_coal_tx_frames_irq(SYSCTL_HANDLER_ARGS) { 1540 struct bnxt_softc *softc = arg1; 1541 int rc; 1542 int val; 1543 1544 if (softc == NULL) 1545 return EBUSY; 1546 1547 val = softc->tx_coal_frames_irq; 1548 rc = sysctl_handle_int(oidp, &val, 0, req); 1549 if (rc || !req->newptr) 1550 return rc; 1551 1552 softc->tx_coal_frames_irq = val; 1553 rc = bnxt_hwrm_set_coal(softc); 1554 1555 return rc; 1556 } 1557 1558 static 1559 void simulate_reset(struct bnxt_softc *bp, char *fwcli_string) 1560 { 1561 struct hwrm_dbg_fw_cli_input req = {0}; 1562 int rc = 0; 1563 1564 bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_DBG_FW_CLI); 1565 req.cmpl_ring = -1; 1566 req.target_id = -1; 1567 req.cli_cmd_len = strlen(fwcli_string); 1568 req.host_buf_len = 64 * 1024; 1569 strcpy((char *)req.cli_cmd, fwcli_string); 1570 1571 BNXT_HWRM_LOCK(bp); 1572 rc = _hwrm_send_message(bp, &req, sizeof(req)); 1573 if (rc) { 1574 device_printf(bp->dev, " Manual FW fault failed, rc:%x\n", rc); 1575 } 1576 BNXT_HWRM_UNLOCK(bp); 1577 } 1578 1579 static int 1580 bnxt_reset_ctrl(SYSCTL_HANDLER_ARGS) { 1581 struct bnxt_softc *softc = arg1; 1582 int rc = 0; 1583 char buf[50] = {0}; 1584 1585 if (softc == NULL) 1586 return EBUSY; 1587 1588 rc = sysctl_handle_string(oidp, buf, sizeof(buf), req); 1589 if (rc || req->newptr == NULL) 1590 return rc; 1591 1592 if (BNXT_CHIP_P5(softc)) 1593 simulate_reset(softc, buf); 1594 1595 return rc; 1596 } 1597 1598 int 1599 bnxt_create_config_sysctls_pre(struct bnxt_softc *softc) 1600 { 1601 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(softc->dev); 1602 struct sysctl_oid_list *children; 1603 1604 children = SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)); 1605 1606 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rss_key", 1607 CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1608 bnxt_rss_key_sysctl, "A", "RSS key"); 1609 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rss_type", 1610 CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1611 bnxt_rss_type_sysctl, "A", "RSS type bits"); 1612 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rx_stall", 1613 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1614 bnxt_rx_stall_sysctl, "I", 1615 "buffer rx packets in hardware until the host posts new buffers"); 1616 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "vlan_strip", 1617 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1618 bnxt_vlan_strip_sysctl, "I", "strip VLAN tag in the RX path"); 1619 SYSCTL_ADD_CONST_STRING(ctx, children, OID_AUTO, "if_name", CTLFLAG_RD, 1620 if_name(iflib_get_ifp(softc->ctx)), "interface name"); 1621 1622 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_usecs", 1623 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1624 bnxt_set_coal_rx_usecs, "I", "interrupt coalescing Rx Usecs"); 1625 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_frames", 1626 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1627 bnxt_set_coal_rx_frames, "I", "interrupt coalescing Rx Frames"); 1628 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_usecs_irq", 1629 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1630 bnxt_set_coal_rx_usecs_irq, "I", 1631 "interrupt coalescing Rx Usecs IRQ"); 1632 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_frames_irq", 1633 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1634 bnxt_set_coal_rx_frames_irq, "I", 1635 "interrupt coalescing Rx Frames IRQ"); 1636 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_usecs", 1637 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1638 bnxt_set_coal_tx_usecs, "I", "interrupt coalescing Tx Usces"); 1639 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_frames", 1640 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1641 bnxt_set_coal_tx_frames, "I", "interrupt coalescing Tx Frames"); 1642 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_usecs_irq", 1643 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1644 bnxt_set_coal_tx_usecs_irq, "I", 1645 "interrupt coalescing Tx Usecs IRQ"); 1646 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_frames_irq", 1647 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1648 bnxt_set_coal_tx_frames_irq, "I", 1649 "interrupt coalescing Tx Frames IRQ"); 1650 SYSCTL_ADD_U32(ctx, children, OID_AUTO, "flags", CTLFLAG_RD, 1651 &softc->flags, 0, "flags"); 1652 SYSCTL_ADD_U64(ctx, children, OID_AUTO, "fw_cap", CTLFLAG_RD, 1653 &softc->fw_cap, 0, "FW caps"); 1654 1655 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 1656 "reset_ctrl", CTLTYPE_STRING | CTLFLAG_RWTUN, softc, 1657 0, bnxt_reset_ctrl, "A", 1658 "Issue controller reset: 0 / 1"); 1659 return 0; 1660 } 1661 1662 #define BNXT_HW_LRO_FN(fn_name, arg) \ 1663 static int \ 1664 fn_name(SYSCTL_HANDLER_ARGS) { \ 1665 struct bnxt_softc *softc = arg1; \ 1666 int rc; \ 1667 int val; \ 1668 \ 1669 if (softc == NULL) \ 1670 return EBUSY; \ 1671 \ 1672 val = softc->hw_lro.arg; \ 1673 rc = sysctl_handle_int(oidp, &val, 0, req); \ 1674 if (rc || !req->newptr) \ 1675 return rc; \ 1676 \ 1677 if ((if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)) \ 1678 return EBUSY; \ 1679 \ 1680 if (!(softc->flags & BNXT_FLAG_TPA)) \ 1681 return EINVAL; \ 1682 \ 1683 softc->hw_lro.arg = val; \ 1684 bnxt_validate_hw_lro_settings(softc); \ 1685 rc = bnxt_hwrm_vnic_tpa_cfg(softc); \ 1686 \ 1687 return rc; \ 1688 } 1689 1690 BNXT_HW_LRO_FN(bnxt_hw_lro_enable_disable, enable) 1691 BNXT_HW_LRO_FN(bnxt_hw_lro_set_mode, is_mode_gro) 1692 BNXT_HW_LRO_FN(bnxt_hw_lro_set_max_agg_segs, max_agg_segs) 1693 BNXT_HW_LRO_FN(bnxt_hw_lro_set_max_aggs, max_aggs) 1694 BNXT_HW_LRO_FN(bnxt_hw_lro_set_min_agg_len, min_agg_len) 1695 1696 #define BNXT_FLOW_CTRL_FN(fn_name, arg) \ 1697 static int \ 1698 fn_name(SYSCTL_HANDLER_ARGS) { \ 1699 struct bnxt_softc *softc = arg1; \ 1700 int rc; \ 1701 int val; \ 1702 \ 1703 if (softc == NULL) \ 1704 return EBUSY; \ 1705 \ 1706 val = softc->link_info.flow_ctrl.arg; \ 1707 rc = sysctl_handle_int(oidp, &val, 0, req); \ 1708 if (rc || !req->newptr) \ 1709 return rc; \ 1710 \ 1711 if (val) \ 1712 val = 1; \ 1713 \ 1714 if (softc->link_info.flow_ctrl.arg != val) { \ 1715 softc->link_info.flow_ctrl.arg = val; \ 1716 rc = bnxt_hwrm_set_link_setting(softc, true, false, false);\ 1717 rc = bnxt_hwrm_port_phy_qcfg(softc); \ 1718 } \ 1719 \ 1720 return rc; \ 1721 } 1722 1723 BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_tx, tx) 1724 BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_rx, rx) 1725 BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_autoneg, autoneg) 1726 int 1727 bnxt_create_pause_fc_sysctls(struct bnxt_softc *softc) 1728 { 1729 struct sysctl_oid *oid = softc->flow_ctrl_oid; 1730 1731 if (!oid) 1732 return ENOMEM; 1733 1734 SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1735 "tx", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1736 bnxt_flow_ctrl_tx, "A", "Enable or Disable Tx Flow Ctrl: 0 / 1"); 1737 1738 SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1739 "rx", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0, 1740 bnxt_flow_ctrl_rx, "A", "Enable or Disable Tx Flow Ctrl: 0 / 1"); 1741 1742 SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1743 "autoneg", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 1744 0, bnxt_flow_ctrl_autoneg, "A", 1745 "Enable or Disable Autoneg Flow Ctrl: 0 / 1"); 1746 1747 return 0; 1748 } 1749 1750 int 1751 bnxt_create_hw_lro_sysctls(struct bnxt_softc *softc) 1752 { 1753 struct sysctl_oid *oid = softc->hw_lro_oid; 1754 1755 if (!oid) 1756 return ENOMEM; 1757 1758 SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1759 "enable", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 1760 0, bnxt_hw_lro_enable_disable, "A", 1761 "Enable or Disable HW LRO: 0 / 1"); 1762 1763 SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1764 "gro_mode", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 1765 0, bnxt_hw_lro_set_mode, "A", 1766 "Set mode: 1 = GRO mode, 0 = RSC mode"); 1767 1768 SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1769 "max_agg_segs", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 1770 softc, 0, bnxt_hw_lro_set_max_agg_segs, "A", 1771 "Set Max Agg Seg Value (unit is Log2): " 1772 "0 (= 1 seg) / 1 (= 2 segs) / ... / 31 (= 2^31 segs)"); 1773 1774 SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1775 "max_aggs", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 1776 softc, 0, bnxt_hw_lro_set_max_aggs, "A", 1777 "Set Max Aggs Value (unit is Log2): " 1778 "0 (= 1 agg) / 1 (= 2 aggs) / ... / 7 (= 2^7 segs)"); 1779 1780 SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 1781 "min_agg_len", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 1782 softc, 0, bnxt_hw_lro_set_min_agg_len, "A", 1783 "Min Agg Len: 1 to 9000"); 1784 1785 return 0; 1786 } 1787 1788 static int 1789 bnxt_dcb_dcbx_cap(SYSCTL_HANDLER_ARGS) 1790 { 1791 struct bnxt_softc *softc = arg1; 1792 int val; 1793 int rc; 1794 1795 if (softc == NULL) 1796 return EBUSY; 1797 1798 val = bnxt_dcb_getdcbx(softc); 1799 rc = sysctl_handle_int(oidp, &val, 0, req); 1800 if (rc || !req->newptr) 1801 return rc; 1802 1803 bnxt_dcb_setdcbx(softc, val); 1804 1805 return rc; 1806 } 1807 1808 static char 1809 bnxt_ets_tsa_to_str(struct bnxt_softc *softc, uint32_t tc) 1810 { 1811 switch (softc->ieee_ets->tc_tsa[tc]) { 1812 case BNXT_IEEE_8021QAZ_TSA_STRICT: 1813 return 's'; 1814 case BNXT_IEEE_8021QAZ_TSA_ETS: 1815 return 'e'; 1816 default: 1817 return 'X'; 1818 1819 } 1820 } 1821 1822 static uint32_t 1823 bnxt_ets_str_to_tsa(char tsa_str) 1824 { 1825 switch (tsa_str) { 1826 case 's': 1827 return BNXT_IEEE_8021QAZ_TSA_STRICT; 1828 case 'e': 1829 return BNXT_IEEE_8021QAZ_TSA_ETS; 1830 default: 1831 return -1; 1832 } 1833 } 1834 1835 static int 1836 bnxt_ets_get_val(struct bnxt_softc *softc, uint32_t type, uint32_t tc) 1837 { 1838 switch (type) { 1839 case BNXT_TYPE_ETS_TSA: 1840 if (softc->ieee_ets) 1841 return softc->ieee_ets->tc_tsa[tc]; 1842 break; 1843 case BNXT_TYPE_ETS_PRI2TC: 1844 if (softc->ieee_ets) 1845 return softc->ieee_ets->prio_tc[tc]; 1846 break; 1847 case BNXT_TYPE_ETS_TCBW: 1848 if (softc->ieee_ets) 1849 return softc->ieee_ets->tc_tx_bw[tc]; 1850 break; 1851 default: 1852 break; 1853 } 1854 1855 return -1; 1856 } 1857 1858 static void 1859 bnxt_pfc_get_string(struct bnxt_softc *softc, char *buf, struct bnxt_ieee_pfc *pfc) 1860 { 1861 uint32_t i; 1862 bool found = false; 1863 1864 for (i = 0; i < BNXT_IEEE_8021QAZ_MAX_TCS; i++) { 1865 if (pfc->pfc_en & (1 << i)) { 1866 if (found) 1867 buf += sprintf(buf, ", "); 1868 buf += sprintf(buf, "%d", i); 1869 found = true; 1870 } 1871 } 1872 1873 if (!found) 1874 buf += sprintf(buf, "none"); 1875 } 1876 1877 static char *bnxt_get_tlv_selector_str(uint8_t selector) 1878 { 1879 switch (selector) { 1880 case BNXT_IEEE_8021QAZ_APP_SEL_ETHERTYPE: 1881 return "Ethertype"; 1882 case BNXT_IEEE_8021QAZ_APP_SEL_DGRAM: 1883 return "UDP or DCCP"; 1884 case BNXT_IEEE_8021QAZ_APP_SEL_DSCP: 1885 return "DSCP"; 1886 default: 1887 return "Unknown"; 1888 } 1889 } 1890 1891 static void 1892 bnxt_app_tlv_get_string(struct bnxt_softc *softc, char *buf, 1893 struct bnxt_dcb_app *app, int num) 1894 { 1895 uint32_t i; 1896 1897 if (!num) { 1898 buf += sprintf(buf, " None"); 1899 return; 1900 } 1901 1902 buf += sprintf(buf, "\n"); 1903 for (i = 0; i < num; i++) { 1904 buf += sprintf(buf, "\tAPP#%0d:\tpri: %d,\tSel: %d,\t%s: %d\n", 1905 i, 1906 app[i].priority, 1907 app[i].selector, 1908 bnxt_get_tlv_selector_str(app[i].selector), 1909 app[i].protocol); 1910 } 1911 } 1912 1913 static void 1914 bnxt_ets_get_string(struct bnxt_softc *softc, char *buf) 1915 { 1916 uint32_t type, i; 1917 1918 type = BNXT_TYPE_ETS_TSA; 1919 for (type = 0; type < BNXT_TYPE_ETS_MAX; type++) { 1920 for (i = 0; i < BNXT_IEEE_8021QAZ_MAX_TCS; i++) { 1921 if (i == 0) 1922 buf += sprintf(buf, "%s:", BNXT_ETS_TYPE_STR[type]); 1923 1924 if (!softc->ieee_ets) 1925 buf += sprintf(buf, "x"); 1926 else if (type == BNXT_TYPE_ETS_TSA) 1927 buf += sprintf(buf, "%c", bnxt_ets_tsa_to_str(softc, i)); 1928 else 1929 buf += sprintf(buf, "%d", bnxt_ets_get_val(softc, type, i)); 1930 1931 if (i != BNXT_IEEE_8021QAZ_MAX_TCS - 1) 1932 buf += sprintf(buf, ","); 1933 } 1934 if (type != BNXT_TYPE_ETS_MAX - 1) 1935 buf += sprintf(buf, "#"); 1936 } 1937 } 1938 1939 static int 1940 bnxt_dcb_list_app(SYSCTL_HANDLER_ARGS) 1941 { 1942 struct bnxt_dcb_app app[128] = {0}; 1943 struct bnxt_softc *softc = arg1; 1944 int rc, num_inputs = 0; 1945 char *buf; 1946 1947 if (softc == NULL) 1948 return EBUSY; 1949 1950 #define BNXT_APP_TLV_STR_LEN 4096 1951 buf = malloc(BNXT_APP_TLV_STR_LEN, M_DEVBUF, M_NOWAIT | M_ZERO); 1952 if (!buf) 1953 return ENOMEM; 1954 1955 bnxt_dcb_ieee_listapp(softc, app, &num_inputs); 1956 bnxt_app_tlv_get_string(softc, buf, app, num_inputs); 1957 1958 rc = sysctl_handle_string(oidp, buf, BNXT_APP_TLV_STR_LEN, req); 1959 if (rc || req->newptr == NULL) 1960 goto end; 1961 1962 end: 1963 free(buf, M_DEVBUF); 1964 return rc; 1965 } 1966 1967 static int 1968 bnxt_dcb_del_app(SYSCTL_HANDLER_ARGS) 1969 { 1970 struct bnxt_softc *softc = arg1; 1971 struct bnxt_dcb_app app = {0}; 1972 char buf[256] = {0}; 1973 int rc, num_inputs; 1974 1975 if (softc == NULL) 1976 return EBUSY; 1977 1978 rc = sysctl_handle_string(oidp, buf, sizeof(buf), req); 1979 if (rc || req->newptr == NULL) 1980 return rc; 1981 1982 num_inputs = sscanf(buf, "%hhu,%hhu,%hd", &app.priority, &app.selector, &app.protocol); 1983 1984 if (num_inputs != 3) { 1985 device_printf(softc->dev, 1986 "Invalid app tlv syntax, inputs = %d\n", num_inputs); 1987 return EINVAL; 1988 } 1989 1990 bnxt_dcb_ieee_delapp(softc, &app); 1991 1992 return rc; 1993 } 1994 static int 1995 bnxt_dcb_set_app(SYSCTL_HANDLER_ARGS) 1996 { 1997 struct bnxt_softc *softc = arg1; 1998 struct bnxt_dcb_app app = {0}; 1999 char buf[256] = {0}; 2000 int rc, num_inputs; 2001 2002 if (softc == NULL) 2003 return EBUSY; 2004 2005 rc = sysctl_handle_string(oidp, buf, sizeof(buf), req); 2006 if (rc || req->newptr == NULL) 2007 return rc; 2008 2009 num_inputs = sscanf(buf, "%hhu,%hhu,%hd", &app.priority, &app.selector, &app.protocol); 2010 2011 if (num_inputs != 3) { 2012 device_printf(softc->dev, 2013 "Invalid app tlv syntax, inputs = %d\n", num_inputs); 2014 return EINVAL; 2015 } 2016 2017 bnxt_dcb_ieee_setapp(softc, &app); 2018 2019 return rc; 2020 } 2021 2022 static int 2023 bnxt_dcb_pfc(SYSCTL_HANDLER_ARGS) 2024 { 2025 struct bnxt_softc *softc = arg1; 2026 struct bnxt_ieee_pfc pfc = {0}; 2027 int rc, i, num_inputs; 2028 char buf[256] = {0}; 2029 int pri_mask = 0; 2030 char pri[8]; 2031 2032 if (softc == NULL) 2033 return EBUSY; 2034 2035 rc = bnxt_dcb_ieee_getpfc(softc, &pfc); 2036 if (!rc) 2037 bnxt_pfc_get_string(softc, buf, &pfc); 2038 else 2039 sprintf(buf, "## getpfc failed with error %d ##", rc); 2040 2041 rc = sysctl_handle_string(oidp, buf, sizeof(buf), req); 2042 if (rc || req->newptr == NULL) 2043 return rc; 2044 2045 /* Check for 'none' string first */ 2046 if (sscanf(buf, "%s", buf) == 1) { 2047 if (strncmp(buf, "none", 8) == 0) { 2048 goto configure; 2049 } 2050 } 2051 num_inputs = sscanf(buf, "%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu", 2052 &pri[0], &pri[1], &pri[2], &pri[3], &pri[4], 2053 &pri[5], &pri[6], &pri[7]); 2054 2055 if (num_inputs < 1 || num_inputs > 8) { 2056 device_printf(softc->dev, 2057 "Invalid pfc syntax, inputs = %d\n", num_inputs); 2058 return EINVAL; 2059 } 2060 2061 for (i = 0; i < num_inputs; i++) { 2062 if (pri[i] > 7 || pri[i] < 0) { 2063 device_printf(softc->dev, 2064 "Invalid priority %d. Valid priorties are " 2065 "from 0 to 7 and string \"none\".\n", pri[i]); 2066 return EINVAL; 2067 } 2068 2069 pri_mask |= (1 << pri[i]) & 0xFF; 2070 } 2071 2072 configure: 2073 pfc.pfc_en = pri_mask; 2074 rc = bnxt_dcb_ieee_setpfc(softc, &pfc); 2075 if (rc) 2076 device_printf(softc->dev, 2077 "setpfc failed with status %d\n", rc); 2078 return rc; 2079 } 2080 2081 static int 2082 bnxt_dcb_ets(SYSCTL_HANDLER_ARGS) 2083 { 2084 struct bnxt_softc *softc = arg1; 2085 struct bnxt_ieee_ets ets = {0}; 2086 int rc = 0, i, num_inputs; 2087 char buf[256] = {0}; 2088 char tsa[8]; 2089 2090 if (softc == NULL) 2091 return EBUSY; 2092 2093 rc = bnxt_dcb_ieee_getets(softc, &ets); 2094 if (!rc) 2095 bnxt_ets_get_string(softc, buf); 2096 else 2097 sprintf(buf, "## getets failed with error %d ##", rc); 2098 2099 rc = sysctl_handle_string(oidp, buf, sizeof(buf), req); 2100 if (rc || req->newptr == NULL) 2101 return rc; 2102 2103 num_inputs = sscanf(buf, "tsa:%c,%c,%c,%c,%c,%c,%c,%c#" 2104 "pri2tc:%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu#" 2105 "tcbw:%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu", 2106 &tsa[0], &tsa[1], &tsa[2], &tsa[3], &tsa[4], &tsa[5], &tsa[6], &tsa[7], 2107 &ets.prio_tc[0], &ets.prio_tc[1], &ets.prio_tc[2], &ets.prio_tc[3], 2108 &ets.prio_tc[4], &ets.prio_tc[5], &ets.prio_tc[6], &ets.prio_tc[7], 2109 &ets.tc_tx_bw[0], &ets.tc_tx_bw[1], &ets.tc_tx_bw[2], &ets.tc_tx_bw[3], 2110 &ets.tc_tx_bw[4], &ets.tc_tx_bw[5], &ets.tc_tx_bw[6], &ets.tc_tx_bw[7]); 2111 2112 if (num_inputs != 24) 2113 return EINVAL; 2114 2115 for ( i= 0; i < 8; i++) 2116 ets.tc_tsa[i] = bnxt_ets_str_to_tsa(tsa[i]); 2117 2118 rc = bnxt_dcb_ieee_setets(softc, &ets); 2119 2120 return rc; 2121 } 2122 2123 int 2124 bnxt_create_dcb_sysctls(struct bnxt_softc *softc) 2125 { 2126 struct sysctl_oid *oid = softc->dcb_oid; 2127 2128 if (!oid) 2129 return ENOMEM; 2130 2131 SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, 2132 "dcbx_cap", CTLTYPE_INT | CTLFLAG_RWTUN, softc, 2133 0, bnxt_dcb_dcbx_cap, "A", 2134 "Enable or Disable LRO: 0 / 1"); 2135 2136 SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "ets", 2137 CTLTYPE_STRING | CTLFLAG_RWTUN, softc, 0, 2138 bnxt_dcb_ets, "A", "Enhanced Transmission Selection (ETS)"); 2139 2140 SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "pfc", 2141 CTLTYPE_STRING | CTLFLAG_RWTUN, softc, 0, 2142 bnxt_dcb_pfc, "A", "Enhanced Transmission Selection (ETS)"); 2143 2144 SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "set_apptlv", 2145 CTLTYPE_STRING | CTLFLAG_WR, softc, 0, 2146 bnxt_dcb_set_app, "A", "Set App TLV"); 2147 2148 SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "del_apptlv", 2149 CTLTYPE_STRING | CTLFLAG_WR, softc, 0, 2150 bnxt_dcb_del_app, "A", "Delete App TLV"); 2151 2152 SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "list_apptlv", 2153 CTLTYPE_STRING | CTLFLAG_RD, softc, 0, 2154 bnxt_dcb_list_app, "A", "List all App TLVs"); 2155 2156 return 0; 2157 } 2158 2159 int 2160 bnxt_create_config_sysctls_post(struct bnxt_softc *softc) 2161 { 2162 /* Nothing for now, meant for future expansion */ 2163 return 0; 2164 } 2165