The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/bnxt/bnxt_sysctl.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: c7a0929554c928b3954b291edc9c149f


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.