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/oce/oce_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  * Copyright (C) 2013 Emulex
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions are met:
    7  *
    8  * 1. Redistributions of source code must retain the above copyright notice,
    9  *    this list of conditions and the following disclaimer.
   10  *
   11  * 2. Redistributions in binary form must reproduce the above copyright
   12  *    notice, this list of conditions and the following disclaimer in the
   13  *    documentation and/or other materials provided with the distribution.
   14  *
   15  * 3. Neither the name of the Emulex Corporation nor the names of its
   16  *    contributors may be used to endorse or promote products derived from
   17  *    this software without specific prior written permission.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   29  * POSSIBILITY OF SUCH DAMAGE.
   30  *
   31  * Contact Information:
   32  * freebsd-drivers@emulex.com
   33  *
   34  * Emulex
   35  * 3333 Susan Street
   36  * Costa Mesa, CA 92626
   37  */
   38 
   39 /* $FreeBSD$ */
   40 
   41 #include "oce_if.h"
   42 
   43 static void copy_stats_to_sc_xe201(POCE_SOFTC sc);
   44 static void copy_stats_to_sc_be3(POCE_SOFTC sc);
   45 static void copy_stats_to_sc_be2(POCE_SOFTC sc);
   46 static int  oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
   47 static int  oce_sys_aic_enable(SYSCTL_HANDLER_ARGS);
   48 static int  oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
   49 static int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
   50 static int  oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
   51 static int  oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
   52 static int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
   53 static boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
   54 static boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
   55                                 int img_optype, uint32_t img_offset,
   56                                 uint32_t img_size, uint32_t hdrs_size);
   57 static void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
   58                                 struct sysctl_ctx_list *ctx,
   59                                 struct sysctl_oid *stats_node);
   60 static void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
   61                                 struct sysctl_ctx_list *ctx,
   62                                 struct sysctl_oid *stats_node);
   63 
   64 
   65 extern char component_revision[32];
   66 uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
   67 
   68 struct flash_img_attri {
   69         int img_offset;
   70         int img_size;
   71         int img_type;
   72         bool skip_image;
   73         int optype;
   74 };
   75 
   76 void
   77 oce_add_sysctls(POCE_SOFTC sc)
   78 {
   79 
   80         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
   81         struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
   82         struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
   83         struct sysctl_oid *stats_node;
   84 
   85         SYSCTL_ADD_STRING(ctx, child,
   86                         OID_AUTO, "component_revision",
   87                         CTLFLAG_RD,
   88                         component_revision,
   89                         sizeof(component_revision),
   90                         "EMULEX One-Connect device driver revision");
   91 
   92         SYSCTL_ADD_STRING(ctx, child,
   93                         OID_AUTO, "firmware_version",
   94                         CTLFLAG_RD,
   95                         sc->fw_version,
   96                         sizeof(sc->fw_version),
   97                         "EMULEX One-Connect Firmware Version");
   98 
   99         SYSCTL_ADD_INT(ctx, child,
  100                         OID_AUTO, "max_rsp_handled",
  101                         CTLFLAG_RW,
  102                         &oce_max_rsp_handled,
  103                         sizeof(oce_max_rsp_handled),
  104                         "Maximum receive frames handled per interupt");
  105 
  106         if ((sc->function_mode & FNM_FLEX10_MODE) || 
  107             (sc->function_mode & FNM_UMC_MODE))
  108                 SYSCTL_ADD_UINT(ctx, child,
  109                                 OID_AUTO, "speed",
  110                                 CTLFLAG_RD,
  111                                 &sc->qos_link_speed,
  112                                 0,"QOS Speed");
  113         else
  114                 SYSCTL_ADD_UINT(ctx, child,
  115                                 OID_AUTO, "speed",
  116                                 CTLFLAG_RD,
  117                                 &sc->speed,
  118                                 0,"Link Speed");
  119 
  120         if (sc->function_mode & FNM_UMC_MODE)
  121                 SYSCTL_ADD_UINT(ctx, child,
  122                                 OID_AUTO, "pvid",
  123                                 CTLFLAG_RD,
  124                                 &sc->pvid,
  125                                 0,"PVID");
  126 
  127         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back",
  128                 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0,
  129                 oce_sysctl_loopback, "I", "Loop Back Tests");
  130 
  131         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade",
  132                 CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0,
  133                 oce_sys_fwupgrade, "A", "Firmware ufi file");
  134 
  135         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "aic_enable",
  136                 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 1,
  137                 oce_sys_aic_enable, "I", "aic flags");
  138 
  139         /*
  140          *  Dumps Transceiver data
  141          *  "sysctl dev.oce.0.sfp_vpd_dump=0"
  142          *  "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump
  143          *  "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump
  144          */
  145         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump",
  146                         CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump,
  147                         "I", "Initiate a sfp_vpd_dump operation");
  148         SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer",
  149                         CTLFLAG_RD, sfp_vpd_dump_buffer,
  150                         TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer");
  151 
  152         stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
  153                                 CTLFLAG_RD, NULL, "Ethernet Statistics");
  154 
  155         if (IS_BE(sc) || IS_SH(sc))
  156                 oce_add_stats_sysctls_be3(sc, ctx, stats_node);
  157         else
  158                 oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
  159 
  160 
  161 }
  162 
  163 
  164 static uint32_t
  165 oce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
  166 {
  167         uint32_t status = 0;
  168 
  169         oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1);
  170         status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type,
  171                                 1500, 2, 0xabc);
  172         oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1);
  173 
  174         return status;
  175 }
  176 
  177 static int
  178 oce_sys_aic_enable(SYSCTL_HANDLER_ARGS)
  179 {
  180         int value = 0;
  181         uint32_t status, vector;
  182         POCE_SOFTC sc = (struct oce_softc *)arg1;
  183         struct oce_aic_obj *aic;
  184 
  185         status = sysctl_handle_int(oidp, &value, 0, req);
  186         if (status || !req->newptr)
  187                 return status; 
  188 
  189         for (vector = 0; vector < sc->intr_count; vector++) {
  190                 aic = &sc->aic_obj[vector];
  191 
  192                 if (value == 0){
  193                         aic->max_eqd = aic->min_eqd = aic->et_eqd = 0;
  194                         aic->enable = 0;
  195                 }
  196                 else {
  197                         aic->max_eqd = OCE_MAX_EQD;
  198                         aic->min_eqd = OCE_MIN_EQD;
  199                         aic->et_eqd = OCE_MIN_EQD;
  200                         aic->enable = TRUE;
  201                 }
  202         }
  203         return 0;
  204 }
  205 
  206 static int
  207 oce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
  208 {
  209         int value = 0;
  210         uint32_t status;  
  211         struct oce_softc *sc  = (struct oce_softc *)arg1;
  212 
  213         status = sysctl_handle_int(oidp, &value, 0, req);
  214         if (status || !req->newptr)
  215                 return status; 
  216 
  217         if (value != 1) {
  218                 device_printf(sc->dev,
  219                         "Not a Valid value. Set to loop_back=1 to run tests\n");
  220                 return 0;
  221         }
  222 
  223         if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) {
  224                 device_printf(sc->dev,
  225                         "MAC Loopback Test = Failed (Error status = %d)\n",
  226                          status);
  227         } else
  228                 device_printf(sc->dev, "MAC Loopback Test = Success\n");
  229 
  230         if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) {
  231                 device_printf(sc->dev,
  232                         "PHY Loopback Test = Failed (Error status = %d)\n",
  233                          status);
  234         } else
  235                 device_printf(sc->dev, "PHY Loopback Test = Success\n");
  236 
  237         if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) {
  238                 device_printf(sc->dev,
  239                         "EXT Loopback Test = Failed (Error status = %d)\n",
  240                          status);
  241         } else
  242                 device_printf(sc->dev, "EXT Loopback Test = Success\n");
  243 
  244         return 0;
  245 }
  246 
  247 
  248 static int
  249 oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS)
  250 {
  251         char ufiname[256] = {0};
  252         uint32_t status = 1;
  253         struct oce_softc *sc  = (struct oce_softc *)arg1;
  254         const struct firmware *fw;
  255 
  256         status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req);
  257         if (status || !req->newptr)
  258                 return status;
  259 
  260         fw = firmware_get(ufiname);
  261         if (fw == NULL) {
  262                 device_printf(sc->dev, "Unable to get Firmware. "
  263                         "Make sure %s is copied to /boot/modules\n", ufiname);
  264                 return ENOENT;
  265         }
  266 
  267         if (IS_BE(sc)) {
  268                 if ((sc->flags & OCE_FLAGS_BE2)) {
  269                         device_printf(sc->dev, 
  270                                 "Flashing not supported for BE2 yet.\n");
  271                         status = 1;
  272                         goto done;
  273                 }
  274                 status = oce_be3_fwupgrade(sc, fw);
  275         } else if (IS_SH(sc)) {
  276                 status = oce_skyhawk_fwupgrade(sc,fw);
  277         } else
  278                 status = oce_lancer_fwupgrade(sc, fw);
  279 done:
  280         if (status) {
  281                 device_printf(sc->dev, "Firmware Upgrade failed\n");
  282         } else {
  283                 device_printf(sc->dev, "Firmware Flashed successfully\n");
  284         }
  285 
  286         /* Release Firmware*/
  287         firmware_put(fw, FIRMWARE_UNLOAD);
  288 
  289         return status;
  290 }
  291 
  292 static void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec,
  293                                 struct flash_img_attri *pimg, int i,
  294                                 const struct firmware *fw, int bin_offset)
  295 {
  296         if (IS_SH(sc)) {
  297                 pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset);
  298                 pimg->img_size   = HOST_32(fsec->fsec_entry[i].pad_size);
  299         }
  300 
  301         pimg->img_type = HOST_32(fsec->fsec_entry[i].type);
  302         pimg->skip_image = FALSE;
  303         switch (pimg->img_type) {
  304                 case IMG_ISCSI:
  305                         pimg->optype = 0;
  306                         if (IS_BE3(sc)) {
  307                                 pimg->img_offset = 2097152;
  308                                 pimg->img_size   = 2097152;
  309                         }
  310                         break;
  311                 case IMG_REDBOOT:
  312                         pimg->optype = 1;
  313                         if (IS_BE3(sc)) {
  314                                 pimg->img_offset = 262144;
  315                                 pimg->img_size   = 1048576;
  316                         }
  317                         if (!oce_img_flashing_required(sc, fw->data,
  318                                                 pimg->optype,
  319                                                 pimg->img_offset,
  320                                                 pimg->img_size,
  321                                                 bin_offset))
  322                                 pimg->skip_image = TRUE;
  323                         break;
  324                 case IMG_BIOS:
  325                         pimg->optype = 2;
  326                         if (IS_BE3(sc)) {
  327                                 pimg->img_offset = 12582912;
  328                                 pimg->img_size   = 524288;
  329                         }
  330                         break;
  331                 case IMG_PXEBIOS:
  332                         pimg->optype = 3;
  333                         if (IS_BE3(sc)) {
  334                                 pimg->img_offset =  13107200;;
  335                                 pimg->img_size   = 524288;
  336                         }
  337                         break;
  338                 case IMG_FCOEBIOS:
  339                         pimg->optype = 8;
  340                         if (IS_BE3(sc)) {
  341                                 pimg->img_offset = 13631488;
  342                                 pimg->img_size   = 524288;
  343                         }
  344                         break;
  345                 case IMG_ISCSI_BAK:
  346                         pimg->optype = 9;
  347                         if (IS_BE3(sc)) {
  348                                 pimg->img_offset = 4194304;
  349                                 pimg->img_size   = 2097152;
  350                         }
  351                         break;
  352                 case IMG_FCOE:
  353                         pimg->optype = 10;
  354                         if (IS_BE3(sc)) {
  355                                 pimg->img_offset = 6291456;
  356                                 pimg->img_size   = 2097152;
  357                         }
  358                         break;
  359                 case IMG_FCOE_BAK:
  360                         pimg->optype = 11;
  361                         if (IS_BE3(sc)) {
  362                                 pimg->img_offset = 8388608;
  363                                 pimg->img_size   = 2097152;
  364                         }
  365                         break;
  366                 case IMG_NCSI:
  367                         pimg->optype = 13;
  368                         if (IS_BE3(sc)) {
  369                                 pimg->img_offset = 15990784;
  370                                 pimg->img_size   = 262144;
  371                         }
  372                         break;
  373                 case IMG_PHY:
  374                         pimg->optype = 99;
  375                         if (IS_BE3(sc)) {
  376                                 pimg->img_offset = 1310720;
  377                                 pimg->img_size   = 262144;
  378                         }
  379                         if (!oce_phy_flashing_required(sc))
  380                                 pimg->skip_image = TRUE;
  381                         break;
  382                 default:
  383                         pimg->skip_image = TRUE;
  384                         break;
  385         }
  386 
  387 }
  388 
  389 static int
  390 oce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs)
  391 {
  392         char cookie[2][16] =    {"*** SE FLAS", "H DIRECTORY *** "};
  393         const char *p = (const char *)fw->data;
  394         const struct flash_sec_info *fsec = NULL;
  395         struct mbx_common_read_write_flashrom *req;
  396         int rc = 0, i, bin_offset = 0, opcode, num_bytes;
  397         OCE_DMA_MEM dma_mem;
  398         struct flash_img_attri imgatt;
  399 
  400         /* Validate Cookie */
  401         bin_offset = (sizeof(struct flash_file_hdr) +
  402                         (num_imgs * sizeof(struct image_hdr)));
  403         p += bin_offset;
  404         while (p < ((const char *)fw->data + fw->datasize)) {
  405                 fsec = (const struct flash_sec_info *)p;
  406                 if (!memcmp(cookie, fsec->cookie, sizeof(cookie)))
  407                         break;
  408                 fsec = NULL;
  409                 p += 32;
  410         }
  411 
  412         if (!fsec) {
  413                 device_printf(sc->dev,
  414                                 "Invalid Cookie. Firmware image corrupted ?\n");
  415                 return EINVAL;
  416         }
  417 
  418         rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom),
  419                                 &dma_mem, 0);
  420         if (rc) {
  421                 device_printf(sc->dev,
  422                                 "Memory allocation failure while flashing\n");
  423                 return ENOMEM;
  424         }
  425         req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom);
  426 
  427         if (IS_SH(sc))
  428                 num_imgs = HOST_32(fsec->fsec_hdr.num_images);
  429         else if (IS_BE3(sc))
  430                 num_imgs = MAX_FLASH_COMP;
  431 
  432         for (i = 0; i < num_imgs; i++) {
  433 
  434                 bzero(&imgatt, sizeof(struct flash_img_attri));
  435 
  436                 oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset);
  437 
  438                 if (imgatt.skip_image)
  439                         continue;
  440 
  441                 p = fw->data;
  442                 p = p + bin_offset + imgatt.img_offset;
  443 
  444                 if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) {
  445                         rc = 1;
  446                         goto ret;
  447                 }
  448 
  449                 while (imgatt.img_size) {
  450 
  451                         if (imgatt.img_size > 32*1024)
  452                                 num_bytes = 32*1024;
  453                         else
  454                                 num_bytes = imgatt.img_size;
  455                         imgatt.img_size -= num_bytes;
  456 
  457                         if (!imgatt.img_size)
  458                                 opcode = FLASHROM_OPER_FLASH;
  459                         else
  460                                 opcode = FLASHROM_OPER_SAVE;
  461 
  462                         memcpy(req->data_buffer, p, num_bytes);
  463                         p += num_bytes;
  464 
  465                         rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode,
  466                                         &dma_mem, num_bytes);
  467                         if (rc) {
  468                                 device_printf(sc->dev,
  469                                                 "cmd to write to flash rom failed.\n");
  470                                 rc = EIO;
  471                                 goto ret;
  472                         }
  473                         /* Leave the CPU for others for some time */
  474                         pause("yield", 10);
  475 
  476                 }
  477 
  478         }
  479 
  480 ret:
  481         oce_dma_free(sc, &dma_mem);
  482         return rc;
  483 }
  484 
  485 #define UFI_TYPE2               2
  486 #define UFI_TYPE3               3
  487 #define UFI_TYPE3R              10
  488 #define UFI_TYPE4               4
  489 #define UFI_TYPE4R              11
  490 static int oce_get_ufi_type(POCE_SOFTC sc,
  491                             const struct flash_file_hdr *fhdr)
  492 {
  493         if (fhdr == NULL)
  494                 goto be_get_ufi_exit;
  495 
  496         if (IS_SH(sc) && fhdr->build[0] == '4') {
  497                 if (fhdr->asic_type_rev >= 0x10)
  498                         return UFI_TYPE4R;
  499                 else
  500                         return UFI_TYPE4;
  501         } else if (IS_BE3(sc) && fhdr->build[0] == '3') {
  502                 if (fhdr->asic_type_rev == 0x10)
  503                         return UFI_TYPE3R;
  504                 else
  505                         return UFI_TYPE3;
  506         } else if (IS_BE2(sc) && fhdr->build[0] == '2')
  507                 return UFI_TYPE2;
  508 
  509 be_get_ufi_exit:
  510         device_printf(sc->dev,
  511                 "UFI and Interface are not compatible for flashing\n");
  512         return -1;
  513 }
  514 
  515 
  516 static int
  517 oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
  518 {
  519         int rc = 0, num_imgs = 0, i = 0, ufi_type;
  520         const struct flash_file_hdr *fhdr;
  521         const struct image_hdr *img_ptr;
  522 
  523         fhdr = (const struct flash_file_hdr *)fw->data;
  524 
  525         ufi_type = oce_get_ufi_type(sc, fhdr);
  526 
  527         /* Display flash version */
  528         device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
  529 
  530         num_imgs = fhdr->num_imgs;
  531         for (i = 0; i < num_imgs; i++) {
  532                 img_ptr = (const struct image_hdr *)((const char *)fw->data +
  533                                 sizeof(struct flash_file_hdr) +
  534                                 (i * sizeof(struct image_hdr)));
  535 
  536                 if (img_ptr->imageid != 1)
  537                         continue;
  538 
  539                 switch (ufi_type) {
  540                         case UFI_TYPE4R:
  541                                 rc = oce_sh_be3_flashdata(sc, fw,
  542                                                 num_imgs);
  543                                 break;
  544                         case UFI_TYPE4:
  545                                 if (sc->asic_revision < 0x10)
  546                                         rc = oce_sh_be3_flashdata(sc, fw,
  547                                                                    num_imgs);
  548                                 else {
  549                                         rc = -1;
  550                                         device_printf(sc->dev,
  551                                                 "Cant load SH A0 UFI on B0\n");
  552                                 }
  553                                 break;
  554                         default:
  555                                 rc = -1;
  556                                 break;
  557 
  558                 }
  559         }
  560 
  561         return rc;
  562 }
  563 
  564 static int
  565 oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
  566 {
  567         int rc = 0, num_imgs = 0, i = 0;
  568         const struct flash_file_hdr *fhdr;
  569         const struct image_hdr *img_ptr;
  570 
  571         fhdr = (const struct flash_file_hdr *)fw->data;
  572         if (fhdr->build[0] != '3') {
  573                 device_printf(sc->dev, "Invalid BE3 firmware image\n");
  574                 return EINVAL;
  575         }
  576         /* Display flash version */
  577         device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
  578 
  579         num_imgs = fhdr->num_imgs;
  580         for (i = 0; i < num_imgs; i++) {
  581                 img_ptr = (const struct image_hdr *)((const char *)fw->data +
  582                                 sizeof(struct flash_file_hdr) +
  583                                 (i * sizeof(struct image_hdr)));
  584                 if (img_ptr->imageid == 1) {
  585                         rc = oce_sh_be3_flashdata(sc, fw, num_imgs);
  586 
  587                         break;
  588                 }
  589         }
  590 
  591         return rc;
  592 }
  593 
  594 
  595 static boolean_t
  596 oce_phy_flashing_required(POCE_SOFTC sc)
  597 {
  598         int status = 0;
  599         struct oce_phy_info phy_info;
  600 
  601         status = oce_mbox_get_phy_info(sc, &phy_info);
  602         if (status)
  603                 return FALSE;
  604 
  605         if ((phy_info.phy_type == TN_8022) &&
  606                 (phy_info.interface_type == PHY_TYPE_BASET_10GB)) {
  607                 return TRUE;
  608         }
  609 
  610         return FALSE;
  611 }
  612 
  613 
  614 static boolean_t
  615 oce_img_flashing_required(POCE_SOFTC sc, const char *p,
  616                                 int img_optype, uint32_t img_offset,
  617                                 uint32_t img_size, uint32_t hdrs_size)
  618 {
  619         uint32_t crc_offset;
  620         uint8_t flashed_crc[4];
  621         int status;
  622 
  623         crc_offset = hdrs_size + img_offset + img_size - 4;
  624 
  625         p += crc_offset;
  626 
  627         status = oce_mbox_get_flashrom_crc(sc, flashed_crc,
  628                         (img_size - 4), img_optype);
  629         if (status)
  630                 return TRUE; /* Some thing worng. ReFlash */
  631 
  632         /*update redboot only if crc does not match*/
  633         if (bcmp(flashed_crc, p, 4))
  634                 return TRUE;
  635         else
  636                 return FALSE;
  637 }
  638 
  639 
  640 static int
  641 oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
  642 {
  643 
  644         int rc = 0;
  645         OCE_DMA_MEM dma_mem;
  646         const uint8_t *data = NULL;
  647         uint8_t *dest_image_ptr = NULL;
  648         size_t size = 0;
  649         uint32_t data_written = 0, chunk_size = 0;
  650         uint32_t offset = 0, add_status = 0;
  651 
  652         if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) {
  653                 device_printf(sc->dev,
  654                         "Lancer FW image is not 4 byte aligned.");
  655                 return EINVAL;
  656         }
  657 
  658         rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0);
  659         if (rc) {
  660                 device_printf(sc->dev,
  661                         "Memory allocation failure while flashing Lancer\n");
  662                 return ENOMEM;
  663         }
  664 
  665         size = fw->datasize;
  666         data = fw->data;
  667         dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t);
  668 
  669         while (size) {
  670                 chunk_size = MIN(size, (32*1024));
  671 
  672                 bcopy(data, dest_image_ptr, chunk_size);
  673 
  674                 rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset,
  675                                 &dma_mem, &data_written, &add_status);
  676 
  677                 if (rc)
  678                         break;
  679 
  680                 size    -= data_written;
  681                 data    += data_written;
  682                 offset  += data_written;
  683                 pause("yield", 10);
  684 
  685         }
  686 
  687         if (!rc)
  688                 /* Commit the firmware*/
  689                 rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem,
  690                                                 &data_written, &add_status);
  691         if (rc) {
  692                 device_printf(sc->dev, "Lancer firmware load error. "
  693                         "Addstatus = 0x%x, status = %d \n", add_status, rc);
  694                 rc = EIO;
  695         }
  696         oce_dma_free(sc, &dma_mem);
  697         return rc;
  698 
  699 }
  700 
  701 
  702 static void
  703 oce_add_stats_sysctls_be3(POCE_SOFTC sc,
  704                                   struct sysctl_ctx_list *ctx,
  705                                   struct sysctl_oid *stats_node)
  706 {
  707         struct sysctl_oid *rx_stats_node, *tx_stats_node;
  708         struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
  709         struct sysctl_oid_list *queue_stats_list;
  710         struct sysctl_oid *queue_stats_node;
  711         struct oce_drv_stats *stats;
  712         char prefix[32];
  713         int i;
  714 
  715         stats = &sc->oce_stats_info;
  716 
  717         rx_stats_node = SYSCTL_ADD_NODE(ctx,
  718                                         SYSCTL_CHILDREN(stats_node), 
  719                                         OID_AUTO,"rx", CTLFLAG_RD, 
  720                                         NULL, "RX Ethernet Statistics");
  721         rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
  722 
  723         
  724         SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
  725                         CTLFLAG_RD, &stats->rx.t_rx_pkts,
  726                         "Total Received Packets");
  727         SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
  728                         CTLFLAG_RD, &stats->rx.t_rx_bytes,
  729                         "Total Received Bytes");
  730         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
  731                         CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
  732                         "Total Received Fragements");
  733         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
  734                         CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
  735                         "Total Received Multicast Packets");
  736         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
  737                         CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
  738                         "Total Received Unicast Packets");
  739         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
  740                         CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
  741                         "Total Receive completion errors");
  742         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
  743                         CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0,
  744                         "Pause Frames");
  745         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames",
  746                         CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0,
  747                         "Priority Pause Frames");
  748         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
  749                         CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0,
  750                         "Control Frames");
  751         
  752         for (i = 0; i < sc->nrqs; i++) {
  753                 sprintf(prefix, "queue%d",i);
  754                 queue_stats_node = SYSCTL_ADD_NODE(ctx, 
  755                                                 SYSCTL_CHILDREN(rx_stats_node),
  756                                                 OID_AUTO, prefix, CTLFLAG_RD,
  757                                                 NULL, "Queue name");
  758                 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
  759                 
  760                 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
  761                         CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
  762                         "Receive Packets");
  763                 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
  764                         CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
  765                         "Recived Bytes");
  766                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
  767                         CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
  768                         "Received Fragments");
  769                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
  770                                 "rx_mcast_pkts", CTLFLAG_RD,
  771                                 &sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
  772                                         "Received Multicast Packets");
  773                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
  774                                 "rx_ucast_pkts", CTLFLAG_RD, 
  775                                 &sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
  776                                         "Received Unicast Packets");
  777                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
  778                         CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
  779                         "Received Completion Errors");
  780                 
  781         }
  782         
  783         rx_stats_node = SYSCTL_ADD_NODE(ctx,
  784                                         SYSCTL_CHILDREN(rx_stats_node),
  785                                         OID_AUTO, "err", CTLFLAG_RD,
  786                                         NULL, "Receive Error Stats");
  787         rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
  788         
  789         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
  790                         CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0,
  791                         "CRC Errors");
  792         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors",
  793                         CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0,
  794                         "Drops due to pbuf full");
  795         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors",
  796                         CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0,
  797                         "ERX Errors");
  798         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
  799                         CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0,
  800                         "RX Alignmnet Errors");
  801         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
  802                         CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0,
  803                         "In Range Errors");
  804         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
  805                         CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0,
  806                         "Out Range Errors");
  807         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
  808                         CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0,
  809                         "Frame Too Long");
  810         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
  811                         CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0,
  812                         "Address Match Errors");
  813         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
  814                         CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0,
  815                         "Dropped Too Small");
  816         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
  817                         CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0,
  818                         "Dropped Too Short");
  819         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
  820                         "dropped_header_too_small", CTLFLAG_RD,
  821                         &stats->u0.be.rx_dropped_header_too_small, 0,
  822                         "Dropped Header Too Small");
  823         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length",
  824                         CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0,
  825                         "Dropped TCP Length");
  826         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
  827                         CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0,
  828                         "Dropped runt");
  829         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
  830                         CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0,
  831                         "IP Checksum Errors");
  832         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
  833                         CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0,
  834                         "TCP Checksum Errors");
  835         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
  836                         CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0,
  837                         "UDP Checksum Errors");
  838         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop",
  839                         CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0,
  840                         "FIFO Overflow Drop");
  841         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
  842                         "input_fifo_overflow_drop", CTLFLAG_RD,
  843                         &stats->u0.be.rx_input_fifo_overflow_drop, 0,
  844                         "Input FIFO Overflow Drop");
  845 
  846         tx_stats_node = SYSCTL_ADD_NODE(ctx,
  847                                         SYSCTL_CHILDREN(stats_node), OID_AUTO,
  848                                         "tx",CTLFLAG_RD, NULL,
  849                                         "TX Ethernet Statistics");
  850         tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
  851 
  852         SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
  853                         CTLFLAG_RD, &stats->tx.t_tx_pkts,
  854                         "Total Transmit Packets");
  855         SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
  856                         CTLFLAG_RD, &stats->tx.t_tx_bytes,
  857                         "Total Transmit Bytes");
  858         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
  859                         CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
  860                         "Total Transmit Requests");
  861         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
  862                         CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
  863                         "Total Transmit Stops");
  864         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
  865                         CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
  866                         "Total Transmit WRB's");
  867         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
  868                         CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
  869                         "Total Transmit Completions");
  870         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
  871                         "total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
  872                         &stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
  873                         "Total Transmit IPV6 Drops");
  874         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
  875                         CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0,
  876                         "Pause Frames");
  877         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes",
  878                         CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0,
  879                         "Priority Pauseframes");
  880         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
  881                         CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0,
  882                         "Tx Control Frames");
  883 
  884         for (i = 0; i < sc->nwqs; i++) {
  885                 sprintf(prefix, "queue%d",i);
  886                 queue_stats_node = SYSCTL_ADD_NODE(ctx, 
  887                                                 SYSCTL_CHILDREN(tx_stats_node),
  888                                                 OID_AUTO, prefix, CTLFLAG_RD,
  889                                                 NULL, "Queue name");
  890                 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
  891 
  892                 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
  893                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
  894                         "Transmit Packets");
  895                 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
  896                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
  897                         "Transmit Bytes");
  898                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
  899                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
  900                         "Transmit Requests");
  901                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
  902                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
  903                         "Transmit Stops");
  904                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
  905                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
  906                         "Transmit WRB's");
  907                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
  908                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
  909                         "Transmit Completions");
  910                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
  911                         "ipv6_ext_hdr_tx_drop",CTLFLAG_RD,
  912                         &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
  913                         "Transmit IPV6 Ext Header Drop");
  914 
  915         }
  916         return;
  917 }
  918 
  919 
  920 static void
  921 oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
  922                                   struct sysctl_ctx_list *ctx,
  923                                   struct sysctl_oid *stats_node)
  924 {
  925         struct sysctl_oid *rx_stats_node, *tx_stats_node;
  926         struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
  927         struct sysctl_oid_list *queue_stats_list;
  928         struct sysctl_oid *queue_stats_node;
  929         struct oce_drv_stats *stats;
  930         char prefix[32];
  931         int i;
  932 
  933         stats = &sc->oce_stats_info;
  934 
  935         rx_stats_node = SYSCTL_ADD_NODE(ctx,
  936                                         SYSCTL_CHILDREN(stats_node),
  937                                         OID_AUTO, "rx", CTLFLAG_RD,
  938                                         NULL, "RX Ethernet Statistics");
  939         rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
  940 
  941         
  942         SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
  943                         CTLFLAG_RD, &stats->rx.t_rx_pkts,
  944                         "Total Received Packets");
  945         SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
  946                         CTLFLAG_RD, &stats->rx.t_rx_bytes,
  947                         "Total Received Bytes");
  948         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
  949                         CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
  950                         "Total Received Fragements");
  951         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
  952                         CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
  953                         "Total Received Multicast Packets");
  954         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
  955                         CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
  956                         "Total Received Unicast Packets");
  957         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
  958                         CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
  959                         "Total Receive completion errors");
  960         SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "pause_frames",
  961                         CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames,
  962                         "Pause Frames");
  963         SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "control_frames",
  964                         CTLFLAG_RD, &stats->u0.xe201.rx_control_frames,
  965                         "Control Frames");
  966         
  967         for (i = 0; i < sc->nrqs; i++) {
  968                 sprintf(prefix, "queue%d",i);
  969                 queue_stats_node = SYSCTL_ADD_NODE(ctx, 
  970                                                 SYSCTL_CHILDREN(rx_stats_node),
  971                                                 OID_AUTO, prefix, CTLFLAG_RD,
  972                                                 NULL, "Queue name");
  973                 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
  974                 
  975                 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
  976                         CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
  977                         "Receive Packets");
  978                 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
  979                         CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
  980                         "Recived Bytes");
  981                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
  982                         CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
  983                         "Received Fragments");
  984                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
  985                         "rx_mcast_pkts", CTLFLAG_RD,
  986                         &sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
  987                         "Received Multicast Packets");
  988                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
  989                         "rx_ucast_pkts",CTLFLAG_RD,
  990                         &sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
  991                         "Received Unicast Packets");
  992                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
  993                         CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
  994                         "Received Completion Errors");
  995                 
  996         }
  997 
  998         rx_stats_node = SYSCTL_ADD_NODE(ctx,
  999                                         SYSCTL_CHILDREN(rx_stats_node),
 1000                                         OID_AUTO, "err", CTLFLAG_RD,
 1001                                         NULL, "Receive Error Stats");
 1002         rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
 1003         
 1004         SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "crc_errs",
 1005                         CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors,
 1006                         "CRC Errors");
 1007         SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
 1008                         CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors,
 1009                         "RX Alignmnet Errors");
 1010         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
 1011                         CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0,
 1012                         "In Range Errors");
 1013         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
 1014                         CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0,
 1015                         "Out Range Errors");
 1016         SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
 1017                         CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long,
 1018                         "Frame Too Long");
 1019         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
 1020                         CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0,
 1021                         "Address Match Errors");
 1022         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
 1023                         CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0,
 1024                         "Dropped Too Small");
 1025         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
 1026                         CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0,
 1027                         "Dropped Too Short");
 1028         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
 1029                         "dropped_header_too_small", CTLFLAG_RD,
 1030                         &stats->u0.xe201.rx_dropped_header_too_small, 0,
 1031                         "Dropped Header Too Small");
 1032         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
 1033                         "dropped_tcp_length", CTLFLAG_RD,
 1034                         &stats->u0.xe201.rx_dropped_invalid_tcp_length, 0,
 1035                         "Dropped TCP Length");
 1036         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
 1037                         CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0,
 1038                         "Dropped runt");
 1039         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
 1040                         CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0,
 1041                         "IP Checksum Errors");
 1042         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
 1043                         CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0,
 1044                         "TCP Checksum Errors");
 1045         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
 1046                         CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0,
 1047                         "UDP Checksum Errors");
 1048         SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop",
 1049                         CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0,
 1050                         "Input FIFO Overflow Drop");
 1051 
 1052         tx_stats_node = SYSCTL_ADD_NODE(ctx,
 1053                                         SYSCTL_CHILDREN(stats_node),
 1054                                         OID_AUTO, "tx", CTLFLAG_RD,
 1055                                         NULL, "TX Ethernet Statistics");
 1056         tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
 1057 
 1058         SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
 1059                         CTLFLAG_RD, &stats->tx.t_tx_pkts,
 1060                         "Total Transmit Packets");
 1061         SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
 1062                         CTLFLAG_RD, &stats->tx.t_tx_bytes,
 1063                         "Total Transmit Bytes");
 1064         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
 1065                         CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
 1066                         "Total Transmit Requests");
 1067         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
 1068                         CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
 1069                         "Total Transmit Stops");
 1070         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
 1071                         CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
 1072                         "Total Transmit WRB's");
 1073         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
 1074                         CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
 1075                         "Total Transmit Completions");
 1076         SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
 1077                         "total_ipv6_ext_hdr_tx_drop",
 1078                         CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
 1079                         "Total Transmit IPV6 Drops");
 1080         SYSCTL_ADD_UQUAD(ctx, tx_stat_list, OID_AUTO, "pauseframes",
 1081                         CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames,
 1082                         "Pause Frames");
 1083         SYSCTL_ADD_UQUAD(ctx, tx_stat_list, OID_AUTO, "controlframes",
 1084                         CTLFLAG_RD, &stats->u0.xe201.tx_control_frames,
 1085                         "Tx Control Frames");
 1086 
 1087         for (i = 0; i < sc->nwqs; i++) {
 1088                 sprintf(prefix, "queue%d",i);
 1089                 queue_stats_node = SYSCTL_ADD_NODE(ctx, 
 1090                                                 SYSCTL_CHILDREN(tx_stats_node),
 1091                                                 OID_AUTO, prefix, CTLFLAG_RD,
 1092                                                 NULL, "Queue name");
 1093                 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
 1094 
 1095                 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
 1096                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
 1097                         "Transmit Packets");
 1098                 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
 1099                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
 1100                         "Transmit Bytes");
 1101                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
 1102                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
 1103                         "Transmit Requests");
 1104                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
 1105                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
 1106                         "Transmit Stops");
 1107                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
 1108                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
 1109                         "Transmit WRB's");
 1110                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
 1111                         CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
 1112                         "Transmit Completions");
 1113                 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
 1114                         "ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
 1115                         &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
 1116                         "Transmit IPV6 Ext Header Drop");
 1117 
 1118         }
 1119         return;
 1120 }
 1121 
 1122 
 1123 void 
 1124 oce_refresh_queue_stats(POCE_SOFTC sc)
 1125 {
 1126         struct oce_drv_stats *adapter_stats;
 1127         int i;
 1128 
 1129         adapter_stats = &sc->oce_stats_info;
 1130         
 1131         /* Caluculate total TX and TXstats from all queues */
 1132         
 1133         bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats));
 1134         for (i = 0; i < sc->nrqs; i++) {
 1135                 
 1136                 adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts;
 1137                 adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes;
 1138                 adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags;
 1139                 adapter_stats->rx.t_rx_mcast_pkts += 
 1140                                         sc->rq[i]->rx_stats.rx_mcast_pkts;
 1141                 adapter_stats->rx.t_rx_ucast_pkts +=
 1142                                         sc->rq[i]->rx_stats.rx_ucast_pkts;
 1143                 adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err;
 1144         }
 1145 
 1146         bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats));
 1147         for (i = 0; i < sc->nwqs; i++) {
 1148                 adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs;
 1149                 adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops;
 1150                 adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs;
 1151                 adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl;
 1152                 adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes;
 1153                 adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts;
 1154                 adapter_stats->tx.t_ipv6_ext_hdr_tx_drop +=
 1155                                 sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop;
 1156         }
 1157 
 1158 }
 1159 
 1160 
 1161 
 1162 static void
 1163 copy_stats_to_sc_xe201(POCE_SOFTC sc)
 1164 {
 1165         struct oce_xe201_stats *adapter_stats;
 1166         struct mbx_get_pport_stats *nic_mbx;
 1167         struct pport_stats *port_stats;
 1168 
 1169         nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats);
 1170         port_stats = &nic_mbx->params.rsp.pps;
 1171         adapter_stats = &sc->oce_stats_info.u0.xe201;
 1172 
 1173         adapter_stats->tx_pkts = port_stats->tx_pkts;
 1174         adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts;
 1175         adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts;
 1176         adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts;
 1177         adapter_stats->tx_bytes = port_stats->tx_bytes;
 1178         adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes;
 1179         adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes;
 1180         adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes;
 1181         adapter_stats->tx_discards = port_stats->tx_discards;
 1182         adapter_stats->tx_errors = port_stats->tx_errors;
 1183         adapter_stats->tx_pause_frames = port_stats->tx_pause_frames;
 1184         adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames;
 1185         adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames;
 1186         adapter_stats->tx_internal_mac_errors =
 1187                 port_stats->tx_internal_mac_errors;
 1188         adapter_stats->tx_control_frames = port_stats->tx_control_frames;
 1189         adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes;
 1190         adapter_stats->tx_pkts_65_to_127_bytes =
 1191                 port_stats->tx_pkts_65_to_127_bytes;
 1192         adapter_stats->tx_pkts_128_to_255_bytes =
 1193                 port_stats->tx_pkts_128_to_255_bytes;
 1194         adapter_stats->tx_pkts_256_to_511_bytes =
 1195                 port_stats->tx_pkts_256_to_511_bytes;
 1196         adapter_stats->tx_pkts_512_to_1023_bytes =
 1197                 port_stats->tx_pkts_512_to_1023_bytes;
 1198         adapter_stats->tx_pkts_1024_to_1518_bytes =
 1199                 port_stats->tx_pkts_1024_to_1518_bytes;
 1200         adapter_stats->tx_pkts_1519_to_2047_bytes =
 1201                 port_stats->tx_pkts_1519_to_2047_bytes;
 1202         adapter_stats->tx_pkts_2048_to_4095_bytes =
 1203                 port_stats->tx_pkts_2048_to_4095_bytes;
 1204         adapter_stats->tx_pkts_4096_to_8191_bytes =
 1205                 port_stats->tx_pkts_4096_to_8191_bytes;
 1206         adapter_stats->tx_pkts_8192_to_9216_bytes =
 1207                 port_stats->tx_pkts_8192_to_9216_bytes;
 1208         adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts;
 1209         adapter_stats->rx_pkts = port_stats->rx_pkts;
 1210         adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts;
 1211         adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts;
 1212         adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts;
 1213         adapter_stats->rx_bytes = port_stats->rx_bytes;
 1214         adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes;
 1215         adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes;
 1216         adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes;
 1217         adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos;
 1218         adapter_stats->rx_discards = port_stats->rx_discards;
 1219         adapter_stats->rx_errors = port_stats->rx_errors;
 1220         adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
 1221         adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors;
 1222         adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors;
 1223         adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
 1224         adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames;
 1225         adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames;
 1226         adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long;
 1227         adapter_stats->rx_internal_mac_errors =
 1228                 port_stats->rx_internal_mac_errors;
 1229         adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts;
 1230         adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts;
 1231         adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts;
 1232         adapter_stats->rx_jabbers = port_stats->rx_jabbers;
 1233         adapter_stats->rx_control_frames = port_stats->rx_control_frames;
 1234         adapter_stats->rx_control_frames_unknown_opcode =
 1235                 port_stats->rx_control_frames_unknown_opcode;
 1236         adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
 1237         adapter_stats->rx_out_of_range_errors =
 1238                 port_stats->rx_out_of_range_errors;
 1239         adapter_stats->rx_address_match_errors =
 1240                 port_stats->rx_address_match_errors;
 1241         adapter_stats->rx_vlan_mismatch_errors =
 1242                 port_stats->rx_vlan_mismatch_errors;
 1243         adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
 1244         adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
 1245         adapter_stats->rx_dropped_header_too_small =
 1246                 port_stats->rx_dropped_header_too_small;
 1247         adapter_stats->rx_dropped_invalid_tcp_length =
 1248                 port_stats->rx_dropped_invalid_tcp_length;
 1249         adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
 1250         adapter_stats->rx_ip_checksum_errors =
 1251                 port_stats->rx_ip_checksum_errors;
 1252         adapter_stats->rx_tcp_checksum_errors =
 1253                 port_stats->rx_tcp_checksum_errors;
 1254         adapter_stats->rx_udp_checksum_errors =
 1255                 port_stats->rx_udp_checksum_errors;
 1256         adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts;
 1257         adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts;
 1258         adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts;
 1259         adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes;
 1260         adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes;
 1261         adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts;
 1262         adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts;
 1263         adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts;
 1264         adapter_stats->rx_management_pkts = port_stats->rx_management_pkts;
 1265         adapter_stats->rx_switched_unicast_pkts =
 1266                 port_stats->rx_switched_unicast_pkts;
 1267         adapter_stats->rx_switched_multicast_pkts =
 1268                 port_stats->rx_switched_multicast_pkts;
 1269         adapter_stats->rx_switched_broadcast_pkts =
 1270                 port_stats->rx_switched_broadcast_pkts;
 1271         adapter_stats->num_forwards = port_stats->num_forwards;
 1272         adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow;
 1273         adapter_stats->rx_input_fifo_overflow =
 1274                 port_stats->rx_input_fifo_overflow;
 1275         adapter_stats->rx_drops_too_many_frags =
 1276                 port_stats->rx_drops_too_many_frags;
 1277         adapter_stats->rx_drops_invalid_queue =
 1278                 port_stats->rx_drops_invalid_queue;
 1279         adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu;
 1280         adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes;
 1281         adapter_stats->rx_pkts_65_to_127_bytes =
 1282                 port_stats->rx_pkts_65_to_127_bytes;
 1283         adapter_stats->rx_pkts_128_to_255_bytes =
 1284                 port_stats->rx_pkts_128_to_255_bytes;
 1285         adapter_stats->rx_pkts_256_to_511_bytes =
 1286                 port_stats->rx_pkts_256_to_511_bytes;
 1287         adapter_stats->rx_pkts_512_to_1023_bytes =
 1288                 port_stats->rx_pkts_512_to_1023_bytes;
 1289         adapter_stats->rx_pkts_1024_to_1518_bytes =
 1290                 port_stats->rx_pkts_1024_to_1518_bytes;
 1291         adapter_stats->rx_pkts_1519_to_2047_bytes =
 1292                 port_stats->rx_pkts_1519_to_2047_bytes;
 1293         adapter_stats->rx_pkts_2048_to_4095_bytes =
 1294                 port_stats->rx_pkts_2048_to_4095_bytes;
 1295         adapter_stats->rx_pkts_4096_to_8191_bytes =
 1296                 port_stats->rx_pkts_4096_to_8191_bytes;
 1297         adapter_stats->rx_pkts_8192_to_9216_bytes =
 1298                 port_stats->rx_pkts_8192_to_9216_bytes;
 1299 }
 1300 
 1301 
 1302 
 1303 static void
 1304 copy_stats_to_sc_be2(POCE_SOFTC sc)
 1305 {
 1306         struct oce_be_stats *adapter_stats;
 1307         struct oce_pmem_stats *pmem;
 1308         struct oce_rxf_stats_v0 *rxf_stats;
 1309         struct oce_port_rxf_stats_v0 *port_stats;
 1310         struct mbx_get_nic_stats_v0 *nic_mbx;
 1311         uint32_t port = sc->port_id;
 1312 
 1313         nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0);
 1314         pmem = &nic_mbx->params.rsp.stats.pmem;
 1315         rxf_stats = &nic_mbx->params.rsp.stats.rxf;
 1316         port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
 1317         
 1318         adapter_stats = &sc->oce_stats_info.u0.be;
 1319 
 1320         
 1321         /* Update stats */
 1322         adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
 1323         adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
 1324         adapter_stats->rx_control_frames = port_stats->rx_control_frames;
 1325         adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
 1326         adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
 1327         adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
 1328         adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
 1329         adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
 1330         adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
 1331         adapter_stats->rxpp_fifo_overflow_drop =
 1332                                         port_stats->rxpp_fifo_overflow_drop;
 1333         adapter_stats->rx_dropped_tcp_length =
 1334                 port_stats->rx_dropped_tcp_length;
 1335         adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
 1336         adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
 1337         adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
 1338         adapter_stats->rx_dropped_header_too_small =
 1339                 port_stats->rx_dropped_header_too_small;
 1340         adapter_stats->rx_input_fifo_overflow_drop =
 1341                 port_stats->rx_input_fifo_overflow_drop;
 1342         adapter_stats->rx_address_match_errors =
 1343                 port_stats->rx_address_match_errors;
 1344         adapter_stats->rx_alignment_symbol_errors =
 1345                 port_stats->rx_alignment_symbol_errors;
 1346         adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
 1347         adapter_stats->tx_controlframes = port_stats->tx_controlframes;
 1348         
 1349         if (sc->if_id)
 1350                 adapter_stats->jabber_events = rxf_stats->port1_jabber_events;
 1351         else
 1352                 adapter_stats->jabber_events = rxf_stats->port0_jabber_events;
 1353 
 1354         adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
 1355         adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
 1356         adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
 1357         adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
 1358         adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
 1359         adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
 1360         adapter_stats->rx_drops_no_tpre_descr =
 1361                 rxf_stats->rx_drops_no_tpre_descr;
 1362         adapter_stats->rx_drops_too_many_frags =
 1363                 rxf_stats->rx_drops_too_many_frags;
 1364         adapter_stats->eth_red_drops = pmem->eth_red_drops;
 1365 }
 1366 
 1367 
 1368 static void
 1369 copy_stats_to_sc_be3(POCE_SOFTC sc)
 1370 {
 1371         struct oce_be_stats *adapter_stats;
 1372         struct oce_pmem_stats *pmem;
 1373         struct oce_rxf_stats_v1 *rxf_stats;
 1374         struct oce_port_rxf_stats_v1 *port_stats;
 1375         struct mbx_get_nic_stats *nic_mbx;
 1376         uint32_t port = sc->port_id;
 1377 
 1378         nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats);
 1379         pmem = &nic_mbx->params.rsp.stats.pmem;
 1380         rxf_stats = &nic_mbx->params.rsp.stats.rxf;
 1381         port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
 1382 
 1383         adapter_stats = &sc->oce_stats_info.u0.be;
 1384 
 1385         /* Update stats */
 1386         adapter_stats->pmem_fifo_overflow_drop =
 1387                 port_stats->pmem_fifo_overflow_drop;
 1388         adapter_stats->rx_priority_pause_frames =
 1389                 port_stats->rx_priority_pause_frames;
 1390         adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
 1391         adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
 1392         adapter_stats->rx_control_frames = port_stats->rx_control_frames;
 1393         adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
 1394         adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
 1395         adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
 1396         adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
 1397         adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
 1398         adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
 1399         adapter_stats->rx_dropped_tcp_length =
 1400                 port_stats->rx_dropped_tcp_length;
 1401         adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
 1402         adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
 1403         adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
 1404         adapter_stats->rx_dropped_header_too_small =
 1405                 port_stats->rx_dropped_header_too_small;
 1406         adapter_stats->rx_input_fifo_overflow_drop =
 1407                 port_stats->rx_input_fifo_overflow_drop;
 1408         adapter_stats->rx_address_match_errors =
 1409                 port_stats->rx_address_match_errors;
 1410         adapter_stats->rx_alignment_symbol_errors =
 1411                 port_stats->rx_alignment_symbol_errors;
 1412         adapter_stats->rxpp_fifo_overflow_drop =
 1413                 port_stats->rxpp_fifo_overflow_drop;
 1414         adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
 1415         adapter_stats->tx_controlframes = port_stats->tx_controlframes;
 1416         adapter_stats->jabber_events = port_stats->jabber_events;
 1417 
 1418         adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
 1419         adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
 1420         adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
 1421         adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
 1422         adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
 1423         adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
 1424         adapter_stats->rx_drops_no_tpre_descr =
 1425                 rxf_stats->rx_drops_no_tpre_descr;
 1426         adapter_stats->rx_drops_too_many_frags =
 1427                 rxf_stats->rx_drops_too_many_frags;
 1428 
 1429         adapter_stats->eth_red_drops = pmem->eth_red_drops;
 1430 }
 1431 
 1432 
 1433 int
 1434 oce_stats_init(POCE_SOFTC sc)
 1435 {
 1436         int rc = 0, sz;
 1437         
 1438         if (IS_BE(sc) || IS_SH(sc)) {
 1439                 if (sc->flags & OCE_FLAGS_BE2)
 1440                         sz = sizeof(struct mbx_get_nic_stats_v0);
 1441                 else 
 1442                         sz = sizeof(struct mbx_get_nic_stats);
 1443         } else 
 1444                 sz = sizeof(struct mbx_get_pport_stats);
 1445 
 1446         rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0);
 1447 
 1448         return rc;
 1449 }
 1450 
 1451 
 1452 void
 1453 oce_stats_free(POCE_SOFTC sc)
 1454 {
 1455 
 1456         oce_dma_free(sc, &sc->stats_mem);
 1457 
 1458 }
 1459 
 1460 
 1461 int
 1462 oce_refresh_nic_stats(POCE_SOFTC sc)
 1463 {
 1464         int rc = 0, reset = 0;
 1465 
 1466         if (IS_BE(sc) || IS_SH(sc)) {
 1467                 if (sc->flags & OCE_FLAGS_BE2) {
 1468                         rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem);
 1469                         if (!rc)
 1470                                 copy_stats_to_sc_be2(sc);
 1471                 } else {
 1472                         rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem);
 1473                         if (!rc)
 1474                                 copy_stats_to_sc_be3(sc);
 1475                 }
 1476 
 1477         } else {
 1478                 rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset);
 1479                 if (!rc)
 1480                         copy_stats_to_sc_xe201(sc);
 1481         }
 1482         
 1483         return rc;
 1484 }
 1485 
 1486 static int 
 1487 oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS)
 1488 {
 1489         int result = 0, error;
 1490         int rc = 0;
 1491         POCE_SOFTC sc = (POCE_SOFTC) arg1;
 1492 
 1493         /* sysctl default handler */
 1494         error = sysctl_handle_int(oidp, &result, 0, req);
 1495         if (error || !req->newptr)
 1496                 return (error);
 1497 
 1498         if(result == -1) {
 1499                 return EINVAL;
 1500         }
 1501         bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE);
 1502 
 1503         rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0);
 1504         if(rc)
 1505                 return rc;
 1506 
 1507         rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2);
 1508         if(rc)
 1509                 return rc;
 1510 
 1511         return rc;
 1512 }

Cache object: a7c093b859c737d7d1dbf83470a0a227


[ 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.