oce_sysctl.c revision 258941
1231437Sluigi/*- 2252869Sdelphij * Copyright (C) 2013 Emulex 3231437Sluigi * All rights reserved. 4231437Sluigi * 5231437Sluigi * Redistribution and use in source and binary forms, with or without 6231437Sluigi * modification, are permitted provided that the following conditions are met: 7231437Sluigi * 8231437Sluigi * 1. Redistributions of source code must retain the above copyright notice, 9231437Sluigi * this list of conditions and the following disclaimer. 10231437Sluigi * 11231437Sluigi * 2. Redistributions in binary form must reproduce the above copyright 12231437Sluigi * notice, this list of conditions and the following disclaimer in the 13231437Sluigi * documentation and/or other materials provided with the distribution. 14231437Sluigi * 15231437Sluigi * 3. Neither the name of the Emulex Corporation nor the names of its 16231437Sluigi * contributors may be used to endorse or promote products derived from 17231437Sluigi * this software without specific prior written permission. 18231437Sluigi * 19231437Sluigi * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20231437Sluigi * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21231437Sluigi * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22231437Sluigi * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23231437Sluigi * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24231437Sluigi * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25231437Sluigi * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26231437Sluigi * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27231437Sluigi * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28231437Sluigi * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29231437Sluigi * POSSIBILITY OF SUCH DAMAGE. 30231437Sluigi * 31231437Sluigi * Contact Information: 32231437Sluigi * freebsd-drivers@emulex.com 33231437Sluigi * 34231437Sluigi * Emulex 35231437Sluigi * 3333 Susan Street 36231437Sluigi * Costa Mesa, CA 92626 37231437Sluigi */ 38231437Sluigi 39231437Sluigi/* $FreeBSD: head/sys/dev/oce/oce_sysctl.c 258941 2013-12-04 20:24:18Z delphij $ */ 40231437Sluigi 41231437Sluigi#include "oce_if.h" 42231437Sluigi 43231437Sluigistatic void copy_stats_to_sc_xe201(POCE_SOFTC sc); 44231437Sluigistatic void copy_stats_to_sc_be3(POCE_SOFTC sc); 45231437Sluigistatic void copy_stats_to_sc_be2(POCE_SOFTC sc); 46231437Sluigistatic int oce_sysctl_loopback(SYSCTL_HANDLER_ARGS); 47258941Sdelphijstatic int oce_sys_aic_enable(SYSCTL_HANDLER_ARGS); 48231437Sluigistatic int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 49257007Sdelphijstatic int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 50231437Sluigistatic int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS); 51231437Sluigistatic int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 52247880Sdelphijstatic int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS); 53231437Sluigistatic boolean_t oce_phy_flashing_required(POCE_SOFTC sc); 54231437Sluigistatic boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p, 55231437Sluigi int img_optype, uint32_t img_offset, 56231437Sluigi uint32_t img_size, uint32_t hdrs_size); 57231437Sluigistatic void oce_add_stats_sysctls_be3(POCE_SOFTC sc, 58231437Sluigi struct sysctl_ctx_list *ctx, 59231437Sluigi struct sysctl_oid *stats_node); 60231437Sluigistatic void oce_add_stats_sysctls_xe201(POCE_SOFTC sc, 61231437Sluigi struct sysctl_ctx_list *ctx, 62231437Sluigi struct sysctl_oid *stats_node); 63231437Sluigi 64257007Sdelphij 65231437Sluigiextern char component_revision[32]; 66247880Sdelphijuint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE]; 67231437Sluigi 68257007Sdelphijstruct flash_img_attri { 69257007Sdelphij int img_offset; 70257007Sdelphij int img_size; 71257007Sdelphij int img_type; 72257007Sdelphij bool skip_image; 73257007Sdelphij int optype; 74257007Sdelphij}; 75257007Sdelphij 76231437Sluigivoid 77231437Sluigioce_add_sysctls(POCE_SOFTC sc) 78231437Sluigi{ 79231437Sluigi 80231437Sluigi struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev); 81231437Sluigi struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev); 82231437Sluigi struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree); 83231437Sluigi struct sysctl_oid *stats_node; 84231437Sluigi 85231437Sluigi SYSCTL_ADD_STRING(ctx, child, 86231437Sluigi OID_AUTO, "component_revision", 87231437Sluigi CTLTYPE_INT | CTLFLAG_RD, 88231437Sluigi &component_revision, 89231437Sluigi sizeof(component_revision), 90231437Sluigi "EMULEX One-Connect device driver revision"); 91231437Sluigi 92231437Sluigi SYSCTL_ADD_STRING(ctx, child, 93231437Sluigi OID_AUTO, "firmware_version", 94231437Sluigi CTLTYPE_INT | CTLFLAG_RD, 95231437Sluigi &sc->fw_version, 96231437Sluigi sizeof(sc->fw_version), 97231437Sluigi "EMULEX One-Connect Firmware Version"); 98231437Sluigi 99231437Sluigi SYSCTL_ADD_INT(ctx, child, 100231437Sluigi OID_AUTO, "max_rsp_handled", 101231437Sluigi CTLTYPE_INT | CTLFLAG_RW, 102231437Sluigi &oce_max_rsp_handled, 103231437Sluigi sizeof(oce_max_rsp_handled), 104231437Sluigi "Maximum receive frames handled per interupt"); 105231437Sluigi 106247880Sdelphij if ((sc->function_mode & FNM_FLEX10_MODE) || 107247880Sdelphij (sc->function_mode & FNM_UMC_MODE)) 108231437Sluigi SYSCTL_ADD_UINT(ctx, child, 109231437Sluigi OID_AUTO, "speed", 110231437Sluigi CTLFLAG_RD, 111231437Sluigi &sc->qos_link_speed, 112231437Sluigi 0,"QOS Speed"); 113231437Sluigi else 114231437Sluigi SYSCTL_ADD_UINT(ctx, child, 115231437Sluigi OID_AUTO, "speed", 116231437Sluigi CTLFLAG_RD, 117231437Sluigi &sc->speed, 118231437Sluigi 0,"Link Speed"); 119231437Sluigi 120231879Sluigi if (sc->function_mode & FNM_UMC_MODE) 121231879Sluigi SYSCTL_ADD_UINT(ctx, child, 122231879Sluigi OID_AUTO, "pvid", 123231879Sluigi CTLFLAG_RD, 124231879Sluigi &sc->pvid, 125231879Sluigi 0,"PVID"); 126231879Sluigi 127231437Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back", 128231437Sluigi CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, 129231437Sluigi oce_sysctl_loopback, "I", "Loop Back Tests"); 130231437Sluigi 131231437Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade", 132231437Sluigi CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0, 133231437Sluigi oce_sys_fwupgrade, "A", "Firmware ufi file"); 134231437Sluigi 135258941Sdelphij SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "aic_enable", 136258941Sdelphij CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 1, 137258941Sdelphij oce_sys_aic_enable, "I", "aic flags"); 138258941Sdelphij 139247880Sdelphij /* 140247880Sdelphij * Dumps Transceiver data 141247880Sdelphij * "sysctl dev.oce.0.sfp_vpd_dump=0" 142247880Sdelphij * "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump 143247880Sdelphij * "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump 144247880Sdelphij */ 145247880Sdelphij SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump", 146247880Sdelphij CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump, 147247880Sdelphij "I", "Initiate a sfp_vpd_dump operation"); 148247880Sdelphij SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer", 149247880Sdelphij CTLFLAG_RD, sfp_vpd_dump_buffer, 150247880Sdelphij TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer"); 151247880Sdelphij 152231437Sluigi stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", 153231437Sluigi CTLFLAG_RD, NULL, "Ethernet Statistics"); 154231437Sluigi 155252869Sdelphij if (IS_BE(sc) || IS_SH(sc)) 156231437Sluigi oce_add_stats_sysctls_be3(sc, ctx, stats_node); 157231437Sluigi else 158231437Sluigi oce_add_stats_sysctls_xe201(sc, ctx, stats_node); 159231437Sluigi 160231437Sluigi 161231437Sluigi} 162231437Sluigi 163231437Sluigi 164231437Sluigistatic uint32_t 165231437Sluigioce_loopback_test(struct oce_softc *sc, uint8_t loopback_type) 166231437Sluigi{ 167231437Sluigi uint32_t status = 0; 168231437Sluigi 169257007Sdelphij oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1); 170257007Sdelphij status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type, 171231437Sluigi 1500, 2, 0xabc); 172257007Sdelphij oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1); 173231437Sluigi 174231437Sluigi return status; 175231437Sluigi} 176231437Sluigi 177231437Sluigistatic int 178258941Sdelphijoce_sys_aic_enable(SYSCTL_HANDLER_ARGS) 179258941Sdelphij{ 180258941Sdelphij int value = 0; 181258941Sdelphij uint32_t status, vector; 182258941Sdelphij POCE_SOFTC sc = (struct oce_softc *)arg1; 183258941Sdelphij struct oce_aic_obj *aic; 184258941Sdelphij 185258941Sdelphij status = sysctl_handle_int(oidp, &value, 0, req); 186258941Sdelphij if (status || !req->newptr) 187258941Sdelphij return status; 188258941Sdelphij 189258941Sdelphij for (vector = 0; vector < sc->intr_count; vector++) { 190258941Sdelphij aic = &sc->aic_obj[vector]; 191258941Sdelphij 192258941Sdelphij if (value == 0){ 193258941Sdelphij aic->max_eqd = aic->min_eqd = aic->et_eqd = 0; 194258941Sdelphij aic->enable = 0; 195258941Sdelphij } 196258941Sdelphij else { 197258941Sdelphij aic->max_eqd = OCE_MAX_EQD; 198258941Sdelphij aic->min_eqd = OCE_MIN_EQD; 199258941Sdelphij aic->et_eqd = OCE_MIN_EQD; 200258941Sdelphij aic->enable = TRUE; 201258941Sdelphij } 202258941Sdelphij } 203258941Sdelphij return 0; 204258941Sdelphij} 205258941Sdelphij 206258941Sdelphijstatic int 207231437Sluigioce_sysctl_loopback(SYSCTL_HANDLER_ARGS) 208231437Sluigi{ 209231437Sluigi int value = 0; 210231437Sluigi uint32_t status; 211231437Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 212231437Sluigi 213231437Sluigi status = sysctl_handle_int(oidp, &value, 0, req); 214231437Sluigi if (status || !req->newptr) 215231437Sluigi return status; 216231437Sluigi 217231437Sluigi if (value != 1) { 218231437Sluigi device_printf(sc->dev, 219231437Sluigi "Not a Valid value. Set to loop_back=1 to run tests\n"); 220231437Sluigi return 0; 221231437Sluigi } 222231437Sluigi 223231437Sluigi if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) { 224231437Sluigi device_printf(sc->dev, 225231437Sluigi "MAC Loopback Test = Failed (Error status = %d)\n", 226231437Sluigi status); 227231437Sluigi } else 228231437Sluigi device_printf(sc->dev, "MAC Loopback Test = Success\n"); 229231437Sluigi 230231437Sluigi if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) { 231231437Sluigi device_printf(sc->dev, 232231437Sluigi "PHY Loopback Test = Failed (Error status = %d)\n", 233231437Sluigi status); 234231437Sluigi } else 235231437Sluigi device_printf(sc->dev, "PHY Loopback Test = Success\n"); 236231437Sluigi 237231437Sluigi if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) { 238231437Sluigi device_printf(sc->dev, 239231437Sluigi "EXT Loopback Test = Failed (Error status = %d)\n", 240231437Sluigi status); 241231437Sluigi } else 242231437Sluigi device_printf(sc->dev, "EXT Loopback Test = Success\n"); 243231437Sluigi 244231437Sluigi return 0; 245231437Sluigi} 246231437Sluigi 247231437Sluigi 248231437Sluigistatic int 249231437Sluigioce_sys_fwupgrade(SYSCTL_HANDLER_ARGS) 250231437Sluigi{ 251231437Sluigi char ufiname[256] = {0}; 252231437Sluigi uint32_t status = 1; 253231437Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 254231437Sluigi const struct firmware *fw; 255231437Sluigi 256231437Sluigi status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req); 257231437Sluigi if (status || !req->newptr) 258231437Sluigi return status; 259231437Sluigi 260231437Sluigi fw = firmware_get(ufiname); 261231437Sluigi if (fw == NULL) { 262231437Sluigi device_printf(sc->dev, "Unable to get Firmware. " 263231437Sluigi "Make sure %s is copied to /boot/modules\n", ufiname); 264231437Sluigi return ENOENT; 265231437Sluigi } 266231437Sluigi 267257007Sdelphij if (IS_BE(sc)) { 268231437Sluigi if ((sc->flags & OCE_FLAGS_BE2)) { 269231437Sluigi device_printf(sc->dev, 270231437Sluigi "Flashing not supported for BE2 yet.\n"); 271231437Sluigi status = 1; 272231437Sluigi goto done; 273231437Sluigi } 274231437Sluigi status = oce_be3_fwupgrade(sc, fw); 275257007Sdelphij } else if (IS_SH(sc)) { 276257007Sdelphij status = oce_skyhawk_fwupgrade(sc,fw); 277231437Sluigi } else 278231437Sluigi status = oce_lancer_fwupgrade(sc, fw); 279231437Sluigidone: 280231437Sluigi if (status) { 281231437Sluigi device_printf(sc->dev, "Firmware Upgrade failed\n"); 282231437Sluigi } else { 283231437Sluigi device_printf(sc->dev, "Firmware Flashed successfully\n"); 284231437Sluigi } 285231437Sluigi 286231437Sluigi /* Release Firmware*/ 287231437Sluigi firmware_put(fw, FIRMWARE_UNLOAD); 288231437Sluigi 289231437Sluigi return status; 290231437Sluigi} 291231437Sluigi 292257007Sdelphijstatic void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec, 293257007Sdelphij struct flash_img_attri *pimg, int i, 294257007Sdelphij const struct firmware *fw, int bin_offset) 295231437Sluigi{ 296257007Sdelphij if (IS_SH(sc)) { 297257007Sdelphij pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset); 298257007Sdelphij pimg->img_size = HOST_32(fsec->fsec_entry[i].pad_size); 299231437Sluigi } 300231437Sluigi 301257007Sdelphij pimg->img_type = HOST_32(fsec->fsec_entry[i].type); 302257007Sdelphij pimg->skip_image = FALSE; 303257007Sdelphij switch (pimg->img_type) { 304257007Sdelphij case IMG_ISCSI: 305257007Sdelphij pimg->optype = 0; 306257007Sdelphij if (IS_BE3(sc)) { 307257007Sdelphij pimg->img_offset = 2097152; 308257007Sdelphij pimg->img_size = 2097152; 309257007Sdelphij } 310231437Sluigi break; 311257007Sdelphij case IMG_REDBOOT: 312257007Sdelphij pimg->optype = 1; 313257007Sdelphij if (IS_BE3(sc)) { 314257007Sdelphij pimg->img_offset = 262144; 315257007Sdelphij pimg->img_size = 1048576; 316257007Sdelphij } 317257007Sdelphij if (!oce_img_flashing_required(sc, fw->data, 318257007Sdelphij pimg->optype, 319257007Sdelphij pimg->img_offset, 320257007Sdelphij pimg->img_size, 321257007Sdelphij bin_offset)) 322257007Sdelphij pimg->skip_image = TRUE; 323257007Sdelphij break; 324257007Sdelphij case IMG_BIOS: 325257007Sdelphij pimg->optype = 2; 326257007Sdelphij if (IS_BE3(sc)) { 327257007Sdelphij pimg->img_offset = 12582912; 328257007Sdelphij pimg->img_size = 524288; 329257007Sdelphij } 330257007Sdelphij break; 331257007Sdelphij case IMG_PXEBIOS: 332257007Sdelphij pimg->optype = 3; 333257007Sdelphij if (IS_BE3(sc)) { 334257007Sdelphij pimg->img_offset = 13107200;; 335257007Sdelphij pimg->img_size = 524288; 336257007Sdelphij } 337257007Sdelphij break; 338257007Sdelphij case IMG_FCOEBIOS: 339257007Sdelphij pimg->optype = 8; 340257007Sdelphij if (IS_BE3(sc)) { 341257007Sdelphij pimg->img_offset = 13631488; 342257007Sdelphij pimg->img_size = 524288; 343257007Sdelphij } 344257007Sdelphij break; 345257007Sdelphij case IMG_ISCSI_BAK: 346257007Sdelphij pimg->optype = 9; 347257007Sdelphij if (IS_BE3(sc)) { 348257007Sdelphij pimg->img_offset = 4194304; 349257007Sdelphij pimg->img_size = 2097152; 350257007Sdelphij } 351257007Sdelphij break; 352257007Sdelphij case IMG_FCOE: 353257007Sdelphij pimg->optype = 10; 354257007Sdelphij if (IS_BE3(sc)) { 355257007Sdelphij pimg->img_offset = 6291456; 356257007Sdelphij pimg->img_size = 2097152; 357257007Sdelphij } 358257007Sdelphij break; 359257007Sdelphij case IMG_FCOE_BAK: 360257007Sdelphij pimg->optype = 11; 361257007Sdelphij if (IS_BE3(sc)) { 362257007Sdelphij pimg->img_offset = 8388608; 363257007Sdelphij pimg->img_size = 2097152; 364257007Sdelphij } 365257007Sdelphij break; 366257007Sdelphij case IMG_NCSI: 367257007Sdelphij pimg->optype = 13; 368257007Sdelphij if (IS_BE3(sc)) { 369257007Sdelphij pimg->img_offset = 15990784; 370257007Sdelphij pimg->img_size = 262144; 371257007Sdelphij } 372257007Sdelphij break; 373257007Sdelphij case IMG_PHY: 374257007Sdelphij pimg->optype = 99; 375257007Sdelphij if (IS_BE3(sc)) { 376257007Sdelphij pimg->img_offset = 1310720; 377257007Sdelphij pimg->img_size = 262144; 378257007Sdelphij } 379257007Sdelphij if (!oce_phy_flashing_required(sc)) 380257007Sdelphij pimg->skip_image = TRUE; 381257007Sdelphij break; 382257007Sdelphij default: 383257007Sdelphij pimg->skip_image = TRUE; 384257007Sdelphij break; 385231437Sluigi } 386231437Sluigi 387231437Sluigi} 388231437Sluigi 389231437Sluigistatic int 390257007Sdelphijoce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs) 391231437Sluigi{ 392231437Sluigi char cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "}; 393231437Sluigi const char *p = (const char *)fw->data; 394231437Sluigi const struct flash_sec_info *fsec = NULL; 395231437Sluigi struct mbx_common_read_write_flashrom *req; 396257007Sdelphij int rc = 0, i, bin_offset = 0, opcode, num_bytes; 397231437Sluigi OCE_DMA_MEM dma_mem; 398257007Sdelphij struct flash_img_attri imgatt; 399231437Sluigi 400231437Sluigi /* Validate Cookie */ 401231437Sluigi bin_offset = (sizeof(struct flash_file_hdr) + 402257007Sdelphij (num_imgs * sizeof(struct image_hdr))); 403231437Sluigi p += bin_offset; 404231437Sluigi while (p < ((const char *)fw->data + fw->datasize)) { 405231437Sluigi fsec = (const struct flash_sec_info *)p; 406231437Sluigi if (!memcmp(cookie, fsec->cookie, sizeof(cookie))) 407231437Sluigi break; 408231437Sluigi fsec = NULL; 409231437Sluigi p += 32; 410231437Sluigi } 411231437Sluigi 412231437Sluigi if (!fsec) { 413231437Sluigi device_printf(sc->dev, 414257007Sdelphij "Invalid Cookie. Firmware image corrupted ?\n"); 415231437Sluigi return EINVAL; 416231437Sluigi } 417231437Sluigi 418258140Sdelphij rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom), 419258140Sdelphij &dma_mem, 0); 420231437Sluigi if (rc) { 421231437Sluigi device_printf(sc->dev, 422257007Sdelphij "Memory allocation failure while flashing\n"); 423231437Sluigi return ENOMEM; 424231437Sluigi } 425231437Sluigi req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom); 426231437Sluigi 427257007Sdelphij if (IS_SH(sc)) 428257007Sdelphij num_imgs = HOST_32(fsec->fsec_hdr.num_images); 429257007Sdelphij else if (IS_BE3(sc)) 430257007Sdelphij num_imgs = MAX_FLASH_COMP; 431231437Sluigi 432257007Sdelphij for (i = 0; i < num_imgs; i++) { 433257007Sdelphij 434257007Sdelphij bzero(&imgatt, sizeof(struct flash_img_attri)); 435257007Sdelphij 436257007Sdelphij oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset); 437257007Sdelphij 438257007Sdelphij if (imgatt.skip_image) 439231437Sluigi continue; 440231437Sluigi 441231437Sluigi p = fw->data; 442257007Sdelphij p = p + bin_offset + imgatt.img_offset; 443257007Sdelphij 444257007Sdelphij if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) { 445231437Sluigi rc = 1; 446231437Sluigi goto ret; 447231437Sluigi } 448231437Sluigi 449257007Sdelphij while (imgatt.img_size) { 450231437Sluigi 451257007Sdelphij if (imgatt.img_size > 32*1024) 452231437Sluigi num_bytes = 32*1024; 453231437Sluigi else 454257007Sdelphij num_bytes = imgatt.img_size; 455257007Sdelphij imgatt.img_size -= num_bytes; 456231437Sluigi 457257007Sdelphij if (!imgatt.img_size) 458231437Sluigi opcode = FLASHROM_OPER_FLASH; 459231437Sluigi else 460231437Sluigi opcode = FLASHROM_OPER_SAVE; 461231437Sluigi 462231437Sluigi memcpy(req->data_buffer, p, num_bytes); 463231437Sluigi p += num_bytes; 464231437Sluigi 465257007Sdelphij rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode, 466257007Sdelphij &dma_mem, num_bytes); 467231437Sluigi if (rc) { 468231437Sluigi device_printf(sc->dev, 469257007Sdelphij "cmd to write to flash rom failed.\n"); 470231437Sluigi rc = EIO; 471231437Sluigi goto ret; 472231437Sluigi } 473231437Sluigi /* Leave the CPU for others for some time */ 474231437Sluigi pause("yield", 10); 475231437Sluigi 476231437Sluigi } 477257007Sdelphij 478231437Sluigi } 479257007Sdelphij 480231437Sluigiret: 481231437Sluigi oce_dma_free(sc, &dma_mem); 482231437Sluigi return rc; 483257007Sdelphij} 484231437Sluigi 485257007Sdelphij#define UFI_TYPE2 2 486257007Sdelphij#define UFI_TYPE3 3 487257007Sdelphij#define UFI_TYPE3R 10 488257007Sdelphij#define UFI_TYPE4 4 489257007Sdelphij#define UFI_TYPE4R 11 490257007Sdelphijstatic int oce_get_ufi_type(POCE_SOFTC sc, 491257007Sdelphij const struct flash_file_hdr *fhdr) 492257007Sdelphij{ 493257007Sdelphij if (fhdr == NULL) 494257007Sdelphij goto be_get_ufi_exit; 495257007Sdelphij 496257007Sdelphij if (IS_SH(sc) && fhdr->build[0] == '4') { 497257007Sdelphij if (fhdr->asic_type_rev >= 0x10) 498257007Sdelphij return UFI_TYPE4R; 499257007Sdelphij else 500257007Sdelphij return UFI_TYPE4; 501257007Sdelphij } else if (IS_BE3(sc) && fhdr->build[0] == '3') { 502257007Sdelphij if (fhdr->asic_type_rev == 0x10) 503257007Sdelphij return UFI_TYPE3R; 504257007Sdelphij else 505257007Sdelphij return UFI_TYPE3; 506257007Sdelphij } else if (IS_BE2(sc) && fhdr->build[0] == '2') 507257007Sdelphij return UFI_TYPE2; 508257007Sdelphij 509257007Sdelphijbe_get_ufi_exit: 510257007Sdelphij device_printf(sc->dev, 511257007Sdelphij "UFI and Interface are not compatible for flashing\n"); 512257007Sdelphij return -1; 513231437Sluigi} 514231437Sluigi 515231437Sluigi 516257007Sdelphijstatic int 517257007Sdelphijoce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 518257007Sdelphij{ 519257007Sdelphij int rc = 0, num_imgs = 0, i = 0, ufi_type; 520257007Sdelphij const struct flash_file_hdr *fhdr; 521257007Sdelphij const struct image_hdr *img_ptr; 522257007Sdelphij 523257007Sdelphij fhdr = (const struct flash_file_hdr *)fw->data; 524257007Sdelphij 525257007Sdelphij ufi_type = oce_get_ufi_type(sc, fhdr); 526257007Sdelphij 527257007Sdelphij /* Display flash version */ 528257007Sdelphij device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 529257007Sdelphij 530257007Sdelphij num_imgs = fhdr->num_imgs; 531257007Sdelphij for (i = 0; i < num_imgs; i++) { 532257007Sdelphij img_ptr = (const struct image_hdr *)((const char *)fw->data + 533257007Sdelphij sizeof(struct flash_file_hdr) + 534257007Sdelphij (i * sizeof(struct image_hdr))); 535257007Sdelphij 536257007Sdelphij if (img_ptr->imageid != 1) 537257007Sdelphij continue; 538257007Sdelphij 539257007Sdelphij switch (ufi_type) { 540257007Sdelphij case UFI_TYPE4R: 541257007Sdelphij rc = oce_sh_be3_flashdata(sc, fw, 542257007Sdelphij num_imgs); 543257007Sdelphij break; 544257007Sdelphij case UFI_TYPE4: 545257007Sdelphij if (sc->asic_revision < 0x10) 546257007Sdelphij rc = oce_sh_be3_flashdata(sc, fw, 547257007Sdelphij num_imgs); 548257007Sdelphij else { 549257007Sdelphij rc = -1; 550257007Sdelphij device_printf(sc->dev, 551257007Sdelphij "Cant load SH A0 UFI on B0\n"); 552257007Sdelphij } 553257007Sdelphij break; 554257007Sdelphij default: 555257007Sdelphij rc = -1; 556257007Sdelphij break; 557257007Sdelphij 558257007Sdelphij } 559257007Sdelphij } 560257007Sdelphij 561257007Sdelphij return rc; 562257007Sdelphij} 563257007Sdelphij 564257007Sdelphijstatic int 565257007Sdelphijoce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 566257007Sdelphij{ 567257007Sdelphij int rc = 0, num_imgs = 0, i = 0; 568257007Sdelphij const struct flash_file_hdr *fhdr; 569257007Sdelphij const struct image_hdr *img_ptr; 570257007Sdelphij 571257007Sdelphij fhdr = (const struct flash_file_hdr *)fw->data; 572257007Sdelphij if (fhdr->build[0] != '3') { 573257007Sdelphij device_printf(sc->dev, "Invalid BE3 firmware image\n"); 574257007Sdelphij return EINVAL; 575257007Sdelphij } 576257007Sdelphij /* Display flash version */ 577257007Sdelphij device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 578257007Sdelphij 579257007Sdelphij num_imgs = fhdr->num_imgs; 580257007Sdelphij for (i = 0; i < num_imgs; i++) { 581257007Sdelphij img_ptr = (const struct image_hdr *)((const char *)fw->data + 582257007Sdelphij sizeof(struct flash_file_hdr) + 583257007Sdelphij (i * sizeof(struct image_hdr))); 584257007Sdelphij if (img_ptr->imageid == 1) { 585257007Sdelphij rc = oce_sh_be3_flashdata(sc, fw, num_imgs); 586257007Sdelphij 587257007Sdelphij break; 588257007Sdelphij } 589257007Sdelphij } 590257007Sdelphij 591257007Sdelphij return rc; 592257007Sdelphij} 593257007Sdelphij 594257007Sdelphij 595231437Sluigistatic boolean_t 596231437Sluigioce_phy_flashing_required(POCE_SOFTC sc) 597231437Sluigi{ 598231437Sluigi int status = 0; 599231437Sluigi struct oce_phy_info phy_info; 600231437Sluigi 601231437Sluigi status = oce_mbox_get_phy_info(sc, &phy_info); 602231437Sluigi if (status) 603231437Sluigi return FALSE; 604231437Sluigi 605231437Sluigi if ((phy_info.phy_type == TN_8022) && 606231437Sluigi (phy_info.interface_type == PHY_TYPE_BASET_10GB)) { 607231437Sluigi return TRUE; 608231437Sluigi } 609231437Sluigi 610231437Sluigi return FALSE; 611231437Sluigi} 612231437Sluigi 613231437Sluigi 614231437Sluigistatic boolean_t 615231437Sluigioce_img_flashing_required(POCE_SOFTC sc, const char *p, 616231437Sluigi int img_optype, uint32_t img_offset, 617231437Sluigi uint32_t img_size, uint32_t hdrs_size) 618231437Sluigi{ 619231437Sluigi uint32_t crc_offset; 620231437Sluigi uint8_t flashed_crc[4]; 621231437Sluigi int status; 622231437Sluigi 623231437Sluigi crc_offset = hdrs_size + img_offset + img_size - 4; 624231437Sluigi 625231437Sluigi p += crc_offset; 626231437Sluigi 627231437Sluigi status = oce_mbox_get_flashrom_crc(sc, flashed_crc, 628231437Sluigi (img_size - 4), img_optype); 629231437Sluigi if (status) 630231437Sluigi return TRUE; /* Some thing worng. ReFlash */ 631231437Sluigi 632231437Sluigi /*update redboot only if crc does not match*/ 633231437Sluigi if (bcmp(flashed_crc, p, 4)) 634231437Sluigi return TRUE; 635231437Sluigi else 636231437Sluigi return FALSE; 637231437Sluigi} 638231437Sluigi 639231437Sluigi 640231437Sluigistatic int 641231437Sluigioce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 642231437Sluigi{ 643231437Sluigi 644231437Sluigi int rc = 0; 645231437Sluigi OCE_DMA_MEM dma_mem; 646231437Sluigi const uint8_t *data = NULL; 647231437Sluigi uint8_t *dest_image_ptr = NULL; 648231437Sluigi size_t size = 0; 649231437Sluigi uint32_t data_written = 0, chunk_size = 0; 650231437Sluigi uint32_t offset = 0, add_status = 0; 651231437Sluigi 652231437Sluigi if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) { 653231437Sluigi device_printf(sc->dev, 654231437Sluigi "Lancer FW image is not 4 byte aligned."); 655231437Sluigi return EINVAL; 656231437Sluigi } 657231437Sluigi 658231437Sluigi rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0); 659231437Sluigi if (rc) { 660231437Sluigi device_printf(sc->dev, 661231437Sluigi "Memory allocation failure while flashing Lancer\n"); 662231437Sluigi return ENOMEM; 663231437Sluigi } 664231437Sluigi 665231437Sluigi size = fw->datasize; 666231437Sluigi data = fw->data; 667231437Sluigi dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t); 668231437Sluigi 669231437Sluigi while (size) { 670231437Sluigi chunk_size = MIN(size, (32*1024)); 671231437Sluigi 672231437Sluigi bcopy(data, dest_image_ptr, chunk_size); 673231437Sluigi 674231437Sluigi rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset, 675231437Sluigi &dma_mem, &data_written, &add_status); 676231437Sluigi 677231437Sluigi if (rc) 678231437Sluigi break; 679231437Sluigi 680231437Sluigi size -= data_written; 681231437Sluigi data += data_written; 682231437Sluigi offset += data_written; 683231437Sluigi pause("yield", 10); 684231437Sluigi 685231437Sluigi } 686231437Sluigi 687231437Sluigi if (!rc) 688231437Sluigi /* Commit the firmware*/ 689231437Sluigi rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem, 690231437Sluigi &data_written, &add_status); 691231437Sluigi if (rc) { 692231437Sluigi device_printf(sc->dev, "Lancer firmware load error. " 693231437Sluigi "Addstatus = 0x%x, status = %d \n", add_status, rc); 694231437Sluigi rc = EIO; 695231437Sluigi } 696231437Sluigi oce_dma_free(sc, &dma_mem); 697231437Sluigi return rc; 698231437Sluigi 699231437Sluigi} 700231437Sluigi 701231437Sluigi 702231437Sluigistatic void 703231437Sluigioce_add_stats_sysctls_be3(POCE_SOFTC sc, 704231437Sluigi struct sysctl_ctx_list *ctx, 705231437Sluigi struct sysctl_oid *stats_node) 706231437Sluigi{ 707231437Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 708231437Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 709231437Sluigi struct sysctl_oid_list *queue_stats_list; 710231437Sluigi struct sysctl_oid *queue_stats_node; 711231437Sluigi struct oce_drv_stats *stats; 712231437Sluigi char prefix[32]; 713231437Sluigi int i; 714231437Sluigi 715231437Sluigi stats = &sc->oce_stats_info; 716231437Sluigi 717231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 718231437Sluigi SYSCTL_CHILDREN(stats_node), 719231437Sluigi OID_AUTO,"rx", CTLFLAG_RD, 720231437Sluigi NULL, "RX Ethernet Statistics"); 721231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 722231437Sluigi 723231437Sluigi 724231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 725231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 726231437Sluigi "Total Received Packets"); 727231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 728231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 729231437Sluigi "Total Received Bytes"); 730231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 731231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 732231437Sluigi "Total Received Fragements"); 733231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 734231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 735231437Sluigi "Total Received Multicast Packets"); 736231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 737231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 738231437Sluigi "Total Received Unicast Packets"); 739231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 740231437Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 741231437Sluigi "Total Receive completion errors"); 742231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 743231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0, 744231437Sluigi "Pause Frames"); 745231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames", 746231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0, 747231437Sluigi "Priority Pause Frames"); 748231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 749231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0, 750231437Sluigi "Control Frames"); 751231437Sluigi 752231437Sluigi for (i = 0; i < sc->nrqs; i++) { 753231437Sluigi sprintf(prefix, "queue%d",i); 754231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 755231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 756231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 757231437Sluigi NULL, "Queue name"); 758231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 759231437Sluigi 760231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 761231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 762231437Sluigi "Receive Packets"); 763231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 764231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 765231437Sluigi "Recived Bytes"); 766231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 767231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 768231437Sluigi "Received Fragments"); 769231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 770231437Sluigi "rx_mcast_pkts", CTLFLAG_RD, 771231437Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 772231437Sluigi "Received Multicast Packets"); 773231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 774231437Sluigi "rx_ucast_pkts", CTLFLAG_RD, 775231437Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 776231437Sluigi "Received Unicast Packets"); 777231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 778231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 779231437Sluigi "Received Completion Errors"); 780231437Sluigi 781231437Sluigi } 782231437Sluigi 783231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 784231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 785231437Sluigi OID_AUTO, "err", CTLFLAG_RD, 786231437Sluigi NULL, "Receive Error Stats"); 787231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 788231437Sluigi 789231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 790231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0, 791231437Sluigi "CRC Errors"); 792231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors", 793231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0, 794231437Sluigi "Drops due to pbuf full"); 795231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors", 796231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0, 797231437Sluigi "ERX Errors"); 798231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 799231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0, 800231437Sluigi "RX Alignmnet Errors"); 801231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 802231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0, 803231437Sluigi "In Range Errors"); 804231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 805231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0, 806231437Sluigi "Out Range Errors"); 807231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 808231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0, 809231437Sluigi "Frame Too Long"); 810231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 811231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0, 812231437Sluigi "Address Match Errors"); 813231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 814231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0, 815231437Sluigi "Dropped Too Small"); 816231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 817231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0, 818231437Sluigi "Dropped Too Short"); 819231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 820231437Sluigi "dropped_header_too_small", CTLFLAG_RD, 821231437Sluigi &stats->u0.be.rx_dropped_header_too_small, 0, 822231437Sluigi "Dropped Header Too Small"); 823231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length", 824231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0, 825231437Sluigi "Dropped TCP Length"); 826231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 827231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0, 828231437Sluigi "Dropped runt"); 829231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 830231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0, 831231437Sluigi "IP Checksum Errors"); 832231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 833231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0, 834231437Sluigi "TCP Checksum Errors"); 835231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 836231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0, 837231437Sluigi "UDP Checksum Errors"); 838231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop", 839231437Sluigi CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0, 840231437Sluigi "FIFO Overflow Drop"); 841231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 842231437Sluigi "input_fifo_overflow_drop", CTLFLAG_RD, 843231437Sluigi &stats->u0.be.rx_input_fifo_overflow_drop, 0, 844231437Sluigi "Input FIFO Overflow Drop"); 845231437Sluigi 846231437Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 847231437Sluigi SYSCTL_CHILDREN(stats_node), OID_AUTO, 848231437Sluigi "tx",CTLFLAG_RD, NULL, 849231437Sluigi "TX Ethernet Statistics"); 850231437Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 851231437Sluigi 852231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 853231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 854231437Sluigi "Total Transmit Packets"); 855231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 856231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 857231437Sluigi "Total Transmit Bytes"); 858231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 859231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 860231437Sluigi "Total Transmit Requests"); 861231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 862231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 863231437Sluigi "Total Transmit Stops"); 864231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 865231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 866231437Sluigi "Total Transmit WRB's"); 867231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 868231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 869231437Sluigi "Total Transmit Completions"); 870231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 871231437Sluigi "total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 872231437Sluigi &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 873231437Sluigi "Total Transmit IPV6 Drops"); 874231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 875231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0, 876231437Sluigi "Pause Frames"); 877231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes", 878231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0, 879231437Sluigi "Priority Pauseframes"); 880231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 881231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0, 882231437Sluigi "Tx Control Frames"); 883231437Sluigi 884231437Sluigi for (i = 0; i < sc->nwqs; i++) { 885231437Sluigi sprintf(prefix, "queue%d",i); 886231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 887231437Sluigi SYSCTL_CHILDREN(tx_stats_node), 888231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 889231437Sluigi NULL, "Queue name"); 890231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 891231437Sluigi 892231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 893231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 894231437Sluigi "Transmit Packets"); 895231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 896231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 897231437Sluigi "Transmit Bytes"); 898231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 899231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 900231437Sluigi "Transmit Requests"); 901231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 902231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 903231437Sluigi "Transmit Stops"); 904231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 905231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 906231437Sluigi "Transmit WRB's"); 907231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 908231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 909231437Sluigi "Transmit Completions"); 910231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 911231437Sluigi "ipv6_ext_hdr_tx_drop",CTLFLAG_RD, 912231437Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 913231437Sluigi "Transmit IPV6 Ext Header Drop"); 914231437Sluigi 915231437Sluigi } 916231437Sluigi return; 917231437Sluigi} 918231437Sluigi 919231437Sluigi 920231437Sluigistatic void 921231437Sluigioce_add_stats_sysctls_xe201(POCE_SOFTC sc, 922231437Sluigi struct sysctl_ctx_list *ctx, 923231437Sluigi struct sysctl_oid *stats_node) 924231437Sluigi{ 925231437Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 926231437Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 927231437Sluigi struct sysctl_oid_list *queue_stats_list; 928231437Sluigi struct sysctl_oid *queue_stats_node; 929231437Sluigi struct oce_drv_stats *stats; 930231437Sluigi char prefix[32]; 931231437Sluigi int i; 932231437Sluigi 933231437Sluigi stats = &sc->oce_stats_info; 934231437Sluigi 935231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 936231437Sluigi SYSCTL_CHILDREN(stats_node), 937231437Sluigi OID_AUTO, "rx", CTLFLAG_RD, 938231437Sluigi NULL, "RX Ethernet Statistics"); 939231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 940231437Sluigi 941231437Sluigi 942231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 943231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 944231437Sluigi "Total Received Packets"); 945231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 946231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 947231437Sluigi "Total Received Bytes"); 948231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 949231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 950231437Sluigi "Total Received Fragements"); 951231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 952231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 953231437Sluigi "Total Received Multicast Packets"); 954231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 955231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 956231437Sluigi "Total Received Unicast Packets"); 957231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 958231437Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 959231437Sluigi "Total Receive completion errors"); 960231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 961231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 0, 962231437Sluigi "Pause Frames"); 963231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 964231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 0, 965231437Sluigi "Control Frames"); 966231437Sluigi 967231437Sluigi for (i = 0; i < sc->nrqs; i++) { 968231437Sluigi sprintf(prefix, "queue%d",i); 969231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 970231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 971231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 972231437Sluigi NULL, "Queue name"); 973231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 974231437Sluigi 975231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 976231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 977231437Sluigi "Receive Packets"); 978231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 979231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 980231437Sluigi "Recived Bytes"); 981231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 982231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 983231437Sluigi "Received Fragments"); 984231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 985231437Sluigi "rx_mcast_pkts", CTLFLAG_RD, 986231437Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 987231437Sluigi "Received Multicast Packets"); 988231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 989231437Sluigi "rx_ucast_pkts",CTLFLAG_RD, 990231437Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 991231437Sluigi "Received Unicast Packets"); 992231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 993231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 994231437Sluigi "Received Completion Errors"); 995231437Sluigi 996231437Sluigi } 997231437Sluigi 998231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 999231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 1000231437Sluigi OID_AUTO, "err", CTLFLAG_RD, 1001231437Sluigi NULL, "Receive Error Stats"); 1002231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 1003231437Sluigi 1004231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 1005231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 0, 1006231437Sluigi "CRC Errors"); 1007231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 1008231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 0, 1009231437Sluigi "RX Alignmnet Errors"); 1010231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 1011231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0, 1012231437Sluigi "In Range Errors"); 1013231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 1014231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0, 1015231437Sluigi "Out Range Errors"); 1016231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 1017231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 0, 1018231437Sluigi "Frame Too Long"); 1019231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 1020231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0, 1021231437Sluigi "Address Match Errors"); 1022231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 1023231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0, 1024231437Sluigi "Dropped Too Small"); 1025231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 1026231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0, 1027231437Sluigi "Dropped Too Short"); 1028231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 1029231437Sluigi "dropped_header_too_small", CTLFLAG_RD, 1030231437Sluigi &stats->u0.xe201.rx_dropped_header_too_small, 0, 1031231437Sluigi "Dropped Header Too Small"); 1032231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 1033231437Sluigi "dropped_tcp_length", CTLFLAG_RD, 1034231437Sluigi &stats->u0.xe201.rx_dropped_invalid_tcp_length, 0, 1035231437Sluigi "Dropped TCP Length"); 1036231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 1037231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0, 1038231437Sluigi "Dropped runt"); 1039231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 1040231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0, 1041231437Sluigi "IP Checksum Errors"); 1042231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 1043231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0, 1044231437Sluigi "TCP Checksum Errors"); 1045231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 1046231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0, 1047231437Sluigi "UDP Checksum Errors"); 1048231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop", 1049231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0, 1050231437Sluigi "Input FIFO Overflow Drop"); 1051231437Sluigi 1052231437Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 1053231437Sluigi SYSCTL_CHILDREN(stats_node), 1054231437Sluigi OID_AUTO, "tx", CTLFLAG_RD, 1055231437Sluigi NULL, "TX Ethernet Statistics"); 1056231437Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 1057231437Sluigi 1058231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 1059231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 1060231437Sluigi "Total Transmit Packets"); 1061231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 1062231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 1063231437Sluigi "Total Transmit Bytes"); 1064231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 1065231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 1066231437Sluigi "Total Transmit Requests"); 1067231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 1068231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 1069231437Sluigi "Total Transmit Stops"); 1070231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 1071231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 1072231437Sluigi "Total Transmit WRB's"); 1073231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 1074231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 1075231437Sluigi "Total Transmit Completions"); 1076231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 1077231437Sluigi "total_ipv6_ext_hdr_tx_drop", 1078231437Sluigi CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 1079231437Sluigi "Total Transmit IPV6 Drops"); 1080231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 1081231437Sluigi CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 0, 1082231437Sluigi "Pause Frames"); 1083231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 1084231437Sluigi CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 0, 1085231437Sluigi "Tx Control Frames"); 1086231437Sluigi 1087231437Sluigi for (i = 0; i < sc->nwqs; i++) { 1088231437Sluigi sprintf(prefix, "queue%d",i); 1089231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 1090231437Sluigi SYSCTL_CHILDREN(tx_stats_node), 1091231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 1092231437Sluigi NULL, "Queue name"); 1093231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 1094231437Sluigi 1095231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 1096231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 1097231437Sluigi "Transmit Packets"); 1098231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 1099231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 1100231437Sluigi "Transmit Bytes"); 1101231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 1102231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 1103231437Sluigi "Transmit Requests"); 1104231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 1105231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 1106231437Sluigi "Transmit Stops"); 1107231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 1108231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 1109231437Sluigi "Transmit WRB's"); 1110231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 1111231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 1112231437Sluigi "Transmit Completions"); 1113231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 1114231437Sluigi "ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 1115231437Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 1116231437Sluigi "Transmit IPV6 Ext Header Drop"); 1117231437Sluigi 1118231437Sluigi } 1119231437Sluigi return; 1120231437Sluigi} 1121231437Sluigi 1122231437Sluigi 1123231437Sluigivoid 1124231437Sluigioce_refresh_queue_stats(POCE_SOFTC sc) 1125231437Sluigi{ 1126231437Sluigi struct oce_drv_stats *adapter_stats; 1127231437Sluigi int i; 1128231437Sluigi 1129231437Sluigi adapter_stats = &sc->oce_stats_info; 1130231437Sluigi 1131231437Sluigi /* Caluculate total TX and TXstats from all queues */ 1132231437Sluigi 1133231437Sluigi bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats)); 1134231437Sluigi for (i = 0; i < sc->nrqs; i++) { 1135231437Sluigi 1136231437Sluigi adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts; 1137231437Sluigi adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes; 1138231437Sluigi adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags; 1139231437Sluigi adapter_stats->rx.t_rx_mcast_pkts += 1140231437Sluigi sc->rq[i]->rx_stats.rx_mcast_pkts; 1141231437Sluigi adapter_stats->rx.t_rx_ucast_pkts += 1142231437Sluigi sc->rq[i]->rx_stats.rx_ucast_pkts; 1143231437Sluigi adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err; 1144231437Sluigi } 1145231437Sluigi 1146231437Sluigi bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats)); 1147231437Sluigi for (i = 0; i < sc->nwqs; i++) { 1148231437Sluigi adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs; 1149231437Sluigi adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops; 1150231437Sluigi adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs; 1151231437Sluigi adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl; 1152231437Sluigi adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes; 1153231437Sluigi adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts; 1154231437Sluigi adapter_stats->tx.t_ipv6_ext_hdr_tx_drop += 1155231437Sluigi sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop; 1156231437Sluigi } 1157231437Sluigi 1158231437Sluigi} 1159231437Sluigi 1160231437Sluigi 1161231437Sluigi 1162231437Sluigistatic void 1163231437Sluigicopy_stats_to_sc_xe201(POCE_SOFTC sc) 1164231437Sluigi{ 1165231437Sluigi struct oce_xe201_stats *adapter_stats; 1166231437Sluigi struct mbx_get_pport_stats *nic_mbx; 1167231437Sluigi struct pport_stats *port_stats; 1168231437Sluigi 1169231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats); 1170231437Sluigi port_stats = &nic_mbx->params.rsp.pps; 1171231437Sluigi adapter_stats = &sc->oce_stats_info.u0.xe201; 1172231437Sluigi 1173231437Sluigi adapter_stats->tx_pkts = port_stats->tx_pkts; 1174231437Sluigi adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts; 1175231437Sluigi adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts; 1176231437Sluigi adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts; 1177231437Sluigi adapter_stats->tx_bytes = port_stats->tx_bytes; 1178231437Sluigi adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes; 1179231437Sluigi adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes; 1180231437Sluigi adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes; 1181231437Sluigi adapter_stats->tx_discards = port_stats->tx_discards; 1182231437Sluigi adapter_stats->tx_errors = port_stats->tx_errors; 1183231437Sluigi adapter_stats->tx_pause_frames = port_stats->tx_pause_frames; 1184231437Sluigi adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames; 1185231437Sluigi adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames; 1186231437Sluigi adapter_stats->tx_internal_mac_errors = 1187231437Sluigi port_stats->tx_internal_mac_errors; 1188231437Sluigi adapter_stats->tx_control_frames = port_stats->tx_control_frames; 1189231437Sluigi adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes; 1190231437Sluigi adapter_stats->tx_pkts_65_to_127_bytes = 1191231437Sluigi port_stats->tx_pkts_65_to_127_bytes; 1192231437Sluigi adapter_stats->tx_pkts_128_to_255_bytes = 1193231437Sluigi port_stats->tx_pkts_128_to_255_bytes; 1194231437Sluigi adapter_stats->tx_pkts_256_to_511_bytes = 1195231437Sluigi port_stats->tx_pkts_256_to_511_bytes; 1196231437Sluigi adapter_stats->tx_pkts_512_to_1023_bytes = 1197231437Sluigi port_stats->tx_pkts_512_to_1023_bytes; 1198231437Sluigi adapter_stats->tx_pkts_1024_to_1518_bytes = 1199231437Sluigi port_stats->tx_pkts_1024_to_1518_bytes; 1200231437Sluigi adapter_stats->tx_pkts_1519_to_2047_bytes = 1201231437Sluigi port_stats->tx_pkts_1519_to_2047_bytes; 1202231437Sluigi adapter_stats->tx_pkts_2048_to_4095_bytes = 1203231437Sluigi port_stats->tx_pkts_2048_to_4095_bytes; 1204231437Sluigi adapter_stats->tx_pkts_4096_to_8191_bytes = 1205231437Sluigi port_stats->tx_pkts_4096_to_8191_bytes; 1206231437Sluigi adapter_stats->tx_pkts_8192_to_9216_bytes = 1207231437Sluigi port_stats->tx_pkts_8192_to_9216_bytes; 1208231437Sluigi adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts; 1209231437Sluigi adapter_stats->rx_pkts = port_stats->rx_pkts; 1210231437Sluigi adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts; 1211231437Sluigi adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts; 1212231437Sluigi adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts; 1213231437Sluigi adapter_stats->rx_bytes = port_stats->rx_bytes; 1214231437Sluigi adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes; 1215231437Sluigi adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes; 1216231437Sluigi adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes; 1217231437Sluigi adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos; 1218231437Sluigi adapter_stats->rx_discards = port_stats->rx_discards; 1219231437Sluigi adapter_stats->rx_errors = port_stats->rx_errors; 1220231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1221231437Sluigi adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors; 1222231437Sluigi adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors; 1223231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1224231437Sluigi adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames; 1225231437Sluigi adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames; 1226231437Sluigi adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long; 1227231437Sluigi adapter_stats->rx_internal_mac_errors = 1228231437Sluigi port_stats->rx_internal_mac_errors; 1229231437Sluigi adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts; 1230231437Sluigi adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts; 1231231437Sluigi adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts; 1232231437Sluigi adapter_stats->rx_jabbers = port_stats->rx_jabbers; 1233231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1234231437Sluigi adapter_stats->rx_control_frames_unknown_opcode = 1235231437Sluigi port_stats->rx_control_frames_unknown_opcode; 1236231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1237231437Sluigi adapter_stats->rx_out_of_range_errors = 1238231437Sluigi port_stats->rx_out_of_range_errors; 1239231437Sluigi adapter_stats->rx_address_match_errors = 1240231437Sluigi port_stats->rx_address_match_errors; 1241231437Sluigi adapter_stats->rx_vlan_mismatch_errors = 1242231437Sluigi port_stats->rx_vlan_mismatch_errors; 1243231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1244231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1245231437Sluigi adapter_stats->rx_dropped_header_too_small = 1246231437Sluigi port_stats->rx_dropped_header_too_small; 1247231437Sluigi adapter_stats->rx_dropped_invalid_tcp_length = 1248231437Sluigi port_stats->rx_dropped_invalid_tcp_length; 1249231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1250231437Sluigi adapter_stats->rx_ip_checksum_errors = 1251231437Sluigi port_stats->rx_ip_checksum_errors; 1252231437Sluigi adapter_stats->rx_tcp_checksum_errors = 1253231437Sluigi port_stats->rx_tcp_checksum_errors; 1254231437Sluigi adapter_stats->rx_udp_checksum_errors = 1255231437Sluigi port_stats->rx_udp_checksum_errors; 1256231437Sluigi adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts; 1257231437Sluigi adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts; 1258231437Sluigi adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts; 1259231437Sluigi adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes; 1260231437Sluigi adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes; 1261231437Sluigi adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts; 1262231437Sluigi adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts; 1263231437Sluigi adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts; 1264231437Sluigi adapter_stats->rx_management_pkts = port_stats->rx_management_pkts; 1265231437Sluigi adapter_stats->rx_switched_unicast_pkts = 1266231437Sluigi port_stats->rx_switched_unicast_pkts; 1267231437Sluigi adapter_stats->rx_switched_multicast_pkts = 1268231437Sluigi port_stats->rx_switched_multicast_pkts; 1269231437Sluigi adapter_stats->rx_switched_broadcast_pkts = 1270231437Sluigi port_stats->rx_switched_broadcast_pkts; 1271231437Sluigi adapter_stats->num_forwards = port_stats->num_forwards; 1272231437Sluigi adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow; 1273231437Sluigi adapter_stats->rx_input_fifo_overflow = 1274231437Sluigi port_stats->rx_input_fifo_overflow; 1275231437Sluigi adapter_stats->rx_drops_too_many_frags = 1276231437Sluigi port_stats->rx_drops_too_many_frags; 1277231437Sluigi adapter_stats->rx_drops_invalid_queue = 1278231437Sluigi port_stats->rx_drops_invalid_queue; 1279231437Sluigi adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu; 1280231437Sluigi adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes; 1281231437Sluigi adapter_stats->rx_pkts_65_to_127_bytes = 1282231437Sluigi port_stats->rx_pkts_65_to_127_bytes; 1283231437Sluigi adapter_stats->rx_pkts_128_to_255_bytes = 1284231437Sluigi port_stats->rx_pkts_128_to_255_bytes; 1285231437Sluigi adapter_stats->rx_pkts_256_to_511_bytes = 1286231437Sluigi port_stats->rx_pkts_256_to_511_bytes; 1287231437Sluigi adapter_stats->rx_pkts_512_to_1023_bytes = 1288231437Sluigi port_stats->rx_pkts_512_to_1023_bytes; 1289231437Sluigi adapter_stats->rx_pkts_1024_to_1518_bytes = 1290231437Sluigi port_stats->rx_pkts_1024_to_1518_bytes; 1291231437Sluigi adapter_stats->rx_pkts_1519_to_2047_bytes = 1292231437Sluigi port_stats->rx_pkts_1519_to_2047_bytes; 1293231437Sluigi adapter_stats->rx_pkts_2048_to_4095_bytes = 1294231437Sluigi port_stats->rx_pkts_2048_to_4095_bytes; 1295231437Sluigi adapter_stats->rx_pkts_4096_to_8191_bytes = 1296231437Sluigi port_stats->rx_pkts_4096_to_8191_bytes; 1297231437Sluigi adapter_stats->rx_pkts_8192_to_9216_bytes = 1298231437Sluigi port_stats->rx_pkts_8192_to_9216_bytes; 1299231437Sluigi} 1300231437Sluigi 1301231437Sluigi 1302231437Sluigi 1303231437Sluigistatic void 1304231437Sluigicopy_stats_to_sc_be2(POCE_SOFTC sc) 1305231437Sluigi{ 1306231437Sluigi struct oce_be_stats *adapter_stats; 1307231437Sluigi struct oce_pmem_stats *pmem; 1308231437Sluigi struct oce_rxf_stats_v0 *rxf_stats; 1309231437Sluigi struct oce_port_rxf_stats_v0 *port_stats; 1310231437Sluigi struct mbx_get_nic_stats_v0 *nic_mbx; 1311231437Sluigi uint32_t port = sc->port_id; 1312231437Sluigi 1313231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0); 1314231437Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1315231437Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1316231437Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1317231437Sluigi 1318231437Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1319231437Sluigi 1320231437Sluigi 1321231437Sluigi /* Update stats */ 1322231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1323231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1324231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1325231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1326231437Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1327231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1328231437Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1329231437Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1330231437Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1331231437Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1332231437Sluigi port_stats->rxpp_fifo_overflow_drop; 1333231437Sluigi adapter_stats->rx_dropped_tcp_length = 1334231437Sluigi port_stats->rx_dropped_tcp_length; 1335231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1336231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1337231437Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1338231437Sluigi adapter_stats->rx_dropped_header_too_small = 1339231437Sluigi port_stats->rx_dropped_header_too_small; 1340231437Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1341231437Sluigi port_stats->rx_input_fifo_overflow_drop; 1342231437Sluigi adapter_stats->rx_address_match_errors = 1343231437Sluigi port_stats->rx_address_match_errors; 1344231437Sluigi adapter_stats->rx_alignment_symbol_errors = 1345231437Sluigi port_stats->rx_alignment_symbol_errors; 1346231437Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1347231437Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1348231437Sluigi 1349231437Sluigi if (sc->if_id) 1350231437Sluigi adapter_stats->jabber_events = rxf_stats->port1_jabber_events; 1351231437Sluigi else 1352231437Sluigi adapter_stats->jabber_events = rxf_stats->port0_jabber_events; 1353231437Sluigi 1354231437Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1355231437Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1356231437Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1357231437Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1358231437Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1359231437Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1360231437Sluigi adapter_stats->rx_drops_no_tpre_descr = 1361231437Sluigi rxf_stats->rx_drops_no_tpre_descr; 1362231437Sluigi adapter_stats->rx_drops_too_many_frags = 1363231437Sluigi rxf_stats->rx_drops_too_many_frags; 1364231437Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1365231437Sluigi} 1366231437Sluigi 1367231437Sluigi 1368231437Sluigistatic void 1369231437Sluigicopy_stats_to_sc_be3(POCE_SOFTC sc) 1370231437Sluigi{ 1371231437Sluigi struct oce_be_stats *adapter_stats; 1372231437Sluigi struct oce_pmem_stats *pmem; 1373231437Sluigi struct oce_rxf_stats_v1 *rxf_stats; 1374231437Sluigi struct oce_port_rxf_stats_v1 *port_stats; 1375231437Sluigi struct mbx_get_nic_stats *nic_mbx; 1376231437Sluigi uint32_t port = sc->port_id; 1377231437Sluigi 1378231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats); 1379231437Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1380231437Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1381231437Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1382231437Sluigi 1383231437Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1384231437Sluigi 1385231437Sluigi /* Update stats */ 1386231437Sluigi adapter_stats->pmem_fifo_overflow_drop = 1387231437Sluigi port_stats->pmem_fifo_overflow_drop; 1388231437Sluigi adapter_stats->rx_priority_pause_frames = 1389231437Sluigi port_stats->rx_priority_pause_frames; 1390231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1391231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1392231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1393231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1394231437Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1395231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1396231437Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1397231437Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1398231437Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1399231437Sluigi adapter_stats->rx_dropped_tcp_length = 1400231437Sluigi port_stats->rx_dropped_tcp_length; 1401231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1402231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1403231437Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1404231437Sluigi adapter_stats->rx_dropped_header_too_small = 1405231437Sluigi port_stats->rx_dropped_header_too_small; 1406231437Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1407231437Sluigi port_stats->rx_input_fifo_overflow_drop; 1408231437Sluigi adapter_stats->rx_address_match_errors = 1409231437Sluigi port_stats->rx_address_match_errors; 1410231437Sluigi adapter_stats->rx_alignment_symbol_errors = 1411231437Sluigi port_stats->rx_alignment_symbol_errors; 1412231437Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1413231437Sluigi port_stats->rxpp_fifo_overflow_drop; 1414231437Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1415231437Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1416231437Sluigi adapter_stats->jabber_events = port_stats->jabber_events; 1417231437Sluigi 1418231437Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1419231437Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1420231437Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1421231437Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1422231437Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1423231437Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1424231437Sluigi adapter_stats->rx_drops_no_tpre_descr = 1425231437Sluigi rxf_stats->rx_drops_no_tpre_descr; 1426231437Sluigi adapter_stats->rx_drops_too_many_frags = 1427231437Sluigi rxf_stats->rx_drops_too_many_frags; 1428231437Sluigi 1429231437Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1430231437Sluigi} 1431231437Sluigi 1432231437Sluigi 1433231437Sluigiint 1434231437Sluigioce_stats_init(POCE_SOFTC sc) 1435231437Sluigi{ 1436231437Sluigi int rc = 0, sz; 1437231437Sluigi 1438252869Sdelphij if (IS_BE(sc) || IS_SH(sc)) { 1439231437Sluigi if (sc->flags & OCE_FLAGS_BE2) 1440231437Sluigi sz = sizeof(struct mbx_get_nic_stats_v0); 1441231437Sluigi else 1442231437Sluigi sz = sizeof(struct mbx_get_nic_stats); 1443231437Sluigi } else 1444231437Sluigi sz = sizeof(struct mbx_get_pport_stats); 1445231437Sluigi 1446231437Sluigi rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0); 1447231437Sluigi 1448231437Sluigi return rc; 1449231437Sluigi} 1450231437Sluigi 1451231437Sluigi 1452231437Sluigivoid 1453231437Sluigioce_stats_free(POCE_SOFTC sc) 1454231437Sluigi{ 1455231437Sluigi 1456231437Sluigi oce_dma_free(sc, &sc->stats_mem); 1457231437Sluigi 1458231437Sluigi} 1459231437Sluigi 1460231437Sluigi 1461231437Sluigiint 1462231437Sluigioce_refresh_nic_stats(POCE_SOFTC sc) 1463231437Sluigi{ 1464231437Sluigi int rc = 0, reset = 0; 1465231437Sluigi 1466252869Sdelphij if (IS_BE(sc) || IS_SH(sc)) { 1467231437Sluigi if (sc->flags & OCE_FLAGS_BE2) { 1468231437Sluigi rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem); 1469231437Sluigi if (!rc) 1470231437Sluigi copy_stats_to_sc_be2(sc); 1471231437Sluigi } else { 1472231437Sluigi rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem); 1473231437Sluigi if (!rc) 1474231437Sluigi copy_stats_to_sc_be3(sc); 1475231437Sluigi } 1476231437Sluigi 1477231437Sluigi } else { 1478231437Sluigi rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset); 1479231437Sluigi if (!rc) 1480231437Sluigi copy_stats_to_sc_xe201(sc); 1481231437Sluigi } 1482231437Sluigi 1483231437Sluigi return rc; 1484231437Sluigi} 1485247880Sdelphij 1486247880Sdelphijstatic int 1487247880Sdelphijoce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS) 1488247880Sdelphij{ 1489247880Sdelphij int result = 0, error; 1490247880Sdelphij int rc = 0; 1491247880Sdelphij POCE_SOFTC sc = (POCE_SOFTC) arg1; 1492247880Sdelphij 1493247880Sdelphij /* sysctl default handler */ 1494247880Sdelphij error = sysctl_handle_int(oidp, &result, 0, req); 1495247880Sdelphij if (error || !req->newptr) 1496247880Sdelphij return (error); 1497247880Sdelphij 1498247880Sdelphij if(result == -1) { 1499247880Sdelphij return EINVAL; 1500247880Sdelphij } 1501247880Sdelphij bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE); 1502247880Sdelphij 1503247880Sdelphij rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0); 1504247880Sdelphij if(rc) 1505247880Sdelphij return rc; 1506247880Sdelphij 1507247880Sdelphij rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2); 1508247880Sdelphij if(rc) 1509247880Sdelphij return rc; 1510247880Sdelphij 1511247880Sdelphij return rc; 1512247880Sdelphij} 1513