Path: blob/main/sys/dev/bnxt/bnxt_en/bnxt_sysctl.c
39536 views
/*-1* Broadcom NetXtreme-C/E network driver.2*3* Copyright (c) 2016 Broadcom, All Rights Reserved.4* The term Broadcom refers to Broadcom Limited and/or its subsidiaries5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'16* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE17* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE18* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS19* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR20* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF21* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS22* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN23* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)24* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF25* THE POSSIBILITY OF SUCH DAMAGE.26*/2728#include <sys/types.h>29#include <sys/sysctl.h>30#include <sys/ctype.h>31#include <linux/delay.h>3233#include "bnxt.h"34#include "bnxt_hwrm.h"35#include "bnxt_sysctl.h"3637DEFINE_MUTEX(tmp_mutex); /* mutex lock for driver */38extern void bnxt_fw_reset(struct bnxt_softc *bp);39extern void bnxt_queue_sp_work(struct bnxt_softc *bp);40extern void41process_nq(struct bnxt_softc *softc, uint16_t nqid);42/*43* We want to create:44* dev.bnxt.0.hwstats.txq045* dev.bnxt.0.hwstats.txq0.txmbufs46* dev.bnxt.0.hwstats.rxq047* dev.bnxt.0.hwstats.txq0.rxmbufs48* so the hwstats ctx list needs to be created in attach_post and populated49* during init.50*51* Then, it needs to be cleaned up in stop.52*/5354int55bnxt_init_sysctl_ctx(struct bnxt_softc *softc)56{57struct sysctl_ctx_list *ctx;5859sysctl_ctx_init(&softc->hw_stats);60ctx = device_get_sysctl_ctx(softc->dev);61softc->hw_stats_oid = SYSCTL_ADD_NODE(ctx,62SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,63"hwstats", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "hardware statistics");64if (!softc->hw_stats_oid) {65sysctl_ctx_free(&softc->hw_stats);66return ENOMEM;67}6869sysctl_ctx_init(&softc->ver_info->ver_ctx);70ctx = device_get_sysctl_ctx(softc->dev);71softc->ver_info->ver_oid = SYSCTL_ADD_NODE(ctx,72SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,73"ver", CTLFLAG_RD | CTLFLAG_MPSAFE, 0,74"hardware/firmware version information");75if (!softc->ver_info->ver_oid) {76sysctl_ctx_free(&softc->ver_info->ver_ctx);77return ENOMEM;78}7980if (BNXT_PF(softc)) {81sysctl_ctx_init(&softc->nvm_info->nvm_ctx);82ctx = device_get_sysctl_ctx(softc->dev);83softc->nvm_info->nvm_oid = SYSCTL_ADD_NODE(ctx,84SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,85"nvram", CTLFLAG_RD | CTLFLAG_MPSAFE, 0,86"nvram information");87if (!softc->nvm_info->nvm_oid) {88sysctl_ctx_free(&softc->nvm_info->nvm_ctx);89return ENOMEM;90}91}9293sysctl_ctx_init(&softc->hw_lro_ctx);94ctx = device_get_sysctl_ctx(softc->dev);95softc->hw_lro_oid = SYSCTL_ADD_NODE(ctx,96SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,97"hw_lro", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "hardware lro");98if (!softc->hw_lro_oid) {99sysctl_ctx_free(&softc->hw_lro_ctx);100return ENOMEM;101}102103sysctl_ctx_init(&softc->flow_ctrl_ctx);104ctx = device_get_sysctl_ctx(softc->dev);105softc->flow_ctrl_oid = SYSCTL_ADD_NODE(ctx,106SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,107"fc", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "flow ctrl");108if (!softc->flow_ctrl_oid) {109sysctl_ctx_free(&softc->flow_ctrl_ctx);110return ENOMEM;111}112113sysctl_ctx_init(&softc->dcb_ctx);114ctx = device_get_sysctl_ctx(softc->dev);115softc->dcb_oid = SYSCTL_ADD_NODE(ctx,116SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev)), OID_AUTO,117"dcb", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Data Center Bridging");118if (!softc->dcb_oid) {119sysctl_ctx_free(&softc->dcb_ctx);120return ENOMEM;121}122123return 0;124}125126int127bnxt_free_sysctl_ctx(struct bnxt_softc *softc)128{129int orc;130int rc = 0;131132if (softc->hw_stats_oid != NULL) {133orc = sysctl_ctx_free(&softc->hw_stats);134if (orc)135rc = orc;136else137softc->hw_stats_oid = NULL;138}139if (softc->ver_info->ver_oid != NULL) {140orc = sysctl_ctx_free(&softc->ver_info->ver_ctx);141if (orc)142rc = orc;143else144softc->ver_info->ver_oid = NULL;145}146if (BNXT_PF(softc) && softc->nvm_info->nvm_oid != NULL) {147orc = sysctl_ctx_free(&softc->nvm_info->nvm_ctx);148if (orc)149rc = orc;150else151softc->nvm_info->nvm_oid = NULL;152}153if (softc->hw_lro_oid != NULL) {154orc = sysctl_ctx_free(&softc->hw_lro_ctx);155if (orc)156rc = orc;157else158softc->hw_lro_oid = NULL;159}160161if (softc->flow_ctrl_oid != NULL) {162orc = sysctl_ctx_free(&softc->flow_ctrl_ctx);163if (orc)164rc = orc;165else166softc->flow_ctrl_oid = NULL;167}168169if (softc->dcb_oid != NULL) {170orc = sysctl_ctx_free(&softc->dcb_ctx);171if (orc)172rc = orc;173else174softc->dcb_oid = NULL;175}176177return rc;178}179180int181bnxt_create_tx_sysctls(struct bnxt_softc *softc, int txr)182{183struct sysctl_oid *oid;184struct ctx_hw_stats *tx_stats = (void *)softc->tx_stats[txr].idi_vaddr;185char name[32];186char desc[64];187188sprintf(name, "txq%d", txr);189sprintf(desc, "transmit queue %d", txr);190oid = SYSCTL_ADD_NODE(&softc->hw_stats,191SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name,192CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc);193if (!oid)194return ENOMEM;195196SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,197"ucast_pkts", CTLFLAG_RD, &tx_stats->tx_ucast_pkts,198"unicast packets sent");199SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,200"mcast_pkts", CTLFLAG_RD, &tx_stats->tx_mcast_pkts,201"multicast packets sent");202SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,203"bcast_pkts", CTLFLAG_RD, &tx_stats->tx_bcast_pkts,204"broadcast packets sent");205SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,206"discard_pkts", CTLFLAG_RD,207&tx_stats->tx_discard_pkts, "discarded transmit packets");208SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,209"error_pkts", CTLFLAG_RD, &tx_stats->tx_error_pkts,210"Error transmit packets");211SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,212"ucast_bytes", CTLFLAG_RD, &tx_stats->tx_ucast_bytes,213"unicast bytes sent");214SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,215"mcast_bytes", CTLFLAG_RD, &tx_stats->tx_mcast_bytes,216"multicast bytes sent");217SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,218"bcast_bytes", CTLFLAG_RD, &tx_stats->tx_bcast_bytes,219"broadcast bytes sent");220221return 0;222}223224int225bnxt_create_port_stats_sysctls(struct bnxt_softc *softc)226{227struct sysctl_oid *oid;228char name[32];229char desc[64];230231sprintf(name, "port_stats");232sprintf(desc, "Port Stats");233oid = SYSCTL_ADD_NODE(&softc->hw_stats,234SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name,235CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc);236if (!oid)237return ENOMEM;238239SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,240"tx_64b_frames", CTLFLAG_RD,241&softc->tx_port_stats->tx_64b_frames, "Transmitted 64b frames");242SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,243"tx_65b_127b_frames", CTLFLAG_RD,244&softc->tx_port_stats->tx_65b_127b_frames,245"Transmitted 65b 127b frames");246SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,247"tx_128b_255b_frames", CTLFLAG_RD,248&softc->tx_port_stats->tx_128b_255b_frames,249"Transmitted 128b 255b frames");250SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,251"tx_256b_511b_frames", CTLFLAG_RD,252&softc->tx_port_stats->tx_256b_511b_frames,253"Transmitted 256b 511b frames");254SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,255"tx_512b_1023b_frames", CTLFLAG_RD,256&softc->tx_port_stats->tx_512b_1023b_frames,257"Transmitted 512b 1023b frames");258SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,259"tx_1024b_1518b_frames", CTLFLAG_RD,260&softc->tx_port_stats->tx_1024b_1518b_frames,261"Transmitted 1024b 1518b frames");262SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,263"tx_good_vlan_frames", CTLFLAG_RD,264&softc->tx_port_stats->tx_good_vlan_frames,265"Transmitted good vlan frames");266SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,267"tx_1519b_2047b_frames", CTLFLAG_RD,268&softc->tx_port_stats->tx_1519b_2047b_frames,269"Transmitted 1519b 2047b frames");270SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,271"tx_2048b_4095b_frames", CTLFLAG_RD,272&softc->tx_port_stats->tx_2048b_4095b_frames,273"Transmitted 2048b 4095b frames");274SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,275"tx_4096b_9216b_frames", CTLFLAG_RD,276&softc->tx_port_stats->tx_4096b_9216b_frames,277"Transmitted 4096b 9216b frames");278SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,279"tx_9217b_16383b_frames", CTLFLAG_RD,280&softc->tx_port_stats->tx_9217b_16383b_frames,281"Transmitted 9217b 16383b frames");282SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,283"tx_good_frames", CTLFLAG_RD,284&softc->tx_port_stats->tx_good_frames, "Transmitted good frames");285SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,286"tx_total_frames", CTLFLAG_RD,287&softc->tx_port_stats->tx_total_frames, "Transmitted total frames");288SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,289"tx_ucast_frames", CTLFLAG_RD,290&softc->tx_port_stats->tx_ucast_frames, "Transmitted ucast frames");291SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,292"tx_mcast_frames", CTLFLAG_RD,293&softc->tx_port_stats->tx_mcast_frames, "Transmitted mcast frames");294SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,295"tx_bcast_frames", CTLFLAG_RD,296&softc->tx_port_stats->tx_bcast_frames, "Transmitted bcast frames");297SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,298"tx_pause_frames", CTLFLAG_RD,299&softc->tx_port_stats->tx_pause_frames, "Transmitted pause frames");300SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,301"tx_pfc_frames", CTLFLAG_RD,302&softc->tx_port_stats->tx_pfc_frames, "Transmitted pfc frames");303SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,304"tx_jabber_frames", CTLFLAG_RD,305&softc->tx_port_stats->tx_jabber_frames, "Transmitted jabber frames");306SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,307"tx_fcs_err_frames", CTLFLAG_RD,308&softc->tx_port_stats->tx_fcs_err_frames,309"Transmitted fcs err frames");310SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,311"tx_err", CTLFLAG_RD,312&softc->tx_port_stats->tx_err, "Transmitted err");313SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,314"tx_fifo_underruns", CTLFLAG_RD,315&softc->tx_port_stats->tx_fifo_underruns,316"Transmitted fifo underruns");317SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,318"tx_pfc_ena_frames_pri0", CTLFLAG_RD,319&softc->tx_port_stats->tx_pfc_ena_frames_pri0,320"Transmitted pfc ena frames pri0");321SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,322"tx_pfc_ena_frames_pri1", CTLFLAG_RD,323&softc->tx_port_stats->tx_pfc_ena_frames_pri1,324"Transmitted pfc ena frames pri1");325SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,326"tx_pfc_ena_frames_pri2", CTLFLAG_RD,327&softc->tx_port_stats->tx_pfc_ena_frames_pri2,328"Transmitted pfc ena frames pri2");329SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,330"tx_pfc_ena_frames_pri3", CTLFLAG_RD,331&softc->tx_port_stats->tx_pfc_ena_frames_pri3,332"Transmitted pfc ena frames pri3");333SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,334"tx_pfc_ena_frames_pri4", CTLFLAG_RD,335&softc->tx_port_stats->tx_pfc_ena_frames_pri4,336"Transmitted pfc ena frames pri4");337SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,338"tx_pfc_ena_frames_pri5", CTLFLAG_RD,339&softc->tx_port_stats->tx_pfc_ena_frames_pri5,340"Transmitted pfc ena frames pri5");341SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,342"tx_pfc_ena_frames_pri6", CTLFLAG_RD,343&softc->tx_port_stats->tx_pfc_ena_frames_pri6,344"Transmitted pfc ena frames pri6");345SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,346"tx_pfc_ena_frames_pri7", CTLFLAG_RD,347&softc->tx_port_stats->tx_pfc_ena_frames_pri7,348"Transmitted pfc ena frames pri7");349SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,350"tx_eee_lpi_events", CTLFLAG_RD,351&softc->tx_port_stats->tx_eee_lpi_events,352"Transmitted eee lpi events");353SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,354"tx_eee_lpi_duration", CTLFLAG_RD,355&softc->tx_port_stats->tx_eee_lpi_duration,356"Transmitted eee lpi duration");357SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,358"tx_llfc_logical_msgs", CTLFLAG_RD,359&softc->tx_port_stats->tx_llfc_logical_msgs,360"Transmitted llfc logical msgs");361SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,362"tx_hcfc_msgs", CTLFLAG_RD,363&softc->tx_port_stats->tx_hcfc_msgs, "Transmitted hcfc msgs");364SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,365"tx_total_collisions", CTLFLAG_RD,366&softc->tx_port_stats->tx_total_collisions,367"Transmitted total collisions");368SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,369"tx_bytes", CTLFLAG_RD,370&softc->tx_port_stats->tx_bytes, "Transmitted bytes");371SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,372"tx_xthol_frames", CTLFLAG_RD,373&softc->tx_port_stats->tx_xthol_frames, "Transmitted xthol frames");374SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,375"tx_stat_discard", CTLFLAG_RD,376&softc->tx_port_stats->tx_stat_discard, "Transmitted stat discard");377SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,378"tx_stat_error", CTLFLAG_RD,379&softc->tx_port_stats->tx_stat_error, "Transmitted stat error");380SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,381"rx_64b_frames", CTLFLAG_RD,382&softc->rx_port_stats->rx_64b_frames, "Received 64b frames");383SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,384"rx_65b_127b_frames", CTLFLAG_RD,385&softc->rx_port_stats->rx_65b_127b_frames, "Received 65b 127b frames");386SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,387"rx_128b_255b_frames", CTLFLAG_RD,388&softc->rx_port_stats->rx_128b_255b_frames,389"Received 128b 255b frames");390SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,391"rx_256b_511b_frames", CTLFLAG_RD,392&softc->rx_port_stats->rx_256b_511b_frames,393"Received 256b 511b frames");394SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,395"rx_512b_1023b_frames", CTLFLAG_RD,396&softc->rx_port_stats->rx_512b_1023b_frames,397"Received 512b 1023b frames");398SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,399"rx_1024b_1518b_frames", CTLFLAG_RD,400&softc->rx_port_stats->rx_1024b_1518b_frames,401"Received 1024b 1518 frames");402SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,403"rx_good_vlan_frames", CTLFLAG_RD,404&softc->rx_port_stats->rx_good_vlan_frames,405"Received good vlan frames");406SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,407"rx_1519b_2047b_frames", CTLFLAG_RD,408&softc->rx_port_stats->rx_1519b_2047b_frames,409"Received 1519b 2047b frames");410SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,411"rx_2048b_4095b_frames", CTLFLAG_RD,412&softc->rx_port_stats->rx_2048b_4095b_frames,413"Received 2048b 4095b frames");414SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,415"rx_4096b_9216b_frames", CTLFLAG_RD,416&softc->rx_port_stats->rx_4096b_9216b_frames,417"Received 4096b 9216b frames");418SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,419"rx_9217b_16383b_frames", CTLFLAG_RD,420&softc->rx_port_stats->rx_9217b_16383b_frames,421"Received 9217b 16383b frames");422SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,423"rx_total_frames", CTLFLAG_RD,424&softc->rx_port_stats->rx_total_frames, "Received total frames");425SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,426"rx_ucast_frames", CTLFLAG_RD,427&softc->rx_port_stats->rx_ucast_frames, "Received ucast frames");428SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,429"rx_mcast_frames", CTLFLAG_RD,430&softc->rx_port_stats->rx_mcast_frames, "Received mcast frames");431SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,432"rx_bcast_frames", CTLFLAG_RD,433&softc->rx_port_stats->rx_bcast_frames, "Received bcast frames");434SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,435"rx_fcs_err_frames", CTLFLAG_RD,436&softc->rx_port_stats->rx_fcs_err_frames, "Received fcs err frames");437SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,438"rx_ctrl_frames", CTLFLAG_RD,439&softc->rx_port_stats->rx_ctrl_frames, "Received ctrl frames");440SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,441"rx_pause_frames", CTLFLAG_RD,442&softc->rx_port_stats->rx_pause_frames, "Received pause frames");443SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,444"rx_pfc_frames", CTLFLAG_RD,445&softc->rx_port_stats->rx_pfc_frames, "Received pfc frames");446SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,447"rx_align_err_frames", CTLFLAG_RD,448&softc->rx_port_stats->rx_align_err_frames,449"Received align err frames");450SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,451"rx_ovrsz_frames", CTLFLAG_RD,452&softc->rx_port_stats->rx_ovrsz_frames,453"Received ovrsz frames");454SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,455"rx_jbr_frames", CTLFLAG_RD,456&softc->rx_port_stats->rx_jbr_frames,457"Received jbr frames");458SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,459"rx_mtu_err_frames", CTLFLAG_RD,460&softc->rx_port_stats->rx_mtu_err_frames,461"Received mtu err frames");462SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,463"rx_tagged_frames", CTLFLAG_RD,464&softc->rx_port_stats->rx_tagged_frames,465"Received tagged frames");466SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,467"rx_double_tagged_frames", CTLFLAG_RD,468&softc->rx_port_stats->rx_double_tagged_frames,469"Received double tagged frames");470SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,471"rx_good_frames", CTLFLAG_RD,472&softc->rx_port_stats->rx_good_frames,473"Received good frames");474SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,475"rx_pfc_ena_frames_pri0", CTLFLAG_RD,476&softc->rx_port_stats->rx_pfc_ena_frames_pri0,477"Received pfc ena frames pri0");478SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,479"rx_pfc_ena_frames_pri1", CTLFLAG_RD,480&softc->rx_port_stats->rx_pfc_ena_frames_pri1,481"Received pfc ena frames pri1");482SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,483"rx_pfc_ena_frames_pri2", CTLFLAG_RD,484&softc->rx_port_stats->rx_pfc_ena_frames_pri2,485"Received pfc ena frames pri2");486SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,487"rx_pfc_ena_frames_pri3", CTLFLAG_RD,488&softc->rx_port_stats->rx_pfc_ena_frames_pri3,489"Received pfc ena frames pri3");490SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,491"rx_pfc_ena_frames_pri4", CTLFLAG_RD,492&softc->rx_port_stats->rx_pfc_ena_frames_pri4,493"Received pfc ena frames pri4");494SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,495"rx_pfc_ena_frames_pri5", CTLFLAG_RD,496&softc->rx_port_stats->rx_pfc_ena_frames_pri5,497"Received pfc ena frames pri5");498SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,499"rx_pfc_ena_frames_pri6", CTLFLAG_RD,500&softc->rx_port_stats->rx_pfc_ena_frames_pri6,501"Received pfc ena frames pri6");502SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,503"rx_pfc_ena_frames_pri7", CTLFLAG_RD,504&softc->rx_port_stats->rx_pfc_ena_frames_pri7,505"Received pfc ena frames pri7");506SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,507"rx_sch_crc_err_frames", CTLFLAG_RD,508&softc->rx_port_stats->rx_sch_crc_err_frames,509"Received sch crc err frames");510SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,511"rx_undrsz_frames", CTLFLAG_RD,512&softc->rx_port_stats->rx_undrsz_frames, "Received undrsz frames");513SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,514"rx_eee_lpi_events", CTLFLAG_RD,515&softc->rx_port_stats->rx_eee_lpi_events, "Received eee lpi events");516SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,517"rx_eee_lpi_duration", CTLFLAG_RD,518&softc->rx_port_stats->rx_eee_lpi_duration,519"Received eee lpi duration");520SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,521"rx_llfc_physical_msgs", CTLFLAG_RD,522&softc->rx_port_stats->rx_llfc_physical_msgs,523"Received llfc physical msgs");524SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,525"rx_llfc_logical_msgs", CTLFLAG_RD,526&softc->rx_port_stats->rx_llfc_logical_msgs,527"Received llfc logical msgs");528SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,529"rx_llfc_msgs_with_crc_err", CTLFLAG_RD,530&softc->rx_port_stats->rx_llfc_msgs_with_crc_err,531"Received llfc msgs with crc err");532SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,533"rx_hcfc_msgs", CTLFLAG_RD,534&softc->rx_port_stats->rx_hcfc_msgs, "Received hcfc msgs");535SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,536"rx_hcfc_msgs_with_crc_err", CTLFLAG_RD,537&softc->rx_port_stats->rx_hcfc_msgs_with_crc_err,538"Received hcfc msgs with crc err");539SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,540"rx_bytes", CTLFLAG_RD,541&softc->rx_port_stats->rx_bytes, "Received bytes");542SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,543"rx_runt_bytes", CTLFLAG_RD,544&softc->rx_port_stats->rx_runt_bytes, "Received runt bytes");545SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,546"rx_runt_frames", CTLFLAG_RD,547&softc->rx_port_stats->rx_runt_frames, "Received runt frames");548SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,549"rx_stat_discard", CTLFLAG_RD,550&softc->rx_port_stats->rx_stat_discard, "Received stat discard");551SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,552"rx_stat_err", CTLFLAG_RD,553&softc->rx_port_stats->rx_stat_err, "Received stat err");554555if (BNXT_CHIP_P5_PLUS(softc) &&556(softc->flags & BNXT_FLAG_FW_CAP_EXT_STATS)) {557SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,558"tx_bytes_cos0", CTLFLAG_RD,559&softc->tx_port_stats_ext->tx_bytes_cos0, "Transmitted bytes count cos0");560SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,561"tx_packets_cos0", CTLFLAG_RD,562&softc->tx_port_stats_ext->tx_packets_cos0, "Transmitted packets count cos0");563SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,564"tx_bytes_cos1", CTLFLAG_RD,565&softc->tx_port_stats_ext->tx_bytes_cos1, "Transmitted bytes count cos1");566SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,567"tx_packets_cos1", CTLFLAG_RD,568&softc->tx_port_stats_ext->tx_packets_cos1, "Transmitted packets count cos1");569SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,570"tx_bytes_cos2", CTLFLAG_RD,571&softc->tx_port_stats_ext->tx_bytes_cos2, "Transmitted bytes count cos2");572SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,573"tx_packets_cos2", CTLFLAG_RD,574&softc->tx_port_stats_ext->tx_packets_cos2, "Transmitted packets count cos2");575SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,576"tx_bytes_cos3", CTLFLAG_RD,577&softc->tx_port_stats_ext->tx_bytes_cos3, "Transmitted bytes count cos3");578SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,579"tx_packets_cos3", CTLFLAG_RD,580&softc->tx_port_stats_ext->tx_packets_cos3, "Transmitted packets count cos3");581SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,582"tx_bytes_cos4", CTLFLAG_RD,583&softc->tx_port_stats_ext->tx_bytes_cos4, "Transmitted bytes count cos4");584SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,585"tx_packets_cos4", CTLFLAG_RD,586&softc->tx_port_stats_ext->tx_packets_cos4, "Transmitted packets count cos4");587SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,588"tx_bytes_cos5", CTLFLAG_RD,589&softc->tx_port_stats_ext->tx_bytes_cos5, "Transmitted bytes count cos5");590SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,591"tx_packets_cos5", CTLFLAG_RD,592&softc->tx_port_stats_ext->tx_packets_cos5, "Transmitted packets count cos5");593SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,594"tx_bytes_cos6", CTLFLAG_RD,595&softc->tx_port_stats_ext->tx_bytes_cos6, "Transmitted bytes count cos6");596SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,597"tx_packets_cos6", CTLFLAG_RD,598&softc->tx_port_stats_ext->tx_packets_cos6, "Transmitted packets count cos6");599SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,600"tx_bytes_cos7", CTLFLAG_RD,601&softc->tx_port_stats_ext->tx_bytes_cos7, "Transmitted bytes count cos7");602SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,603"tx_packets_cos7", CTLFLAG_RD,604&softc->tx_port_stats_ext->tx_packets_cos7, "Transmitted packets count cos7");605606SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,607"tx_bytes_pri0", CTLFLAG_RD,608&softc->tx_bytes_pri[0], "Transmitted bytes count pri0");609SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,610"tx_packets_pri0", CTLFLAG_RD,611&softc->tx_packets_pri[0], "Transmitted packets count pri0");612SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,613"tx_bytes_pri1", CTLFLAG_RD,614&softc->tx_bytes_pri[1], "Transmitted bytes count pri1");615SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,616"tx_packets_pri1", CTLFLAG_RD,617&softc->tx_packets_pri[1], "Transmitted packets count pri1");618SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,619"tx_bytes_pri2", CTLFLAG_RD,620&softc->tx_bytes_pri[2], "Transmitted bytes count pri2");621SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,622"tx_packets_pri2", CTLFLAG_RD,623&softc->tx_packets_pri[2], "Transmitted packets count pri2");624SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,625"tx_bytes_pri3", CTLFLAG_RD,626&softc->tx_bytes_pri[3], "Transmitted bytes count pri3");627SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,628"tx_packets_pri3", CTLFLAG_RD,629&softc->tx_packets_pri[3], "Transmitted packets count pri3");630SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,631"tx_bytes_pri4", CTLFLAG_RD,632&softc->tx_bytes_pri[4], "Transmitted bytes count pri4");633SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,634"tx_packets_pri4", CTLFLAG_RD,635&softc->tx_packets_pri[4], "Transmitted packets count pri4");636SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,637"tx_bytes_pri5", CTLFLAG_RD,638&softc->tx_bytes_pri[5], "Transmitted bytes count pri5");639SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,640"tx_packets_pri5", CTLFLAG_RD,641&softc->tx_packets_pri[5], "Transmitted packets count pri5");642SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,643"tx_bytes_pri6", CTLFLAG_RD,644&softc->tx_bytes_pri[6], "Transmitted bytes count pri6");645SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,646"tx_packets_pri6", CTLFLAG_RD,647&softc->tx_packets_pri[6], "Transmitted packets count pri6");648SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,649"tx_bytes_pri7", CTLFLAG_RD,650&softc->tx_bytes_pri[7], "Transmitted bytes count pri7");651SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,652"tx_packets_pri7", CTLFLAG_RD,653&softc->tx_packets_pri[7], "Transmitted packets count pri7");654655SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,656"pfc_pri0_tx_duration_us", CTLFLAG_RD,657&softc->tx_port_stats_ext->pfc_pri0_tx_duration_us, "Time duration between"658"XON to XOFF and XOFF to XON for pri0");659SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,660"pfc_pri0_tx_transitions", CTLFLAG_RD,661&softc->tx_port_stats_ext->pfc_pri0_tx_transitions, "Num times transition"662"between XON to XOFF and XOFF to XON for pri0");663SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,664"pfc_pri1_tx_duration_us", CTLFLAG_RD,665&softc->tx_port_stats_ext->pfc_pri1_tx_duration_us, "Time duration between"666"XON to XOFF and XOFF to XON for pri1");667SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,668"pfc_pri1_tx_transitions", CTLFLAG_RD,669&softc->tx_port_stats_ext->pfc_pri1_tx_transitions, "Num times transition"670"between XON to XOFF and XOFF to XON for pri1");671SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,672"pfc_pri2_tx_duration_us", CTLFLAG_RD,673&softc->tx_port_stats_ext->pfc_pri2_tx_duration_us, "Time duration between"674"XON to XOFF and XOFF to XON for pri2");675SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,676"pfc_pri2_tx_transitions", CTLFLAG_RD,677&softc->tx_port_stats_ext->pfc_pri2_tx_transitions, "Num times transition"678"between XON to XOFF and XOFF to XON for pri2");679SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,680"pfc_pri3_tx_duration_us", CTLFLAG_RD,681&softc->tx_port_stats_ext->pfc_pri3_tx_duration_us, "Time duration between"682"XON to XOFF and XOFF to XON for pri3");683SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,684"pfc_pri3_tx_transitions", CTLFLAG_RD,685&softc->tx_port_stats_ext->pfc_pri3_tx_transitions, "Num times transition"686"between XON to XOFF and XOFF to XON for pri3");687SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,688"pfc_pri4_tx_duration_us", CTLFLAG_RD,689&softc->tx_port_stats_ext->pfc_pri4_tx_duration_us, "Time duration between"690"XON to XOFF and XOFF to XON for pri4");691SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,692"pfc_pri4_tx_transitions", CTLFLAG_RD,693&softc->tx_port_stats_ext->pfc_pri4_tx_transitions, "Num times transition"694"between XON to XOFF and XOFF to XON for pri4");695SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,696"pfc_pri5_tx_duration_us", CTLFLAG_RD,697&softc->tx_port_stats_ext->pfc_pri5_tx_duration_us, "Time duration between"698"XON to XOFF and XOFF to XON for pri5");699SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,700"pfc_pri5_tx_transitions", CTLFLAG_RD,701&softc->tx_port_stats_ext->pfc_pri5_tx_transitions, "Num times transition"702"between XON to XOFF and XOFF to XON for pri5");703SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,704"pfc_pri6_tx_duration_us", CTLFLAG_RD,705&softc->tx_port_stats_ext->pfc_pri6_tx_duration_us, "Time duration between"706"XON to XOFF and XOFF to XON for pri6");707SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,708"pfc_pri6_tx_transitions", CTLFLAG_RD,709&softc->tx_port_stats_ext->pfc_pri6_tx_transitions, "Num times transition"710"between XON to XOFF and XOFF to XON for pri6");711SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,712"pfc_pri7_tx_duration_us", CTLFLAG_RD,713&softc->tx_port_stats_ext->pfc_pri7_tx_duration_us, "Time duration between"714"XON to XOFF and XOFF to XON for pri7");715SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,716"pfc_pri7_tx_transitions", CTLFLAG_RD,717&softc->tx_port_stats_ext->pfc_pri7_tx_transitions, "Num times transition"718"between XON to XOFF and XOFF to XON for pri7");719720SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,721"link_down_events", CTLFLAG_RD,722&softc->rx_port_stats_ext->link_down_events, "Num times link states down");723SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,724"continuous_pause_events", CTLFLAG_RD,725&softc->rx_port_stats_ext->continuous_pause_events, "Num times pause events");726SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,727"resume_pause_events", CTLFLAG_RD,728&softc->rx_port_stats_ext->resume_pause_events, "Num times pause events"729"resumes");730SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,731"continuous_roce_pause_events", CTLFLAG_RD,732&softc->rx_port_stats_ext->continuous_roce_pause_events, "Num times roce"733"pause events");734SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,735"resume_roce_pause_events", CTLFLAG_RD,736&softc->rx_port_stats_ext->resume_roce_pause_events, "Num times roce pause"737"events resumes");738739SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,740"rx_bytes_cos0", CTLFLAG_RD,741&softc->rx_port_stats_ext->rx_bytes_cos0, "Received bytes count cos0");742SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,743"rx_packets_cos0", CTLFLAG_RD,744&softc->rx_port_stats_ext->rx_packets_cos0, "Received packets count cos0");745SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,746"rx_bytes_cos1", CTLFLAG_RD,747&softc->rx_port_stats_ext->rx_bytes_cos1, "Received bytes count cos1");748SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,749"rx_packets_cos1", CTLFLAG_RD,750&softc->rx_port_stats_ext->rx_packets_cos1, "Received packets count cos1");751SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,752"rx_bytes_cos2", CTLFLAG_RD,753&softc->rx_port_stats_ext->rx_bytes_cos2, "Received bytes count cos2");754SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,755"rx_packets_cos2", CTLFLAG_RD,756&softc->rx_port_stats_ext->rx_packets_cos2, "Received packets count cos2");757SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,758"rx_bytes_cos3", CTLFLAG_RD,759&softc->rx_port_stats_ext->rx_bytes_cos3, "Received bytes count cos3");760SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,761"rx_packets_cos3", CTLFLAG_RD,762&softc->rx_port_stats_ext->rx_packets_cos3, "Received packets count cos3");763SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,764"rx_bytes_cos4", CTLFLAG_RD,765&softc->rx_port_stats_ext->rx_bytes_cos4, "Received bytes count cos4");766SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,767"rx_packets_cos4", CTLFLAG_RD,768&softc->rx_port_stats_ext->rx_packets_cos4, "Received packets count cos4");769SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,770"rx_bytes_cos5", CTLFLAG_RD,771&softc->rx_port_stats_ext->rx_bytes_cos5, "Received bytes count cos5");772SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,773"rx_packets_cos5", CTLFLAG_RD,774&softc->rx_port_stats_ext->rx_packets_cos5, "Received packets count cos5");775SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,776"rx_bytes_cos6", CTLFLAG_RD,777&softc->rx_port_stats_ext->rx_bytes_cos6, "Received bytes count cos6");778SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,779"rx_packets_cos6", CTLFLAG_RD,780&softc->rx_port_stats_ext->rx_packets_cos6, "Received packets count cos6");781SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,782"rx_bytes_cos7", CTLFLAG_RD,783&softc->rx_port_stats_ext->rx_bytes_cos7, "Received bytes count cos7");784SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,785"rx_packets_cos7", CTLFLAG_RD,786&softc->rx_port_stats_ext->rx_packets_cos7, "Received packets count cos7");787788SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,789"rx_bytes_pri0", CTLFLAG_RD,790&softc->rx_bytes_pri[0], "Received bytes count pri0");791SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,792"rx_packets_pri0", CTLFLAG_RD,793&softc->rx_packets_pri[0], "Received packets count pri0");794SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,795"rx_bytes_pri1", CTLFLAG_RD,796&softc->rx_bytes_pri[1], "Received bytes count pri1");797SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,798"rx_packets_pri1", CTLFLAG_RD,799&softc->rx_packets_pri[1], "Received packets count pri1");800SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,801"rx_bytes_pri2", CTLFLAG_RD,802&softc->rx_bytes_pri[2], "Received bytes count pri2");803SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,804"rx_packets_pri2", CTLFLAG_RD,805&softc->rx_packets_pri[2], "Received packets count pri2");806SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,807"rx_bytes_pri3", CTLFLAG_RD,808&softc->rx_bytes_pri[3], "Received bytes count pri3");809SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,810"rx_packets_pri3", CTLFLAG_RD,811&softc->rx_packets_pri[3], "Received packets count pri3");812SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,813"rx_bytes_pri4", CTLFLAG_RD,814&softc->rx_bytes_pri[4], "Received bytes count pri4");815SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,816"rx_packets_pri4", CTLFLAG_RD,817&softc->rx_packets_pri[4], "Received packets count pri4");818SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,819"rx_bytes_pri5", CTLFLAG_RD,820&softc->rx_bytes_pri[5], "Received bytes count pri5");821SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,822"rx_packets_pri5", CTLFLAG_RD,823&softc->rx_packets_pri[5], "Received packets count pri5");824SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,825"rx_bytes_pri6", CTLFLAG_RD,826&softc->rx_bytes_pri[6], "Received bytes count pri6");827SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,828"rx_packets_pri6", CTLFLAG_RD,829&softc->rx_packets_pri[6], "Received packets count pri6");830SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,831"rx_bytes_pri7", CTLFLAG_RD,832&softc->rx_bytes_pri[7], "Received bytes count pri7");833SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,834"rx_packets_pri7", CTLFLAG_RD,835&softc->rx_packets_pri[7], "Received packets count pri7");836837SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,838"pfc_pri0_rx_duration_us", CTLFLAG_RD,839&softc->rx_port_stats_ext->pfc_pri0_rx_duration_us, "Time duration in receiving"840"between XON to XOFF and XOFF to XON for pri0");841SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,842"pfc_pri0_rx_transitions", CTLFLAG_RD,843&softc->rx_port_stats_ext->pfc_pri0_rx_transitions, "Num times rx transition"844"between XON to XOFF and XOFF to XON for pri0");845SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,846"pfc_pri1_rx_duration_us", CTLFLAG_RD,847&softc->rx_port_stats_ext->pfc_pri1_rx_duration_us, "Time duration in receiving"848"between XON to XOFF and XOFF to XON for pri1");849SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,850"pfc_pri1_rx_transitions", CTLFLAG_RD,851&softc->rx_port_stats_ext->pfc_pri1_rx_transitions, "Num times rx transition"852"between XON to XOFF and XOFF to XON for pri1");853SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,854"pfc_pri2_rx_duration_us", CTLFLAG_RD,855&softc->rx_port_stats_ext->pfc_pri2_rx_duration_us, "Time duration in receiving"856"between XON to XOFF and XOFF to XON for pri2");857SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,858"pfc_pri2_rx_transitions", CTLFLAG_RD,859&softc->rx_port_stats_ext->pfc_pri2_rx_transitions, "Num times rx transition"860"between XON to XOFF and XOFF to XON for pri2");861SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,862"pfc_pri3_rx_duration_us", CTLFLAG_RD,863&softc->rx_port_stats_ext->pfc_pri3_rx_duration_us, "Time duration in receiving"864"between XON to XOFF and XOFF to XON for pri3");865SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,866"pfc_pri3_rx_transitions", CTLFLAG_RD,867&softc->rx_port_stats_ext->pfc_pri3_rx_transitions, "Num times rx transition"868"between XON to XOFF and XOFF to XON for pri3");869SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,870"pfc_pri4_rx_duration_us", CTLFLAG_RD,871&softc->rx_port_stats_ext->pfc_pri4_rx_duration_us, "Time duration in receiving"872"between XON to XOFF and XOFF to XON for pri4");873SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,874"pfc_pri4_rx_transitions", CTLFLAG_RD,875&softc->rx_port_stats_ext->pfc_pri4_rx_transitions, "Num times rx transition"876"between XON to XOFF and XOFF to XON for pri4");877SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,878"pfc_pri5_rx_duration_us", CTLFLAG_RD,879&softc->rx_port_stats_ext->pfc_pri5_rx_duration_us, "Time duration in receiving"880"between XON to XOFF and XOFF to XON for pri5");881SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,882"pfc_pri5_rx_transitions", CTLFLAG_RD,883&softc->rx_port_stats_ext->pfc_pri5_rx_transitions, "Num times rx transition"884"between XON to XOFF and XOFF to XON for pri5");885SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,886"pfc_pri6_rx_duration_us", CTLFLAG_RD,887&softc->rx_port_stats_ext->pfc_pri6_rx_duration_us, "Time duration in receiving"888"between XON to XOFF and XOFF to XON for pri6");889SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,890"pfc_pri6_rx_transitions", CTLFLAG_RD,891&softc->rx_port_stats_ext->pfc_pri6_rx_transitions, "Num times rx transition"892"between XON to XOFF and XOFF to XON for pri6");893SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,894"pfc_pri7_rx_duration_us", CTLFLAG_RD,895&softc->rx_port_stats_ext->pfc_pri7_rx_duration_us, "Time duration in receiving"896"between XON to XOFF and XOFF to XON for pri7");897SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,898"pfc_pri7_rx_transitions", CTLFLAG_RD,899&softc->rx_port_stats_ext->pfc_pri7_rx_transitions, "Num times rx transition"900"between XON to XOFF and XOFF to XON for pri7");901902SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,903"rx_bits", CTLFLAG_RD,904&softc->rx_port_stats_ext->rx_bits, "total number of received bits");905SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,906"rx_buffer_passed_threshold", CTLFLAG_RD,907&softc->rx_port_stats_ext->rx_buffer_passed_threshold, "num of events port"908"buffer"909"was over 85%");910SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,911"rx_pcs_symbol_err", CTLFLAG_RD,912&softc->rx_port_stats_ext->rx_pcs_symbol_err, "num of symbol errors wasn't"913"corrected by FEC");914SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,915"rx_corrected_bits", CTLFLAG_RD,916&softc->rx_port_stats_ext->rx_corrected_bits, "num of bits corrected by FEC");917918SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,919"rx_discard_bytes_cos0", CTLFLAG_RD,920&softc->rx_port_stats_ext->rx_discard_bytes_cos0, "num of rx discard bytes"921"count on cos0");922SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,923"rx_discard_packets_cos0", CTLFLAG_RD,924&softc->rx_port_stats_ext->rx_discard_packets_cos0, "num of rx discard packets"925"count on cos0");926SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,927"rx_discard_bytes_cos1", CTLFLAG_RD,928&softc->rx_port_stats_ext->rx_discard_bytes_cos1, "num of rx discard bytes"929"count on cos1");930SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,931"rx_discard_packets_cos1", CTLFLAG_RD,932&softc->rx_port_stats_ext->rx_discard_packets_cos1, "num of rx discard packets"933"count on cos1");934SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,935"rx_discard_bytes_cos2", CTLFLAG_RD,936&softc->rx_port_stats_ext->rx_discard_bytes_cos2, "num of rx discard bytes"937"count on cos2");938SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,939"rx_discard_packets_cos2", CTLFLAG_RD,940&softc->rx_port_stats_ext->rx_discard_packets_cos2, "num of rx discard packets"941"count on cos2");942SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,943"rx_discard_bytes_cos3", CTLFLAG_RD,944&softc->rx_port_stats_ext->rx_discard_bytes_cos3, "num of rx discard bytes"945"count on cos3");946SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,947"rx_discard_packets_cos3", CTLFLAG_RD,948&softc->rx_port_stats_ext->rx_discard_packets_cos3, "num of rx discard packets"949"count on cos3");950SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,951"rx_discard_bytes_cos4", CTLFLAG_RD,952&softc->rx_port_stats_ext->rx_discard_bytes_cos4, "num of rx discard bytes"953"count on cos4");954SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,955"rx_discard_packets_cos4", CTLFLAG_RD,956&softc->rx_port_stats_ext->rx_discard_packets_cos4, "num of rx discard packets"957"count on cos4");958SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,959"rx_discard_bytes_cos5", CTLFLAG_RD,960&softc->rx_port_stats_ext->rx_discard_bytes_cos5, "num of rx discard bytes"961"count on cos5");962SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,963"rx_discard_packets_cos5", CTLFLAG_RD,964&softc->rx_port_stats_ext->rx_discard_packets_cos5, "num of rx discard packets"965"count on cos5");966SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,967"rx_discard_bytes_cos6", CTLFLAG_RD,968&softc->rx_port_stats_ext->rx_discard_bytes_cos6, "num of rx discard bytes"969"count on cos6");970SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,971"rx_discard_packets_cos6", CTLFLAG_RD,972&softc->rx_port_stats_ext->rx_discard_packets_cos6, "num of rx discard packets"973"count on cos6");974SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,975"rx_discard_bytes_cos7", CTLFLAG_RD,976&softc->rx_port_stats_ext->rx_discard_bytes_cos7, "num of rx discard bytes"977"count on cos7");978SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,979"rx_discard_packets_cos7", CTLFLAG_RD,980&softc->rx_port_stats_ext->rx_discard_packets_cos7, "num of rx discard packets"981"count on cos7");982}983984985return 0;986}987988int989bnxt_create_rx_sysctls(struct bnxt_softc *softc, int rxr)990{991struct sysctl_oid *oid;992struct ctx_hw_stats *rx_stats = (void *)softc->rx_stats[rxr].idi_vaddr;993char name[32];994char desc[64];995996sprintf(name, "rxq%d", rxr);997sprintf(desc, "receive queue %d", rxr);998oid = SYSCTL_ADD_NODE(&softc->hw_stats,999SYSCTL_CHILDREN(softc->hw_stats_oid), OID_AUTO, name,1000CTLFLAG_RD | CTLFLAG_MPSAFE, 0, desc);1001if (!oid)1002return ENOMEM;10031004if (BNXT_CHIP_P5_PLUS(softc))1005SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1006"nq_num_ints", CTLFLAG_RD, &softc->nq_rings[rxr].int_count,1007"Num Interrupts");1008else1009SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1010"rq_num_ints", CTLFLAG_RD, &softc->rx_cp_rings[rxr].int_count,1011"Num Interrupts");1012SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1013"ucast_pkts", CTLFLAG_RD, &rx_stats->rx_ucast_pkts,1014"unicast packets received");1015SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1016"mcast_pkts", CTLFLAG_RD, &rx_stats->rx_mcast_pkts,1017"multicast packets received");1018SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1019"bcast_pkts", CTLFLAG_RD, &rx_stats->rx_bcast_pkts,1020"broadcast packets received");1021SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1022"discard_pkts", CTLFLAG_RD,1023&rx_stats->rx_discard_pkts, "discarded receive packets");1024SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1025"error_pkts", CTLFLAG_RD, &rx_stats->rx_error_pkts,1026"Error receive packets");1027SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1028"ucast_bytes", CTLFLAG_RD, &rx_stats->rx_ucast_bytes,1029"unicast bytes received");1030SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1031"mcast_bytes", CTLFLAG_RD, &rx_stats->rx_mcast_bytes,1032"multicast bytes received");1033SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1034"bcast_bytes", CTLFLAG_RD, &rx_stats->rx_bcast_bytes,1035"broadcast bytes received");10361037SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1038"tpa_pkts", CTLFLAG_RD, &rx_stats->tpa_pkts,1039"TPA packets");1040SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1041"tpa_bytes", CTLFLAG_RD, &rx_stats->tpa_bytes,1042"TPA bytes");1043SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1044"tpa_events", CTLFLAG_RD, &rx_stats->tpa_events,1045"TPA events");1046SYSCTL_ADD_QUAD(&softc->hw_stats, SYSCTL_CHILDREN(oid), OID_AUTO,1047"tpa_aborts", CTLFLAG_RD, &rx_stats->tpa_aborts,1048"TPA aborts");10491050return 0;1051}10521053static char *bnxt_chip_type[] = {1054"ASIC",1055"FPGA",1056"Palladium",1057"Unknown"1058};1059#define MAX_CHIP_TYPE 310601061static char *bnxt_parse_pkglog(int desired_field, uint8_t *data, size_t datalen)1062{1063char *retval = NULL;1064char *p;1065char *value;1066int field = 0;10671068if (datalen < 1)1069return NULL;1070/* null-terminate the log data (removing last '\n'): */1071data[datalen - 1] = 0;1072for (p = data; *p != 0; p++) {1073field = 0;1074retval = NULL;1075while (*p != 0 && *p != '\n') {1076value = p;1077while (*p != 0 && *p != '\t' && *p != '\n')1078p++;1079if (field == desired_field)1080retval = value;1081if (*p != '\t')1082break;1083*p = 0;1084field++;1085p++;1086}1087if (*p == 0)1088break;1089*p = 0;1090}1091return retval;1092}10931094static int1095bnxt_package_ver_sysctl(SYSCTL_HANDLER_ARGS)1096{1097struct bnxt_softc *softc = arg1;1098struct iflib_dma_info dma_data;1099char *pkglog = NULL;1100char *p;1101char unk[] = "<unknown>";1102char *buf = unk;1103int rc;1104uint16_t ordinal = BNX_DIR_ORDINAL_FIRST;1105uint16_t index;1106uint32_t data_len;11071108rc = bnxt_hwrm_nvm_find_dir_entry(softc, BNX_DIR_TYPE_PKG_LOG,1109&ordinal, BNX_DIR_EXT_NONE, &index, false,1110HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_EQ,1111&data_len, NULL, NULL);1112dma_data.idi_vaddr = NULL;1113if (rc == 0 && data_len) {1114rc = iflib_dma_alloc(softc->ctx, data_len, &dma_data,1115BUS_DMA_NOWAIT);1116if (rc == 0) {1117rc = bnxt_hwrm_nvm_read(softc, index, 0, data_len,1118&dma_data);1119if (rc == 0) {1120pkglog = dma_data.idi_vaddr;1121p = bnxt_parse_pkglog(BNX_PKG_LOG_FIELD_IDX_PKG_VERSION, pkglog, data_len);1122if (p && *p != 0 && isdigit(*p))1123buf = p;1124}1125} else1126dma_data.idi_vaddr = NULL;1127}11281129rc = sysctl_handle_string(oidp, buf, 0, req);1130if (dma_data.idi_vaddr)1131iflib_dma_free(&dma_data);1132return rc;1133}11341135static int1136bnxt_hwrm_min_ver_sysctl(SYSCTL_HANDLER_ARGS)1137{1138struct bnxt_softc *softc = arg1;1139char buf[16];1140uint8_t newver[3];1141int rc;11421143sprintf(buf, "%hhu.%hhu.%hhu", softc->ver_info->hwrm_min_major,1144softc->ver_info->hwrm_min_minor, softc->ver_info->hwrm_min_update);11451146rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);1147if (rc || req->newptr == NULL)1148return rc;1149if (sscanf(buf, "%hhu.%hhu.%hhu%*c", &newver[0], &newver[1],1150&newver[2]) != 3)1151return EINVAL;1152softc->ver_info->hwrm_min_major = newver[0];1153softc->ver_info->hwrm_min_minor = newver[1];1154softc->ver_info->hwrm_min_update = newver[2];1155bnxt_check_hwrm_version(softc);11561157return rc;1158}11591160int1161bnxt_create_ver_sysctls(struct bnxt_softc *softc)1162{1163struct bnxt_ver_info *vi = softc->ver_info;1164struct sysctl_oid *oid = vi->ver_oid;11651166if (!oid)1167return ENOMEM;11681169SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1170"hwrm_if", CTLFLAG_RD, vi->hwrm_if_ver, 0,1171"HWRM interface version");1172SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1173"driver_hwrm_if", CTLFLAG_RD, vi->driver_hwrm_if_ver, 0,1174"HWRM firmware version");1175SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1176"mgmt_fw", CTLFLAG_RD, vi->mgmt_fw_ver, 0,1177"management firmware version");1178SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1179"netctrl_fw", CTLFLAG_RD, vi->netctrl_fw_ver, 0,1180"network control firmware version");1181SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1182"roce_fw", CTLFLAG_RD, vi->roce_fw_ver, 0,1183"RoCE firmware version");1184SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1185"fw_ver", CTLFLAG_RD, vi->fw_ver_str, 0,1186"Firmware version");1187SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1188"phy", CTLFLAG_RD, vi->phy_ver, 0,1189"PHY version");1190SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1191"hwrm_fw_name", CTLFLAG_RD, vi->hwrm_fw_name, 0,1192"HWRM firmware name");1193SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1194"mgmt_fw_name", CTLFLAG_RD, vi->mgmt_fw_name, 0,1195"management firmware name");1196SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1197"netctrl_fw_name", CTLFLAG_RD, vi->netctrl_fw_name, 0,1198"network control firmware name");1199SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1200"roce_fw_name", CTLFLAG_RD, vi->roce_fw_name, 0,1201"RoCE firmware name");1202SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1203"phy_vendor", CTLFLAG_RD, vi->phy_vendor, 0,1204"PHY vendor name");1205SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1206"phy_partnumber", CTLFLAG_RD, vi->phy_partnumber, 0,1207"PHY vendor part number");1208SYSCTL_ADD_U16(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1209"chip_num", CTLFLAG_RD, &vi->chip_num, 0, "chip number");1210SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1211"chip_rev", CTLFLAG_RD, &vi->chip_rev, 0, "chip revision");1212SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1213"chip_metal", CTLFLAG_RD, &vi->chip_metal, 0, "chip metal number");1214SYSCTL_ADD_U8(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1215"chip_bond_id", CTLFLAG_RD, &vi->chip_bond_id, 0,1216"chip bond id");1217SYSCTL_ADD_STRING(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1218"chip_type", CTLFLAG_RD, vi->chip_type > MAX_CHIP_TYPE ?1219bnxt_chip_type[MAX_CHIP_TYPE] : bnxt_chip_type[vi->chip_type], 0,1220"RoCE firmware name");1221SYSCTL_ADD_PROC(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1222"package_ver", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,1223softc, 0, bnxt_package_ver_sysctl, "A",1224"currently installed package version");1225SYSCTL_ADD_PROC(&vi->ver_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1226"hwrm_min_ver", CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,1227softc, 0, bnxt_hwrm_min_ver_sysctl, "A",1228"minimum hwrm API vesion to support");12291230return 0;1231}12321233int1234bnxt_create_nvram_sysctls(struct bnxt_nvram_info *ni)1235{1236struct sysctl_oid *oid = ni->nvm_oid;12371238if (!oid)1239return ENOMEM;12401241SYSCTL_ADD_U16(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1242"mfg_id", CTLFLAG_RD, &ni->mfg_id, 0, "manufacturer id");1243SYSCTL_ADD_U16(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1244"device_id", CTLFLAG_RD, &ni->device_id, 0, "device id");1245SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1246"sector_size", CTLFLAG_RD, &ni->sector_size, 0, "sector size");1247SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1248"size", CTLFLAG_RD, &ni->size, 0, "nvram total size");1249SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1250"reserved_size", CTLFLAG_RD, &ni->reserved_size, 0,1251"total reserved space");1252SYSCTL_ADD_U32(&ni->nvm_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1253"available_size", CTLFLAG_RD, &ni->available_size, 0,1254"total available space");12551256return 0;1257}12581259static int1260bnxt_rss_key_sysctl(SYSCTL_HANDLER_ARGS)1261{1262struct bnxt_softc *softc = arg1;1263char buf[HW_HASH_KEY_SIZE*2+1] = {0};1264char *p;1265int i;1266int rc;12671268for (p = buf, i=0; i<HW_HASH_KEY_SIZE; i++)1269p += sprintf(p, "%02x", softc->vnic_info.rss_hash_key[i]);12701271rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);1272if (rc || req->newptr == NULL)1273return rc;12741275if (strspn(buf, "0123456789abcdefABCDEF") != (HW_HASH_KEY_SIZE * 2))1276return EINVAL;12771278for (p = buf, i=0; i<HW_HASH_KEY_SIZE; i++) {1279if (sscanf(p, "%02hhx", &softc->vnic_info.rss_hash_key[i]) != 1)1280return EINVAL;1281p += 2;1282}12831284if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)1285bnxt_hwrm_rss_cfg(softc, &softc->vnic_info,1286softc->vnic_info.rss_hash_type);12871288return rc;1289}12901291static const char *bnxt_hash_types[] = {"ipv4", "tcp_ipv4", "udp_ipv4", "ipv6",1292"tcp_ipv6", "udp_ipv6", NULL};12931294static int bnxt_get_rss_type_str_bit(char *str)1295{1296int i;12971298for (i=0; bnxt_hash_types[i]; i++)1299if (strcmp(bnxt_hash_types[i], str) == 0)1300return i;13011302return -1;1303}13041305static int1306bnxt_rss_type_sysctl(SYSCTL_HANDLER_ARGS)1307{1308struct bnxt_softc *softc = arg1;1309char buf[256] = {0};1310char *p;1311char *next;1312int rc;1313int type;1314int bit;13151316for (type = softc->vnic_info.rss_hash_type; type;1317type &= ~(1<<bit)) {1318bit = ffs(type) - 1;1319if (bit >= sizeof(bnxt_hash_types) / sizeof(const char *))1320continue;1321if (type != softc->vnic_info.rss_hash_type)1322strcat(buf, ",");1323strcat(buf, bnxt_hash_types[bit]);1324}13251326rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);1327if (rc || req->newptr == NULL)1328return rc;13291330for (type = 0, next = buf, p = strsep(&next, " ,"); p;1331p = strsep(&next, " ,")) {1332bit = bnxt_get_rss_type_str_bit(p);1333if (bit == -1)1334return EINVAL;1335type |= 1<<bit;1336}1337if (type != softc->vnic_info.rss_hash_type) {1338softc->vnic_info.rss_hash_type = type;1339if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)1340bnxt_hwrm_rss_cfg(softc, &softc->vnic_info,1341softc->vnic_info.rss_hash_type);1342}13431344return rc;1345}13461347static int1348bnxt_rx_stall_sysctl(SYSCTL_HANDLER_ARGS) {1349struct bnxt_softc *softc = arg1;1350int rc;1351int val;13521353if (softc == NULL)1354return EBUSY;13551356val = (bool)(softc->vnic_info.flags & BNXT_VNIC_FLAG_BD_STALL);1357rc = sysctl_handle_int(oidp, &val, 0, req);1358if (rc || !req->newptr)1359return rc;13601361if (val)1362softc->vnic_info.flags |= BNXT_VNIC_FLAG_BD_STALL;1363else1364softc->vnic_info.flags &= ~BNXT_VNIC_FLAG_BD_STALL;13651366if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)1367rc = bnxt_hwrm_vnic_cfg(softc, &softc->vnic_info);13681369return rc;1370}13711372static int1373bnxt_vlan_strip_sysctl(SYSCTL_HANDLER_ARGS) {1374struct bnxt_softc *softc = arg1;1375int rc;1376int val;13771378if (softc == NULL)1379return EBUSY;13801381val = (bool)(softc->vnic_info.flags & BNXT_VNIC_FLAG_VLAN_STRIP);1382rc = sysctl_handle_int(oidp, &val, 0, req);1383if (rc || !req->newptr)1384return rc;13851386if (val)1387softc->vnic_info.flags |= BNXT_VNIC_FLAG_VLAN_STRIP;1388else1389softc->vnic_info.flags &= ~BNXT_VNIC_FLAG_VLAN_STRIP;13901391if (if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)1392rc = bnxt_hwrm_vnic_cfg(softc, &softc->vnic_info);13931394return rc;1395}13961397static int1398bnxt_set_coal_rx_usecs(SYSCTL_HANDLER_ARGS) {1399struct bnxt_softc *softc = arg1;1400int rc;1401int val;14021403if (softc == NULL)1404return EBUSY;14051406val = softc->rx_coal_usecs;1407rc = sysctl_handle_int(oidp, &val, 0, req);1408if (rc || !req->newptr)1409return rc;14101411softc->rx_coal_usecs = val;1412rc = bnxt_hwrm_set_coal(softc);14131414return rc;1415}14161417static int1418bnxt_set_coal_rx_frames(SYSCTL_HANDLER_ARGS) {1419struct bnxt_softc *softc = arg1;1420int rc;1421int val;14221423if (softc == NULL)1424return EBUSY;14251426val = softc->rx_coal_frames;1427rc = sysctl_handle_int(oidp, &val, 0, req);1428if (rc || !req->newptr)1429return rc;14301431softc->rx_coal_frames = val;1432rc = bnxt_hwrm_set_coal(softc);14331434return rc;1435}14361437static int1438bnxt_set_coal_rx_usecs_irq(SYSCTL_HANDLER_ARGS) {1439struct bnxt_softc *softc = arg1;1440int rc;1441int val;14421443if (softc == NULL)1444return EBUSY;14451446val = softc->rx_coal_usecs_irq;1447rc = sysctl_handle_int(oidp, &val, 0, req);1448if (rc || !req->newptr)1449return rc;14501451softc->rx_coal_usecs_irq = val;1452rc = bnxt_hwrm_set_coal(softc);14531454return rc;1455}14561457static int1458bnxt_set_coal_rx_frames_irq(SYSCTL_HANDLER_ARGS) {1459struct bnxt_softc *softc = arg1;1460int rc;1461int val;14621463if (softc == NULL)1464return EBUSY;14651466val = softc->rx_coal_frames_irq;1467rc = sysctl_handle_int(oidp, &val, 0, req);1468if (rc || !req->newptr)1469return rc;14701471softc->rx_coal_frames_irq = val;1472rc = bnxt_hwrm_set_coal(softc);14731474return rc;1475}14761477static int1478bnxt_set_coal_tx_usecs(SYSCTL_HANDLER_ARGS) {1479struct bnxt_softc *softc = arg1;1480int rc;1481int val;14821483if (softc == NULL)1484return EBUSY;14851486val = softc->tx_coal_usecs;1487rc = sysctl_handle_int(oidp, &val, 0, req);1488if (rc || !req->newptr)1489return rc;14901491softc->tx_coal_usecs = val;1492rc = bnxt_hwrm_set_coal(softc);14931494return rc;1495}14961497static int1498bnxt_set_coal_tx_frames(SYSCTL_HANDLER_ARGS) {1499struct bnxt_softc *softc = arg1;1500int rc;1501int val;15021503if (softc == NULL)1504return EBUSY;15051506val = softc->tx_coal_frames;1507rc = sysctl_handle_int(oidp, &val, 0, req);1508if (rc || !req->newptr)1509return rc;15101511softc->tx_coal_frames = val;1512rc = bnxt_hwrm_set_coal(softc);15131514return rc;1515}15161517static int1518bnxt_set_coal_tx_usecs_irq(SYSCTL_HANDLER_ARGS) {1519struct bnxt_softc *softc = arg1;1520int rc;1521int val;15221523if (softc == NULL)1524return EBUSY;15251526val = softc->tx_coal_usecs_irq;1527rc = sysctl_handle_int(oidp, &val, 0, req);1528if (rc || !req->newptr)1529return rc;15301531softc->tx_coal_usecs_irq = val;1532rc = bnxt_hwrm_set_coal(softc);15331534return rc;1535}15361537static int1538bnxt_set_coal_tx_frames_irq(SYSCTL_HANDLER_ARGS) {1539struct bnxt_softc *softc = arg1;1540int rc;1541int val;15421543if (softc == NULL)1544return EBUSY;15451546val = softc->tx_coal_frames_irq;1547rc = sysctl_handle_int(oidp, &val, 0, req);1548if (rc || !req->newptr)1549return rc;15501551softc->tx_coal_frames_irq = val;1552rc = bnxt_hwrm_set_coal(softc);15531554return rc;1555}15561557static1558void simulate_reset(struct bnxt_softc *bp, char *fwcli_string)1559{1560struct hwrm_dbg_fw_cli_input req = {0};1561int rc = 0;15621563bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_DBG_FW_CLI);1564req.cmpl_ring = -1;1565req.target_id = -1;1566req.cli_cmd_len = strlen(fwcli_string);1567req.host_buf_len = 64 * 1024;1568strcpy((char *)req.cli_cmd, fwcli_string);15691570BNXT_HWRM_LOCK(bp);1571rc = _hwrm_send_message(bp, &req, sizeof(req));1572if (rc) {1573device_printf(bp->dev, " Manual FW fault failed, rc:%x\n", rc);1574}1575BNXT_HWRM_UNLOCK(bp);1576}15771578static int1579bnxt_reset_ctrl(SYSCTL_HANDLER_ARGS) {1580struct bnxt_softc *softc = arg1;1581int rc = 0;1582char buf[50] = {0};15831584if (softc == NULL)1585return EBUSY;15861587rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);1588if (rc || req->newptr == NULL)1589return rc;15901591if (BNXT_CHIP_P5_PLUS(softc))1592simulate_reset(softc, buf);15931594return rc;1595}15961597int1598bnxt_create_config_sysctls_pre(struct bnxt_softc *softc)1599{1600struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(softc->dev);1601struct sysctl_oid_list *children;16021603children = SYSCTL_CHILDREN(device_get_sysctl_tree(softc->dev));16041605SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rss_key",1606CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1607bnxt_rss_key_sysctl, "A", "RSS key");1608SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rss_type",1609CTLTYPE_STRING | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1610bnxt_rss_type_sysctl, "A", "RSS type bits");1611SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rx_stall",1612CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1613bnxt_rx_stall_sysctl, "I",1614"buffer rx packets in hardware until the host posts new buffers");1615SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "vlan_strip",1616CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1617bnxt_vlan_strip_sysctl, "I", "strip VLAN tag in the RX path");1618SYSCTL_ADD_CONST_STRING(ctx, children, OID_AUTO, "if_name", CTLFLAG_RD,1619if_name(iflib_get_ifp(softc->ctx)), "interface name");16201621SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_usecs",1622CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1623bnxt_set_coal_rx_usecs, "I", "interrupt coalescing Rx Usecs");1624SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_frames",1625CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1626bnxt_set_coal_rx_frames, "I", "interrupt coalescing Rx Frames");1627SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_usecs_irq",1628CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1629bnxt_set_coal_rx_usecs_irq, "I",1630"interrupt coalescing Rx Usecs IRQ");1631SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_rx_frames_irq",1632CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1633bnxt_set_coal_rx_frames_irq, "I",1634"interrupt coalescing Rx Frames IRQ");1635SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_usecs",1636CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1637bnxt_set_coal_tx_usecs, "I", "interrupt coalescing Tx Usces");1638SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_frames",1639CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1640bnxt_set_coal_tx_frames, "I", "interrupt coalescing Tx Frames");1641SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_usecs_irq",1642CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1643bnxt_set_coal_tx_usecs_irq, "I",1644"interrupt coalescing Tx Usecs IRQ");1645SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_coal_tx_frames_irq",1646CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1647bnxt_set_coal_tx_frames_irq, "I",1648"interrupt coalescing Tx Frames IRQ");1649SYSCTL_ADD_U32(ctx, children, OID_AUTO, "flags", CTLFLAG_RD,1650&softc->flags, 0, "flags");1651SYSCTL_ADD_U64(ctx, children, OID_AUTO, "fw_cap", CTLFLAG_RD,1652&softc->fw_cap, 0, "FW caps");16531654SYSCTL_ADD_PROC(ctx, children, OID_AUTO,1655"reset_ctrl", CTLTYPE_STRING | CTLFLAG_RWTUN, softc,16560, bnxt_reset_ctrl, "A",1657"Issue controller reset: 0 / 1");1658return 0;1659}16601661#define BNXT_HW_LRO_FN(fn_name, arg) \1662static int \1663fn_name(SYSCTL_HANDLER_ARGS) { \1664struct bnxt_softc *softc = arg1; \1665int rc; \1666int val; \1667\1668if (softc == NULL) \1669return EBUSY; \1670\1671val = softc->hw_lro.arg; \1672rc = sysctl_handle_int(oidp, &val, 0, req); \1673if (rc || !req->newptr) \1674return rc; \1675\1676if ((if_getdrvflags(iflib_get_ifp(softc->ctx)) & IFF_DRV_RUNNING)) \1677return EBUSY; \1678\1679if (!(softc->flags & BNXT_FLAG_TPA)) \1680return EINVAL; \1681\1682softc->hw_lro.arg = val; \1683bnxt_validate_hw_lro_settings(softc); \1684rc = bnxt_hwrm_vnic_tpa_cfg(softc); \1685\1686return rc; \1687}16881689BNXT_HW_LRO_FN(bnxt_hw_lro_enable_disable, enable)1690BNXT_HW_LRO_FN(bnxt_hw_lro_set_mode, is_mode_gro)1691BNXT_HW_LRO_FN(bnxt_hw_lro_set_max_agg_segs, max_agg_segs)1692BNXT_HW_LRO_FN(bnxt_hw_lro_set_max_aggs, max_aggs)1693BNXT_HW_LRO_FN(bnxt_hw_lro_set_min_agg_len, min_agg_len)16941695#define BNXT_FLOW_CTRL_FN(fn_name, arg) \1696static int \1697fn_name(SYSCTL_HANDLER_ARGS) { \1698struct bnxt_softc *softc = arg1; \1699int rc; \1700int val; \1701\1702if (softc == NULL) \1703return EBUSY; \1704\1705val = softc->link_info.flow_ctrl.arg; \1706rc = sysctl_handle_int(oidp, &val, 0, req); \1707if (rc || !req->newptr) \1708return rc; \1709\1710if (val) \1711val = 1; \1712\1713if (softc->link_info.flow_ctrl.arg != val) { \1714softc->link_info.flow_ctrl.arg = val; \1715rc = bnxt_hwrm_set_link_setting(softc, true, false, false);\1716rc = bnxt_hwrm_port_phy_qcfg(softc); \1717} \1718\1719return rc; \1720}17211722BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_tx, tx)1723BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_rx, rx)1724BNXT_FLOW_CTRL_FN(bnxt_flow_ctrl_autoneg, autoneg)1725int1726bnxt_create_pause_fc_sysctls(struct bnxt_softc *softc)1727{1728struct sysctl_oid *oid = softc->flow_ctrl_oid;17291730if (!oid)1731return ENOMEM;17321733SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1734"tx", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1735bnxt_flow_ctrl_tx, "A", "Enable or Disable Tx Flow Ctrl: 0 / 1");17361737SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1738"rx", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc, 0,1739bnxt_flow_ctrl_rx, "A", "Enable or Disable Tx Flow Ctrl: 0 / 1");17401741SYSCTL_ADD_PROC(&softc->flow_ctrl_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1742"autoneg", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc,17430, bnxt_flow_ctrl_autoneg, "A",1744"Enable or Disable Autoneg Flow Ctrl: 0 / 1");17451746return 0;1747}17481749int1750bnxt_create_hw_lro_sysctls(struct bnxt_softc *softc)1751{1752struct sysctl_oid *oid = softc->hw_lro_oid;17531754if (!oid)1755return ENOMEM;17561757SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1758"enable", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc,17590, bnxt_hw_lro_enable_disable, "A",1760"Enable or Disable HW LRO: 0 / 1");17611762SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1763"gro_mode", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, softc,17640, bnxt_hw_lro_set_mode, "A",1765"Set mode: 1 = GRO mode, 0 = RSC mode");17661767SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1768"max_agg_segs", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,1769softc, 0, bnxt_hw_lro_set_max_agg_segs, "A",1770"Set Max Agg Seg Value (unit is Log2): "1771"0 (= 1 seg) / 1 (= 2 segs) / ... / 31 (= 2^31 segs)");17721773SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1774"max_aggs", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,1775softc, 0, bnxt_hw_lro_set_max_aggs, "A",1776"Set Max Aggs Value (unit is Log2): "1777"0 (= 1 agg) / 1 (= 2 aggs) / ... / 7 (= 2^7 segs)");17781779SYSCTL_ADD_PROC(&softc->hw_lro_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,1780"min_agg_len", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,1781softc, 0, bnxt_hw_lro_set_min_agg_len, "A",1782"Min Agg Len: 1 to 9000");17831784return 0;1785}17861787static int1788bnxt_dcb_dcbx_cap(SYSCTL_HANDLER_ARGS)1789{1790struct bnxt_softc *softc = arg1;1791int val;1792int rc;17931794val = bnxt_dcb_getdcbx(softc);1795rc = sysctl_handle_int(oidp, &val, 0, req);1796if (rc || !req->newptr)1797return rc;17981799bnxt_dcb_setdcbx(softc, val);18001801return rc;1802}18031804static char1805bnxt_ets_tsa_to_str(struct bnxt_softc *softc, uint32_t tc)1806{1807switch (softc->ieee_ets->tc_tsa[tc]) {1808case BNXT_IEEE_8021QAZ_TSA_STRICT:1809return 's';1810case BNXT_IEEE_8021QAZ_TSA_ETS:1811return 'e';1812default:1813return 'X';18141815}1816}18171818static uint32_t1819bnxt_ets_str_to_tsa(char tsa_str)1820{1821switch (tsa_str) {1822case 's':1823return BNXT_IEEE_8021QAZ_TSA_STRICT;1824case 'e':1825return BNXT_IEEE_8021QAZ_TSA_ETS;1826default:1827return -1;1828}1829}18301831static int1832bnxt_ets_get_val(struct bnxt_softc *softc, uint32_t type, uint32_t tc)1833{1834switch (type) {1835case BNXT_TYPE_ETS_TSA:1836if (softc->ieee_ets)1837return softc->ieee_ets->tc_tsa[tc];1838break;1839case BNXT_TYPE_ETS_PRI2TC:1840if (softc->ieee_ets)1841return softc->ieee_ets->prio_tc[tc];1842break;1843case BNXT_TYPE_ETS_TCBW:1844if (softc->ieee_ets)1845return softc->ieee_ets->tc_tx_bw[tc];1846break;1847default:1848break;1849}18501851return -1;1852}18531854static void1855bnxt_pfc_get_string(struct bnxt_softc *softc, char *buf, struct bnxt_ieee_pfc *pfc)1856{1857uint32_t i;1858bool found = false;18591860for (i = 0; i < BNXT_IEEE_8021QAZ_MAX_TCS; i++) {1861if (pfc->pfc_en & (1 << i)) {1862if (found)1863buf += sprintf(buf, ", ");1864buf += sprintf(buf, "%d", i);1865found = true;1866}1867}18681869if (!found)1870buf += sprintf(buf, "none");1871}18721873static const char *bnxt_get_tlv_selector_str(uint8_t selector)1874{1875switch (selector) {1876case BNXT_IEEE_8021QAZ_APP_SEL_ETHERTYPE:1877return "Ethertype";1878case BNXT_IEEE_8021QAZ_APP_SEL_DGRAM:1879return "UDP or DCCP";1880case BNXT_IEEE_8021QAZ_APP_SEL_DSCP:1881return "DSCP";1882default:1883return "Unknown";1884}1885}18861887static void1888bnxt_app_tlv_get_string(struct sbuf *sb, struct bnxt_dcb_app *app, int num)1889{1890int i;18911892if (num == 0) {1893sbuf_printf(sb, " None");1894return;1895}18961897sbuf_putc(sb, '\n');1898for (i = 0; i < num; i++) {1899sbuf_printf(sb, "\tAPP#%0d:\tpri: %d,\tSel: %d,\t%s: %d\n",1900i,1901app[i].priority,1902app[i].selector,1903bnxt_get_tlv_selector_str(app[i].selector),1904app[i].protocol);1905}1906}19071908static void1909bnxt_ets_get_string(struct bnxt_softc *softc, char *buf)1910{1911uint32_t type, i;19121913type = BNXT_TYPE_ETS_TSA;1914for (type = 0; type < BNXT_TYPE_ETS_MAX; type++) {1915for (i = 0; i < BNXT_IEEE_8021QAZ_MAX_TCS; i++) {1916if (i == 0)1917buf += sprintf(buf, "%s:", BNXT_ETS_TYPE_STR[type]);19181919if (!softc->ieee_ets)1920buf += sprintf(buf, "x");1921else if (type == BNXT_TYPE_ETS_TSA)1922buf += sprintf(buf, "%c", bnxt_ets_tsa_to_str(softc, i));1923else1924buf += sprintf(buf, "%d", bnxt_ets_get_val(softc, type, i));19251926if (i != BNXT_IEEE_8021QAZ_MAX_TCS - 1)1927buf += sprintf(buf, ",");1928}1929if (type != BNXT_TYPE_ETS_MAX - 1)1930buf += sprintf(buf, "#");1931}1932}19331934static int1935bnxt_dcb_list_app(SYSCTL_HANDLER_ARGS)1936{1937struct sbuf sb;1938struct bnxt_dcb_app app[128] = {0};1939struct bnxt_softc *softc = arg1;1940int rc, num_inputs = 0;19411942sbuf_new_for_sysctl(&sb, NULL, 128, req);1943bnxt_dcb_ieee_listapp(softc, app, nitems(app), &num_inputs);1944bnxt_app_tlv_get_string(&sb, app, num_inputs);1945rc = sbuf_finish(&sb);1946sbuf_delete(&sb);1947return rc;1948}19491950static int1951bnxt_dcb_del_app(SYSCTL_HANDLER_ARGS)1952{1953struct bnxt_softc *softc = arg1;1954struct bnxt_dcb_app app = {0};1955char buf[256] = {0};1956int rc, num_inputs;19571958rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);1959if (rc || req->newptr == NULL)1960return rc;19611962num_inputs = sscanf(buf, "%hhu,%hhu,%hd", &app.priority, &app.selector, &app.protocol);19631964if (num_inputs != 3) {1965device_printf(softc->dev,1966"Invalid app tlv syntax, inputs = %d\n", num_inputs);1967return EINVAL;1968}19691970bnxt_dcb_ieee_delapp(softc, &app);19711972return rc;1973}1974static int1975bnxt_dcb_set_app(SYSCTL_HANDLER_ARGS)1976{1977struct bnxt_softc *softc = arg1;1978struct bnxt_dcb_app app = {0};1979char buf[256] = {0};1980int rc, num_inputs;19811982rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);1983if (rc || req->newptr == NULL)1984return rc;19851986num_inputs = sscanf(buf, "%hhu,%hhu,%hd", &app.priority, &app.selector, &app.protocol);19871988if (num_inputs != 3) {1989device_printf(softc->dev,1990"Invalid app tlv syntax, inputs = %d\n", num_inputs);1991return EINVAL;1992}19931994bnxt_dcb_ieee_setapp(softc, &app);19951996return rc;1997}19981999static int2000bnxt_dcb_pfc(SYSCTL_HANDLER_ARGS)2001{2002struct bnxt_softc *softc = arg1;2003struct bnxt_ieee_pfc pfc = {0};2004int rc, i, num_inputs;2005char buf[256] = {0};2006int pri_mask = 0;2007char pri[8];20082009rc = bnxt_dcb_ieee_getpfc(softc, &pfc);2010if (!rc)2011bnxt_pfc_get_string(softc, buf, &pfc);2012else2013sprintf(buf, "## getpfc failed with error %d ##", rc);20142015rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);2016if (rc || req->newptr == NULL)2017return rc;20182019/* Check for 'none' string first */2020if (sscanf(buf, "%s", buf) == 1) {2021if (strncmp(buf, "none", 8) == 0) {2022goto configure;2023}2024}2025num_inputs = sscanf(buf, "%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu",2026&pri[0], &pri[1], &pri[2], &pri[3], &pri[4],2027&pri[5], &pri[6], &pri[7]);20282029if (num_inputs < 1 || num_inputs > 8) {2030device_printf(softc->dev,2031"Invalid pfc syntax, inputs = %d\n", num_inputs);2032return EINVAL;2033}20342035for (i = 0; i < num_inputs; i++) {2036if (pri[i] > 7 || pri[i] < 0) {2037device_printf(softc->dev,2038"Invalid priority %d. Valid priorties are "2039"from 0 to 7 and string \"none\".\n", pri[i]);2040return EINVAL;2041}20422043pri_mask |= (1 << pri[i]) & 0xFF;2044}20452046configure:2047pfc.pfc_en = pri_mask;2048rc = bnxt_dcb_ieee_setpfc(softc, &pfc);2049if (rc)2050device_printf(softc->dev,2051"setpfc failed with status %d\n", rc);2052return rc;2053}20542055static int2056bnxt_dcb_ets(SYSCTL_HANDLER_ARGS)2057{2058struct bnxt_softc *softc = arg1;2059struct bnxt_ieee_ets ets = {0};2060int rc = 0, i, num_inputs;2061char buf[256] = {0};2062char tsa[8];20632064rc = bnxt_dcb_ieee_getets(softc, &ets);2065if (!rc)2066bnxt_ets_get_string(softc, buf);2067else2068sprintf(buf, "## getets failed with error %d ##", rc);20692070rc = sysctl_handle_string(oidp, buf, sizeof(buf), req);2071if (rc || req->newptr == NULL)2072return rc;20732074num_inputs = sscanf(buf, "tsa:%c,%c,%c,%c,%c,%c,%c,%c#"2075"pri2tc:%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu#"2076"tcbw:%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu,%hhu",2077&tsa[0], &tsa[1], &tsa[2], &tsa[3], &tsa[4], &tsa[5], &tsa[6], &tsa[7],2078&ets.prio_tc[0], &ets.prio_tc[1], &ets.prio_tc[2], &ets.prio_tc[3],2079&ets.prio_tc[4], &ets.prio_tc[5], &ets.prio_tc[6], &ets.prio_tc[7],2080&ets.tc_tx_bw[0], &ets.tc_tx_bw[1], &ets.tc_tx_bw[2], &ets.tc_tx_bw[3],2081&ets.tc_tx_bw[4], &ets.tc_tx_bw[5], &ets.tc_tx_bw[6], &ets.tc_tx_bw[7]);20822083if (num_inputs != 24)2084return EINVAL;20852086for ( i= 0; i < 8; i++)2087ets.tc_tsa[i] = bnxt_ets_str_to_tsa(tsa[i]);20882089rc = bnxt_dcb_ieee_setets(softc, &ets);20902091return rc;2092}20932094int2095bnxt_create_dcb_sysctls(struct bnxt_softc *softc)2096{2097struct sysctl_oid *oid = softc->dcb_oid;20982099if (!oid)2100return ENOMEM;21012102SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO,2103"dcbx_cap", CTLTYPE_INT | CTLFLAG_RWTUN, softc,21040, bnxt_dcb_dcbx_cap, "A",2105"Enable DCB Capability Exchange Protocol (DCBX) capabilities");21062107SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "ets",2108CTLTYPE_STRING | CTLFLAG_RWTUN, softc, 0,2109bnxt_dcb_ets, "A", "Enhanced Transmission Selection (ETS)");21102111SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "pfc",2112CTLTYPE_STRING | CTLFLAG_RWTUN, softc, 0,2113bnxt_dcb_pfc, "A", "Enhanced Transmission Selection (ETS)");21142115SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "set_apptlv",2116CTLTYPE_STRING | CTLFLAG_WR, softc, 0,2117bnxt_dcb_set_app, "A", "Set App TLV");21182119SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "del_apptlv",2120CTLTYPE_STRING | CTLFLAG_WR, softc, 0,2121bnxt_dcb_del_app, "A", "Delete App TLV");21222123SYSCTL_ADD_PROC(&softc->dcb_ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "list_apptlv",2124CTLTYPE_STRING | CTLFLAG_RD, softc, 0,2125bnxt_dcb_list_app, "A", "List all App TLVs");21262127return 0;2128}21292130int2131bnxt_create_config_sysctls_post(struct bnxt_softc *softc)2132{2133/* Nothing for now, meant for future expansion */2134return 0;2135}213621372138