oce_sysctl.c revision 258140
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 258140 2013-11-14 18:53:17Z 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); 47231437Sluigistatic int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 48257007Sdelphijstatic int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 49231437Sluigistatic int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS); 50231437Sluigistatic int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 51247880Sdelphijstatic int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS); 52231437Sluigistatic boolean_t oce_phy_flashing_required(POCE_SOFTC sc); 53231437Sluigistatic boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p, 54231437Sluigi int img_optype, uint32_t img_offset, 55231437Sluigi uint32_t img_size, uint32_t hdrs_size); 56231437Sluigistatic void oce_add_stats_sysctls_be3(POCE_SOFTC sc, 57231437Sluigi struct sysctl_ctx_list *ctx, 58231437Sluigi struct sysctl_oid *stats_node); 59231437Sluigistatic void oce_add_stats_sysctls_xe201(POCE_SOFTC sc, 60231437Sluigi struct sysctl_ctx_list *ctx, 61231437Sluigi struct sysctl_oid *stats_node); 62231437Sluigi 63257007Sdelphij 64231437Sluigiextern char component_revision[32]; 65247880Sdelphijuint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE]; 66231437Sluigi 67257007Sdelphijstruct flash_img_attri { 68257007Sdelphij int img_offset; 69257007Sdelphij int img_size; 70257007Sdelphij int img_type; 71257007Sdelphij bool skip_image; 72257007Sdelphij int optype; 73257007Sdelphij}; 74257007Sdelphij 75231437Sluigivoid 76231437Sluigioce_add_sysctls(POCE_SOFTC sc) 77231437Sluigi{ 78231437Sluigi 79231437Sluigi struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev); 80231437Sluigi struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev); 81231437Sluigi struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree); 82231437Sluigi struct sysctl_oid *stats_node; 83231437Sluigi 84231437Sluigi SYSCTL_ADD_STRING(ctx, child, 85231437Sluigi OID_AUTO, "component_revision", 86231437Sluigi CTLTYPE_INT | CTLFLAG_RD, 87231437Sluigi &component_revision, 88231437Sluigi sizeof(component_revision), 89231437Sluigi "EMULEX One-Connect device driver revision"); 90231437Sluigi 91231437Sluigi SYSCTL_ADD_STRING(ctx, child, 92231437Sluigi OID_AUTO, "firmware_version", 93231437Sluigi CTLTYPE_INT | CTLFLAG_RD, 94231437Sluigi &sc->fw_version, 95231437Sluigi sizeof(sc->fw_version), 96231437Sluigi "EMULEX One-Connect Firmware Version"); 97231437Sluigi 98231437Sluigi SYSCTL_ADD_INT(ctx, child, 99231437Sluigi OID_AUTO, "max_rsp_handled", 100231437Sluigi CTLTYPE_INT | CTLFLAG_RW, 101231437Sluigi &oce_max_rsp_handled, 102231437Sluigi sizeof(oce_max_rsp_handled), 103231437Sluigi "Maximum receive frames handled per interupt"); 104231437Sluigi 105247880Sdelphij if ((sc->function_mode & FNM_FLEX10_MODE) || 106247880Sdelphij (sc->function_mode & FNM_UMC_MODE)) 107231437Sluigi SYSCTL_ADD_UINT(ctx, child, 108231437Sluigi OID_AUTO, "speed", 109231437Sluigi CTLFLAG_RD, 110231437Sluigi &sc->qos_link_speed, 111231437Sluigi 0,"QOS Speed"); 112231437Sluigi else 113231437Sluigi SYSCTL_ADD_UINT(ctx, child, 114231437Sluigi OID_AUTO, "speed", 115231437Sluigi CTLFLAG_RD, 116231437Sluigi &sc->speed, 117231437Sluigi 0,"Link Speed"); 118231437Sluigi 119231879Sluigi if (sc->function_mode & FNM_UMC_MODE) 120231879Sluigi SYSCTL_ADD_UINT(ctx, child, 121231879Sluigi OID_AUTO, "pvid", 122231879Sluigi CTLFLAG_RD, 123231879Sluigi &sc->pvid, 124231879Sluigi 0,"PVID"); 125231879Sluigi 126231437Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back", 127231437Sluigi CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, 128231437Sluigi oce_sysctl_loopback, "I", "Loop Back Tests"); 129231437Sluigi 130231437Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade", 131231437Sluigi CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0, 132231437Sluigi oce_sys_fwupgrade, "A", "Firmware ufi file"); 133231437Sluigi 134247880Sdelphij /* 135247880Sdelphij * Dumps Transceiver data 136247880Sdelphij * "sysctl dev.oce.0.sfp_vpd_dump=0" 137247880Sdelphij * "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump 138247880Sdelphij * "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump 139247880Sdelphij */ 140247880Sdelphij SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump", 141247880Sdelphij CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump, 142247880Sdelphij "I", "Initiate a sfp_vpd_dump operation"); 143247880Sdelphij SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer", 144247880Sdelphij CTLFLAG_RD, sfp_vpd_dump_buffer, 145247880Sdelphij TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer"); 146247880Sdelphij 147231437Sluigi stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", 148231437Sluigi CTLFLAG_RD, NULL, "Ethernet Statistics"); 149231437Sluigi 150252869Sdelphij if (IS_BE(sc) || IS_SH(sc)) 151231437Sluigi oce_add_stats_sysctls_be3(sc, ctx, stats_node); 152231437Sluigi else 153231437Sluigi oce_add_stats_sysctls_xe201(sc, ctx, stats_node); 154231437Sluigi 155231437Sluigi 156231437Sluigi} 157231437Sluigi 158231437Sluigi 159231437Sluigistatic uint32_t 160231437Sluigioce_loopback_test(struct oce_softc *sc, uint8_t loopback_type) 161231437Sluigi{ 162231437Sluigi uint32_t status = 0; 163231437Sluigi 164257007Sdelphij oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1); 165257007Sdelphij status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type, 166231437Sluigi 1500, 2, 0xabc); 167257007Sdelphij oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1); 168231437Sluigi 169231437Sluigi return status; 170231437Sluigi} 171231437Sluigi 172231437Sluigistatic int 173231437Sluigioce_sysctl_loopback(SYSCTL_HANDLER_ARGS) 174231437Sluigi{ 175231437Sluigi int value = 0; 176231437Sluigi uint32_t status; 177231437Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 178231437Sluigi 179231437Sluigi status = sysctl_handle_int(oidp, &value, 0, req); 180231437Sluigi if (status || !req->newptr) 181231437Sluigi return status; 182231437Sluigi 183231437Sluigi if (value != 1) { 184231437Sluigi device_printf(sc->dev, 185231437Sluigi "Not a Valid value. Set to loop_back=1 to run tests\n"); 186231437Sluigi return 0; 187231437Sluigi } 188231437Sluigi 189231437Sluigi if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) { 190231437Sluigi device_printf(sc->dev, 191231437Sluigi "MAC Loopback Test = Failed (Error status = %d)\n", 192231437Sluigi status); 193231437Sluigi } else 194231437Sluigi device_printf(sc->dev, "MAC Loopback Test = Success\n"); 195231437Sluigi 196231437Sluigi if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) { 197231437Sluigi device_printf(sc->dev, 198231437Sluigi "PHY Loopback Test = Failed (Error status = %d)\n", 199231437Sluigi status); 200231437Sluigi } else 201231437Sluigi device_printf(sc->dev, "PHY Loopback Test = Success\n"); 202231437Sluigi 203231437Sluigi if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) { 204231437Sluigi device_printf(sc->dev, 205231437Sluigi "EXT Loopback Test = Failed (Error status = %d)\n", 206231437Sluigi status); 207231437Sluigi } else 208231437Sluigi device_printf(sc->dev, "EXT Loopback Test = Success\n"); 209231437Sluigi 210231437Sluigi return 0; 211231437Sluigi} 212231437Sluigi 213231437Sluigi 214231437Sluigistatic int 215231437Sluigioce_sys_fwupgrade(SYSCTL_HANDLER_ARGS) 216231437Sluigi{ 217231437Sluigi char ufiname[256] = {0}; 218231437Sluigi uint32_t status = 1; 219231437Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 220231437Sluigi const struct firmware *fw; 221231437Sluigi 222231437Sluigi status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req); 223231437Sluigi if (status || !req->newptr) 224231437Sluigi return status; 225231437Sluigi 226231437Sluigi fw = firmware_get(ufiname); 227231437Sluigi if (fw == NULL) { 228231437Sluigi device_printf(sc->dev, "Unable to get Firmware. " 229231437Sluigi "Make sure %s is copied to /boot/modules\n", ufiname); 230231437Sluigi return ENOENT; 231231437Sluigi } 232231437Sluigi 233257007Sdelphij if (IS_BE(sc)) { 234231437Sluigi if ((sc->flags & OCE_FLAGS_BE2)) { 235231437Sluigi device_printf(sc->dev, 236231437Sluigi "Flashing not supported for BE2 yet.\n"); 237231437Sluigi status = 1; 238231437Sluigi goto done; 239231437Sluigi } 240231437Sluigi status = oce_be3_fwupgrade(sc, fw); 241257007Sdelphij } else if (IS_SH(sc)) { 242257007Sdelphij status = oce_skyhawk_fwupgrade(sc,fw); 243231437Sluigi } else 244231437Sluigi status = oce_lancer_fwupgrade(sc, fw); 245231437Sluigidone: 246231437Sluigi if (status) { 247231437Sluigi device_printf(sc->dev, "Firmware Upgrade failed\n"); 248231437Sluigi } else { 249231437Sluigi device_printf(sc->dev, "Firmware Flashed successfully\n"); 250231437Sluigi } 251231437Sluigi 252231437Sluigi /* Release Firmware*/ 253231437Sluigi firmware_put(fw, FIRMWARE_UNLOAD); 254231437Sluigi 255231437Sluigi return status; 256231437Sluigi} 257231437Sluigi 258257007Sdelphijstatic void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec, 259257007Sdelphij struct flash_img_attri *pimg, int i, 260257007Sdelphij const struct firmware *fw, int bin_offset) 261231437Sluigi{ 262257007Sdelphij if (IS_SH(sc)) { 263257007Sdelphij pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset); 264257007Sdelphij pimg->img_size = HOST_32(fsec->fsec_entry[i].pad_size); 265231437Sluigi } 266231437Sluigi 267257007Sdelphij pimg->img_type = HOST_32(fsec->fsec_entry[i].type); 268257007Sdelphij pimg->skip_image = FALSE; 269257007Sdelphij switch (pimg->img_type) { 270257007Sdelphij case IMG_ISCSI: 271257007Sdelphij pimg->optype = 0; 272257007Sdelphij if (IS_BE3(sc)) { 273257007Sdelphij pimg->img_offset = 2097152; 274257007Sdelphij pimg->img_size = 2097152; 275257007Sdelphij } 276231437Sluigi break; 277257007Sdelphij case IMG_REDBOOT: 278257007Sdelphij pimg->optype = 1; 279257007Sdelphij if (IS_BE3(sc)) { 280257007Sdelphij pimg->img_offset = 262144; 281257007Sdelphij pimg->img_size = 1048576; 282257007Sdelphij } 283257007Sdelphij if (!oce_img_flashing_required(sc, fw->data, 284257007Sdelphij pimg->optype, 285257007Sdelphij pimg->img_offset, 286257007Sdelphij pimg->img_size, 287257007Sdelphij bin_offset)) 288257007Sdelphij pimg->skip_image = TRUE; 289257007Sdelphij break; 290257007Sdelphij case IMG_BIOS: 291257007Sdelphij pimg->optype = 2; 292257007Sdelphij if (IS_BE3(sc)) { 293257007Sdelphij pimg->img_offset = 12582912; 294257007Sdelphij pimg->img_size = 524288; 295257007Sdelphij } 296257007Sdelphij break; 297257007Sdelphij case IMG_PXEBIOS: 298257007Sdelphij pimg->optype = 3; 299257007Sdelphij if (IS_BE3(sc)) { 300257007Sdelphij pimg->img_offset = 13107200;; 301257007Sdelphij pimg->img_size = 524288; 302257007Sdelphij } 303257007Sdelphij break; 304257007Sdelphij case IMG_FCOEBIOS: 305257007Sdelphij pimg->optype = 8; 306257007Sdelphij if (IS_BE3(sc)) { 307257007Sdelphij pimg->img_offset = 13631488; 308257007Sdelphij pimg->img_size = 524288; 309257007Sdelphij } 310257007Sdelphij break; 311257007Sdelphij case IMG_ISCSI_BAK: 312257007Sdelphij pimg->optype = 9; 313257007Sdelphij if (IS_BE3(sc)) { 314257007Sdelphij pimg->img_offset = 4194304; 315257007Sdelphij pimg->img_size = 2097152; 316257007Sdelphij } 317257007Sdelphij break; 318257007Sdelphij case IMG_FCOE: 319257007Sdelphij pimg->optype = 10; 320257007Sdelphij if (IS_BE3(sc)) { 321257007Sdelphij pimg->img_offset = 6291456; 322257007Sdelphij pimg->img_size = 2097152; 323257007Sdelphij } 324257007Sdelphij break; 325257007Sdelphij case IMG_FCOE_BAK: 326257007Sdelphij pimg->optype = 11; 327257007Sdelphij if (IS_BE3(sc)) { 328257007Sdelphij pimg->img_offset = 8388608; 329257007Sdelphij pimg->img_size = 2097152; 330257007Sdelphij } 331257007Sdelphij break; 332257007Sdelphij case IMG_NCSI: 333257007Sdelphij pimg->optype = 13; 334257007Sdelphij if (IS_BE3(sc)) { 335257007Sdelphij pimg->img_offset = 15990784; 336257007Sdelphij pimg->img_size = 262144; 337257007Sdelphij } 338257007Sdelphij break; 339257007Sdelphij case IMG_PHY: 340257007Sdelphij pimg->optype = 99; 341257007Sdelphij if (IS_BE3(sc)) { 342257007Sdelphij pimg->img_offset = 1310720; 343257007Sdelphij pimg->img_size = 262144; 344257007Sdelphij } 345257007Sdelphij if (!oce_phy_flashing_required(sc)) 346257007Sdelphij pimg->skip_image = TRUE; 347257007Sdelphij break; 348257007Sdelphij default: 349257007Sdelphij pimg->skip_image = TRUE; 350257007Sdelphij break; 351231437Sluigi } 352231437Sluigi 353231437Sluigi} 354231437Sluigi 355231437Sluigistatic int 356257007Sdelphijoce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs) 357231437Sluigi{ 358231437Sluigi char cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "}; 359231437Sluigi const char *p = (const char *)fw->data; 360231437Sluigi const struct flash_sec_info *fsec = NULL; 361231437Sluigi struct mbx_common_read_write_flashrom *req; 362257007Sdelphij int rc = 0, i, bin_offset = 0, opcode, num_bytes; 363231437Sluigi OCE_DMA_MEM dma_mem; 364257007Sdelphij struct flash_img_attri imgatt; 365231437Sluigi 366231437Sluigi /* Validate Cookie */ 367231437Sluigi bin_offset = (sizeof(struct flash_file_hdr) + 368257007Sdelphij (num_imgs * sizeof(struct image_hdr))); 369231437Sluigi p += bin_offset; 370231437Sluigi while (p < ((const char *)fw->data + fw->datasize)) { 371231437Sluigi fsec = (const struct flash_sec_info *)p; 372231437Sluigi if (!memcmp(cookie, fsec->cookie, sizeof(cookie))) 373231437Sluigi break; 374231437Sluigi fsec = NULL; 375231437Sluigi p += 32; 376231437Sluigi } 377231437Sluigi 378231437Sluigi if (!fsec) { 379231437Sluigi device_printf(sc->dev, 380257007Sdelphij "Invalid Cookie. Firmware image corrupted ?\n"); 381231437Sluigi return EINVAL; 382231437Sluigi } 383231437Sluigi 384258140Sdelphij rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom), 385258140Sdelphij &dma_mem, 0); 386231437Sluigi if (rc) { 387231437Sluigi device_printf(sc->dev, 388257007Sdelphij "Memory allocation failure while flashing\n"); 389231437Sluigi return ENOMEM; 390231437Sluigi } 391231437Sluigi req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom); 392231437Sluigi 393257007Sdelphij if (IS_SH(sc)) 394257007Sdelphij num_imgs = HOST_32(fsec->fsec_hdr.num_images); 395257007Sdelphij else if (IS_BE3(sc)) 396257007Sdelphij num_imgs = MAX_FLASH_COMP; 397231437Sluigi 398257007Sdelphij for (i = 0; i < num_imgs; i++) { 399257007Sdelphij 400257007Sdelphij bzero(&imgatt, sizeof(struct flash_img_attri)); 401257007Sdelphij 402257007Sdelphij oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset); 403257007Sdelphij 404257007Sdelphij if (imgatt.skip_image) 405231437Sluigi continue; 406231437Sluigi 407231437Sluigi p = fw->data; 408257007Sdelphij p = p + bin_offset + imgatt.img_offset; 409257007Sdelphij 410257007Sdelphij if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) { 411231437Sluigi rc = 1; 412231437Sluigi goto ret; 413231437Sluigi } 414231437Sluigi 415257007Sdelphij while (imgatt.img_size) { 416231437Sluigi 417257007Sdelphij if (imgatt.img_size > 32*1024) 418231437Sluigi num_bytes = 32*1024; 419231437Sluigi else 420257007Sdelphij num_bytes = imgatt.img_size; 421257007Sdelphij imgatt.img_size -= num_bytes; 422231437Sluigi 423257007Sdelphij if (!imgatt.img_size) 424231437Sluigi opcode = FLASHROM_OPER_FLASH; 425231437Sluigi else 426231437Sluigi opcode = FLASHROM_OPER_SAVE; 427231437Sluigi 428231437Sluigi memcpy(req->data_buffer, p, num_bytes); 429231437Sluigi p += num_bytes; 430231437Sluigi 431257007Sdelphij rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode, 432257007Sdelphij &dma_mem, num_bytes); 433231437Sluigi if (rc) { 434231437Sluigi device_printf(sc->dev, 435257007Sdelphij "cmd to write to flash rom failed.\n"); 436231437Sluigi rc = EIO; 437231437Sluigi goto ret; 438231437Sluigi } 439231437Sluigi /* Leave the CPU for others for some time */ 440231437Sluigi pause("yield", 10); 441231437Sluigi 442231437Sluigi } 443257007Sdelphij 444231437Sluigi } 445257007Sdelphij 446231437Sluigiret: 447231437Sluigi oce_dma_free(sc, &dma_mem); 448231437Sluigi return rc; 449257007Sdelphij} 450231437Sluigi 451257007Sdelphij#define UFI_TYPE2 2 452257007Sdelphij#define UFI_TYPE3 3 453257007Sdelphij#define UFI_TYPE3R 10 454257007Sdelphij#define UFI_TYPE4 4 455257007Sdelphij#define UFI_TYPE4R 11 456257007Sdelphijstatic int oce_get_ufi_type(POCE_SOFTC sc, 457257007Sdelphij const struct flash_file_hdr *fhdr) 458257007Sdelphij{ 459257007Sdelphij if (fhdr == NULL) 460257007Sdelphij goto be_get_ufi_exit; 461257007Sdelphij 462257007Sdelphij if (IS_SH(sc) && fhdr->build[0] == '4') { 463257007Sdelphij if (fhdr->asic_type_rev >= 0x10) 464257007Sdelphij return UFI_TYPE4R; 465257007Sdelphij else 466257007Sdelphij return UFI_TYPE4; 467257007Sdelphij } else if (IS_BE3(sc) && fhdr->build[0] == '3') { 468257007Sdelphij if (fhdr->asic_type_rev == 0x10) 469257007Sdelphij return UFI_TYPE3R; 470257007Sdelphij else 471257007Sdelphij return UFI_TYPE3; 472257007Sdelphij } else if (IS_BE2(sc) && fhdr->build[0] == '2') 473257007Sdelphij return UFI_TYPE2; 474257007Sdelphij 475257007Sdelphijbe_get_ufi_exit: 476257007Sdelphij device_printf(sc->dev, 477257007Sdelphij "UFI and Interface are not compatible for flashing\n"); 478257007Sdelphij return -1; 479231437Sluigi} 480231437Sluigi 481231437Sluigi 482257007Sdelphijstatic int 483257007Sdelphijoce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 484257007Sdelphij{ 485257007Sdelphij int rc = 0, num_imgs = 0, i = 0, ufi_type; 486257007Sdelphij const struct flash_file_hdr *fhdr; 487257007Sdelphij const struct image_hdr *img_ptr; 488257007Sdelphij 489257007Sdelphij fhdr = (const struct flash_file_hdr *)fw->data; 490257007Sdelphij 491257007Sdelphij ufi_type = oce_get_ufi_type(sc, fhdr); 492257007Sdelphij 493257007Sdelphij /* Display flash version */ 494257007Sdelphij device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 495257007Sdelphij 496257007Sdelphij num_imgs = fhdr->num_imgs; 497257007Sdelphij for (i = 0; i < num_imgs; i++) { 498257007Sdelphij img_ptr = (const struct image_hdr *)((const char *)fw->data + 499257007Sdelphij sizeof(struct flash_file_hdr) + 500257007Sdelphij (i * sizeof(struct image_hdr))); 501257007Sdelphij 502257007Sdelphij if (img_ptr->imageid != 1) 503257007Sdelphij continue; 504257007Sdelphij 505257007Sdelphij switch (ufi_type) { 506257007Sdelphij case UFI_TYPE4R: 507257007Sdelphij rc = oce_sh_be3_flashdata(sc, fw, 508257007Sdelphij num_imgs); 509257007Sdelphij break; 510257007Sdelphij case UFI_TYPE4: 511257007Sdelphij if (sc->asic_revision < 0x10) 512257007Sdelphij rc = oce_sh_be3_flashdata(sc, fw, 513257007Sdelphij num_imgs); 514257007Sdelphij else { 515257007Sdelphij rc = -1; 516257007Sdelphij device_printf(sc->dev, 517257007Sdelphij "Cant load SH A0 UFI on B0\n"); 518257007Sdelphij } 519257007Sdelphij break; 520257007Sdelphij default: 521257007Sdelphij rc = -1; 522257007Sdelphij break; 523257007Sdelphij 524257007Sdelphij } 525257007Sdelphij } 526257007Sdelphij 527257007Sdelphij return rc; 528257007Sdelphij} 529257007Sdelphij 530257007Sdelphijstatic int 531257007Sdelphijoce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 532257007Sdelphij{ 533257007Sdelphij int rc = 0, num_imgs = 0, i = 0; 534257007Sdelphij const struct flash_file_hdr *fhdr; 535257007Sdelphij const struct image_hdr *img_ptr; 536257007Sdelphij 537257007Sdelphij fhdr = (const struct flash_file_hdr *)fw->data; 538257007Sdelphij if (fhdr->build[0] != '3') { 539257007Sdelphij device_printf(sc->dev, "Invalid BE3 firmware image\n"); 540257007Sdelphij return EINVAL; 541257007Sdelphij } 542257007Sdelphij /* Display flash version */ 543257007Sdelphij device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 544257007Sdelphij 545257007Sdelphij num_imgs = fhdr->num_imgs; 546257007Sdelphij for (i = 0; i < num_imgs; i++) { 547257007Sdelphij img_ptr = (const struct image_hdr *)((const char *)fw->data + 548257007Sdelphij sizeof(struct flash_file_hdr) + 549257007Sdelphij (i * sizeof(struct image_hdr))); 550257007Sdelphij if (img_ptr->imageid == 1) { 551257007Sdelphij rc = oce_sh_be3_flashdata(sc, fw, num_imgs); 552257007Sdelphij 553257007Sdelphij break; 554257007Sdelphij } 555257007Sdelphij } 556257007Sdelphij 557257007Sdelphij return rc; 558257007Sdelphij} 559257007Sdelphij 560257007Sdelphij 561231437Sluigistatic boolean_t 562231437Sluigioce_phy_flashing_required(POCE_SOFTC sc) 563231437Sluigi{ 564231437Sluigi int status = 0; 565231437Sluigi struct oce_phy_info phy_info; 566231437Sluigi 567231437Sluigi status = oce_mbox_get_phy_info(sc, &phy_info); 568231437Sluigi if (status) 569231437Sluigi return FALSE; 570231437Sluigi 571231437Sluigi if ((phy_info.phy_type == TN_8022) && 572231437Sluigi (phy_info.interface_type == PHY_TYPE_BASET_10GB)) { 573231437Sluigi return TRUE; 574231437Sluigi } 575231437Sluigi 576231437Sluigi return FALSE; 577231437Sluigi} 578231437Sluigi 579231437Sluigi 580231437Sluigistatic boolean_t 581231437Sluigioce_img_flashing_required(POCE_SOFTC sc, const char *p, 582231437Sluigi int img_optype, uint32_t img_offset, 583231437Sluigi uint32_t img_size, uint32_t hdrs_size) 584231437Sluigi{ 585231437Sluigi uint32_t crc_offset; 586231437Sluigi uint8_t flashed_crc[4]; 587231437Sluigi int status; 588231437Sluigi 589231437Sluigi crc_offset = hdrs_size + img_offset + img_size - 4; 590231437Sluigi 591231437Sluigi p += crc_offset; 592231437Sluigi 593231437Sluigi status = oce_mbox_get_flashrom_crc(sc, flashed_crc, 594231437Sluigi (img_size - 4), img_optype); 595231437Sluigi if (status) 596231437Sluigi return TRUE; /* Some thing worng. ReFlash */ 597231437Sluigi 598231437Sluigi /*update redboot only if crc does not match*/ 599231437Sluigi if (bcmp(flashed_crc, p, 4)) 600231437Sluigi return TRUE; 601231437Sluigi else 602231437Sluigi return FALSE; 603231437Sluigi} 604231437Sluigi 605231437Sluigi 606231437Sluigistatic int 607231437Sluigioce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 608231437Sluigi{ 609231437Sluigi 610231437Sluigi int rc = 0; 611231437Sluigi OCE_DMA_MEM dma_mem; 612231437Sluigi const uint8_t *data = NULL; 613231437Sluigi uint8_t *dest_image_ptr = NULL; 614231437Sluigi size_t size = 0; 615231437Sluigi uint32_t data_written = 0, chunk_size = 0; 616231437Sluigi uint32_t offset = 0, add_status = 0; 617231437Sluigi 618231437Sluigi if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) { 619231437Sluigi device_printf(sc->dev, 620231437Sluigi "Lancer FW image is not 4 byte aligned."); 621231437Sluigi return EINVAL; 622231437Sluigi } 623231437Sluigi 624231437Sluigi rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0); 625231437Sluigi if (rc) { 626231437Sluigi device_printf(sc->dev, 627231437Sluigi "Memory allocation failure while flashing Lancer\n"); 628231437Sluigi return ENOMEM; 629231437Sluigi } 630231437Sluigi 631231437Sluigi size = fw->datasize; 632231437Sluigi data = fw->data; 633231437Sluigi dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t); 634231437Sluigi 635231437Sluigi while (size) { 636231437Sluigi chunk_size = MIN(size, (32*1024)); 637231437Sluigi 638231437Sluigi bcopy(data, dest_image_ptr, chunk_size); 639231437Sluigi 640231437Sluigi rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset, 641231437Sluigi &dma_mem, &data_written, &add_status); 642231437Sluigi 643231437Sluigi if (rc) 644231437Sluigi break; 645231437Sluigi 646231437Sluigi size -= data_written; 647231437Sluigi data += data_written; 648231437Sluigi offset += data_written; 649231437Sluigi pause("yield", 10); 650231437Sluigi 651231437Sluigi } 652231437Sluigi 653231437Sluigi if (!rc) 654231437Sluigi /* Commit the firmware*/ 655231437Sluigi rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem, 656231437Sluigi &data_written, &add_status); 657231437Sluigi if (rc) { 658231437Sluigi device_printf(sc->dev, "Lancer firmware load error. " 659231437Sluigi "Addstatus = 0x%x, status = %d \n", add_status, rc); 660231437Sluigi rc = EIO; 661231437Sluigi } 662231437Sluigi oce_dma_free(sc, &dma_mem); 663231437Sluigi return rc; 664231437Sluigi 665231437Sluigi} 666231437Sluigi 667231437Sluigi 668231437Sluigistatic void 669231437Sluigioce_add_stats_sysctls_be3(POCE_SOFTC sc, 670231437Sluigi struct sysctl_ctx_list *ctx, 671231437Sluigi struct sysctl_oid *stats_node) 672231437Sluigi{ 673231437Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 674231437Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 675231437Sluigi struct sysctl_oid_list *queue_stats_list; 676231437Sluigi struct sysctl_oid *queue_stats_node; 677231437Sluigi struct oce_drv_stats *stats; 678231437Sluigi char prefix[32]; 679231437Sluigi int i; 680231437Sluigi 681231437Sluigi stats = &sc->oce_stats_info; 682231437Sluigi 683231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 684231437Sluigi SYSCTL_CHILDREN(stats_node), 685231437Sluigi OID_AUTO,"rx", CTLFLAG_RD, 686231437Sluigi NULL, "RX Ethernet Statistics"); 687231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 688231437Sluigi 689231437Sluigi 690231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 691231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 692231437Sluigi "Total Received Packets"); 693231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 694231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 695231437Sluigi "Total Received Bytes"); 696231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 697231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 698231437Sluigi "Total Received Fragements"); 699231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 700231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 701231437Sluigi "Total Received Multicast Packets"); 702231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 703231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 704231437Sluigi "Total Received Unicast Packets"); 705231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 706231437Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 707231437Sluigi "Total Receive completion errors"); 708231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 709231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0, 710231437Sluigi "Pause Frames"); 711231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames", 712231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0, 713231437Sluigi "Priority Pause Frames"); 714231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 715231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0, 716231437Sluigi "Control Frames"); 717231437Sluigi 718231437Sluigi for (i = 0; i < sc->nrqs; i++) { 719231437Sluigi sprintf(prefix, "queue%d",i); 720231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 721231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 722231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 723231437Sluigi NULL, "Queue name"); 724231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 725231437Sluigi 726231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 727231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 728231437Sluigi "Receive Packets"); 729231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 730231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 731231437Sluigi "Recived Bytes"); 732231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 733231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 734231437Sluigi "Received Fragments"); 735231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 736231437Sluigi "rx_mcast_pkts", CTLFLAG_RD, 737231437Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 738231437Sluigi "Received Multicast Packets"); 739231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 740231437Sluigi "rx_ucast_pkts", CTLFLAG_RD, 741231437Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 742231437Sluigi "Received Unicast Packets"); 743231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 744231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 745231437Sluigi "Received Completion Errors"); 746231437Sluigi 747231437Sluigi } 748231437Sluigi 749231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 750231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 751231437Sluigi OID_AUTO, "err", CTLFLAG_RD, 752231437Sluigi NULL, "Receive Error Stats"); 753231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 754231437Sluigi 755231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 756231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0, 757231437Sluigi "CRC Errors"); 758231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors", 759231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0, 760231437Sluigi "Drops due to pbuf full"); 761231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors", 762231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0, 763231437Sluigi "ERX Errors"); 764231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 765231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0, 766231437Sluigi "RX Alignmnet Errors"); 767231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 768231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0, 769231437Sluigi "In Range Errors"); 770231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 771231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0, 772231437Sluigi "Out Range Errors"); 773231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 774231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0, 775231437Sluigi "Frame Too Long"); 776231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 777231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0, 778231437Sluigi "Address Match Errors"); 779231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 780231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0, 781231437Sluigi "Dropped Too Small"); 782231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 783231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0, 784231437Sluigi "Dropped Too Short"); 785231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 786231437Sluigi "dropped_header_too_small", CTLFLAG_RD, 787231437Sluigi &stats->u0.be.rx_dropped_header_too_small, 0, 788231437Sluigi "Dropped Header Too Small"); 789231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length", 790231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0, 791231437Sluigi "Dropped TCP Length"); 792231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 793231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0, 794231437Sluigi "Dropped runt"); 795231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 796231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0, 797231437Sluigi "IP Checksum Errors"); 798231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 799231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0, 800231437Sluigi "TCP Checksum Errors"); 801231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 802231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0, 803231437Sluigi "UDP Checksum Errors"); 804231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop", 805231437Sluigi CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0, 806231437Sluigi "FIFO Overflow Drop"); 807231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 808231437Sluigi "input_fifo_overflow_drop", CTLFLAG_RD, 809231437Sluigi &stats->u0.be.rx_input_fifo_overflow_drop, 0, 810231437Sluigi "Input FIFO Overflow Drop"); 811231437Sluigi 812231437Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 813231437Sluigi SYSCTL_CHILDREN(stats_node), OID_AUTO, 814231437Sluigi "tx",CTLFLAG_RD, NULL, 815231437Sluigi "TX Ethernet Statistics"); 816231437Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 817231437Sluigi 818231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 819231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 820231437Sluigi "Total Transmit Packets"); 821231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 822231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 823231437Sluigi "Total Transmit Bytes"); 824231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 825231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 826231437Sluigi "Total Transmit Requests"); 827231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 828231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 829231437Sluigi "Total Transmit Stops"); 830231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 831231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 832231437Sluigi "Total Transmit WRB's"); 833231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 834231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 835231437Sluigi "Total Transmit Completions"); 836231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 837231437Sluigi "total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 838231437Sluigi &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 839231437Sluigi "Total Transmit IPV6 Drops"); 840231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 841231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0, 842231437Sluigi "Pause Frames"); 843231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes", 844231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0, 845231437Sluigi "Priority Pauseframes"); 846231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 847231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0, 848231437Sluigi "Tx Control Frames"); 849231437Sluigi 850231437Sluigi for (i = 0; i < sc->nwqs; i++) { 851231437Sluigi sprintf(prefix, "queue%d",i); 852231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 853231437Sluigi SYSCTL_CHILDREN(tx_stats_node), 854231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 855231437Sluigi NULL, "Queue name"); 856231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 857231437Sluigi 858231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 859231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 860231437Sluigi "Transmit Packets"); 861231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 862231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 863231437Sluigi "Transmit Bytes"); 864231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 865231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 866231437Sluigi "Transmit Requests"); 867231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 868231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 869231437Sluigi "Transmit Stops"); 870231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 871231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 872231437Sluigi "Transmit WRB's"); 873231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 874231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 875231437Sluigi "Transmit Completions"); 876231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 877231437Sluigi "ipv6_ext_hdr_tx_drop",CTLFLAG_RD, 878231437Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 879231437Sluigi "Transmit IPV6 Ext Header Drop"); 880231437Sluigi 881231437Sluigi } 882231437Sluigi return; 883231437Sluigi} 884231437Sluigi 885231437Sluigi 886231437Sluigistatic void 887231437Sluigioce_add_stats_sysctls_xe201(POCE_SOFTC sc, 888231437Sluigi struct sysctl_ctx_list *ctx, 889231437Sluigi struct sysctl_oid *stats_node) 890231437Sluigi{ 891231437Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 892231437Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 893231437Sluigi struct sysctl_oid_list *queue_stats_list; 894231437Sluigi struct sysctl_oid *queue_stats_node; 895231437Sluigi struct oce_drv_stats *stats; 896231437Sluigi char prefix[32]; 897231437Sluigi int i; 898231437Sluigi 899231437Sluigi stats = &sc->oce_stats_info; 900231437Sluigi 901231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 902231437Sluigi SYSCTL_CHILDREN(stats_node), 903231437Sluigi OID_AUTO, "rx", CTLFLAG_RD, 904231437Sluigi NULL, "RX Ethernet Statistics"); 905231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 906231437Sluigi 907231437Sluigi 908231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 909231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 910231437Sluigi "Total Received Packets"); 911231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 912231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 913231437Sluigi "Total Received Bytes"); 914231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 915231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 916231437Sluigi "Total Received Fragements"); 917231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 918231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 919231437Sluigi "Total Received Multicast Packets"); 920231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 921231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 922231437Sluigi "Total Received Unicast Packets"); 923231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 924231437Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 925231437Sluigi "Total Receive completion errors"); 926231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 927231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 0, 928231437Sluigi "Pause Frames"); 929231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 930231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 0, 931231437Sluigi "Control Frames"); 932231437Sluigi 933231437Sluigi for (i = 0; i < sc->nrqs; i++) { 934231437Sluigi sprintf(prefix, "queue%d",i); 935231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 936231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 937231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 938231437Sluigi NULL, "Queue name"); 939231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 940231437Sluigi 941231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 942231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 943231437Sluigi "Receive Packets"); 944231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 945231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 946231437Sluigi "Recived Bytes"); 947231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 948231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 949231437Sluigi "Received Fragments"); 950231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 951231437Sluigi "rx_mcast_pkts", CTLFLAG_RD, 952231437Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 953231437Sluigi "Received Multicast Packets"); 954231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 955231437Sluigi "rx_ucast_pkts",CTLFLAG_RD, 956231437Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 957231437Sluigi "Received Unicast Packets"); 958231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 959231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 960231437Sluigi "Received Completion Errors"); 961231437Sluigi 962231437Sluigi } 963231437Sluigi 964231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 965231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 966231437Sluigi OID_AUTO, "err", CTLFLAG_RD, 967231437Sluigi NULL, "Receive Error Stats"); 968231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 969231437Sluigi 970231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 971231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 0, 972231437Sluigi "CRC Errors"); 973231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 974231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 0, 975231437Sluigi "RX Alignmnet Errors"); 976231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 977231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0, 978231437Sluigi "In Range Errors"); 979231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 980231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0, 981231437Sluigi "Out Range Errors"); 982231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 983231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 0, 984231437Sluigi "Frame Too Long"); 985231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 986231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0, 987231437Sluigi "Address Match Errors"); 988231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 989231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0, 990231437Sluigi "Dropped Too Small"); 991231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 992231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0, 993231437Sluigi "Dropped Too Short"); 994231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 995231437Sluigi "dropped_header_too_small", CTLFLAG_RD, 996231437Sluigi &stats->u0.xe201.rx_dropped_header_too_small, 0, 997231437Sluigi "Dropped Header Too Small"); 998231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 999231437Sluigi "dropped_tcp_length", CTLFLAG_RD, 1000231437Sluigi &stats->u0.xe201.rx_dropped_invalid_tcp_length, 0, 1001231437Sluigi "Dropped TCP Length"); 1002231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 1003231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0, 1004231437Sluigi "Dropped runt"); 1005231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 1006231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0, 1007231437Sluigi "IP Checksum Errors"); 1008231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 1009231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0, 1010231437Sluigi "TCP Checksum Errors"); 1011231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 1012231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0, 1013231437Sluigi "UDP Checksum Errors"); 1014231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop", 1015231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0, 1016231437Sluigi "Input FIFO Overflow Drop"); 1017231437Sluigi 1018231437Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 1019231437Sluigi SYSCTL_CHILDREN(stats_node), 1020231437Sluigi OID_AUTO, "tx", CTLFLAG_RD, 1021231437Sluigi NULL, "TX Ethernet Statistics"); 1022231437Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 1023231437Sluigi 1024231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 1025231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 1026231437Sluigi "Total Transmit Packets"); 1027231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 1028231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 1029231437Sluigi "Total Transmit Bytes"); 1030231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 1031231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 1032231437Sluigi "Total Transmit Requests"); 1033231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 1034231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 1035231437Sluigi "Total Transmit Stops"); 1036231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 1037231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 1038231437Sluigi "Total Transmit WRB's"); 1039231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 1040231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 1041231437Sluigi "Total Transmit Completions"); 1042231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 1043231437Sluigi "total_ipv6_ext_hdr_tx_drop", 1044231437Sluigi CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 1045231437Sluigi "Total Transmit IPV6 Drops"); 1046231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 1047231437Sluigi CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 0, 1048231437Sluigi "Pause Frames"); 1049231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 1050231437Sluigi CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 0, 1051231437Sluigi "Tx Control Frames"); 1052231437Sluigi 1053231437Sluigi for (i = 0; i < sc->nwqs; i++) { 1054231437Sluigi sprintf(prefix, "queue%d",i); 1055231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 1056231437Sluigi SYSCTL_CHILDREN(tx_stats_node), 1057231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 1058231437Sluigi NULL, "Queue name"); 1059231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 1060231437Sluigi 1061231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 1062231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 1063231437Sluigi "Transmit Packets"); 1064231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 1065231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 1066231437Sluigi "Transmit Bytes"); 1067231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 1068231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 1069231437Sluigi "Transmit Requests"); 1070231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 1071231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 1072231437Sluigi "Transmit Stops"); 1073231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 1074231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 1075231437Sluigi "Transmit WRB's"); 1076231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 1077231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 1078231437Sluigi "Transmit Completions"); 1079231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 1080231437Sluigi "ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 1081231437Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 1082231437Sluigi "Transmit IPV6 Ext Header Drop"); 1083231437Sluigi 1084231437Sluigi } 1085231437Sluigi return; 1086231437Sluigi} 1087231437Sluigi 1088231437Sluigi 1089231437Sluigivoid 1090231437Sluigioce_refresh_queue_stats(POCE_SOFTC sc) 1091231437Sluigi{ 1092231437Sluigi struct oce_drv_stats *adapter_stats; 1093231437Sluigi int i; 1094231437Sluigi 1095231437Sluigi adapter_stats = &sc->oce_stats_info; 1096231437Sluigi 1097231437Sluigi /* Caluculate total TX and TXstats from all queues */ 1098231437Sluigi 1099231437Sluigi bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats)); 1100231437Sluigi for (i = 0; i < sc->nrqs; i++) { 1101231437Sluigi 1102231437Sluigi adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts; 1103231437Sluigi adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes; 1104231437Sluigi adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags; 1105231437Sluigi adapter_stats->rx.t_rx_mcast_pkts += 1106231437Sluigi sc->rq[i]->rx_stats.rx_mcast_pkts; 1107231437Sluigi adapter_stats->rx.t_rx_ucast_pkts += 1108231437Sluigi sc->rq[i]->rx_stats.rx_ucast_pkts; 1109231437Sluigi adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err; 1110231437Sluigi } 1111231437Sluigi 1112231437Sluigi bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats)); 1113231437Sluigi for (i = 0; i < sc->nwqs; i++) { 1114231437Sluigi adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs; 1115231437Sluigi adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops; 1116231437Sluigi adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs; 1117231437Sluigi adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl; 1118231437Sluigi adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes; 1119231437Sluigi adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts; 1120231437Sluigi adapter_stats->tx.t_ipv6_ext_hdr_tx_drop += 1121231437Sluigi sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop; 1122231437Sluigi } 1123231437Sluigi 1124231437Sluigi} 1125231437Sluigi 1126231437Sluigi 1127231437Sluigi 1128231437Sluigistatic void 1129231437Sluigicopy_stats_to_sc_xe201(POCE_SOFTC sc) 1130231437Sluigi{ 1131231437Sluigi struct oce_xe201_stats *adapter_stats; 1132231437Sluigi struct mbx_get_pport_stats *nic_mbx; 1133231437Sluigi struct pport_stats *port_stats; 1134231437Sluigi 1135231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats); 1136231437Sluigi port_stats = &nic_mbx->params.rsp.pps; 1137231437Sluigi adapter_stats = &sc->oce_stats_info.u0.xe201; 1138231437Sluigi 1139231437Sluigi adapter_stats->tx_pkts = port_stats->tx_pkts; 1140231437Sluigi adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts; 1141231437Sluigi adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts; 1142231437Sluigi adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts; 1143231437Sluigi adapter_stats->tx_bytes = port_stats->tx_bytes; 1144231437Sluigi adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes; 1145231437Sluigi adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes; 1146231437Sluigi adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes; 1147231437Sluigi adapter_stats->tx_discards = port_stats->tx_discards; 1148231437Sluigi adapter_stats->tx_errors = port_stats->tx_errors; 1149231437Sluigi adapter_stats->tx_pause_frames = port_stats->tx_pause_frames; 1150231437Sluigi adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames; 1151231437Sluigi adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames; 1152231437Sluigi adapter_stats->tx_internal_mac_errors = 1153231437Sluigi port_stats->tx_internal_mac_errors; 1154231437Sluigi adapter_stats->tx_control_frames = port_stats->tx_control_frames; 1155231437Sluigi adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes; 1156231437Sluigi adapter_stats->tx_pkts_65_to_127_bytes = 1157231437Sluigi port_stats->tx_pkts_65_to_127_bytes; 1158231437Sluigi adapter_stats->tx_pkts_128_to_255_bytes = 1159231437Sluigi port_stats->tx_pkts_128_to_255_bytes; 1160231437Sluigi adapter_stats->tx_pkts_256_to_511_bytes = 1161231437Sluigi port_stats->tx_pkts_256_to_511_bytes; 1162231437Sluigi adapter_stats->tx_pkts_512_to_1023_bytes = 1163231437Sluigi port_stats->tx_pkts_512_to_1023_bytes; 1164231437Sluigi adapter_stats->tx_pkts_1024_to_1518_bytes = 1165231437Sluigi port_stats->tx_pkts_1024_to_1518_bytes; 1166231437Sluigi adapter_stats->tx_pkts_1519_to_2047_bytes = 1167231437Sluigi port_stats->tx_pkts_1519_to_2047_bytes; 1168231437Sluigi adapter_stats->tx_pkts_2048_to_4095_bytes = 1169231437Sluigi port_stats->tx_pkts_2048_to_4095_bytes; 1170231437Sluigi adapter_stats->tx_pkts_4096_to_8191_bytes = 1171231437Sluigi port_stats->tx_pkts_4096_to_8191_bytes; 1172231437Sluigi adapter_stats->tx_pkts_8192_to_9216_bytes = 1173231437Sluigi port_stats->tx_pkts_8192_to_9216_bytes; 1174231437Sluigi adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts; 1175231437Sluigi adapter_stats->rx_pkts = port_stats->rx_pkts; 1176231437Sluigi adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts; 1177231437Sluigi adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts; 1178231437Sluigi adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts; 1179231437Sluigi adapter_stats->rx_bytes = port_stats->rx_bytes; 1180231437Sluigi adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes; 1181231437Sluigi adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes; 1182231437Sluigi adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes; 1183231437Sluigi adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos; 1184231437Sluigi adapter_stats->rx_discards = port_stats->rx_discards; 1185231437Sluigi adapter_stats->rx_errors = port_stats->rx_errors; 1186231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1187231437Sluigi adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors; 1188231437Sluigi adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors; 1189231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1190231437Sluigi adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames; 1191231437Sluigi adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames; 1192231437Sluigi adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long; 1193231437Sluigi adapter_stats->rx_internal_mac_errors = 1194231437Sluigi port_stats->rx_internal_mac_errors; 1195231437Sluigi adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts; 1196231437Sluigi adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts; 1197231437Sluigi adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts; 1198231437Sluigi adapter_stats->rx_jabbers = port_stats->rx_jabbers; 1199231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1200231437Sluigi adapter_stats->rx_control_frames_unknown_opcode = 1201231437Sluigi port_stats->rx_control_frames_unknown_opcode; 1202231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1203231437Sluigi adapter_stats->rx_out_of_range_errors = 1204231437Sluigi port_stats->rx_out_of_range_errors; 1205231437Sluigi adapter_stats->rx_address_match_errors = 1206231437Sluigi port_stats->rx_address_match_errors; 1207231437Sluigi adapter_stats->rx_vlan_mismatch_errors = 1208231437Sluigi port_stats->rx_vlan_mismatch_errors; 1209231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1210231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1211231437Sluigi adapter_stats->rx_dropped_header_too_small = 1212231437Sluigi port_stats->rx_dropped_header_too_small; 1213231437Sluigi adapter_stats->rx_dropped_invalid_tcp_length = 1214231437Sluigi port_stats->rx_dropped_invalid_tcp_length; 1215231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1216231437Sluigi adapter_stats->rx_ip_checksum_errors = 1217231437Sluigi port_stats->rx_ip_checksum_errors; 1218231437Sluigi adapter_stats->rx_tcp_checksum_errors = 1219231437Sluigi port_stats->rx_tcp_checksum_errors; 1220231437Sluigi adapter_stats->rx_udp_checksum_errors = 1221231437Sluigi port_stats->rx_udp_checksum_errors; 1222231437Sluigi adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts; 1223231437Sluigi adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts; 1224231437Sluigi adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts; 1225231437Sluigi adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes; 1226231437Sluigi adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes; 1227231437Sluigi adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts; 1228231437Sluigi adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts; 1229231437Sluigi adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts; 1230231437Sluigi adapter_stats->rx_management_pkts = port_stats->rx_management_pkts; 1231231437Sluigi adapter_stats->rx_switched_unicast_pkts = 1232231437Sluigi port_stats->rx_switched_unicast_pkts; 1233231437Sluigi adapter_stats->rx_switched_multicast_pkts = 1234231437Sluigi port_stats->rx_switched_multicast_pkts; 1235231437Sluigi adapter_stats->rx_switched_broadcast_pkts = 1236231437Sluigi port_stats->rx_switched_broadcast_pkts; 1237231437Sluigi adapter_stats->num_forwards = port_stats->num_forwards; 1238231437Sluigi adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow; 1239231437Sluigi adapter_stats->rx_input_fifo_overflow = 1240231437Sluigi port_stats->rx_input_fifo_overflow; 1241231437Sluigi adapter_stats->rx_drops_too_many_frags = 1242231437Sluigi port_stats->rx_drops_too_many_frags; 1243231437Sluigi adapter_stats->rx_drops_invalid_queue = 1244231437Sluigi port_stats->rx_drops_invalid_queue; 1245231437Sluigi adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu; 1246231437Sluigi adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes; 1247231437Sluigi adapter_stats->rx_pkts_65_to_127_bytes = 1248231437Sluigi port_stats->rx_pkts_65_to_127_bytes; 1249231437Sluigi adapter_stats->rx_pkts_128_to_255_bytes = 1250231437Sluigi port_stats->rx_pkts_128_to_255_bytes; 1251231437Sluigi adapter_stats->rx_pkts_256_to_511_bytes = 1252231437Sluigi port_stats->rx_pkts_256_to_511_bytes; 1253231437Sluigi adapter_stats->rx_pkts_512_to_1023_bytes = 1254231437Sluigi port_stats->rx_pkts_512_to_1023_bytes; 1255231437Sluigi adapter_stats->rx_pkts_1024_to_1518_bytes = 1256231437Sluigi port_stats->rx_pkts_1024_to_1518_bytes; 1257231437Sluigi adapter_stats->rx_pkts_1519_to_2047_bytes = 1258231437Sluigi port_stats->rx_pkts_1519_to_2047_bytes; 1259231437Sluigi adapter_stats->rx_pkts_2048_to_4095_bytes = 1260231437Sluigi port_stats->rx_pkts_2048_to_4095_bytes; 1261231437Sluigi adapter_stats->rx_pkts_4096_to_8191_bytes = 1262231437Sluigi port_stats->rx_pkts_4096_to_8191_bytes; 1263231437Sluigi adapter_stats->rx_pkts_8192_to_9216_bytes = 1264231437Sluigi port_stats->rx_pkts_8192_to_9216_bytes; 1265231437Sluigi} 1266231437Sluigi 1267231437Sluigi 1268231437Sluigi 1269231437Sluigistatic void 1270231437Sluigicopy_stats_to_sc_be2(POCE_SOFTC sc) 1271231437Sluigi{ 1272231437Sluigi struct oce_be_stats *adapter_stats; 1273231437Sluigi struct oce_pmem_stats *pmem; 1274231437Sluigi struct oce_rxf_stats_v0 *rxf_stats; 1275231437Sluigi struct oce_port_rxf_stats_v0 *port_stats; 1276231437Sluigi struct mbx_get_nic_stats_v0 *nic_mbx; 1277231437Sluigi uint32_t port = sc->port_id; 1278231437Sluigi 1279231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0); 1280231437Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1281231437Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1282231437Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1283231437Sluigi 1284231437Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1285231437Sluigi 1286231437Sluigi 1287231437Sluigi /* Update stats */ 1288231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1289231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1290231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1291231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1292231437Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1293231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1294231437Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1295231437Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1296231437Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1297231437Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1298231437Sluigi port_stats->rxpp_fifo_overflow_drop; 1299231437Sluigi adapter_stats->rx_dropped_tcp_length = 1300231437Sluigi port_stats->rx_dropped_tcp_length; 1301231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1302231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1303231437Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1304231437Sluigi adapter_stats->rx_dropped_header_too_small = 1305231437Sluigi port_stats->rx_dropped_header_too_small; 1306231437Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1307231437Sluigi port_stats->rx_input_fifo_overflow_drop; 1308231437Sluigi adapter_stats->rx_address_match_errors = 1309231437Sluigi port_stats->rx_address_match_errors; 1310231437Sluigi adapter_stats->rx_alignment_symbol_errors = 1311231437Sluigi port_stats->rx_alignment_symbol_errors; 1312231437Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1313231437Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1314231437Sluigi 1315231437Sluigi if (sc->if_id) 1316231437Sluigi adapter_stats->jabber_events = rxf_stats->port1_jabber_events; 1317231437Sluigi else 1318231437Sluigi adapter_stats->jabber_events = rxf_stats->port0_jabber_events; 1319231437Sluigi 1320231437Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1321231437Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1322231437Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1323231437Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1324231437Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1325231437Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1326231437Sluigi adapter_stats->rx_drops_no_tpre_descr = 1327231437Sluigi rxf_stats->rx_drops_no_tpre_descr; 1328231437Sluigi adapter_stats->rx_drops_too_many_frags = 1329231437Sluigi rxf_stats->rx_drops_too_many_frags; 1330231437Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1331231437Sluigi} 1332231437Sluigi 1333231437Sluigi 1334231437Sluigistatic void 1335231437Sluigicopy_stats_to_sc_be3(POCE_SOFTC sc) 1336231437Sluigi{ 1337231437Sluigi struct oce_be_stats *adapter_stats; 1338231437Sluigi struct oce_pmem_stats *pmem; 1339231437Sluigi struct oce_rxf_stats_v1 *rxf_stats; 1340231437Sluigi struct oce_port_rxf_stats_v1 *port_stats; 1341231437Sluigi struct mbx_get_nic_stats *nic_mbx; 1342231437Sluigi uint32_t port = sc->port_id; 1343231437Sluigi 1344231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats); 1345231437Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1346231437Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1347231437Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1348231437Sluigi 1349231437Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1350231437Sluigi 1351231437Sluigi /* Update stats */ 1352231437Sluigi adapter_stats->pmem_fifo_overflow_drop = 1353231437Sluigi port_stats->pmem_fifo_overflow_drop; 1354231437Sluigi adapter_stats->rx_priority_pause_frames = 1355231437Sluigi port_stats->rx_priority_pause_frames; 1356231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1357231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1358231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1359231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1360231437Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1361231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1362231437Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1363231437Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1364231437Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1365231437Sluigi adapter_stats->rx_dropped_tcp_length = 1366231437Sluigi port_stats->rx_dropped_tcp_length; 1367231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1368231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1369231437Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1370231437Sluigi adapter_stats->rx_dropped_header_too_small = 1371231437Sluigi port_stats->rx_dropped_header_too_small; 1372231437Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1373231437Sluigi port_stats->rx_input_fifo_overflow_drop; 1374231437Sluigi adapter_stats->rx_address_match_errors = 1375231437Sluigi port_stats->rx_address_match_errors; 1376231437Sluigi adapter_stats->rx_alignment_symbol_errors = 1377231437Sluigi port_stats->rx_alignment_symbol_errors; 1378231437Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1379231437Sluigi port_stats->rxpp_fifo_overflow_drop; 1380231437Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1381231437Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1382231437Sluigi adapter_stats->jabber_events = port_stats->jabber_events; 1383231437Sluigi 1384231437Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1385231437Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1386231437Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1387231437Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1388231437Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1389231437Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1390231437Sluigi adapter_stats->rx_drops_no_tpre_descr = 1391231437Sluigi rxf_stats->rx_drops_no_tpre_descr; 1392231437Sluigi adapter_stats->rx_drops_too_many_frags = 1393231437Sluigi rxf_stats->rx_drops_too_many_frags; 1394231437Sluigi 1395231437Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1396231437Sluigi} 1397231437Sluigi 1398231437Sluigi 1399231437Sluigiint 1400231437Sluigioce_stats_init(POCE_SOFTC sc) 1401231437Sluigi{ 1402231437Sluigi int rc = 0, sz; 1403231437Sluigi 1404252869Sdelphij if (IS_BE(sc) || IS_SH(sc)) { 1405231437Sluigi if (sc->flags & OCE_FLAGS_BE2) 1406231437Sluigi sz = sizeof(struct mbx_get_nic_stats_v0); 1407231437Sluigi else 1408231437Sluigi sz = sizeof(struct mbx_get_nic_stats); 1409231437Sluigi } else 1410231437Sluigi sz = sizeof(struct mbx_get_pport_stats); 1411231437Sluigi 1412231437Sluigi rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0); 1413231437Sluigi 1414231437Sluigi return rc; 1415231437Sluigi} 1416231437Sluigi 1417231437Sluigi 1418231437Sluigivoid 1419231437Sluigioce_stats_free(POCE_SOFTC sc) 1420231437Sluigi{ 1421231437Sluigi 1422231437Sluigi oce_dma_free(sc, &sc->stats_mem); 1423231437Sluigi 1424231437Sluigi} 1425231437Sluigi 1426231437Sluigi 1427231437Sluigiint 1428231437Sluigioce_refresh_nic_stats(POCE_SOFTC sc) 1429231437Sluigi{ 1430231437Sluigi int rc = 0, reset = 0; 1431231437Sluigi 1432252869Sdelphij if (IS_BE(sc) || IS_SH(sc)) { 1433231437Sluigi if (sc->flags & OCE_FLAGS_BE2) { 1434231437Sluigi rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem); 1435231437Sluigi if (!rc) 1436231437Sluigi copy_stats_to_sc_be2(sc); 1437231437Sluigi } else { 1438231437Sluigi rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem); 1439231437Sluigi if (!rc) 1440231437Sluigi copy_stats_to_sc_be3(sc); 1441231437Sluigi } 1442231437Sluigi 1443231437Sluigi } else { 1444231437Sluigi rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset); 1445231437Sluigi if (!rc) 1446231437Sluigi copy_stats_to_sc_xe201(sc); 1447231437Sluigi } 1448231437Sluigi 1449231437Sluigi return rc; 1450231437Sluigi} 1451247880Sdelphij 1452247880Sdelphijstatic int 1453247880Sdelphijoce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS) 1454247880Sdelphij{ 1455247880Sdelphij int result = 0, error; 1456247880Sdelphij int rc = 0; 1457247880Sdelphij POCE_SOFTC sc = (POCE_SOFTC) arg1; 1458247880Sdelphij 1459247880Sdelphij /* sysctl default handler */ 1460247880Sdelphij error = sysctl_handle_int(oidp, &result, 0, req); 1461247880Sdelphij if (error || !req->newptr) 1462247880Sdelphij return (error); 1463247880Sdelphij 1464247880Sdelphij if(result == -1) { 1465247880Sdelphij return EINVAL; 1466247880Sdelphij } 1467247880Sdelphij bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE); 1468247880Sdelphij 1469247880Sdelphij rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0); 1470247880Sdelphij if(rc) 1471247880Sdelphij return rc; 1472247880Sdelphij 1473247880Sdelphij rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2); 1474247880Sdelphij if(rc) 1475247880Sdelphij return rc; 1476247880Sdelphij 1477247880Sdelphij return rc; 1478247880Sdelphij} 1479