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: stable/11/sys/dev/oce/oce_sysctl.c 343300 2019-01-22 04:20:52Z 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); 46338938Sjpaetzelstatic void copy_stats_to_sc_sh(POCE_SOFTC sc); 47231437Sluigistatic int oce_sysctl_loopback(SYSCTL_HANDLER_ARGS); 48258941Sdelphijstatic int oce_sys_aic_enable(SYSCTL_HANDLER_ARGS); 49231437Sluigistatic int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 50257007Sdelphijstatic int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 51231437Sluigistatic int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS); 52231437Sluigistatic int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 53247880Sdelphijstatic int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS); 54231437Sluigistatic boolean_t oce_phy_flashing_required(POCE_SOFTC sc); 55231437Sluigistatic boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p, 56231437Sluigi int img_optype, uint32_t img_offset, 57231437Sluigi uint32_t img_size, uint32_t hdrs_size); 58231437Sluigistatic void oce_add_stats_sysctls_be3(POCE_SOFTC sc, 59231437Sluigi struct sysctl_ctx_list *ctx, 60231437Sluigi struct sysctl_oid *stats_node); 61231437Sluigistatic void oce_add_stats_sysctls_xe201(POCE_SOFTC sc, 62231437Sluigi struct sysctl_ctx_list *ctx, 63231437Sluigi struct sysctl_oid *stats_node); 64231437Sluigi 65257007Sdelphij 66231437Sluigiextern char component_revision[32]; 67343300Sdelphijuint8_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_SIZE]; 68231437Sluigi 69257007Sdelphijstruct flash_img_attri { 70257007Sdelphij int img_offset; 71257007Sdelphij int img_size; 72257007Sdelphij int img_type; 73257007Sdelphij bool skip_image; 74257007Sdelphij int optype; 75257007Sdelphij}; 76257007Sdelphij 77231437Sluigivoid 78231437Sluigioce_add_sysctls(POCE_SOFTC sc) 79231437Sluigi{ 80231437Sluigi 81231437Sluigi struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev); 82231437Sluigi struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev); 83231437Sluigi struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree); 84231437Sluigi struct sysctl_oid *stats_node; 85231437Sluigi 86231437Sluigi SYSCTL_ADD_STRING(ctx, child, 87231437Sluigi OID_AUTO, "component_revision", 88273377Shselasky CTLFLAG_RD, 89273377Shselasky component_revision, 90231437Sluigi sizeof(component_revision), 91231437Sluigi "EMULEX One-Connect device driver revision"); 92231437Sluigi 93231437Sluigi SYSCTL_ADD_STRING(ctx, child, 94231437Sluigi OID_AUTO, "firmware_version", 95273377Shselasky CTLFLAG_RD, 96273377Shselasky sc->fw_version, 97231437Sluigi sizeof(sc->fw_version), 98231437Sluigi "EMULEX One-Connect Firmware Version"); 99231437Sluigi 100231437Sluigi SYSCTL_ADD_INT(ctx, child, 101231437Sluigi OID_AUTO, "max_rsp_handled", 102273377Shselasky CTLFLAG_RW, 103231437Sluigi &oce_max_rsp_handled, 104231437Sluigi sizeof(oce_max_rsp_handled), 105231437Sluigi "Maximum receive frames handled per interupt"); 106231437Sluigi 107247880Sdelphij if ((sc->function_mode & FNM_FLEX10_MODE) || 108247880Sdelphij (sc->function_mode & FNM_UMC_MODE)) 109231437Sluigi SYSCTL_ADD_UINT(ctx, child, 110231437Sluigi OID_AUTO, "speed", 111231437Sluigi CTLFLAG_RD, 112231437Sluigi &sc->qos_link_speed, 113231437Sluigi 0,"QOS Speed"); 114231437Sluigi else 115231437Sluigi SYSCTL_ADD_UINT(ctx, child, 116231437Sluigi OID_AUTO, "speed", 117231437Sluigi CTLFLAG_RD, 118231437Sluigi &sc->speed, 119231437Sluigi 0,"Link Speed"); 120231437Sluigi 121231879Sluigi if (sc->function_mode & FNM_UMC_MODE) 122231879Sluigi SYSCTL_ADD_UINT(ctx, child, 123231879Sluigi OID_AUTO, "pvid", 124231879Sluigi CTLFLAG_RD, 125231879Sluigi &sc->pvid, 126231879Sluigi 0,"PVID"); 127231879Sluigi 128231437Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back", 129231437Sluigi CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, 130231437Sluigi oce_sysctl_loopback, "I", "Loop Back Tests"); 131231437Sluigi 132231437Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade", 133231437Sluigi CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0, 134231437Sluigi oce_sys_fwupgrade, "A", "Firmware ufi file"); 135231437Sluigi 136258941Sdelphij SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "aic_enable", 137258941Sdelphij CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 1, 138258941Sdelphij oce_sys_aic_enable, "I", "aic flags"); 139258941Sdelphij 140247880Sdelphij /* 141247880Sdelphij * Dumps Transceiver data 142247880Sdelphij * "sysctl dev.oce.0.sfp_vpd_dump=0" 143247880Sdelphij * "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump 144247880Sdelphij * "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump 145247880Sdelphij */ 146247880Sdelphij SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump", 147247880Sdelphij CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump, 148247880Sdelphij "I", "Initiate a sfp_vpd_dump operation"); 149247880Sdelphij SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer", 150247880Sdelphij CTLFLAG_RD, sfp_vpd_dump_buffer, 151247880Sdelphij TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer"); 152247880Sdelphij 153231437Sluigi stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", 154231437Sluigi CTLFLAG_RD, NULL, "Ethernet Statistics"); 155231437Sluigi 156252869Sdelphij if (IS_BE(sc) || IS_SH(sc)) 157231437Sluigi oce_add_stats_sysctls_be3(sc, ctx, stats_node); 158231437Sluigi else 159231437Sluigi oce_add_stats_sysctls_xe201(sc, ctx, stats_node); 160231437Sluigi 161231437Sluigi 162231437Sluigi} 163231437Sluigi 164231437Sluigi 165231437Sluigistatic uint32_t 166231437Sluigioce_loopback_test(struct oce_softc *sc, uint8_t loopback_type) 167231437Sluigi{ 168231437Sluigi uint32_t status = 0; 169231437Sluigi 170257007Sdelphij oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1); 171257007Sdelphij status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type, 172231437Sluigi 1500, 2, 0xabc); 173257007Sdelphij oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1); 174231437Sluigi 175231437Sluigi return status; 176231437Sluigi} 177231437Sluigi 178231437Sluigistatic int 179258941Sdelphijoce_sys_aic_enable(SYSCTL_HANDLER_ARGS) 180258941Sdelphij{ 181258941Sdelphij int value = 0; 182258941Sdelphij uint32_t status, vector; 183258941Sdelphij POCE_SOFTC sc = (struct oce_softc *)arg1; 184258941Sdelphij struct oce_aic_obj *aic; 185258941Sdelphij 186338938Sjpaetzel /* set current value for proper sysctl logging */ 187338938Sjpaetzel value = sc->aic_obj[0].enable; 188258941Sdelphij status = sysctl_handle_int(oidp, &value, 0, req); 189258941Sdelphij if (status || !req->newptr) 190258941Sdelphij return status; 191258941Sdelphij 192258941Sdelphij for (vector = 0; vector < sc->intr_count; vector++) { 193258941Sdelphij aic = &sc->aic_obj[vector]; 194258941Sdelphij 195258941Sdelphij if (value == 0){ 196258941Sdelphij aic->max_eqd = aic->min_eqd = aic->et_eqd = 0; 197258941Sdelphij aic->enable = 0; 198258941Sdelphij } 199258941Sdelphij else { 200258941Sdelphij aic->max_eqd = OCE_MAX_EQD; 201258941Sdelphij aic->min_eqd = OCE_MIN_EQD; 202258941Sdelphij aic->et_eqd = OCE_MIN_EQD; 203258941Sdelphij aic->enable = TRUE; 204258941Sdelphij } 205258941Sdelphij } 206258941Sdelphij return 0; 207258941Sdelphij} 208258941Sdelphij 209258941Sdelphijstatic int 210231437Sluigioce_sysctl_loopback(SYSCTL_HANDLER_ARGS) 211231437Sluigi{ 212231437Sluigi int value = 0; 213231437Sluigi uint32_t status; 214231437Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 215231437Sluigi 216231437Sluigi status = sysctl_handle_int(oidp, &value, 0, req); 217231437Sluigi if (status || !req->newptr) 218231437Sluigi return status; 219231437Sluigi 220231437Sluigi if (value != 1) { 221231437Sluigi device_printf(sc->dev, 222231437Sluigi "Not a Valid value. Set to loop_back=1 to run tests\n"); 223231437Sluigi return 0; 224231437Sluigi } 225231437Sluigi 226231437Sluigi if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) { 227231437Sluigi device_printf(sc->dev, 228231437Sluigi "MAC Loopback Test = Failed (Error status = %d)\n", 229231437Sluigi status); 230231437Sluigi } else 231231437Sluigi device_printf(sc->dev, "MAC Loopback Test = Success\n"); 232231437Sluigi 233231437Sluigi if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) { 234231437Sluigi device_printf(sc->dev, 235231437Sluigi "PHY Loopback Test = Failed (Error status = %d)\n", 236231437Sluigi status); 237231437Sluigi } else 238231437Sluigi device_printf(sc->dev, "PHY Loopback Test = Success\n"); 239231437Sluigi 240231437Sluigi if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) { 241231437Sluigi device_printf(sc->dev, 242231437Sluigi "EXT Loopback Test = Failed (Error status = %d)\n", 243231437Sluigi status); 244231437Sluigi } else 245231437Sluigi device_printf(sc->dev, "EXT Loopback Test = Success\n"); 246231437Sluigi 247231437Sluigi return 0; 248231437Sluigi} 249231437Sluigi 250231437Sluigi 251231437Sluigistatic int 252231437Sluigioce_sys_fwupgrade(SYSCTL_HANDLER_ARGS) 253231437Sluigi{ 254231437Sluigi char ufiname[256] = {0}; 255231437Sluigi uint32_t status = 1; 256231437Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 257231437Sluigi const struct firmware *fw; 258231437Sluigi 259231437Sluigi status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req); 260231437Sluigi if (status || !req->newptr) 261231437Sluigi return status; 262231437Sluigi 263231437Sluigi fw = firmware_get(ufiname); 264231437Sluigi if (fw == NULL) { 265231437Sluigi device_printf(sc->dev, "Unable to get Firmware. " 266231437Sluigi "Make sure %s is copied to /boot/modules\n", ufiname); 267231437Sluigi return ENOENT; 268231437Sluigi } 269231437Sluigi 270257007Sdelphij if (IS_BE(sc)) { 271231437Sluigi if ((sc->flags & OCE_FLAGS_BE2)) { 272231437Sluigi device_printf(sc->dev, 273231437Sluigi "Flashing not supported for BE2 yet.\n"); 274231437Sluigi status = 1; 275231437Sluigi goto done; 276231437Sluigi } 277231437Sluigi status = oce_be3_fwupgrade(sc, fw); 278257007Sdelphij } else if (IS_SH(sc)) { 279257007Sdelphij status = oce_skyhawk_fwupgrade(sc,fw); 280231437Sluigi } else 281231437Sluigi status = oce_lancer_fwupgrade(sc, fw); 282231437Sluigidone: 283231437Sluigi if (status) { 284231437Sluigi device_printf(sc->dev, "Firmware Upgrade failed\n"); 285231437Sluigi } else { 286231437Sluigi device_printf(sc->dev, "Firmware Flashed successfully\n"); 287231437Sluigi } 288231437Sluigi 289231437Sluigi /* Release Firmware*/ 290231437Sluigi firmware_put(fw, FIRMWARE_UNLOAD); 291231437Sluigi 292231437Sluigi return status; 293231437Sluigi} 294231437Sluigi 295257007Sdelphijstatic void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec, 296257007Sdelphij struct flash_img_attri *pimg, int i, 297257007Sdelphij const struct firmware *fw, int bin_offset) 298231437Sluigi{ 299257007Sdelphij if (IS_SH(sc)) { 300257007Sdelphij pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset); 301257007Sdelphij pimg->img_size = HOST_32(fsec->fsec_entry[i].pad_size); 302231437Sluigi } 303231437Sluigi 304257007Sdelphij pimg->img_type = HOST_32(fsec->fsec_entry[i].type); 305257007Sdelphij pimg->skip_image = FALSE; 306257007Sdelphij switch (pimg->img_type) { 307257007Sdelphij case IMG_ISCSI: 308257007Sdelphij pimg->optype = 0; 309257007Sdelphij if (IS_BE3(sc)) { 310257007Sdelphij pimg->img_offset = 2097152; 311257007Sdelphij pimg->img_size = 2097152; 312257007Sdelphij } 313231437Sluigi break; 314257007Sdelphij case IMG_REDBOOT: 315257007Sdelphij pimg->optype = 1; 316257007Sdelphij if (IS_BE3(sc)) { 317257007Sdelphij pimg->img_offset = 262144; 318257007Sdelphij pimg->img_size = 1048576; 319257007Sdelphij } 320257007Sdelphij if (!oce_img_flashing_required(sc, fw->data, 321257007Sdelphij pimg->optype, 322257007Sdelphij pimg->img_offset, 323257007Sdelphij pimg->img_size, 324257007Sdelphij bin_offset)) 325257007Sdelphij pimg->skip_image = TRUE; 326257007Sdelphij break; 327257007Sdelphij case IMG_BIOS: 328257007Sdelphij pimg->optype = 2; 329257007Sdelphij if (IS_BE3(sc)) { 330257007Sdelphij pimg->img_offset = 12582912; 331257007Sdelphij pimg->img_size = 524288; 332257007Sdelphij } 333257007Sdelphij break; 334257007Sdelphij case IMG_PXEBIOS: 335257007Sdelphij pimg->optype = 3; 336257007Sdelphij if (IS_BE3(sc)) { 337297793Spfg pimg->img_offset = 13107200; 338257007Sdelphij pimg->img_size = 524288; 339257007Sdelphij } 340257007Sdelphij break; 341257007Sdelphij case IMG_FCOEBIOS: 342257007Sdelphij pimg->optype = 8; 343257007Sdelphij if (IS_BE3(sc)) { 344257007Sdelphij pimg->img_offset = 13631488; 345257007Sdelphij pimg->img_size = 524288; 346257007Sdelphij } 347257007Sdelphij break; 348257007Sdelphij case IMG_ISCSI_BAK: 349257007Sdelphij pimg->optype = 9; 350257007Sdelphij if (IS_BE3(sc)) { 351257007Sdelphij pimg->img_offset = 4194304; 352257007Sdelphij pimg->img_size = 2097152; 353257007Sdelphij } 354257007Sdelphij break; 355257007Sdelphij case IMG_FCOE: 356257007Sdelphij pimg->optype = 10; 357257007Sdelphij if (IS_BE3(sc)) { 358257007Sdelphij pimg->img_offset = 6291456; 359257007Sdelphij pimg->img_size = 2097152; 360257007Sdelphij } 361257007Sdelphij break; 362257007Sdelphij case IMG_FCOE_BAK: 363257007Sdelphij pimg->optype = 11; 364257007Sdelphij if (IS_BE3(sc)) { 365257007Sdelphij pimg->img_offset = 8388608; 366257007Sdelphij pimg->img_size = 2097152; 367257007Sdelphij } 368257007Sdelphij break; 369257007Sdelphij case IMG_NCSI: 370257007Sdelphij pimg->optype = 13; 371257007Sdelphij if (IS_BE3(sc)) { 372257007Sdelphij pimg->img_offset = 15990784; 373257007Sdelphij pimg->img_size = 262144; 374257007Sdelphij } 375257007Sdelphij break; 376257007Sdelphij case IMG_PHY: 377257007Sdelphij pimg->optype = 99; 378257007Sdelphij if (IS_BE3(sc)) { 379257007Sdelphij pimg->img_offset = 1310720; 380257007Sdelphij pimg->img_size = 262144; 381257007Sdelphij } 382257007Sdelphij if (!oce_phy_flashing_required(sc)) 383257007Sdelphij pimg->skip_image = TRUE; 384257007Sdelphij break; 385257007Sdelphij default: 386257007Sdelphij pimg->skip_image = TRUE; 387257007Sdelphij break; 388231437Sluigi } 389231437Sluigi 390231437Sluigi} 391231437Sluigi 392231437Sluigistatic int 393257007Sdelphijoce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs) 394231437Sluigi{ 395231437Sluigi char cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "}; 396231437Sluigi const char *p = (const char *)fw->data; 397231437Sluigi const struct flash_sec_info *fsec = NULL; 398231437Sluigi struct mbx_common_read_write_flashrom *req; 399257007Sdelphij int rc = 0, i, bin_offset = 0, opcode, num_bytes; 400231437Sluigi OCE_DMA_MEM dma_mem; 401257007Sdelphij struct flash_img_attri imgatt; 402231437Sluigi 403231437Sluigi /* Validate Cookie */ 404231437Sluigi bin_offset = (sizeof(struct flash_file_hdr) + 405257007Sdelphij (num_imgs * sizeof(struct image_hdr))); 406231437Sluigi p += bin_offset; 407231437Sluigi while (p < ((const char *)fw->data + fw->datasize)) { 408231437Sluigi fsec = (const struct flash_sec_info *)p; 409231437Sluigi if (!memcmp(cookie, fsec->cookie, sizeof(cookie))) 410231437Sluigi break; 411231437Sluigi fsec = NULL; 412231437Sluigi p += 32; 413231437Sluigi } 414231437Sluigi 415231437Sluigi if (!fsec) { 416231437Sluigi device_printf(sc->dev, 417257007Sdelphij "Invalid Cookie. Firmware image corrupted ?\n"); 418231437Sluigi return EINVAL; 419231437Sluigi } 420231437Sluigi 421258140Sdelphij rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom), 422258140Sdelphij &dma_mem, 0); 423231437Sluigi if (rc) { 424231437Sluigi device_printf(sc->dev, 425257007Sdelphij "Memory allocation failure while flashing\n"); 426231437Sluigi return ENOMEM; 427231437Sluigi } 428231437Sluigi req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom); 429231437Sluigi 430257007Sdelphij if (IS_SH(sc)) 431257007Sdelphij num_imgs = HOST_32(fsec->fsec_hdr.num_images); 432257007Sdelphij else if (IS_BE3(sc)) 433257007Sdelphij num_imgs = MAX_FLASH_COMP; 434231437Sluigi 435257007Sdelphij for (i = 0; i < num_imgs; i++) { 436257007Sdelphij 437257007Sdelphij bzero(&imgatt, sizeof(struct flash_img_attri)); 438257007Sdelphij 439257007Sdelphij oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset); 440257007Sdelphij 441257007Sdelphij if (imgatt.skip_image) 442231437Sluigi continue; 443231437Sluigi 444231437Sluigi p = fw->data; 445257007Sdelphij p = p + bin_offset + imgatt.img_offset; 446257007Sdelphij 447257007Sdelphij if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) { 448231437Sluigi rc = 1; 449231437Sluigi goto ret; 450231437Sluigi } 451231437Sluigi 452257007Sdelphij while (imgatt.img_size) { 453231437Sluigi 454257007Sdelphij if (imgatt.img_size > 32*1024) 455231437Sluigi num_bytes = 32*1024; 456231437Sluigi else 457257007Sdelphij num_bytes = imgatt.img_size; 458257007Sdelphij imgatt.img_size -= num_bytes; 459231437Sluigi 460257007Sdelphij if (!imgatt.img_size) 461231437Sluigi opcode = FLASHROM_OPER_FLASH; 462231437Sluigi else 463231437Sluigi opcode = FLASHROM_OPER_SAVE; 464231437Sluigi 465231437Sluigi memcpy(req->data_buffer, p, num_bytes); 466231437Sluigi p += num_bytes; 467231437Sluigi 468257007Sdelphij rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode, 469257007Sdelphij &dma_mem, num_bytes); 470231437Sluigi if (rc) { 471231437Sluigi device_printf(sc->dev, 472257007Sdelphij "cmd to write to flash rom failed.\n"); 473231437Sluigi rc = EIO; 474231437Sluigi goto ret; 475231437Sluigi } 476231437Sluigi /* Leave the CPU for others for some time */ 477231437Sluigi pause("yield", 10); 478231437Sluigi 479231437Sluigi } 480257007Sdelphij 481231437Sluigi } 482257007Sdelphij 483231437Sluigiret: 484231437Sluigi oce_dma_free(sc, &dma_mem); 485231437Sluigi return rc; 486257007Sdelphij} 487231437Sluigi 488338938Sjpaetzel#define UFI_TYPE2 2 489338938Sjpaetzel#define UFI_TYPE3 3 490338938Sjpaetzel#define UFI_TYPE3R 10 491338938Sjpaetzel#define UFI_TYPE4 4 492338938Sjpaetzel#define UFI_TYPE4R 11 493257007Sdelphijstatic int oce_get_ufi_type(POCE_SOFTC sc, 494338938Sjpaetzel const struct flash_file_hdr *fhdr) 495257007Sdelphij{ 496338938Sjpaetzel if (fhdr == NULL) 497338938Sjpaetzel goto be_get_ufi_exit; 498257007Sdelphij 499338938Sjpaetzel if (IS_SH(sc) && fhdr->build[0] == '4') { 500338938Sjpaetzel if (fhdr->asic_type_rev >= 0x10) 501338938Sjpaetzel return UFI_TYPE4R; 502338938Sjpaetzel else 503338938Sjpaetzel return UFI_TYPE4; 504338938Sjpaetzel } else if (IS_BE3(sc) && fhdr->build[0] == '3') { 505338938Sjpaetzel if (fhdr->asic_type_rev == 0x10) 506338938Sjpaetzel return UFI_TYPE3R; 507338938Sjpaetzel else 508338938Sjpaetzel return UFI_TYPE3; 509338938Sjpaetzel } else if (IS_BE2(sc) && fhdr->build[0] == '2') 510338938Sjpaetzel return UFI_TYPE2; 511257007Sdelphij 512257007Sdelphijbe_get_ufi_exit: 513338938Sjpaetzel device_printf(sc->dev, 514338938Sjpaetzel "UFI and Interface are not compatible for flashing\n"); 515338938Sjpaetzel return -1; 516231437Sluigi} 517231437Sluigi 518231437Sluigi 519257007Sdelphijstatic int 520257007Sdelphijoce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 521257007Sdelphij{ 522257007Sdelphij int rc = 0, num_imgs = 0, i = 0, ufi_type; 523257007Sdelphij const struct flash_file_hdr *fhdr; 524257007Sdelphij const struct image_hdr *img_ptr; 525257007Sdelphij 526257007Sdelphij fhdr = (const struct flash_file_hdr *)fw->data; 527257007Sdelphij 528257007Sdelphij ufi_type = oce_get_ufi_type(sc, fhdr); 529257007Sdelphij 530257007Sdelphij /* Display flash version */ 531257007Sdelphij device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 532257007Sdelphij 533257007Sdelphij num_imgs = fhdr->num_imgs; 534257007Sdelphij for (i = 0; i < num_imgs; i++) { 535257007Sdelphij img_ptr = (const struct image_hdr *)((const char *)fw->data + 536257007Sdelphij sizeof(struct flash_file_hdr) + 537257007Sdelphij (i * sizeof(struct image_hdr))); 538257007Sdelphij 539257007Sdelphij if (img_ptr->imageid != 1) 540257007Sdelphij continue; 541257007Sdelphij 542257007Sdelphij switch (ufi_type) { 543257007Sdelphij case UFI_TYPE4R: 544257007Sdelphij rc = oce_sh_be3_flashdata(sc, fw, 545257007Sdelphij num_imgs); 546257007Sdelphij break; 547257007Sdelphij case UFI_TYPE4: 548257007Sdelphij if (sc->asic_revision < 0x10) 549257007Sdelphij rc = oce_sh_be3_flashdata(sc, fw, 550257007Sdelphij num_imgs); 551257007Sdelphij else { 552257007Sdelphij rc = -1; 553257007Sdelphij device_printf(sc->dev, 554257007Sdelphij "Cant load SH A0 UFI on B0\n"); 555257007Sdelphij } 556257007Sdelphij break; 557257007Sdelphij default: 558257007Sdelphij rc = -1; 559257007Sdelphij break; 560257007Sdelphij 561257007Sdelphij } 562257007Sdelphij } 563257007Sdelphij 564257007Sdelphij return rc; 565257007Sdelphij} 566257007Sdelphij 567257007Sdelphijstatic int 568257007Sdelphijoce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 569257007Sdelphij{ 570257007Sdelphij int rc = 0, num_imgs = 0, i = 0; 571257007Sdelphij const struct flash_file_hdr *fhdr; 572257007Sdelphij const struct image_hdr *img_ptr; 573257007Sdelphij 574257007Sdelphij fhdr = (const struct flash_file_hdr *)fw->data; 575257007Sdelphij if (fhdr->build[0] != '3') { 576257007Sdelphij device_printf(sc->dev, "Invalid BE3 firmware image\n"); 577257007Sdelphij return EINVAL; 578257007Sdelphij } 579257007Sdelphij /* Display flash version */ 580257007Sdelphij device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 581257007Sdelphij 582257007Sdelphij num_imgs = fhdr->num_imgs; 583257007Sdelphij for (i = 0; i < num_imgs; i++) { 584257007Sdelphij img_ptr = (const struct image_hdr *)((const char *)fw->data + 585257007Sdelphij sizeof(struct flash_file_hdr) + 586257007Sdelphij (i * sizeof(struct image_hdr))); 587257007Sdelphij if (img_ptr->imageid == 1) { 588257007Sdelphij rc = oce_sh_be3_flashdata(sc, fw, num_imgs); 589257007Sdelphij 590257007Sdelphij break; 591257007Sdelphij } 592257007Sdelphij } 593257007Sdelphij 594257007Sdelphij return rc; 595257007Sdelphij} 596257007Sdelphij 597257007Sdelphij 598231437Sluigistatic boolean_t 599231437Sluigioce_phy_flashing_required(POCE_SOFTC sc) 600231437Sluigi{ 601231437Sluigi int status = 0; 602231437Sluigi struct oce_phy_info phy_info; 603231437Sluigi 604231437Sluigi status = oce_mbox_get_phy_info(sc, &phy_info); 605231437Sluigi if (status) 606231437Sluigi return FALSE; 607231437Sluigi 608231437Sluigi if ((phy_info.phy_type == TN_8022) && 609231437Sluigi (phy_info.interface_type == PHY_TYPE_BASET_10GB)) { 610231437Sluigi return TRUE; 611231437Sluigi } 612231437Sluigi 613231437Sluigi return FALSE; 614231437Sluigi} 615231437Sluigi 616231437Sluigi 617231437Sluigistatic boolean_t 618231437Sluigioce_img_flashing_required(POCE_SOFTC sc, const char *p, 619231437Sluigi int img_optype, uint32_t img_offset, 620231437Sluigi uint32_t img_size, uint32_t hdrs_size) 621231437Sluigi{ 622231437Sluigi uint32_t crc_offset; 623231437Sluigi uint8_t flashed_crc[4]; 624231437Sluigi int status; 625231437Sluigi 626231437Sluigi crc_offset = hdrs_size + img_offset + img_size - 4; 627231437Sluigi 628231437Sluigi p += crc_offset; 629231437Sluigi 630231437Sluigi status = oce_mbox_get_flashrom_crc(sc, flashed_crc, 631231437Sluigi (img_size - 4), img_optype); 632231437Sluigi if (status) 633231437Sluigi return TRUE; /* Some thing worng. ReFlash */ 634231437Sluigi 635231437Sluigi /*update redboot only if crc does not match*/ 636231437Sluigi if (bcmp(flashed_crc, p, 4)) 637231437Sluigi return TRUE; 638231437Sluigi else 639231437Sluigi return FALSE; 640231437Sluigi} 641231437Sluigi 642231437Sluigi 643231437Sluigistatic int 644231437Sluigioce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 645231437Sluigi{ 646231437Sluigi 647231437Sluigi int rc = 0; 648231437Sluigi OCE_DMA_MEM dma_mem; 649231437Sluigi const uint8_t *data = NULL; 650231437Sluigi uint8_t *dest_image_ptr = NULL; 651231437Sluigi size_t size = 0; 652231437Sluigi uint32_t data_written = 0, chunk_size = 0; 653231437Sluigi uint32_t offset = 0, add_status = 0; 654231437Sluigi 655231437Sluigi if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) { 656231437Sluigi device_printf(sc->dev, 657231437Sluigi "Lancer FW image is not 4 byte aligned."); 658231437Sluigi return EINVAL; 659231437Sluigi } 660231437Sluigi 661231437Sluigi rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0); 662231437Sluigi if (rc) { 663231437Sluigi device_printf(sc->dev, 664231437Sluigi "Memory allocation failure while flashing Lancer\n"); 665231437Sluigi return ENOMEM; 666231437Sluigi } 667231437Sluigi 668231437Sluigi size = fw->datasize; 669231437Sluigi data = fw->data; 670231437Sluigi dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t); 671231437Sluigi 672231437Sluigi while (size) { 673231437Sluigi chunk_size = MIN(size, (32*1024)); 674231437Sluigi 675231437Sluigi bcopy(data, dest_image_ptr, chunk_size); 676231437Sluigi 677231437Sluigi rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset, 678231437Sluigi &dma_mem, &data_written, &add_status); 679231437Sluigi 680231437Sluigi if (rc) 681231437Sluigi break; 682231437Sluigi 683231437Sluigi size -= data_written; 684231437Sluigi data += data_written; 685231437Sluigi offset += data_written; 686231437Sluigi pause("yield", 10); 687231437Sluigi 688231437Sluigi } 689231437Sluigi 690231437Sluigi if (!rc) 691231437Sluigi /* Commit the firmware*/ 692231437Sluigi rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem, 693231437Sluigi &data_written, &add_status); 694231437Sluigi if (rc) { 695231437Sluigi device_printf(sc->dev, "Lancer firmware load error. " 696231437Sluigi "Addstatus = 0x%x, status = %d \n", add_status, rc); 697231437Sluigi rc = EIO; 698231437Sluigi } 699231437Sluigi oce_dma_free(sc, &dma_mem); 700231437Sluigi return rc; 701231437Sluigi 702231437Sluigi} 703231437Sluigi 704231437Sluigi 705231437Sluigistatic void 706231437Sluigioce_add_stats_sysctls_be3(POCE_SOFTC sc, 707231437Sluigi struct sysctl_ctx_list *ctx, 708231437Sluigi struct sysctl_oid *stats_node) 709231437Sluigi{ 710231437Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 711231437Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 712231437Sluigi struct sysctl_oid_list *queue_stats_list; 713231437Sluigi struct sysctl_oid *queue_stats_node; 714231437Sluigi struct oce_drv_stats *stats; 715231437Sluigi char prefix[32]; 716231437Sluigi int i; 717231437Sluigi 718231437Sluigi stats = &sc->oce_stats_info; 719231437Sluigi 720231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 721231437Sluigi SYSCTL_CHILDREN(stats_node), 722231437Sluigi OID_AUTO,"rx", CTLFLAG_RD, 723231437Sluigi NULL, "RX Ethernet Statistics"); 724231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 725231437Sluigi 726231437Sluigi 727231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 728231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 729231437Sluigi "Total Received Packets"); 730231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 731231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 732231437Sluigi "Total Received Bytes"); 733231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 734231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 735231437Sluigi "Total Received Fragements"); 736231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 737231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 738231437Sluigi "Total Received Multicast Packets"); 739231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 740231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 741231437Sluigi "Total Received Unicast Packets"); 742231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 743231437Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 744231437Sluigi "Total Receive completion errors"); 745231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 746231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0, 747231437Sluigi "Pause Frames"); 748231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames", 749231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0, 750231437Sluigi "Priority Pause Frames"); 751231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 752231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0, 753231437Sluigi "Control Frames"); 754231437Sluigi 755231437Sluigi for (i = 0; i < sc->nrqs; i++) { 756231437Sluigi sprintf(prefix, "queue%d",i); 757231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 758231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 759231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 760231437Sluigi NULL, "Queue name"); 761231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 762231437Sluigi 763231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 764231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 765231437Sluigi "Receive Packets"); 766231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 767231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 768231437Sluigi "Recived Bytes"); 769231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 770231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 771231437Sluigi "Received Fragments"); 772231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 773231437Sluigi "rx_mcast_pkts", CTLFLAG_RD, 774231437Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 775231437Sluigi "Received Multicast Packets"); 776231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 777231437Sluigi "rx_ucast_pkts", CTLFLAG_RD, 778231437Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 779231437Sluigi "Received Unicast Packets"); 780231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 781231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 782231437Sluigi "Received Completion Errors"); 783338938Sjpaetzel if(IS_SH(sc)) { 784338938Sjpaetzel SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_drops_no_frags", 785338938Sjpaetzel CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_drops_no_frags, 0, 786338938Sjpaetzel "num of packet drops due to no fragments"); 787338938Sjpaetzel } 788231437Sluigi } 789231437Sluigi 790231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 791231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 792231437Sluigi OID_AUTO, "err", CTLFLAG_RD, 793231437Sluigi NULL, "Receive Error Stats"); 794231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 795231437Sluigi 796231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 797231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0, 798231437Sluigi "CRC Errors"); 799231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors", 800231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0, 801231437Sluigi "Drops due to pbuf full"); 802231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors", 803231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0, 804231437Sluigi "ERX Errors"); 805231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 806231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0, 807231437Sluigi "RX Alignmnet Errors"); 808231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 809231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0, 810231437Sluigi "In Range Errors"); 811231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 812231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0, 813231437Sluigi "Out Range Errors"); 814231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 815231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0, 816231437Sluigi "Frame Too Long"); 817231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 818231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0, 819231437Sluigi "Address Match Errors"); 820231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 821231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0, 822231437Sluigi "Dropped Too Small"); 823231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 824231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0, 825231437Sluigi "Dropped Too Short"); 826231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 827231437Sluigi "dropped_header_too_small", CTLFLAG_RD, 828231437Sluigi &stats->u0.be.rx_dropped_header_too_small, 0, 829231437Sluigi "Dropped Header Too Small"); 830231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length", 831231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0, 832231437Sluigi "Dropped TCP Length"); 833231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 834231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0, 835231437Sluigi "Dropped runt"); 836231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 837231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0, 838231437Sluigi "IP Checksum Errors"); 839231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 840231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0, 841231437Sluigi "TCP Checksum Errors"); 842231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 843231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0, 844231437Sluigi "UDP Checksum Errors"); 845231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop", 846231437Sluigi CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0, 847231437Sluigi "FIFO Overflow Drop"); 848231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 849231437Sluigi "input_fifo_overflow_drop", CTLFLAG_RD, 850231437Sluigi &stats->u0.be.rx_input_fifo_overflow_drop, 0, 851231437Sluigi "Input FIFO Overflow Drop"); 852231437Sluigi 853231437Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 854231437Sluigi SYSCTL_CHILDREN(stats_node), OID_AUTO, 855231437Sluigi "tx",CTLFLAG_RD, NULL, 856231437Sluigi "TX Ethernet Statistics"); 857231437Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 858231437Sluigi 859231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 860231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 861231437Sluigi "Total Transmit Packets"); 862231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 863231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 864231437Sluigi "Total Transmit Bytes"); 865231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 866231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 867231437Sluigi "Total Transmit Requests"); 868231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 869231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 870231437Sluigi "Total Transmit Stops"); 871231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 872231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 873231437Sluigi "Total Transmit WRB's"); 874231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 875231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 876231437Sluigi "Total Transmit Completions"); 877231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 878231437Sluigi "total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 879231437Sluigi &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 880231437Sluigi "Total Transmit IPV6 Drops"); 881231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 882231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0, 883231437Sluigi "Pause Frames"); 884231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes", 885231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0, 886231437Sluigi "Priority Pauseframes"); 887231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 888231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0, 889231437Sluigi "Tx Control Frames"); 890231437Sluigi 891231437Sluigi for (i = 0; i < sc->nwqs; i++) { 892231437Sluigi sprintf(prefix, "queue%d",i); 893231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 894231437Sluigi SYSCTL_CHILDREN(tx_stats_node), 895231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 896231437Sluigi NULL, "Queue name"); 897231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 898231437Sluigi 899231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 900231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 901231437Sluigi "Transmit Packets"); 902231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 903231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 904231437Sluigi "Transmit Bytes"); 905231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 906231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 907231437Sluigi "Transmit Requests"); 908231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 909231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 910231437Sluigi "Transmit Stops"); 911231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 912231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 913231437Sluigi "Transmit WRB's"); 914231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 915231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 916231437Sluigi "Transmit Completions"); 917231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 918231437Sluigi "ipv6_ext_hdr_tx_drop",CTLFLAG_RD, 919231437Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 920231437Sluigi "Transmit IPV6 Ext Header Drop"); 921231437Sluigi 922231437Sluigi } 923231437Sluigi return; 924231437Sluigi} 925231437Sluigi 926231437Sluigi 927231437Sluigistatic void 928231437Sluigioce_add_stats_sysctls_xe201(POCE_SOFTC sc, 929231437Sluigi struct sysctl_ctx_list *ctx, 930231437Sluigi struct sysctl_oid *stats_node) 931231437Sluigi{ 932231437Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 933231437Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 934231437Sluigi struct sysctl_oid_list *queue_stats_list; 935231437Sluigi struct sysctl_oid *queue_stats_node; 936231437Sluigi struct oce_drv_stats *stats; 937231437Sluigi char prefix[32]; 938231437Sluigi int i; 939231437Sluigi 940231437Sluigi stats = &sc->oce_stats_info; 941231437Sluigi 942231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 943231437Sluigi SYSCTL_CHILDREN(stats_node), 944231437Sluigi OID_AUTO, "rx", CTLFLAG_RD, 945231437Sluigi NULL, "RX Ethernet Statistics"); 946231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 947231437Sluigi 948231437Sluigi 949231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 950231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 951231437Sluigi "Total Received Packets"); 952231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 953231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 954231437Sluigi "Total Received Bytes"); 955231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 956231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 957231437Sluigi "Total Received Fragements"); 958231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 959231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 960231437Sluigi "Total Received Multicast Packets"); 961231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 962231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 963231437Sluigi "Total Received Unicast Packets"); 964231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 965231437Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 966231437Sluigi "Total Receive completion errors"); 967273377Shselasky SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "pause_frames", 968273377Shselasky CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 969231437Sluigi "Pause Frames"); 970273377Shselasky SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "control_frames", 971273377Shselasky CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 972231437Sluigi "Control Frames"); 973231437Sluigi 974231437Sluigi for (i = 0; i < sc->nrqs; i++) { 975231437Sluigi sprintf(prefix, "queue%d",i); 976231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 977231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 978231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 979231437Sluigi NULL, "Queue name"); 980231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 981231437Sluigi 982231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 983231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 984231437Sluigi "Receive Packets"); 985231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 986231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 987231437Sluigi "Recived Bytes"); 988231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 989231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 990231437Sluigi "Received Fragments"); 991231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 992231437Sluigi "rx_mcast_pkts", CTLFLAG_RD, 993231437Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 994231437Sluigi "Received Multicast Packets"); 995231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 996231437Sluigi "rx_ucast_pkts",CTLFLAG_RD, 997231437Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 998231437Sluigi "Received Unicast Packets"); 999231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 1000231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 1001231437Sluigi "Received Completion Errors"); 1002231437Sluigi 1003231437Sluigi } 1004231437Sluigi 1005231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 1006231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 1007231437Sluigi OID_AUTO, "err", CTLFLAG_RD, 1008231437Sluigi NULL, "Receive Error Stats"); 1009231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 1010231437Sluigi 1011273377Shselasky SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "crc_errs", 1012273377Shselasky CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 1013231437Sluigi "CRC Errors"); 1014273377Shselasky SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 1015273377Shselasky CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 1016231437Sluigi "RX Alignmnet Errors"); 1017231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 1018231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0, 1019231437Sluigi "In Range Errors"); 1020231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 1021231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0, 1022231437Sluigi "Out Range Errors"); 1023273377Shselasky SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 1024273377Shselasky CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 1025231437Sluigi "Frame Too Long"); 1026231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 1027231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0, 1028231437Sluigi "Address Match Errors"); 1029231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 1030231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0, 1031231437Sluigi "Dropped Too Small"); 1032231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 1033231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0, 1034231437Sluigi "Dropped Too Short"); 1035231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 1036231437Sluigi "dropped_header_too_small", CTLFLAG_RD, 1037231437Sluigi &stats->u0.xe201.rx_dropped_header_too_small, 0, 1038231437Sluigi "Dropped Header Too Small"); 1039231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 1040231437Sluigi "dropped_tcp_length", CTLFLAG_RD, 1041231437Sluigi &stats->u0.xe201.rx_dropped_invalid_tcp_length, 0, 1042231437Sluigi "Dropped TCP Length"); 1043231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 1044231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0, 1045231437Sluigi "Dropped runt"); 1046231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 1047231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0, 1048231437Sluigi "IP Checksum Errors"); 1049231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 1050231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0, 1051231437Sluigi "TCP Checksum Errors"); 1052231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 1053231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0, 1054231437Sluigi "UDP Checksum Errors"); 1055231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop", 1056231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0, 1057231437Sluigi "Input FIFO Overflow Drop"); 1058231437Sluigi 1059231437Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 1060231437Sluigi SYSCTL_CHILDREN(stats_node), 1061231437Sluigi OID_AUTO, "tx", CTLFLAG_RD, 1062231437Sluigi NULL, "TX Ethernet Statistics"); 1063231437Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 1064231437Sluigi 1065231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 1066231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 1067231437Sluigi "Total Transmit Packets"); 1068231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 1069231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 1070231437Sluigi "Total Transmit Bytes"); 1071231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 1072231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 1073231437Sluigi "Total Transmit Requests"); 1074231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 1075231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 1076231437Sluigi "Total Transmit Stops"); 1077231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 1078231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 1079231437Sluigi "Total Transmit WRB's"); 1080231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 1081231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 1082231437Sluigi "Total Transmit Completions"); 1083231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 1084231437Sluigi "total_ipv6_ext_hdr_tx_drop", 1085231437Sluigi CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 1086231437Sluigi "Total Transmit IPV6 Drops"); 1087273377Shselasky SYSCTL_ADD_UQUAD(ctx, tx_stat_list, OID_AUTO, "pauseframes", 1088273377Shselasky CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 1089231437Sluigi "Pause Frames"); 1090273377Shselasky SYSCTL_ADD_UQUAD(ctx, tx_stat_list, OID_AUTO, "controlframes", 1091273377Shselasky CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 1092231437Sluigi "Tx Control Frames"); 1093231437Sluigi 1094231437Sluigi for (i = 0; i < sc->nwqs; i++) { 1095231437Sluigi sprintf(prefix, "queue%d",i); 1096231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 1097231437Sluigi SYSCTL_CHILDREN(tx_stats_node), 1098231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 1099231437Sluigi NULL, "Queue name"); 1100231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 1101231437Sluigi 1102231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 1103231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 1104231437Sluigi "Transmit Packets"); 1105231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 1106231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 1107231437Sluigi "Transmit Bytes"); 1108231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 1109231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 1110231437Sluigi "Transmit Requests"); 1111231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 1112231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 1113231437Sluigi "Transmit Stops"); 1114231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 1115231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 1116231437Sluigi "Transmit WRB's"); 1117231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 1118231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 1119231437Sluigi "Transmit Completions"); 1120231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 1121231437Sluigi "ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 1122231437Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 1123231437Sluigi "Transmit IPV6 Ext Header Drop"); 1124231437Sluigi 1125231437Sluigi } 1126231437Sluigi return; 1127231437Sluigi} 1128231437Sluigi 1129231437Sluigi 1130231437Sluigivoid 1131231437Sluigioce_refresh_queue_stats(POCE_SOFTC sc) 1132231437Sluigi{ 1133231437Sluigi struct oce_drv_stats *adapter_stats; 1134231437Sluigi int i; 1135231437Sluigi 1136231437Sluigi adapter_stats = &sc->oce_stats_info; 1137231437Sluigi 1138231437Sluigi /* Caluculate total TX and TXstats from all queues */ 1139231437Sluigi 1140231437Sluigi bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats)); 1141231437Sluigi for (i = 0; i < sc->nrqs; i++) { 1142231437Sluigi 1143231437Sluigi adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts; 1144231437Sluigi adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes; 1145231437Sluigi adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags; 1146231437Sluigi adapter_stats->rx.t_rx_mcast_pkts += 1147231437Sluigi sc->rq[i]->rx_stats.rx_mcast_pkts; 1148231437Sluigi adapter_stats->rx.t_rx_ucast_pkts += 1149231437Sluigi sc->rq[i]->rx_stats.rx_ucast_pkts; 1150231437Sluigi adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err; 1151231437Sluigi } 1152231437Sluigi 1153231437Sluigi bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats)); 1154231437Sluigi for (i = 0; i < sc->nwqs; i++) { 1155231437Sluigi adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs; 1156231437Sluigi adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops; 1157231437Sluigi adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs; 1158231437Sluigi adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl; 1159231437Sluigi adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes; 1160231437Sluigi adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts; 1161231437Sluigi adapter_stats->tx.t_ipv6_ext_hdr_tx_drop += 1162231437Sluigi sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop; 1163231437Sluigi } 1164231437Sluigi 1165231437Sluigi} 1166231437Sluigi 1167231437Sluigi 1168231437Sluigi 1169231437Sluigistatic void 1170231437Sluigicopy_stats_to_sc_xe201(POCE_SOFTC sc) 1171231437Sluigi{ 1172231437Sluigi struct oce_xe201_stats *adapter_stats; 1173231437Sluigi struct mbx_get_pport_stats *nic_mbx; 1174231437Sluigi struct pport_stats *port_stats; 1175231437Sluigi 1176231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats); 1177231437Sluigi port_stats = &nic_mbx->params.rsp.pps; 1178231437Sluigi adapter_stats = &sc->oce_stats_info.u0.xe201; 1179231437Sluigi 1180231437Sluigi adapter_stats->tx_pkts = port_stats->tx_pkts; 1181231437Sluigi adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts; 1182231437Sluigi adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts; 1183231437Sluigi adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts; 1184231437Sluigi adapter_stats->tx_bytes = port_stats->tx_bytes; 1185231437Sluigi adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes; 1186231437Sluigi adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes; 1187231437Sluigi adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes; 1188231437Sluigi adapter_stats->tx_discards = port_stats->tx_discards; 1189231437Sluigi adapter_stats->tx_errors = port_stats->tx_errors; 1190231437Sluigi adapter_stats->tx_pause_frames = port_stats->tx_pause_frames; 1191231437Sluigi adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames; 1192231437Sluigi adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames; 1193231437Sluigi adapter_stats->tx_internal_mac_errors = 1194231437Sluigi port_stats->tx_internal_mac_errors; 1195231437Sluigi adapter_stats->tx_control_frames = port_stats->tx_control_frames; 1196231437Sluigi adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes; 1197231437Sluigi adapter_stats->tx_pkts_65_to_127_bytes = 1198231437Sluigi port_stats->tx_pkts_65_to_127_bytes; 1199231437Sluigi adapter_stats->tx_pkts_128_to_255_bytes = 1200231437Sluigi port_stats->tx_pkts_128_to_255_bytes; 1201231437Sluigi adapter_stats->tx_pkts_256_to_511_bytes = 1202231437Sluigi port_stats->tx_pkts_256_to_511_bytes; 1203231437Sluigi adapter_stats->tx_pkts_512_to_1023_bytes = 1204231437Sluigi port_stats->tx_pkts_512_to_1023_bytes; 1205231437Sluigi adapter_stats->tx_pkts_1024_to_1518_bytes = 1206231437Sluigi port_stats->tx_pkts_1024_to_1518_bytes; 1207231437Sluigi adapter_stats->tx_pkts_1519_to_2047_bytes = 1208231437Sluigi port_stats->tx_pkts_1519_to_2047_bytes; 1209231437Sluigi adapter_stats->tx_pkts_2048_to_4095_bytes = 1210231437Sluigi port_stats->tx_pkts_2048_to_4095_bytes; 1211231437Sluigi adapter_stats->tx_pkts_4096_to_8191_bytes = 1212231437Sluigi port_stats->tx_pkts_4096_to_8191_bytes; 1213231437Sluigi adapter_stats->tx_pkts_8192_to_9216_bytes = 1214231437Sluigi port_stats->tx_pkts_8192_to_9216_bytes; 1215231437Sluigi adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts; 1216231437Sluigi adapter_stats->rx_pkts = port_stats->rx_pkts; 1217231437Sluigi adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts; 1218231437Sluigi adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts; 1219231437Sluigi adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts; 1220231437Sluigi adapter_stats->rx_bytes = port_stats->rx_bytes; 1221231437Sluigi adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes; 1222231437Sluigi adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes; 1223231437Sluigi adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes; 1224231437Sluigi adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos; 1225231437Sluigi adapter_stats->rx_discards = port_stats->rx_discards; 1226231437Sluigi adapter_stats->rx_errors = port_stats->rx_errors; 1227231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1228231437Sluigi adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors; 1229231437Sluigi adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors; 1230231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1231231437Sluigi adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames; 1232231437Sluigi adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames; 1233231437Sluigi adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long; 1234231437Sluigi adapter_stats->rx_internal_mac_errors = 1235231437Sluigi port_stats->rx_internal_mac_errors; 1236231437Sluigi adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts; 1237231437Sluigi adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts; 1238231437Sluigi adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts; 1239231437Sluigi adapter_stats->rx_jabbers = port_stats->rx_jabbers; 1240231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1241231437Sluigi adapter_stats->rx_control_frames_unknown_opcode = 1242231437Sluigi port_stats->rx_control_frames_unknown_opcode; 1243231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1244231437Sluigi adapter_stats->rx_out_of_range_errors = 1245231437Sluigi port_stats->rx_out_of_range_errors; 1246231437Sluigi adapter_stats->rx_address_match_errors = 1247231437Sluigi port_stats->rx_address_match_errors; 1248231437Sluigi adapter_stats->rx_vlan_mismatch_errors = 1249231437Sluigi port_stats->rx_vlan_mismatch_errors; 1250231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1251231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1252231437Sluigi adapter_stats->rx_dropped_header_too_small = 1253231437Sluigi port_stats->rx_dropped_header_too_small; 1254231437Sluigi adapter_stats->rx_dropped_invalid_tcp_length = 1255231437Sluigi port_stats->rx_dropped_invalid_tcp_length; 1256231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1257231437Sluigi adapter_stats->rx_ip_checksum_errors = 1258231437Sluigi port_stats->rx_ip_checksum_errors; 1259231437Sluigi adapter_stats->rx_tcp_checksum_errors = 1260231437Sluigi port_stats->rx_tcp_checksum_errors; 1261231437Sluigi adapter_stats->rx_udp_checksum_errors = 1262231437Sluigi port_stats->rx_udp_checksum_errors; 1263231437Sluigi adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts; 1264231437Sluigi adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts; 1265231437Sluigi adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts; 1266231437Sluigi adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes; 1267231437Sluigi adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes; 1268231437Sluigi adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts; 1269231437Sluigi adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts; 1270231437Sluigi adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts; 1271231437Sluigi adapter_stats->rx_management_pkts = port_stats->rx_management_pkts; 1272231437Sluigi adapter_stats->rx_switched_unicast_pkts = 1273231437Sluigi port_stats->rx_switched_unicast_pkts; 1274231437Sluigi adapter_stats->rx_switched_multicast_pkts = 1275231437Sluigi port_stats->rx_switched_multicast_pkts; 1276231437Sluigi adapter_stats->rx_switched_broadcast_pkts = 1277231437Sluigi port_stats->rx_switched_broadcast_pkts; 1278231437Sluigi adapter_stats->num_forwards = port_stats->num_forwards; 1279231437Sluigi adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow; 1280231437Sluigi adapter_stats->rx_input_fifo_overflow = 1281231437Sluigi port_stats->rx_input_fifo_overflow; 1282231437Sluigi adapter_stats->rx_drops_too_many_frags = 1283231437Sluigi port_stats->rx_drops_too_many_frags; 1284231437Sluigi adapter_stats->rx_drops_invalid_queue = 1285231437Sluigi port_stats->rx_drops_invalid_queue; 1286231437Sluigi adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu; 1287231437Sluigi adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes; 1288231437Sluigi adapter_stats->rx_pkts_65_to_127_bytes = 1289231437Sluigi port_stats->rx_pkts_65_to_127_bytes; 1290231437Sluigi adapter_stats->rx_pkts_128_to_255_bytes = 1291231437Sluigi port_stats->rx_pkts_128_to_255_bytes; 1292231437Sluigi adapter_stats->rx_pkts_256_to_511_bytes = 1293231437Sluigi port_stats->rx_pkts_256_to_511_bytes; 1294231437Sluigi adapter_stats->rx_pkts_512_to_1023_bytes = 1295231437Sluigi port_stats->rx_pkts_512_to_1023_bytes; 1296231437Sluigi adapter_stats->rx_pkts_1024_to_1518_bytes = 1297231437Sluigi port_stats->rx_pkts_1024_to_1518_bytes; 1298231437Sluigi adapter_stats->rx_pkts_1519_to_2047_bytes = 1299231437Sluigi port_stats->rx_pkts_1519_to_2047_bytes; 1300231437Sluigi adapter_stats->rx_pkts_2048_to_4095_bytes = 1301231437Sluigi port_stats->rx_pkts_2048_to_4095_bytes; 1302231437Sluigi adapter_stats->rx_pkts_4096_to_8191_bytes = 1303231437Sluigi port_stats->rx_pkts_4096_to_8191_bytes; 1304231437Sluigi adapter_stats->rx_pkts_8192_to_9216_bytes = 1305231437Sluigi port_stats->rx_pkts_8192_to_9216_bytes; 1306231437Sluigi} 1307231437Sluigi 1308231437Sluigi 1309231437Sluigi 1310231437Sluigistatic void 1311231437Sluigicopy_stats_to_sc_be2(POCE_SOFTC sc) 1312231437Sluigi{ 1313231437Sluigi struct oce_be_stats *adapter_stats; 1314231437Sluigi struct oce_pmem_stats *pmem; 1315231437Sluigi struct oce_rxf_stats_v0 *rxf_stats; 1316231437Sluigi struct oce_port_rxf_stats_v0 *port_stats; 1317231437Sluigi struct mbx_get_nic_stats_v0 *nic_mbx; 1318231437Sluigi uint32_t port = sc->port_id; 1319231437Sluigi 1320231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0); 1321231437Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1322231437Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1323231437Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1324231437Sluigi 1325231437Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1326231437Sluigi 1327231437Sluigi 1328231437Sluigi /* Update stats */ 1329231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1330231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1331231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1332231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1333231437Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1334231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1335231437Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1336231437Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1337231437Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1338231437Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1339231437Sluigi port_stats->rxpp_fifo_overflow_drop; 1340231437Sluigi adapter_stats->rx_dropped_tcp_length = 1341231437Sluigi port_stats->rx_dropped_tcp_length; 1342231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1343231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1344231437Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1345231437Sluigi adapter_stats->rx_dropped_header_too_small = 1346231437Sluigi port_stats->rx_dropped_header_too_small; 1347231437Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1348231437Sluigi port_stats->rx_input_fifo_overflow_drop; 1349231437Sluigi adapter_stats->rx_address_match_errors = 1350231437Sluigi port_stats->rx_address_match_errors; 1351231437Sluigi adapter_stats->rx_alignment_symbol_errors = 1352231437Sluigi port_stats->rx_alignment_symbol_errors; 1353231437Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1354231437Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1355231437Sluigi 1356231437Sluigi if (sc->if_id) 1357231437Sluigi adapter_stats->jabber_events = rxf_stats->port1_jabber_events; 1358231437Sluigi else 1359231437Sluigi adapter_stats->jabber_events = rxf_stats->port0_jabber_events; 1360231437Sluigi 1361231437Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1362231437Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1363231437Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1364231437Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1365231437Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1366231437Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1367231437Sluigi adapter_stats->rx_drops_no_tpre_descr = 1368231437Sluigi rxf_stats->rx_drops_no_tpre_descr; 1369231437Sluigi adapter_stats->rx_drops_too_many_frags = 1370231437Sluigi rxf_stats->rx_drops_too_many_frags; 1371231437Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1372231437Sluigi} 1373231437Sluigi 1374231437Sluigi 1375231437Sluigistatic void 1376231437Sluigicopy_stats_to_sc_be3(POCE_SOFTC sc) 1377231437Sluigi{ 1378231437Sluigi struct oce_be_stats *adapter_stats; 1379231437Sluigi struct oce_pmem_stats *pmem; 1380231437Sluigi struct oce_rxf_stats_v1 *rxf_stats; 1381231437Sluigi struct oce_port_rxf_stats_v1 *port_stats; 1382338938Sjpaetzel struct mbx_get_nic_stats_v1 *nic_mbx; 1383231437Sluigi uint32_t port = sc->port_id; 1384231437Sluigi 1385338938Sjpaetzel nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v1); 1386231437Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1387231437Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1388231437Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1389231437Sluigi 1390231437Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1391231437Sluigi 1392231437Sluigi /* Update stats */ 1393231437Sluigi adapter_stats->pmem_fifo_overflow_drop = 1394231437Sluigi port_stats->pmem_fifo_overflow_drop; 1395231437Sluigi adapter_stats->rx_priority_pause_frames = 1396231437Sluigi port_stats->rx_priority_pause_frames; 1397231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1398231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1399231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1400231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1401231437Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1402231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1403231437Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1404231437Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1405231437Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1406231437Sluigi adapter_stats->rx_dropped_tcp_length = 1407231437Sluigi port_stats->rx_dropped_tcp_length; 1408231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1409231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1410231437Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1411231437Sluigi adapter_stats->rx_dropped_header_too_small = 1412231437Sluigi port_stats->rx_dropped_header_too_small; 1413231437Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1414231437Sluigi port_stats->rx_input_fifo_overflow_drop; 1415231437Sluigi adapter_stats->rx_address_match_errors = 1416231437Sluigi port_stats->rx_address_match_errors; 1417231437Sluigi adapter_stats->rx_alignment_symbol_errors = 1418231437Sluigi port_stats->rx_alignment_symbol_errors; 1419231437Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1420231437Sluigi port_stats->rxpp_fifo_overflow_drop; 1421231437Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1422231437Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1423231437Sluigi adapter_stats->jabber_events = port_stats->jabber_events; 1424231437Sluigi 1425231437Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1426231437Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1427231437Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1428231437Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1429231437Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1430231437Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1431231437Sluigi adapter_stats->rx_drops_no_tpre_descr = 1432231437Sluigi rxf_stats->rx_drops_no_tpre_descr; 1433231437Sluigi adapter_stats->rx_drops_too_many_frags = 1434231437Sluigi rxf_stats->rx_drops_too_many_frags; 1435231437Sluigi 1436231437Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1437231437Sluigi} 1438231437Sluigi 1439338938Sjpaetzelstatic void 1440338938Sjpaetzelcopy_stats_to_sc_sh(POCE_SOFTC sc) 1441338938Sjpaetzel{ 1442338938Sjpaetzel struct oce_be_stats *adapter_stats; 1443338938Sjpaetzel struct oce_pmem_stats *pmem; 1444338938Sjpaetzel struct oce_rxf_stats_v2 *rxf_stats; 1445338938Sjpaetzel struct oce_port_rxf_stats_v2 *port_stats; 1446338938Sjpaetzel struct mbx_get_nic_stats_v2 *nic_mbx; 1447338938Sjpaetzel struct oce_erx_stats_v2 *erx_stats; 1448338938Sjpaetzel uint32_t port = sc->port_id; 1449231437Sluigi 1450338938Sjpaetzel nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v2); 1451338938Sjpaetzel pmem = &nic_mbx->params.rsp.stats.pmem; 1452338938Sjpaetzel rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1453338938Sjpaetzel erx_stats = &nic_mbx->params.rsp.stats.erx; 1454338938Sjpaetzel port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1455338938Sjpaetzel 1456338938Sjpaetzel adapter_stats = &sc->oce_stats_info.u0.be; 1457338938Sjpaetzel 1458338938Sjpaetzel /* Update stats */ 1459338938Sjpaetzel adapter_stats->pmem_fifo_overflow_drop = 1460338938Sjpaetzel port_stats->pmem_fifo_overflow_drop; 1461338938Sjpaetzel adapter_stats->rx_priority_pause_frames = 1462338938Sjpaetzel port_stats->rx_priority_pause_frames; 1463338938Sjpaetzel adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1464338938Sjpaetzel adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1465338938Sjpaetzel adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1466338938Sjpaetzel adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1467338938Sjpaetzel adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1468338938Sjpaetzel adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1469338938Sjpaetzel adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1470338938Sjpaetzel adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1471338938Sjpaetzel adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1472338938Sjpaetzel adapter_stats->rx_dropped_tcp_length = 1473338938Sjpaetzel port_stats->rx_dropped_tcp_length; 1474338938Sjpaetzel adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1475338938Sjpaetzel adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1476338938Sjpaetzel adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1477338938Sjpaetzel adapter_stats->rx_dropped_header_too_small = 1478338938Sjpaetzel port_stats->rx_dropped_header_too_small; 1479338938Sjpaetzel adapter_stats->rx_input_fifo_overflow_drop = 1480338938Sjpaetzel port_stats->rx_input_fifo_overflow_drop; 1481338938Sjpaetzel adapter_stats->rx_address_match_errors = 1482338938Sjpaetzel port_stats->rx_address_match_errors; 1483338938Sjpaetzel adapter_stats->rx_alignment_symbol_errors = 1484338938Sjpaetzel port_stats->rx_alignment_symbol_errors; 1485338938Sjpaetzel adapter_stats->rxpp_fifo_overflow_drop = 1486338938Sjpaetzel port_stats->rxpp_fifo_overflow_drop; 1487338938Sjpaetzel adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1488338938Sjpaetzel adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1489338938Sjpaetzel adapter_stats->jabber_events = port_stats->jabber_events; 1490338938Sjpaetzel 1491338938Sjpaetzel adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1492338938Sjpaetzel adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1493338938Sjpaetzel adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1494338938Sjpaetzel adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1495338938Sjpaetzel adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1496338938Sjpaetzel adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1497338938Sjpaetzel adapter_stats->rx_drops_no_tpre_descr = 1498338938Sjpaetzel rxf_stats->rx_drops_no_tpre_descr; 1499338938Sjpaetzel adapter_stats->rx_drops_too_many_frags = 1500338938Sjpaetzel rxf_stats->rx_drops_too_many_frags; 1501338938Sjpaetzel 1502338938Sjpaetzel adapter_stats->eth_red_drops = pmem->eth_red_drops; 1503338938Sjpaetzel 1504338938Sjpaetzel /* populate erx stats */ 1505338938Sjpaetzel for (int i = 0; i < sc->nrqs; i++) 1506338938Sjpaetzel sc->rq[i]->rx_stats.rx_drops_no_frags = erx_stats->rx_drops_no_fragments[sc->rq[i]->rq_id]; 1507338938Sjpaetzel} 1508338938Sjpaetzel 1509338938Sjpaetzel 1510338938Sjpaetzel 1511231437Sluigiint 1512231437Sluigioce_stats_init(POCE_SOFTC sc) 1513231437Sluigi{ 1514338938Sjpaetzel int rc = 0, sz = 0; 1515338938Sjpaetzel 1516338938Sjpaetzel 1517338938Sjpaetzel if( IS_BE2(sc) ) 1518338938Sjpaetzel sz = sizeof(struct mbx_get_nic_stats_v0); 1519338938Sjpaetzel else if( IS_BE3(sc) ) 1520338938Sjpaetzel sz = sizeof(struct mbx_get_nic_stats_v1); 1521338938Sjpaetzel else if( IS_SH(sc)) 1522338938Sjpaetzel sz = sizeof(struct mbx_get_nic_stats_v2); 1523338938Sjpaetzel else if( IS_XE201(sc) ) 1524231437Sluigi sz = sizeof(struct mbx_get_pport_stats); 1525231437Sluigi 1526231437Sluigi rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0); 1527231437Sluigi 1528231437Sluigi return rc; 1529231437Sluigi} 1530231437Sluigi 1531231437Sluigi 1532231437Sluigivoid 1533231437Sluigioce_stats_free(POCE_SOFTC sc) 1534231437Sluigi{ 1535231437Sluigi 1536231437Sluigi oce_dma_free(sc, &sc->stats_mem); 1537231437Sluigi 1538231437Sluigi} 1539231437Sluigi 1540231437Sluigi 1541231437Sluigiint 1542231437Sluigioce_refresh_nic_stats(POCE_SOFTC sc) 1543231437Sluigi{ 1544231437Sluigi int rc = 0, reset = 0; 1545231437Sluigi 1546338938Sjpaetzel if( IS_BE2(sc) ) { 1547338938Sjpaetzel rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem); 1548338938Sjpaetzel if (!rc) 1549338938Sjpaetzel copy_stats_to_sc_be2(sc); 1550338938Sjpaetzel }else if( IS_BE3(sc) ) { 1551338938Sjpaetzel rc = oce_mbox_get_nic_stats_v1(sc, &sc->stats_mem); 1552338938Sjpaetzel if (!rc) 1553338938Sjpaetzel copy_stats_to_sc_be3(sc); 1554338938Sjpaetzel }else if( IS_SH(sc)) { 1555338938Sjpaetzel rc = oce_mbox_get_nic_stats_v2(sc, &sc->stats_mem); 1556338938Sjpaetzel if (!rc) 1557338938Sjpaetzel copy_stats_to_sc_sh(sc); 1558338938Sjpaetzel }else if( IS_XE201(sc) ){ 1559231437Sluigi rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset); 1560231437Sluigi if (!rc) 1561231437Sluigi copy_stats_to_sc_xe201(sc); 1562231437Sluigi } 1563338938Sjpaetzel 1564231437Sluigi return rc; 1565231437Sluigi} 1566247880Sdelphij 1567247880Sdelphijstatic int 1568247880Sdelphijoce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS) 1569247880Sdelphij{ 1570247880Sdelphij int result = 0, error; 1571247880Sdelphij int rc = 0; 1572247880Sdelphij POCE_SOFTC sc = (POCE_SOFTC) arg1; 1573247880Sdelphij 1574247880Sdelphij /* sysctl default handler */ 1575247880Sdelphij error = sysctl_handle_int(oidp, &result, 0, req); 1576247880Sdelphij if (error || !req->newptr) 1577247880Sdelphij return (error); 1578247880Sdelphij 1579247880Sdelphij if(result == -1) { 1580247880Sdelphij return EINVAL; 1581247880Sdelphij } 1582247880Sdelphij bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE); 1583247880Sdelphij 1584247880Sdelphij rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0); 1585247880Sdelphij if(rc) 1586247880Sdelphij return rc; 1587247880Sdelphij 1588247880Sdelphij rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2); 1589247880Sdelphij if(rc) 1590247880Sdelphij return rc; 1591247880Sdelphij 1592247880Sdelphij return rc; 1593247880Sdelphij} 1594