1231663Sluigi/*- 2252905Sdelphij * Copyright (C) 2013 Emulex 3231663Sluigi * All rights reserved. 4231663Sluigi * 5231663Sluigi * Redistribution and use in source and binary forms, with or without 6231663Sluigi * modification, are permitted provided that the following conditions are met: 7231663Sluigi * 8231663Sluigi * 1. Redistributions of source code must retain the above copyright notice, 9231663Sluigi * this list of conditions and the following disclaimer. 10231663Sluigi * 11231663Sluigi * 2. Redistributions in binary form must reproduce the above copyright 12231663Sluigi * notice, this list of conditions and the following disclaimer in the 13231663Sluigi * documentation and/or other materials provided with the distribution. 14231663Sluigi * 15231663Sluigi * 3. Neither the name of the Emulex Corporation nor the names of its 16231663Sluigi * contributors may be used to endorse or promote products derived from 17231663Sluigi * this software without specific prior written permission. 18231663Sluigi * 19231663Sluigi * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20231663Sluigi * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21231663Sluigi * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22231663Sluigi * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23231663Sluigi * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24231663Sluigi * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25231663Sluigi * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26231663Sluigi * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27231663Sluigi * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28231663Sluigi * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29231663Sluigi * POSSIBILITY OF SUCH DAMAGE. 30231663Sluigi * 31231663Sluigi * Contact Information: 32231663Sluigi * freebsd-drivers@emulex.com 33231663Sluigi * 34231663Sluigi * Emulex 35231663Sluigi * 3333 Susan Street 36231663Sluigi * Costa Mesa, CA 92626 37231663Sluigi */ 38231663Sluigi 39231663Sluigi/* $FreeBSD$ */ 40231663Sluigi 41231663Sluigi#include "oce_if.h" 42231663Sluigi 43231663Sluigistatic void copy_stats_to_sc_xe201(POCE_SOFTC sc); 44231663Sluigistatic void copy_stats_to_sc_be3(POCE_SOFTC sc); 45231663Sluigistatic void copy_stats_to_sc_be2(POCE_SOFTC sc); 46231663Sluigistatic int oce_sysctl_loopback(SYSCTL_HANDLER_ARGS); 47268044Sdelphijstatic int oce_sys_aic_enable(SYSCTL_HANDLER_ARGS); 48231663Sluigistatic int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 49258586Sdelphijstatic int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 50231663Sluigistatic int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS); 51231663Sluigistatic int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 52248062Sdelphijstatic int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS); 53231663Sluigistatic boolean_t oce_phy_flashing_required(POCE_SOFTC sc); 54231663Sluigistatic boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p, 55231663Sluigi int img_optype, uint32_t img_offset, 56231663Sluigi uint32_t img_size, uint32_t hdrs_size); 57231663Sluigistatic void oce_add_stats_sysctls_be3(POCE_SOFTC sc, 58231663Sluigi struct sysctl_ctx_list *ctx, 59231663Sluigi struct sysctl_oid *stats_node); 60231663Sluigistatic void oce_add_stats_sysctls_xe201(POCE_SOFTC sc, 61231663Sluigi struct sysctl_ctx_list *ctx, 62231663Sluigi struct sysctl_oid *stats_node); 63231663Sluigi 64258586Sdelphij 65231663Sluigiextern char component_revision[32]; 66248062Sdelphijuint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE]; 67231663Sluigi 68258586Sdelphijstruct flash_img_attri { 69258586Sdelphij int img_offset; 70258586Sdelphij int img_size; 71258586Sdelphij int img_type; 72258586Sdelphij bool skip_image; 73258586Sdelphij int optype; 74258586Sdelphij}; 75258586Sdelphij 76231663Sluigivoid 77231663Sluigioce_add_sysctls(POCE_SOFTC sc) 78231663Sluigi{ 79231663Sluigi 80231663Sluigi struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev); 81231663Sluigi struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev); 82231663Sluigi struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree); 83231663Sluigi struct sysctl_oid *stats_node; 84231663Sluigi 85231663Sluigi SYSCTL_ADD_STRING(ctx, child, 86231663Sluigi OID_AUTO, "component_revision", 87231663Sluigi CTLTYPE_INT | CTLFLAG_RD, 88231663Sluigi &component_revision, 89231663Sluigi sizeof(component_revision), 90231663Sluigi "EMULEX One-Connect device driver revision"); 91231663Sluigi 92231663Sluigi SYSCTL_ADD_STRING(ctx, child, 93231663Sluigi OID_AUTO, "firmware_version", 94231663Sluigi CTLTYPE_INT | CTLFLAG_RD, 95231663Sluigi &sc->fw_version, 96231663Sluigi sizeof(sc->fw_version), 97231663Sluigi "EMULEX One-Connect Firmware Version"); 98231663Sluigi 99231663Sluigi SYSCTL_ADD_INT(ctx, child, 100231663Sluigi OID_AUTO, "max_rsp_handled", 101231663Sluigi CTLTYPE_INT | CTLFLAG_RW, 102231663Sluigi &oce_max_rsp_handled, 103231663Sluigi sizeof(oce_max_rsp_handled), 104231663Sluigi "Maximum receive frames handled per interupt"); 105231663Sluigi 106248062Sdelphij if ((sc->function_mode & FNM_FLEX10_MODE) || 107248062Sdelphij (sc->function_mode & FNM_UMC_MODE)) 108231663Sluigi SYSCTL_ADD_UINT(ctx, child, 109231663Sluigi OID_AUTO, "speed", 110231663Sluigi CTLFLAG_RD, 111231663Sluigi &sc->qos_link_speed, 112231663Sluigi 0,"QOS Speed"); 113231663Sluigi else 114231663Sluigi SYSCTL_ADD_UINT(ctx, child, 115231663Sluigi OID_AUTO, "speed", 116231663Sluigi CTLFLAG_RD, 117231663Sluigi &sc->speed, 118231663Sluigi 0,"Link Speed"); 119231663Sluigi 120248062Sdelphij if (sc->function_mode & FNM_UMC_MODE) 121248062Sdelphij SYSCTL_ADD_UINT(ctx, child, 122248062Sdelphij OID_AUTO, "pvid", 123248062Sdelphij CTLFLAG_RD, 124248062Sdelphij &sc->pvid, 125248062Sdelphij 0,"PVID"); 126248062Sdelphij 127231663Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back", 128231663Sluigi CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, 129231663Sluigi oce_sysctl_loopback, "I", "Loop Back Tests"); 130231663Sluigi 131231663Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade", 132231663Sluigi CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0, 133231663Sluigi oce_sys_fwupgrade, "A", "Firmware ufi file"); 134231663Sluigi 135268044Sdelphij SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "aic_enable", 136268044Sdelphij CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 1, 137268044Sdelphij oce_sys_aic_enable, "I", "aic flags"); 138268044Sdelphij 139248062Sdelphij /* 140248062Sdelphij * Dumps Transceiver data 141248062Sdelphij * "sysctl dev.oce.0.sfp_vpd_dump=0" 142248062Sdelphij * "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump 143248062Sdelphij * "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump 144248062Sdelphij */ 145248062Sdelphij SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump", 146248062Sdelphij CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump, 147248062Sdelphij "I", "Initiate a sfp_vpd_dump operation"); 148248062Sdelphij SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer", 149248062Sdelphij CTLFLAG_RD, sfp_vpd_dump_buffer, 150248062Sdelphij TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer"); 151248062Sdelphij 152231663Sluigi stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", 153231663Sluigi CTLFLAG_RD, NULL, "Ethernet Statistics"); 154231663Sluigi 155252905Sdelphij if (IS_BE(sc) || IS_SH(sc)) 156231663Sluigi oce_add_stats_sysctls_be3(sc, ctx, stats_node); 157231663Sluigi else 158231663Sluigi oce_add_stats_sysctls_xe201(sc, ctx, stats_node); 159231663Sluigi 160231663Sluigi 161231663Sluigi} 162231663Sluigi 163231663Sluigi 164231663Sluigistatic uint32_t 165231663Sluigioce_loopback_test(struct oce_softc *sc, uint8_t loopback_type) 166231663Sluigi{ 167231663Sluigi uint32_t status = 0; 168231663Sluigi 169258586Sdelphij oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1); 170258586Sdelphij status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type, 171231663Sluigi 1500, 2, 0xabc); 172258586Sdelphij oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1); 173231663Sluigi 174231663Sluigi return status; 175231663Sluigi} 176231663Sluigi 177231663Sluigistatic int 178268044Sdelphijoce_sys_aic_enable(SYSCTL_HANDLER_ARGS) 179268044Sdelphij{ 180268044Sdelphij int value = 0; 181268044Sdelphij uint32_t status, vector; 182268044Sdelphij POCE_SOFTC sc = (struct oce_softc *)arg1; 183268044Sdelphij struct oce_aic_obj *aic; 184268044Sdelphij 185268044Sdelphij status = sysctl_handle_int(oidp, &value, 0, req); 186268044Sdelphij if (status || !req->newptr) 187268044Sdelphij return status; 188268044Sdelphij 189268044Sdelphij for (vector = 0; vector < sc->intr_count; vector++) { 190268044Sdelphij aic = &sc->aic_obj[vector]; 191268044Sdelphij 192268044Sdelphij if (value == 0){ 193268044Sdelphij aic->max_eqd = aic->min_eqd = aic->et_eqd = 0; 194268044Sdelphij aic->enable = 0; 195268044Sdelphij } 196268044Sdelphij else { 197268044Sdelphij aic->max_eqd = OCE_MAX_EQD; 198268044Sdelphij aic->min_eqd = OCE_MIN_EQD; 199268044Sdelphij aic->et_eqd = OCE_MIN_EQD; 200268044Sdelphij aic->enable = TRUE; 201268044Sdelphij } 202268044Sdelphij } 203268044Sdelphij return 0; 204268044Sdelphij} 205268044Sdelphij 206268044Sdelphijstatic int 207231663Sluigioce_sysctl_loopback(SYSCTL_HANDLER_ARGS) 208231663Sluigi{ 209231663Sluigi int value = 0; 210231663Sluigi uint32_t status; 211231663Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 212231663Sluigi 213231663Sluigi status = sysctl_handle_int(oidp, &value, 0, req); 214231663Sluigi if (status || !req->newptr) 215231663Sluigi return status; 216231663Sluigi 217231663Sluigi if (value != 1) { 218231663Sluigi device_printf(sc->dev, 219231663Sluigi "Not a Valid value. Set to loop_back=1 to run tests\n"); 220231663Sluigi return 0; 221231663Sluigi } 222231663Sluigi 223231663Sluigi if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) { 224231663Sluigi device_printf(sc->dev, 225231663Sluigi "MAC Loopback Test = Failed (Error status = %d)\n", 226231663Sluigi status); 227231663Sluigi } else 228231663Sluigi device_printf(sc->dev, "MAC Loopback Test = Success\n"); 229231663Sluigi 230231663Sluigi if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) { 231231663Sluigi device_printf(sc->dev, 232231663Sluigi "PHY Loopback Test = Failed (Error status = %d)\n", 233231663Sluigi status); 234231663Sluigi } else 235231663Sluigi device_printf(sc->dev, "PHY Loopback Test = Success\n"); 236231663Sluigi 237231663Sluigi if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) { 238231663Sluigi device_printf(sc->dev, 239231663Sluigi "EXT Loopback Test = Failed (Error status = %d)\n", 240231663Sluigi status); 241231663Sluigi } else 242231663Sluigi device_printf(sc->dev, "EXT Loopback Test = Success\n"); 243231663Sluigi 244231663Sluigi return 0; 245231663Sluigi} 246231663Sluigi 247231663Sluigi 248231663Sluigistatic int 249231663Sluigioce_sys_fwupgrade(SYSCTL_HANDLER_ARGS) 250231663Sluigi{ 251231663Sluigi char ufiname[256] = {0}; 252231663Sluigi uint32_t status = 1; 253231663Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 254231663Sluigi const struct firmware *fw; 255231663Sluigi 256231663Sluigi status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req); 257231663Sluigi if (status || !req->newptr) 258231663Sluigi return status; 259231663Sluigi 260231663Sluigi fw = firmware_get(ufiname); 261231663Sluigi if (fw == NULL) { 262231663Sluigi device_printf(sc->dev, "Unable to get Firmware. " 263231663Sluigi "Make sure %s is copied to /boot/modules\n", ufiname); 264231663Sluigi return ENOENT; 265231663Sluigi } 266231663Sluigi 267258586Sdelphij if (IS_BE(sc)) { 268231663Sluigi if ((sc->flags & OCE_FLAGS_BE2)) { 269231663Sluigi device_printf(sc->dev, 270231663Sluigi "Flashing not supported for BE2 yet.\n"); 271231663Sluigi status = 1; 272231663Sluigi goto done; 273231663Sluigi } 274231663Sluigi status = oce_be3_fwupgrade(sc, fw); 275258586Sdelphij } else if (IS_SH(sc)) { 276258586Sdelphij status = oce_skyhawk_fwupgrade(sc,fw); 277231663Sluigi } else 278231663Sluigi status = oce_lancer_fwupgrade(sc, fw); 279231663Sluigidone: 280231663Sluigi if (status) { 281231663Sluigi device_printf(sc->dev, "Firmware Upgrade failed\n"); 282231663Sluigi } else { 283231663Sluigi device_printf(sc->dev, "Firmware Flashed successfully\n"); 284231663Sluigi } 285231663Sluigi 286231663Sluigi /* Release Firmware*/ 287231663Sluigi firmware_put(fw, FIRMWARE_UNLOAD); 288231663Sluigi 289231663Sluigi return status; 290231663Sluigi} 291231663Sluigi 292258586Sdelphijstatic void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec, 293258586Sdelphij struct flash_img_attri *pimg, int i, 294258586Sdelphij const struct firmware *fw, int bin_offset) 295231663Sluigi{ 296258586Sdelphij if (IS_SH(sc)) { 297258586Sdelphij pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset); 298258586Sdelphij pimg->img_size = HOST_32(fsec->fsec_entry[i].pad_size); 299231663Sluigi } 300231663Sluigi 301258586Sdelphij pimg->img_type = HOST_32(fsec->fsec_entry[i].type); 302258586Sdelphij pimg->skip_image = FALSE; 303258586Sdelphij switch (pimg->img_type) { 304258586Sdelphij case IMG_ISCSI: 305258586Sdelphij pimg->optype = 0; 306258586Sdelphij if (IS_BE3(sc)) { 307258586Sdelphij pimg->img_offset = 2097152; 308258586Sdelphij pimg->img_size = 2097152; 309258586Sdelphij } 310231663Sluigi break; 311258586Sdelphij case IMG_REDBOOT: 312258586Sdelphij pimg->optype = 1; 313258586Sdelphij if (IS_BE3(sc)) { 314258586Sdelphij pimg->img_offset = 262144; 315258586Sdelphij pimg->img_size = 1048576; 316258586Sdelphij } 317258586Sdelphij if (!oce_img_flashing_required(sc, fw->data, 318258586Sdelphij pimg->optype, 319258586Sdelphij pimg->img_offset, 320258586Sdelphij pimg->img_size, 321258586Sdelphij bin_offset)) 322258586Sdelphij pimg->skip_image = TRUE; 323258586Sdelphij break; 324258586Sdelphij case IMG_BIOS: 325258586Sdelphij pimg->optype = 2; 326258586Sdelphij if (IS_BE3(sc)) { 327258586Sdelphij pimg->img_offset = 12582912; 328258586Sdelphij pimg->img_size = 524288; 329258586Sdelphij } 330258586Sdelphij break; 331258586Sdelphij case IMG_PXEBIOS: 332258586Sdelphij pimg->optype = 3; 333258586Sdelphij if (IS_BE3(sc)) { 334258586Sdelphij pimg->img_offset = 13107200;; 335258586Sdelphij pimg->img_size = 524288; 336258586Sdelphij } 337258586Sdelphij break; 338258586Sdelphij case IMG_FCOEBIOS: 339258586Sdelphij pimg->optype = 8; 340258586Sdelphij if (IS_BE3(sc)) { 341258586Sdelphij pimg->img_offset = 13631488; 342258586Sdelphij pimg->img_size = 524288; 343258586Sdelphij } 344258586Sdelphij break; 345258586Sdelphij case IMG_ISCSI_BAK: 346258586Sdelphij pimg->optype = 9; 347258586Sdelphij if (IS_BE3(sc)) { 348258586Sdelphij pimg->img_offset = 4194304; 349258586Sdelphij pimg->img_size = 2097152; 350258586Sdelphij } 351258586Sdelphij break; 352258586Sdelphij case IMG_FCOE: 353258586Sdelphij pimg->optype = 10; 354258586Sdelphij if (IS_BE3(sc)) { 355258586Sdelphij pimg->img_offset = 6291456; 356258586Sdelphij pimg->img_size = 2097152; 357258586Sdelphij } 358258586Sdelphij break; 359258586Sdelphij case IMG_FCOE_BAK: 360258586Sdelphij pimg->optype = 11; 361258586Sdelphij if (IS_BE3(sc)) { 362258586Sdelphij pimg->img_offset = 8388608; 363258586Sdelphij pimg->img_size = 2097152; 364258586Sdelphij } 365258586Sdelphij break; 366258586Sdelphij case IMG_NCSI: 367258586Sdelphij pimg->optype = 13; 368258586Sdelphij if (IS_BE3(sc)) { 369258586Sdelphij pimg->img_offset = 15990784; 370258586Sdelphij pimg->img_size = 262144; 371258586Sdelphij } 372258586Sdelphij break; 373258586Sdelphij case IMG_PHY: 374258586Sdelphij pimg->optype = 99; 375258586Sdelphij if (IS_BE3(sc)) { 376258586Sdelphij pimg->img_offset = 1310720; 377258586Sdelphij pimg->img_size = 262144; 378258586Sdelphij } 379258586Sdelphij if (!oce_phy_flashing_required(sc)) 380258586Sdelphij pimg->skip_image = TRUE; 381258586Sdelphij break; 382258586Sdelphij default: 383258586Sdelphij pimg->skip_image = TRUE; 384258586Sdelphij break; 385231663Sluigi } 386231663Sluigi 387231663Sluigi} 388231663Sluigi 389231663Sluigistatic int 390258586Sdelphijoce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs) 391231663Sluigi{ 392231663Sluigi char cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "}; 393231663Sluigi const char *p = (const char *)fw->data; 394231663Sluigi const struct flash_sec_info *fsec = NULL; 395231663Sluigi struct mbx_common_read_write_flashrom *req; 396258586Sdelphij int rc = 0, i, bin_offset = 0, opcode, num_bytes; 397231663Sluigi OCE_DMA_MEM dma_mem; 398258586Sdelphij struct flash_img_attri imgatt; 399231663Sluigi 400231663Sluigi /* Validate Cookie */ 401231663Sluigi bin_offset = (sizeof(struct flash_file_hdr) + 402258586Sdelphij (num_imgs * sizeof(struct image_hdr))); 403231663Sluigi p += bin_offset; 404231663Sluigi while (p < ((const char *)fw->data + fw->datasize)) { 405231663Sluigi fsec = (const struct flash_sec_info *)p; 406231663Sluigi if (!memcmp(cookie, fsec->cookie, sizeof(cookie))) 407231663Sluigi break; 408231663Sluigi fsec = NULL; 409231663Sluigi p += 32; 410231663Sluigi } 411231663Sluigi 412231663Sluigi if (!fsec) { 413231663Sluigi device_printf(sc->dev, 414258586Sdelphij "Invalid Cookie. Firmware image corrupted ?\n"); 415231663Sluigi return EINVAL; 416231663Sluigi } 417231663Sluigi 418258586Sdelphij rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom), 419258586Sdelphij &dma_mem, 0); 420231663Sluigi if (rc) { 421231663Sluigi device_printf(sc->dev, 422258586Sdelphij "Memory allocation failure while flashing\n"); 423231663Sluigi return ENOMEM; 424231663Sluigi } 425231663Sluigi req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom); 426231663Sluigi 427258586Sdelphij if (IS_SH(sc)) 428258586Sdelphij num_imgs = HOST_32(fsec->fsec_hdr.num_images); 429258586Sdelphij else if (IS_BE3(sc)) 430258586Sdelphij num_imgs = MAX_FLASH_COMP; 431231663Sluigi 432258586Sdelphij for (i = 0; i < num_imgs; i++) { 433258586Sdelphij 434258586Sdelphij bzero(&imgatt, sizeof(struct flash_img_attri)); 435258586Sdelphij 436258586Sdelphij oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset); 437258586Sdelphij 438258586Sdelphij if (imgatt.skip_image) 439231663Sluigi continue; 440231663Sluigi 441231663Sluigi p = fw->data; 442258586Sdelphij p = p + bin_offset + imgatt.img_offset; 443258586Sdelphij 444258586Sdelphij if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) { 445231663Sluigi rc = 1; 446231663Sluigi goto ret; 447231663Sluigi } 448231663Sluigi 449258586Sdelphij while (imgatt.img_size) { 450231663Sluigi 451258586Sdelphij if (imgatt.img_size > 32*1024) 452231663Sluigi num_bytes = 32*1024; 453231663Sluigi else 454258586Sdelphij num_bytes = imgatt.img_size; 455258586Sdelphij imgatt.img_size -= num_bytes; 456231663Sluigi 457258586Sdelphij if (!imgatt.img_size) 458231663Sluigi opcode = FLASHROM_OPER_FLASH; 459231663Sluigi else 460231663Sluigi opcode = FLASHROM_OPER_SAVE; 461231663Sluigi 462231663Sluigi memcpy(req->data_buffer, p, num_bytes); 463231663Sluigi p += num_bytes; 464231663Sluigi 465258586Sdelphij rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode, 466258586Sdelphij &dma_mem, num_bytes); 467231663Sluigi if (rc) { 468231663Sluigi device_printf(sc->dev, 469258586Sdelphij "cmd to write to flash rom failed.\n"); 470231663Sluigi rc = EIO; 471231663Sluigi goto ret; 472231663Sluigi } 473231663Sluigi /* Leave the CPU for others for some time */ 474231663Sluigi pause("yield", 10); 475231663Sluigi 476231663Sluigi } 477258586Sdelphij 478231663Sluigi } 479258586Sdelphij 480231663Sluigiret: 481231663Sluigi oce_dma_free(sc, &dma_mem); 482231663Sluigi return rc; 483258586Sdelphij} 484231663Sluigi 485258586Sdelphij#define UFI_TYPE2 2 486258586Sdelphij#define UFI_TYPE3 3 487258586Sdelphij#define UFI_TYPE3R 10 488258586Sdelphij#define UFI_TYPE4 4 489258586Sdelphij#define UFI_TYPE4R 11 490258586Sdelphijstatic int oce_get_ufi_type(POCE_SOFTC sc, 491258586Sdelphij const struct flash_file_hdr *fhdr) 492258586Sdelphij{ 493258586Sdelphij if (fhdr == NULL) 494258586Sdelphij goto be_get_ufi_exit; 495258586Sdelphij 496258586Sdelphij if (IS_SH(sc) && fhdr->build[0] == '4') { 497258586Sdelphij if (fhdr->asic_type_rev >= 0x10) 498258586Sdelphij return UFI_TYPE4R; 499258586Sdelphij else 500258586Sdelphij return UFI_TYPE4; 501258586Sdelphij } else if (IS_BE3(sc) && fhdr->build[0] == '3') { 502258586Sdelphij if (fhdr->asic_type_rev == 0x10) 503258586Sdelphij return UFI_TYPE3R; 504258586Sdelphij else 505258586Sdelphij return UFI_TYPE3; 506258586Sdelphij } else if (IS_BE2(sc) && fhdr->build[0] == '2') 507258586Sdelphij return UFI_TYPE2; 508258586Sdelphij 509258586Sdelphijbe_get_ufi_exit: 510258586Sdelphij device_printf(sc->dev, 511258586Sdelphij "UFI and Interface are not compatible for flashing\n"); 512258586Sdelphij return -1; 513231663Sluigi} 514231663Sluigi 515231663Sluigi 516258586Sdelphijstatic int 517258586Sdelphijoce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 518258586Sdelphij{ 519258586Sdelphij int rc = 0, num_imgs = 0, i = 0, ufi_type; 520258586Sdelphij const struct flash_file_hdr *fhdr; 521258586Sdelphij const struct image_hdr *img_ptr; 522258586Sdelphij 523258586Sdelphij fhdr = (const struct flash_file_hdr *)fw->data; 524258586Sdelphij 525258586Sdelphij ufi_type = oce_get_ufi_type(sc, fhdr); 526258586Sdelphij 527258586Sdelphij /* Display flash version */ 528258586Sdelphij device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 529258586Sdelphij 530258586Sdelphij num_imgs = fhdr->num_imgs; 531258586Sdelphij for (i = 0; i < num_imgs; i++) { 532258586Sdelphij img_ptr = (const struct image_hdr *)((const char *)fw->data + 533258586Sdelphij sizeof(struct flash_file_hdr) + 534258586Sdelphij (i * sizeof(struct image_hdr))); 535258586Sdelphij 536258586Sdelphij if (img_ptr->imageid != 1) 537258586Sdelphij continue; 538258586Sdelphij 539258586Sdelphij switch (ufi_type) { 540258586Sdelphij case UFI_TYPE4R: 541258586Sdelphij rc = oce_sh_be3_flashdata(sc, fw, 542258586Sdelphij num_imgs); 543258586Sdelphij break; 544258586Sdelphij case UFI_TYPE4: 545258586Sdelphij if (sc->asic_revision < 0x10) 546258586Sdelphij rc = oce_sh_be3_flashdata(sc, fw, 547258586Sdelphij num_imgs); 548258586Sdelphij else { 549258586Sdelphij rc = -1; 550258586Sdelphij device_printf(sc->dev, 551258586Sdelphij "Cant load SH A0 UFI on B0\n"); 552258586Sdelphij } 553258586Sdelphij break; 554258586Sdelphij default: 555258586Sdelphij rc = -1; 556258586Sdelphij break; 557258586Sdelphij 558258586Sdelphij } 559258586Sdelphij } 560258586Sdelphij 561258586Sdelphij return rc; 562258586Sdelphij} 563258586Sdelphij 564258586Sdelphijstatic int 565258586Sdelphijoce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 566258586Sdelphij{ 567258586Sdelphij int rc = 0, num_imgs = 0, i = 0; 568258586Sdelphij const struct flash_file_hdr *fhdr; 569258586Sdelphij const struct image_hdr *img_ptr; 570258586Sdelphij 571258586Sdelphij fhdr = (const struct flash_file_hdr *)fw->data; 572258586Sdelphij if (fhdr->build[0] != '3') { 573258586Sdelphij device_printf(sc->dev, "Invalid BE3 firmware image\n"); 574258586Sdelphij return EINVAL; 575258586Sdelphij } 576258586Sdelphij /* Display flash version */ 577258586Sdelphij device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 578258586Sdelphij 579258586Sdelphij num_imgs = fhdr->num_imgs; 580258586Sdelphij for (i = 0; i < num_imgs; i++) { 581258586Sdelphij img_ptr = (const struct image_hdr *)((const char *)fw->data + 582258586Sdelphij sizeof(struct flash_file_hdr) + 583258586Sdelphij (i * sizeof(struct image_hdr))); 584258586Sdelphij if (img_ptr->imageid == 1) { 585258586Sdelphij rc = oce_sh_be3_flashdata(sc, fw, num_imgs); 586258586Sdelphij 587258586Sdelphij break; 588258586Sdelphij } 589258586Sdelphij } 590258586Sdelphij 591258586Sdelphij return rc; 592258586Sdelphij} 593258586Sdelphij 594258586Sdelphij 595231663Sluigistatic boolean_t 596231663Sluigioce_phy_flashing_required(POCE_SOFTC sc) 597231663Sluigi{ 598231663Sluigi int status = 0; 599231663Sluigi struct oce_phy_info phy_info; 600231663Sluigi 601231663Sluigi status = oce_mbox_get_phy_info(sc, &phy_info); 602231663Sluigi if (status) 603231663Sluigi return FALSE; 604231663Sluigi 605231663Sluigi if ((phy_info.phy_type == TN_8022) && 606231663Sluigi (phy_info.interface_type == PHY_TYPE_BASET_10GB)) { 607231663Sluigi return TRUE; 608231663Sluigi } 609231663Sluigi 610231663Sluigi return FALSE; 611231663Sluigi} 612231663Sluigi 613231663Sluigi 614231663Sluigistatic boolean_t 615231663Sluigioce_img_flashing_required(POCE_SOFTC sc, const char *p, 616231663Sluigi int img_optype, uint32_t img_offset, 617231663Sluigi uint32_t img_size, uint32_t hdrs_size) 618231663Sluigi{ 619231663Sluigi uint32_t crc_offset; 620231663Sluigi uint8_t flashed_crc[4]; 621231663Sluigi int status; 622231663Sluigi 623231663Sluigi crc_offset = hdrs_size + img_offset + img_size - 4; 624231663Sluigi 625231663Sluigi p += crc_offset; 626231663Sluigi 627231663Sluigi status = oce_mbox_get_flashrom_crc(sc, flashed_crc, 628231663Sluigi (img_size - 4), img_optype); 629231663Sluigi if (status) 630231663Sluigi return TRUE; /* Some thing worng. ReFlash */ 631231663Sluigi 632231663Sluigi /*update redboot only if crc does not match*/ 633231663Sluigi if (bcmp(flashed_crc, p, 4)) 634231663Sluigi return TRUE; 635231663Sluigi else 636231663Sluigi return FALSE; 637231663Sluigi} 638231663Sluigi 639231663Sluigi 640231663Sluigistatic int 641231663Sluigioce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 642231663Sluigi{ 643231663Sluigi 644231663Sluigi int rc = 0; 645231663Sluigi OCE_DMA_MEM dma_mem; 646231663Sluigi const uint8_t *data = NULL; 647231663Sluigi uint8_t *dest_image_ptr = NULL; 648231663Sluigi size_t size = 0; 649231663Sluigi uint32_t data_written = 0, chunk_size = 0; 650231663Sluigi uint32_t offset = 0, add_status = 0; 651231663Sluigi 652231663Sluigi if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) { 653231663Sluigi device_printf(sc->dev, 654231663Sluigi "Lancer FW image is not 4 byte aligned."); 655231663Sluigi return EINVAL; 656231663Sluigi } 657231663Sluigi 658231663Sluigi rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0); 659231663Sluigi if (rc) { 660231663Sluigi device_printf(sc->dev, 661231663Sluigi "Memory allocation failure while flashing Lancer\n"); 662231663Sluigi return ENOMEM; 663231663Sluigi } 664231663Sluigi 665231663Sluigi size = fw->datasize; 666231663Sluigi data = fw->data; 667231663Sluigi dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t); 668231663Sluigi 669231663Sluigi while (size) { 670231663Sluigi chunk_size = MIN(size, (32*1024)); 671231663Sluigi 672231663Sluigi bcopy(data, dest_image_ptr, chunk_size); 673231663Sluigi 674231663Sluigi rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset, 675231663Sluigi &dma_mem, &data_written, &add_status); 676231663Sluigi 677231663Sluigi if (rc) 678231663Sluigi break; 679231663Sluigi 680231663Sluigi size -= data_written; 681231663Sluigi data += data_written; 682231663Sluigi offset += data_written; 683231663Sluigi pause("yield", 10); 684231663Sluigi 685231663Sluigi } 686231663Sluigi 687231663Sluigi if (!rc) 688231663Sluigi /* Commit the firmware*/ 689231663Sluigi rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem, 690231663Sluigi &data_written, &add_status); 691231663Sluigi if (rc) { 692231663Sluigi device_printf(sc->dev, "Lancer firmware load error. " 693231663Sluigi "Addstatus = 0x%x, status = %d \n", add_status, rc); 694231663Sluigi rc = EIO; 695231663Sluigi } 696231663Sluigi oce_dma_free(sc, &dma_mem); 697231663Sluigi return rc; 698231663Sluigi 699231663Sluigi} 700231663Sluigi 701231663Sluigi 702231663Sluigistatic void 703231663Sluigioce_add_stats_sysctls_be3(POCE_SOFTC sc, 704231663Sluigi struct sysctl_ctx_list *ctx, 705231663Sluigi struct sysctl_oid *stats_node) 706231663Sluigi{ 707231663Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 708231663Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 709231663Sluigi struct sysctl_oid_list *queue_stats_list; 710231663Sluigi struct sysctl_oid *queue_stats_node; 711231663Sluigi struct oce_drv_stats *stats; 712231663Sluigi char prefix[32]; 713231663Sluigi int i; 714231663Sluigi 715231663Sluigi stats = &sc->oce_stats_info; 716231663Sluigi 717231663Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 718231663Sluigi SYSCTL_CHILDREN(stats_node), 719231663Sluigi OID_AUTO,"rx", CTLFLAG_RD, 720231663Sluigi NULL, "RX Ethernet Statistics"); 721231663Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 722231663Sluigi 723231663Sluigi 724231663Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 725231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 726231663Sluigi "Total Received Packets"); 727231663Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 728231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 729231663Sluigi "Total Received Bytes"); 730231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 731231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 732231663Sluigi "Total Received Fragements"); 733231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 734231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 735231663Sluigi "Total Received Multicast Packets"); 736231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 737231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 738231663Sluigi "Total Received Unicast Packets"); 739231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 740231663Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 741231663Sluigi "Total Receive completion errors"); 742231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 743231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0, 744231663Sluigi "Pause Frames"); 745231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames", 746231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0, 747231663Sluigi "Priority Pause Frames"); 748231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 749231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0, 750231663Sluigi "Control Frames"); 751231663Sluigi 752231663Sluigi for (i = 0; i < sc->nrqs; i++) { 753231663Sluigi sprintf(prefix, "queue%d",i); 754231663Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 755231663Sluigi SYSCTL_CHILDREN(rx_stats_node), 756231663Sluigi OID_AUTO, prefix, CTLFLAG_RD, 757231663Sluigi NULL, "Queue name"); 758231663Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 759231663Sluigi 760231663Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 761231663Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 762231663Sluigi "Receive Packets"); 763231663Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 764231663Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 765231663Sluigi "Recived Bytes"); 766231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 767231663Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 768231663Sluigi "Received Fragments"); 769231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 770231663Sluigi "rx_mcast_pkts", CTLFLAG_RD, 771231663Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 772231663Sluigi "Received Multicast Packets"); 773231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 774231663Sluigi "rx_ucast_pkts", CTLFLAG_RD, 775231663Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 776231663Sluigi "Received Unicast Packets"); 777231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 778231663Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 779231663Sluigi "Received Completion Errors"); 780231663Sluigi 781231663Sluigi } 782231663Sluigi 783231663Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 784231663Sluigi SYSCTL_CHILDREN(rx_stats_node), 785231663Sluigi OID_AUTO, "err", CTLFLAG_RD, 786231663Sluigi NULL, "Receive Error Stats"); 787231663Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 788231663Sluigi 789231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 790231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0, 791231663Sluigi "CRC Errors"); 792231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors", 793231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0, 794231663Sluigi "Drops due to pbuf full"); 795231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors", 796231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0, 797231663Sluigi "ERX Errors"); 798231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 799231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0, 800231663Sluigi "RX Alignmnet Errors"); 801231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 802231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0, 803231663Sluigi "In Range Errors"); 804231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 805231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0, 806231663Sluigi "Out Range Errors"); 807231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 808231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0, 809231663Sluigi "Frame Too Long"); 810231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 811231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0, 812231663Sluigi "Address Match Errors"); 813231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 814231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0, 815231663Sluigi "Dropped Too Small"); 816231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 817231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0, 818231663Sluigi "Dropped Too Short"); 819231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 820231663Sluigi "dropped_header_too_small", CTLFLAG_RD, 821231663Sluigi &stats->u0.be.rx_dropped_header_too_small, 0, 822231663Sluigi "Dropped Header Too Small"); 823231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length", 824231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0, 825231663Sluigi "Dropped TCP Length"); 826231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 827231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0, 828231663Sluigi "Dropped runt"); 829231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 830231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0, 831231663Sluigi "IP Checksum Errors"); 832231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 833231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0, 834231663Sluigi "TCP Checksum Errors"); 835231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 836231663Sluigi CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0, 837231663Sluigi "UDP Checksum Errors"); 838231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop", 839231663Sluigi CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0, 840231663Sluigi "FIFO Overflow Drop"); 841231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 842231663Sluigi "input_fifo_overflow_drop", CTLFLAG_RD, 843231663Sluigi &stats->u0.be.rx_input_fifo_overflow_drop, 0, 844231663Sluigi "Input FIFO Overflow Drop"); 845231663Sluigi 846231663Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 847231663Sluigi SYSCTL_CHILDREN(stats_node), OID_AUTO, 848231663Sluigi "tx",CTLFLAG_RD, NULL, 849231663Sluigi "TX Ethernet Statistics"); 850231663Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 851231663Sluigi 852231663Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 853231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 854231663Sluigi "Total Transmit Packets"); 855231663Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 856231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 857231663Sluigi "Total Transmit Bytes"); 858231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 859231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 860231663Sluigi "Total Transmit Requests"); 861231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 862231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 863231663Sluigi "Total Transmit Stops"); 864231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 865231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 866231663Sluigi "Total Transmit WRB's"); 867231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 868231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 869231663Sluigi "Total Transmit Completions"); 870231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 871231663Sluigi "total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 872231663Sluigi &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 873231663Sluigi "Total Transmit IPV6 Drops"); 874231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 875231663Sluigi CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0, 876231663Sluigi "Pause Frames"); 877231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes", 878231663Sluigi CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0, 879231663Sluigi "Priority Pauseframes"); 880231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 881231663Sluigi CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0, 882231663Sluigi "Tx Control Frames"); 883231663Sluigi 884231663Sluigi for (i = 0; i < sc->nwqs; i++) { 885231663Sluigi sprintf(prefix, "queue%d",i); 886231663Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 887231663Sluigi SYSCTL_CHILDREN(tx_stats_node), 888231663Sluigi OID_AUTO, prefix, CTLFLAG_RD, 889231663Sluigi NULL, "Queue name"); 890231663Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 891231663Sluigi 892231663Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 893231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 894231663Sluigi "Transmit Packets"); 895231663Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 896231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 897231663Sluigi "Transmit Bytes"); 898231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 899231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 900231663Sluigi "Transmit Requests"); 901231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 902231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 903231663Sluigi "Transmit Stops"); 904231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 905231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 906231663Sluigi "Transmit WRB's"); 907231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 908231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 909231663Sluigi "Transmit Completions"); 910231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 911231663Sluigi "ipv6_ext_hdr_tx_drop",CTLFLAG_RD, 912231663Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 913231663Sluigi "Transmit IPV6 Ext Header Drop"); 914231663Sluigi 915231663Sluigi } 916231663Sluigi return; 917231663Sluigi} 918231663Sluigi 919231663Sluigi 920231663Sluigistatic void 921231663Sluigioce_add_stats_sysctls_xe201(POCE_SOFTC sc, 922231663Sluigi struct sysctl_ctx_list *ctx, 923231663Sluigi struct sysctl_oid *stats_node) 924231663Sluigi{ 925231663Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 926231663Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 927231663Sluigi struct sysctl_oid_list *queue_stats_list; 928231663Sluigi struct sysctl_oid *queue_stats_node; 929231663Sluigi struct oce_drv_stats *stats; 930231663Sluigi char prefix[32]; 931231663Sluigi int i; 932231663Sluigi 933231663Sluigi stats = &sc->oce_stats_info; 934231663Sluigi 935231663Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 936231663Sluigi SYSCTL_CHILDREN(stats_node), 937231663Sluigi OID_AUTO, "rx", CTLFLAG_RD, 938231663Sluigi NULL, "RX Ethernet Statistics"); 939231663Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 940231663Sluigi 941231663Sluigi 942231663Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 943231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 944231663Sluigi "Total Received Packets"); 945231663Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 946231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 947231663Sluigi "Total Received Bytes"); 948231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 949231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 950231663Sluigi "Total Received Fragements"); 951231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 952231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 953231663Sluigi "Total Received Multicast Packets"); 954231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 955231663Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 956231663Sluigi "Total Received Unicast Packets"); 957231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 958231663Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 959231663Sluigi "Total Receive completion errors"); 960231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 961231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 0, 962231663Sluigi "Pause Frames"); 963231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 964231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 0, 965231663Sluigi "Control Frames"); 966231663Sluigi 967231663Sluigi for (i = 0; i < sc->nrqs; i++) { 968231663Sluigi sprintf(prefix, "queue%d",i); 969231663Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 970231663Sluigi SYSCTL_CHILDREN(rx_stats_node), 971231663Sluigi OID_AUTO, prefix, CTLFLAG_RD, 972231663Sluigi NULL, "Queue name"); 973231663Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 974231663Sluigi 975231663Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 976231663Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 977231663Sluigi "Receive Packets"); 978231663Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 979231663Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 980231663Sluigi "Recived Bytes"); 981231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 982231663Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 983231663Sluigi "Received Fragments"); 984231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 985231663Sluigi "rx_mcast_pkts", CTLFLAG_RD, 986231663Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 987231663Sluigi "Received Multicast Packets"); 988231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 989231663Sluigi "rx_ucast_pkts",CTLFLAG_RD, 990231663Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 991231663Sluigi "Received Unicast Packets"); 992231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 993231663Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 994231663Sluigi "Received Completion Errors"); 995231663Sluigi 996231663Sluigi } 997231663Sluigi 998231663Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 999231663Sluigi SYSCTL_CHILDREN(rx_stats_node), 1000231663Sluigi OID_AUTO, "err", CTLFLAG_RD, 1001231663Sluigi NULL, "Receive Error Stats"); 1002231663Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 1003231663Sluigi 1004231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 1005231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 0, 1006231663Sluigi "CRC Errors"); 1007231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 1008231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 0, 1009231663Sluigi "RX Alignmnet Errors"); 1010231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 1011231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0, 1012231663Sluigi "In Range Errors"); 1013231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 1014231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0, 1015231663Sluigi "Out Range Errors"); 1016231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 1017231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 0, 1018231663Sluigi "Frame Too Long"); 1019231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 1020231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0, 1021231663Sluigi "Address Match Errors"); 1022231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 1023231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0, 1024231663Sluigi "Dropped Too Small"); 1025231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 1026231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0, 1027231663Sluigi "Dropped Too Short"); 1028231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 1029231663Sluigi "dropped_header_too_small", CTLFLAG_RD, 1030231663Sluigi &stats->u0.xe201.rx_dropped_header_too_small, 0, 1031231663Sluigi "Dropped Header Too Small"); 1032231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 1033231663Sluigi "dropped_tcp_length", CTLFLAG_RD, 1034231663Sluigi &stats->u0.xe201.rx_dropped_invalid_tcp_length, 0, 1035231663Sluigi "Dropped TCP Length"); 1036231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 1037231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0, 1038231663Sluigi "Dropped runt"); 1039231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 1040231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0, 1041231663Sluigi "IP Checksum Errors"); 1042231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 1043231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0, 1044231663Sluigi "TCP Checksum Errors"); 1045231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 1046231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0, 1047231663Sluigi "UDP Checksum Errors"); 1048231663Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop", 1049231663Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0, 1050231663Sluigi "Input FIFO Overflow Drop"); 1051231663Sluigi 1052231663Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 1053231663Sluigi SYSCTL_CHILDREN(stats_node), 1054231663Sluigi OID_AUTO, "tx", CTLFLAG_RD, 1055231663Sluigi NULL, "TX Ethernet Statistics"); 1056231663Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 1057231663Sluigi 1058231663Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 1059231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 1060231663Sluigi "Total Transmit Packets"); 1061231663Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 1062231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 1063231663Sluigi "Total Transmit Bytes"); 1064231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 1065231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 1066231663Sluigi "Total Transmit Requests"); 1067231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 1068231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 1069231663Sluigi "Total Transmit Stops"); 1070231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 1071231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 1072231663Sluigi "Total Transmit WRB's"); 1073231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 1074231663Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 1075231663Sluigi "Total Transmit Completions"); 1076231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 1077231663Sluigi "total_ipv6_ext_hdr_tx_drop", 1078231663Sluigi CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 1079231663Sluigi "Total Transmit IPV6 Drops"); 1080231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 1081231663Sluigi CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 0, 1082231663Sluigi "Pause Frames"); 1083231663Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 1084231663Sluigi CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 0, 1085231663Sluigi "Tx Control Frames"); 1086231663Sluigi 1087231663Sluigi for (i = 0; i < sc->nwqs; i++) { 1088231663Sluigi sprintf(prefix, "queue%d",i); 1089231663Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 1090231663Sluigi SYSCTL_CHILDREN(tx_stats_node), 1091231663Sluigi OID_AUTO, prefix, CTLFLAG_RD, 1092231663Sluigi NULL, "Queue name"); 1093231663Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 1094231663Sluigi 1095231663Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 1096231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 1097231663Sluigi "Transmit Packets"); 1098231663Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 1099231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 1100231663Sluigi "Transmit Bytes"); 1101231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 1102231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 1103231663Sluigi "Transmit Requests"); 1104231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 1105231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 1106231663Sluigi "Transmit Stops"); 1107231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 1108231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 1109231663Sluigi "Transmit WRB's"); 1110231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 1111231663Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 1112231663Sluigi "Transmit Completions"); 1113231663Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 1114231663Sluigi "ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 1115231663Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 1116231663Sluigi "Transmit IPV6 Ext Header Drop"); 1117231663Sluigi 1118231663Sluigi } 1119231663Sluigi return; 1120231663Sluigi} 1121231663Sluigi 1122231663Sluigi 1123231663Sluigivoid 1124231663Sluigioce_refresh_queue_stats(POCE_SOFTC sc) 1125231663Sluigi{ 1126231663Sluigi struct oce_drv_stats *adapter_stats; 1127231663Sluigi int i; 1128231663Sluigi 1129231663Sluigi adapter_stats = &sc->oce_stats_info; 1130231663Sluigi 1131231663Sluigi /* Caluculate total TX and TXstats from all queues */ 1132231663Sluigi 1133231663Sluigi bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats)); 1134231663Sluigi for (i = 0; i < sc->nrqs; i++) { 1135231663Sluigi 1136231663Sluigi adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts; 1137231663Sluigi adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes; 1138231663Sluigi adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags; 1139231663Sluigi adapter_stats->rx.t_rx_mcast_pkts += 1140231663Sluigi sc->rq[i]->rx_stats.rx_mcast_pkts; 1141231663Sluigi adapter_stats->rx.t_rx_ucast_pkts += 1142231663Sluigi sc->rq[i]->rx_stats.rx_ucast_pkts; 1143231663Sluigi adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err; 1144231663Sluigi } 1145231663Sluigi 1146231663Sluigi bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats)); 1147231663Sluigi for (i = 0; i < sc->nwqs; i++) { 1148231663Sluigi adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs; 1149231663Sluigi adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops; 1150231663Sluigi adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs; 1151231663Sluigi adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl; 1152231663Sluigi adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes; 1153231663Sluigi adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts; 1154231663Sluigi adapter_stats->tx.t_ipv6_ext_hdr_tx_drop += 1155231663Sluigi sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop; 1156231663Sluigi } 1157231663Sluigi 1158231663Sluigi} 1159231663Sluigi 1160231663Sluigi 1161231663Sluigi 1162231663Sluigistatic void 1163231663Sluigicopy_stats_to_sc_xe201(POCE_SOFTC sc) 1164231663Sluigi{ 1165231663Sluigi struct oce_xe201_stats *adapter_stats; 1166231663Sluigi struct mbx_get_pport_stats *nic_mbx; 1167231663Sluigi struct pport_stats *port_stats; 1168231663Sluigi 1169231663Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats); 1170231663Sluigi port_stats = &nic_mbx->params.rsp.pps; 1171231663Sluigi adapter_stats = &sc->oce_stats_info.u0.xe201; 1172231663Sluigi 1173231663Sluigi adapter_stats->tx_pkts = port_stats->tx_pkts; 1174231663Sluigi adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts; 1175231663Sluigi adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts; 1176231663Sluigi adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts; 1177231663Sluigi adapter_stats->tx_bytes = port_stats->tx_bytes; 1178231663Sluigi adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes; 1179231663Sluigi adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes; 1180231663Sluigi adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes; 1181231663Sluigi adapter_stats->tx_discards = port_stats->tx_discards; 1182231663Sluigi adapter_stats->tx_errors = port_stats->tx_errors; 1183231663Sluigi adapter_stats->tx_pause_frames = port_stats->tx_pause_frames; 1184231663Sluigi adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames; 1185231663Sluigi adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames; 1186231663Sluigi adapter_stats->tx_internal_mac_errors = 1187231663Sluigi port_stats->tx_internal_mac_errors; 1188231663Sluigi adapter_stats->tx_control_frames = port_stats->tx_control_frames; 1189231663Sluigi adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes; 1190231663Sluigi adapter_stats->tx_pkts_65_to_127_bytes = 1191231663Sluigi port_stats->tx_pkts_65_to_127_bytes; 1192231663Sluigi adapter_stats->tx_pkts_128_to_255_bytes = 1193231663Sluigi port_stats->tx_pkts_128_to_255_bytes; 1194231663Sluigi adapter_stats->tx_pkts_256_to_511_bytes = 1195231663Sluigi port_stats->tx_pkts_256_to_511_bytes; 1196231663Sluigi adapter_stats->tx_pkts_512_to_1023_bytes = 1197231663Sluigi port_stats->tx_pkts_512_to_1023_bytes; 1198231663Sluigi adapter_stats->tx_pkts_1024_to_1518_bytes = 1199231663Sluigi port_stats->tx_pkts_1024_to_1518_bytes; 1200231663Sluigi adapter_stats->tx_pkts_1519_to_2047_bytes = 1201231663Sluigi port_stats->tx_pkts_1519_to_2047_bytes; 1202231663Sluigi adapter_stats->tx_pkts_2048_to_4095_bytes = 1203231663Sluigi port_stats->tx_pkts_2048_to_4095_bytes; 1204231663Sluigi adapter_stats->tx_pkts_4096_to_8191_bytes = 1205231663Sluigi port_stats->tx_pkts_4096_to_8191_bytes; 1206231663Sluigi adapter_stats->tx_pkts_8192_to_9216_bytes = 1207231663Sluigi port_stats->tx_pkts_8192_to_9216_bytes; 1208231663Sluigi adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts; 1209231663Sluigi adapter_stats->rx_pkts = port_stats->rx_pkts; 1210231663Sluigi adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts; 1211231663Sluigi adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts; 1212231663Sluigi adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts; 1213231663Sluigi adapter_stats->rx_bytes = port_stats->rx_bytes; 1214231663Sluigi adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes; 1215231663Sluigi adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes; 1216231663Sluigi adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes; 1217231663Sluigi adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos; 1218231663Sluigi adapter_stats->rx_discards = port_stats->rx_discards; 1219231663Sluigi adapter_stats->rx_errors = port_stats->rx_errors; 1220231663Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1221231663Sluigi adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors; 1222231663Sluigi adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors; 1223231663Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1224231663Sluigi adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames; 1225231663Sluigi adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames; 1226231663Sluigi adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long; 1227231663Sluigi adapter_stats->rx_internal_mac_errors = 1228231663Sluigi port_stats->rx_internal_mac_errors; 1229231663Sluigi adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts; 1230231663Sluigi adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts; 1231231663Sluigi adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts; 1232231663Sluigi adapter_stats->rx_jabbers = port_stats->rx_jabbers; 1233231663Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1234231663Sluigi adapter_stats->rx_control_frames_unknown_opcode = 1235231663Sluigi port_stats->rx_control_frames_unknown_opcode; 1236231663Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1237231663Sluigi adapter_stats->rx_out_of_range_errors = 1238231663Sluigi port_stats->rx_out_of_range_errors; 1239231663Sluigi adapter_stats->rx_address_match_errors = 1240231663Sluigi port_stats->rx_address_match_errors; 1241231663Sluigi adapter_stats->rx_vlan_mismatch_errors = 1242231663Sluigi port_stats->rx_vlan_mismatch_errors; 1243231663Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1244231663Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1245231663Sluigi adapter_stats->rx_dropped_header_too_small = 1246231663Sluigi port_stats->rx_dropped_header_too_small; 1247231663Sluigi adapter_stats->rx_dropped_invalid_tcp_length = 1248231663Sluigi port_stats->rx_dropped_invalid_tcp_length; 1249231663Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1250231663Sluigi adapter_stats->rx_ip_checksum_errors = 1251231663Sluigi port_stats->rx_ip_checksum_errors; 1252231663Sluigi adapter_stats->rx_tcp_checksum_errors = 1253231663Sluigi port_stats->rx_tcp_checksum_errors; 1254231663Sluigi adapter_stats->rx_udp_checksum_errors = 1255231663Sluigi port_stats->rx_udp_checksum_errors; 1256231663Sluigi adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts; 1257231663Sluigi adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts; 1258231663Sluigi adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts; 1259231663Sluigi adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes; 1260231663Sluigi adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes; 1261231663Sluigi adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts; 1262231663Sluigi adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts; 1263231663Sluigi adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts; 1264231663Sluigi adapter_stats->rx_management_pkts = port_stats->rx_management_pkts; 1265231663Sluigi adapter_stats->rx_switched_unicast_pkts = 1266231663Sluigi port_stats->rx_switched_unicast_pkts; 1267231663Sluigi adapter_stats->rx_switched_multicast_pkts = 1268231663Sluigi port_stats->rx_switched_multicast_pkts; 1269231663Sluigi adapter_stats->rx_switched_broadcast_pkts = 1270231663Sluigi port_stats->rx_switched_broadcast_pkts; 1271231663Sluigi adapter_stats->num_forwards = port_stats->num_forwards; 1272231663Sluigi adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow; 1273231663Sluigi adapter_stats->rx_input_fifo_overflow = 1274231663Sluigi port_stats->rx_input_fifo_overflow; 1275231663Sluigi adapter_stats->rx_drops_too_many_frags = 1276231663Sluigi port_stats->rx_drops_too_many_frags; 1277231663Sluigi adapter_stats->rx_drops_invalid_queue = 1278231663Sluigi port_stats->rx_drops_invalid_queue; 1279231663Sluigi adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu; 1280231663Sluigi adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes; 1281231663Sluigi adapter_stats->rx_pkts_65_to_127_bytes = 1282231663Sluigi port_stats->rx_pkts_65_to_127_bytes; 1283231663Sluigi adapter_stats->rx_pkts_128_to_255_bytes = 1284231663Sluigi port_stats->rx_pkts_128_to_255_bytes; 1285231663Sluigi adapter_stats->rx_pkts_256_to_511_bytes = 1286231663Sluigi port_stats->rx_pkts_256_to_511_bytes; 1287231663Sluigi adapter_stats->rx_pkts_512_to_1023_bytes = 1288231663Sluigi port_stats->rx_pkts_512_to_1023_bytes; 1289231663Sluigi adapter_stats->rx_pkts_1024_to_1518_bytes = 1290231663Sluigi port_stats->rx_pkts_1024_to_1518_bytes; 1291231663Sluigi adapter_stats->rx_pkts_1519_to_2047_bytes = 1292231663Sluigi port_stats->rx_pkts_1519_to_2047_bytes; 1293231663Sluigi adapter_stats->rx_pkts_2048_to_4095_bytes = 1294231663Sluigi port_stats->rx_pkts_2048_to_4095_bytes; 1295231663Sluigi adapter_stats->rx_pkts_4096_to_8191_bytes = 1296231663Sluigi port_stats->rx_pkts_4096_to_8191_bytes; 1297231663Sluigi adapter_stats->rx_pkts_8192_to_9216_bytes = 1298231663Sluigi port_stats->rx_pkts_8192_to_9216_bytes; 1299231663Sluigi} 1300231663Sluigi 1301231663Sluigi 1302231663Sluigi 1303231663Sluigistatic void 1304231663Sluigicopy_stats_to_sc_be2(POCE_SOFTC sc) 1305231663Sluigi{ 1306231663Sluigi struct oce_be_stats *adapter_stats; 1307231663Sluigi struct oce_pmem_stats *pmem; 1308231663Sluigi struct oce_rxf_stats_v0 *rxf_stats; 1309231663Sluigi struct oce_port_rxf_stats_v0 *port_stats; 1310231663Sluigi struct mbx_get_nic_stats_v0 *nic_mbx; 1311231663Sluigi uint32_t port = sc->port_id; 1312231663Sluigi 1313231663Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0); 1314231663Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1315231663Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1316231663Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1317231663Sluigi 1318231663Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1319231663Sluigi 1320231663Sluigi 1321231663Sluigi /* Update stats */ 1322231663Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1323231663Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1324231663Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1325231663Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1326231663Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1327231663Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1328231663Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1329231663Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1330231663Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1331231663Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1332231663Sluigi port_stats->rxpp_fifo_overflow_drop; 1333231663Sluigi adapter_stats->rx_dropped_tcp_length = 1334231663Sluigi port_stats->rx_dropped_tcp_length; 1335231663Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1336231663Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1337231663Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1338231663Sluigi adapter_stats->rx_dropped_header_too_small = 1339231663Sluigi port_stats->rx_dropped_header_too_small; 1340231663Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1341231663Sluigi port_stats->rx_input_fifo_overflow_drop; 1342231663Sluigi adapter_stats->rx_address_match_errors = 1343231663Sluigi port_stats->rx_address_match_errors; 1344231663Sluigi adapter_stats->rx_alignment_symbol_errors = 1345231663Sluigi port_stats->rx_alignment_symbol_errors; 1346231663Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1347231663Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1348231663Sluigi 1349231663Sluigi if (sc->if_id) 1350231663Sluigi adapter_stats->jabber_events = rxf_stats->port1_jabber_events; 1351231663Sluigi else 1352231663Sluigi adapter_stats->jabber_events = rxf_stats->port0_jabber_events; 1353231663Sluigi 1354231663Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1355231663Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1356231663Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1357231663Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1358231663Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1359231663Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1360231663Sluigi adapter_stats->rx_drops_no_tpre_descr = 1361231663Sluigi rxf_stats->rx_drops_no_tpre_descr; 1362231663Sluigi adapter_stats->rx_drops_too_many_frags = 1363231663Sluigi rxf_stats->rx_drops_too_many_frags; 1364231663Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1365231663Sluigi} 1366231663Sluigi 1367231663Sluigi 1368231663Sluigistatic void 1369231663Sluigicopy_stats_to_sc_be3(POCE_SOFTC sc) 1370231663Sluigi{ 1371231663Sluigi struct oce_be_stats *adapter_stats; 1372231663Sluigi struct oce_pmem_stats *pmem; 1373231663Sluigi struct oce_rxf_stats_v1 *rxf_stats; 1374231663Sluigi struct oce_port_rxf_stats_v1 *port_stats; 1375231663Sluigi struct mbx_get_nic_stats *nic_mbx; 1376231663Sluigi uint32_t port = sc->port_id; 1377231663Sluigi 1378231663Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats); 1379231663Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1380231663Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1381231663Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1382231663Sluigi 1383231663Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1384231663Sluigi 1385231663Sluigi /* Update stats */ 1386231663Sluigi adapter_stats->pmem_fifo_overflow_drop = 1387231663Sluigi port_stats->pmem_fifo_overflow_drop; 1388231663Sluigi adapter_stats->rx_priority_pause_frames = 1389231663Sluigi port_stats->rx_priority_pause_frames; 1390231663Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1391231663Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1392231663Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1393231663Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1394231663Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1395231663Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1396231663Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1397231663Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1398231663Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1399231663Sluigi adapter_stats->rx_dropped_tcp_length = 1400231663Sluigi port_stats->rx_dropped_tcp_length; 1401231663Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1402231663Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1403231663Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1404231663Sluigi adapter_stats->rx_dropped_header_too_small = 1405231663Sluigi port_stats->rx_dropped_header_too_small; 1406231663Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1407231663Sluigi port_stats->rx_input_fifo_overflow_drop; 1408231663Sluigi adapter_stats->rx_address_match_errors = 1409231663Sluigi port_stats->rx_address_match_errors; 1410231663Sluigi adapter_stats->rx_alignment_symbol_errors = 1411231663Sluigi port_stats->rx_alignment_symbol_errors; 1412231663Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1413231663Sluigi port_stats->rxpp_fifo_overflow_drop; 1414231663Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1415231663Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1416231663Sluigi adapter_stats->jabber_events = port_stats->jabber_events; 1417231663Sluigi 1418231663Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1419231663Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1420231663Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1421231663Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1422231663Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1423231663Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1424231663Sluigi adapter_stats->rx_drops_no_tpre_descr = 1425231663Sluigi rxf_stats->rx_drops_no_tpre_descr; 1426231663Sluigi adapter_stats->rx_drops_too_many_frags = 1427231663Sluigi rxf_stats->rx_drops_too_many_frags; 1428231663Sluigi 1429231663Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1430231663Sluigi} 1431231663Sluigi 1432231663Sluigi 1433231663Sluigiint 1434231663Sluigioce_stats_init(POCE_SOFTC sc) 1435231663Sluigi{ 1436231663Sluigi int rc = 0, sz; 1437231663Sluigi 1438252905Sdelphij if (IS_BE(sc) || IS_SH(sc)) { 1439231663Sluigi if (sc->flags & OCE_FLAGS_BE2) 1440231663Sluigi sz = sizeof(struct mbx_get_nic_stats_v0); 1441231663Sluigi else 1442231663Sluigi sz = sizeof(struct mbx_get_nic_stats); 1443231663Sluigi } else 1444231663Sluigi sz = sizeof(struct mbx_get_pport_stats); 1445231663Sluigi 1446231663Sluigi rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0); 1447231663Sluigi 1448231663Sluigi return rc; 1449231663Sluigi} 1450231663Sluigi 1451231663Sluigi 1452231663Sluigivoid 1453231663Sluigioce_stats_free(POCE_SOFTC sc) 1454231663Sluigi{ 1455231663Sluigi 1456231663Sluigi oce_dma_free(sc, &sc->stats_mem); 1457231663Sluigi 1458231663Sluigi} 1459231663Sluigi 1460231663Sluigi 1461231663Sluigiint 1462231663Sluigioce_refresh_nic_stats(POCE_SOFTC sc) 1463231663Sluigi{ 1464231663Sluigi int rc = 0, reset = 0; 1465231663Sluigi 1466252905Sdelphij if (IS_BE(sc) || IS_SH(sc)) { 1467231663Sluigi if (sc->flags & OCE_FLAGS_BE2) { 1468231663Sluigi rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem); 1469231663Sluigi if (!rc) 1470231663Sluigi copy_stats_to_sc_be2(sc); 1471231663Sluigi } else { 1472231663Sluigi rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem); 1473231663Sluigi if (!rc) 1474231663Sluigi copy_stats_to_sc_be3(sc); 1475231663Sluigi } 1476231663Sluigi 1477231663Sluigi } else { 1478231663Sluigi rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset); 1479231663Sluigi if (!rc) 1480231663Sluigi copy_stats_to_sc_xe201(sc); 1481231663Sluigi } 1482231663Sluigi 1483231663Sluigi return rc; 1484231663Sluigi} 1485248062Sdelphij 1486248062Sdelphijstatic int 1487248062Sdelphijoce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS) 1488248062Sdelphij{ 1489248062Sdelphij int result = 0, error; 1490248062Sdelphij int rc = 0; 1491248062Sdelphij POCE_SOFTC sc = (POCE_SOFTC) arg1; 1492248062Sdelphij 1493248062Sdelphij /* sysctl default handler */ 1494248062Sdelphij error = sysctl_handle_int(oidp, &result, 0, req); 1495248062Sdelphij if (error || !req->newptr) 1496248062Sdelphij return (error); 1497248062Sdelphij 1498248062Sdelphij if(result == -1) { 1499248062Sdelphij return EINVAL; 1500248062Sdelphij } 1501248062Sdelphij bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE); 1502248062Sdelphij 1503248062Sdelphij rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0); 1504248062Sdelphij if(rc) 1505248062Sdelphij return rc; 1506248062Sdelphij 1507248062Sdelphij rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2); 1508248062Sdelphij if(rc) 1509248062Sdelphij return rc; 1510248062Sdelphij 1511248062Sdelphij return rc; 1512248062Sdelphij} 1513