oce_sysctl.c revision 231879
1231437Sluigi/*- 2231437Sluigi * Copyright (C) 2012 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 231879 2012-02-17 13:55:17Z luigi $ */ 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); 48231437Sluigistatic int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS); 49231437Sluigistatic int oce_be3_flashdata(POCE_SOFTC sc, const struct firmware 50231437Sluigi *fw, int num_imgs); 51231437Sluigistatic int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 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 63231437Sluigiextern char component_revision[32]; 64231437Sluigi 65231437Sluigi 66231437Sluigivoid 67231437Sluigioce_add_sysctls(POCE_SOFTC sc) 68231437Sluigi{ 69231437Sluigi 70231437Sluigi struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev); 71231437Sluigi struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev); 72231437Sluigi struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree); 73231437Sluigi struct sysctl_oid *stats_node; 74231437Sluigi 75231437Sluigi SYSCTL_ADD_STRING(ctx, child, 76231437Sluigi OID_AUTO, "component_revision", 77231437Sluigi CTLTYPE_INT | CTLFLAG_RD, 78231437Sluigi &component_revision, 79231437Sluigi sizeof(component_revision), 80231437Sluigi "EMULEX One-Connect device driver revision"); 81231437Sluigi 82231437Sluigi SYSCTL_ADD_STRING(ctx, child, 83231437Sluigi OID_AUTO, "firmware_version", 84231437Sluigi CTLTYPE_INT | CTLFLAG_RD, 85231437Sluigi &sc->fw_version, 86231437Sluigi sizeof(sc->fw_version), 87231437Sluigi "EMULEX One-Connect Firmware Version"); 88231437Sluigi 89231437Sluigi SYSCTL_ADD_INT(ctx, child, 90231437Sluigi OID_AUTO, "max_rsp_handled", 91231437Sluigi CTLTYPE_INT | CTLFLAG_RW, 92231437Sluigi &oce_max_rsp_handled, 93231437Sluigi sizeof(oce_max_rsp_handled), 94231437Sluigi "Maximum receive frames handled per interupt"); 95231437Sluigi 96231437Sluigi if (sc->function_mode & FNM_FLEX10_MODE) 97231437Sluigi SYSCTL_ADD_UINT(ctx, child, 98231437Sluigi OID_AUTO, "speed", 99231437Sluigi CTLFLAG_RD, 100231437Sluigi &sc->qos_link_speed, 101231437Sluigi 0,"QOS Speed"); 102231437Sluigi else 103231437Sluigi SYSCTL_ADD_UINT(ctx, child, 104231437Sluigi OID_AUTO, "speed", 105231437Sluigi CTLFLAG_RD, 106231437Sluigi &sc->speed, 107231437Sluigi 0,"Link Speed"); 108231437Sluigi 109231879Sluigi if (sc->function_mode & FNM_UMC_MODE) 110231879Sluigi SYSCTL_ADD_UINT(ctx, child, 111231879Sluigi OID_AUTO, "pvid", 112231879Sluigi CTLFLAG_RD, 113231879Sluigi &sc->pvid, 114231879Sluigi 0,"PVID"); 115231879Sluigi 116231437Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back", 117231437Sluigi CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, 118231437Sluigi oce_sysctl_loopback, "I", "Loop Back Tests"); 119231437Sluigi 120231437Sluigi SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade", 121231437Sluigi CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0, 122231437Sluigi oce_sys_fwupgrade, "A", "Firmware ufi file"); 123231437Sluigi 124231437Sluigi stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", 125231437Sluigi CTLFLAG_RD, NULL, "Ethernet Statistics"); 126231437Sluigi 127231437Sluigi if (IS_BE(sc)) 128231437Sluigi oce_add_stats_sysctls_be3(sc, ctx, stats_node); 129231437Sluigi else 130231437Sluigi oce_add_stats_sysctls_xe201(sc, ctx, stats_node); 131231437Sluigi 132231437Sluigi 133231437Sluigi} 134231437Sluigi 135231437Sluigi 136231437Sluigi 137231437Sluigistatic uint32_t 138231437Sluigioce_loopback_test(struct oce_softc *sc, uint8_t loopback_type) 139231437Sluigi{ 140231437Sluigi uint32_t status = 0; 141231437Sluigi 142231437Sluigi oce_mbox_cmd_set_loopback(sc, sc->if_id, loopback_type, 1); 143231437Sluigi status = oce_mbox_cmd_test_loopback(sc, sc->if_id, loopback_type, 144231437Sluigi 1500, 2, 0xabc); 145231437Sluigi oce_mbox_cmd_set_loopback(sc, sc->if_id, OCE_NO_LOOPBACK, 1); 146231437Sluigi 147231437Sluigi return status; 148231437Sluigi} 149231437Sluigi 150231437Sluigi 151231437Sluigistatic int 152231437Sluigioce_sysctl_loopback(SYSCTL_HANDLER_ARGS) 153231437Sluigi{ 154231437Sluigi int value = 0; 155231437Sluigi uint32_t status; 156231437Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 157231437Sluigi 158231437Sluigi status = sysctl_handle_int(oidp, &value, 0, req); 159231437Sluigi if (status || !req->newptr) 160231437Sluigi return status; 161231437Sluigi 162231437Sluigi if (value != 1) { 163231437Sluigi device_printf(sc->dev, 164231437Sluigi "Not a Valid value. Set to loop_back=1 to run tests\n"); 165231437Sluigi return 0; 166231437Sluigi } 167231437Sluigi 168231437Sluigi if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) { 169231437Sluigi device_printf(sc->dev, 170231437Sluigi "MAC Loopback Test = Failed (Error status = %d)\n", 171231437Sluigi status); 172231437Sluigi } else 173231437Sluigi device_printf(sc->dev, "MAC Loopback Test = Success\n"); 174231437Sluigi 175231437Sluigi if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) { 176231437Sluigi device_printf(sc->dev, 177231437Sluigi "PHY Loopback Test = Failed (Error status = %d)\n", 178231437Sluigi status); 179231437Sluigi } else 180231437Sluigi device_printf(sc->dev, "PHY Loopback Test = Success\n"); 181231437Sluigi 182231437Sluigi if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) { 183231437Sluigi device_printf(sc->dev, 184231437Sluigi "EXT Loopback Test = Failed (Error status = %d)\n", 185231437Sluigi status); 186231437Sluigi } else 187231437Sluigi device_printf(sc->dev, "EXT Loopback Test = Success\n"); 188231437Sluigi 189231437Sluigi return 0; 190231437Sluigi} 191231437Sluigi 192231437Sluigi 193231437Sluigistatic int 194231437Sluigioce_sys_fwupgrade(SYSCTL_HANDLER_ARGS) 195231437Sluigi{ 196231437Sluigi char ufiname[256] = {0}; 197231437Sluigi uint32_t status = 1; 198231437Sluigi struct oce_softc *sc = (struct oce_softc *)arg1; 199231437Sluigi const struct firmware *fw; 200231437Sluigi 201231437Sluigi status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req); 202231437Sluigi if (status || !req->newptr) 203231437Sluigi return status; 204231437Sluigi 205231437Sluigi fw = firmware_get(ufiname); 206231437Sluigi if (fw == NULL) { 207231437Sluigi device_printf(sc->dev, "Unable to get Firmware. " 208231437Sluigi "Make sure %s is copied to /boot/modules\n", ufiname); 209231437Sluigi return ENOENT; 210231437Sluigi } 211231437Sluigi 212231437Sluigi if (IS_BE(sc)) { 213231437Sluigi if ((sc->flags & OCE_FLAGS_BE2)) { 214231437Sluigi device_printf(sc->dev, 215231437Sluigi "Flashing not supported for BE2 yet.\n"); 216231437Sluigi status = 1; 217231437Sluigi goto done; 218231437Sluigi } 219231437Sluigi status = oce_be3_fwupgrade(sc, fw); 220231437Sluigi } else 221231437Sluigi status = oce_lancer_fwupgrade(sc, fw); 222231437Sluigidone: 223231437Sluigi if (status) { 224231437Sluigi device_printf(sc->dev, "Firmware Upgrade failed\n"); 225231437Sluigi } else { 226231437Sluigi device_printf(sc->dev, "Firmware Flashed successfully\n"); 227231437Sluigi } 228231437Sluigi 229231437Sluigi /* Release Firmware*/ 230231437Sluigi firmware_put(fw, FIRMWARE_UNLOAD); 231231437Sluigi 232231437Sluigi return status; 233231437Sluigi} 234231437Sluigi 235231437Sluigi 236231437Sluigistatic int 237231437Sluigioce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 238231437Sluigi{ 239231437Sluigi int rc = 0, num_imgs = 0, i = 0; 240231437Sluigi const struct flash_file_hdr *fhdr; 241231437Sluigi const struct image_hdr *img_ptr; 242231437Sluigi 243231437Sluigi fhdr = (const struct flash_file_hdr *)fw->data; 244231437Sluigi if (fhdr->build[0] != '3') { 245231437Sluigi device_printf(sc->dev, "Invalid BE3 firmware image\n"); 246231437Sluigi return EINVAL; 247231437Sluigi } 248231437Sluigi /* Display flash version */ 249231437Sluigi device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 250231437Sluigi 251231437Sluigi num_imgs = fhdr->num_imgs; 252231437Sluigi for (i = 0; i < num_imgs; i++) { 253231437Sluigi img_ptr = (const struct image_hdr *)((const char *)fw->data + 254231437Sluigi sizeof(struct flash_file_hdr) + 255231437Sluigi (i * sizeof(struct image_hdr))); 256231437Sluigi if (img_ptr->imageid == 1) { 257231437Sluigi rc = oce_be3_flashdata(sc, fw, num_imgs); 258231437Sluigi break; 259231437Sluigi } 260231437Sluigi } 261231437Sluigi 262231437Sluigi return rc; 263231437Sluigi} 264231437Sluigi 265231437Sluigi 266231437Sluigistatic int 267231437Sluigioce_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int num_imgs) 268231437Sluigi{ 269231437Sluigi char cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "}; 270231437Sluigi const char *p = (const char *)fw->data; 271231437Sluigi const struct flash_sec_info *fsec = NULL; 272231437Sluigi struct mbx_common_read_write_flashrom *req; 273231437Sluigi int rc = 0, i, img_type, bin_offset = 0; 274231437Sluigi boolean_t skip_image; 275231437Sluigi uint32_t optype = 0, size = 0, start = 0, num_bytes = 0; 276231437Sluigi uint32_t opcode = 0; 277231437Sluigi OCE_DMA_MEM dma_mem; 278231437Sluigi 279231437Sluigi /* Validate Cookie */ 280231437Sluigi bin_offset = (sizeof(struct flash_file_hdr) + 281231437Sluigi (num_imgs * sizeof(struct image_hdr))); 282231437Sluigi p += bin_offset; 283231437Sluigi while (p < ((const char *)fw->data + fw->datasize)) { 284231437Sluigi fsec = (const struct flash_sec_info *)p; 285231437Sluigi if (!memcmp(cookie, fsec->cookie, sizeof(cookie))) 286231437Sluigi break; 287231437Sluigi fsec = NULL; 288231437Sluigi p += 32; 289231437Sluigi } 290231437Sluigi 291231437Sluigi if (!fsec) { 292231437Sluigi device_printf(sc->dev, 293231437Sluigi "Invalid Cookie. Firmware image corrupted ?\n"); 294231437Sluigi return EINVAL; 295231437Sluigi } 296231437Sluigi 297231437Sluigi rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom) 298231437Sluigi + 32*1024, &dma_mem, 0); 299231437Sluigi if (rc) { 300231437Sluigi device_printf(sc->dev, 301231437Sluigi "Memory allocation failure while flashing\n"); 302231437Sluigi return ENOMEM; 303231437Sluigi } 304231437Sluigi req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom); 305231437Sluigi 306231437Sluigi for (i = 0; i < MAX_FLASH_COMP; i++) { 307231437Sluigi 308231437Sluigi img_type = fsec->fsec_entry[i].type; 309231437Sluigi skip_image = FALSE; 310231437Sluigi switch (img_type) { 311231437Sluigi case IMG_ISCSI: 312231437Sluigi optype = 0; 313231437Sluigi size = 2097152; 314231437Sluigi start = 2097152; 315231437Sluigi break; 316231437Sluigi case IMG_REDBOOT: 317231437Sluigi optype = 1; 318231437Sluigi size = 1048576; 319231437Sluigi start = 262144; 320231437Sluigi if (!oce_img_flashing_required(sc, fw->data, 321231437Sluigi optype, start, size, bin_offset)) 322231437Sluigi skip_image = TRUE; 323231437Sluigi break; 324231437Sluigi case IMG_BIOS: 325231437Sluigi optype = 2; 326231437Sluigi size = 524288; 327231437Sluigi start = 12582912; 328231437Sluigi break; 329231437Sluigi case IMG_PXEBIOS: 330231437Sluigi optype = 3; 331231437Sluigi size = 524288; 332231437Sluigi start = 13107200; 333231437Sluigi break; 334231437Sluigi case IMG_FCOEBIOS: 335231437Sluigi optype = 8; 336231437Sluigi size = 524288; 337231437Sluigi start = 13631488; 338231437Sluigi break; 339231437Sluigi case IMG_ISCSI_BAK: 340231437Sluigi optype = 9; 341231437Sluigi size = 2097152; 342231437Sluigi start = 4194304; 343231437Sluigi break; 344231437Sluigi case IMG_FCOE: 345231437Sluigi optype = 10; 346231437Sluigi size = 2097152; 347231437Sluigi start = 6291456; 348231437Sluigi break; 349231437Sluigi case IMG_FCOE_BAK: 350231437Sluigi optype = 11; 351231437Sluigi size = 2097152; 352231437Sluigi start = 8388608; 353231437Sluigi break; 354231437Sluigi case IMG_NCSI: 355231437Sluigi optype = 13; 356231437Sluigi size = 262144; 357231437Sluigi start = 15990784; 358231437Sluigi break; 359231437Sluigi case IMG_PHY: 360231437Sluigi optype = 99; 361231437Sluigi size = 262144; 362231437Sluigi start = 1310720; 363231437Sluigi if (!oce_phy_flashing_required(sc)) 364231437Sluigi skip_image = TRUE; 365231437Sluigi break; 366231437Sluigi default: 367231437Sluigi skip_image = TRUE; 368231437Sluigi break; 369231437Sluigi } 370231437Sluigi if (skip_image) 371231437Sluigi continue; 372231437Sluigi 373231437Sluigi p = fw->data; 374231437Sluigi p = p + bin_offset + start; 375231437Sluigi if ((p + size) > ((const char *)fw->data + fw->datasize)) { 376231437Sluigi rc = 1; 377231437Sluigi goto ret; 378231437Sluigi } 379231437Sluigi 380231437Sluigi while (size) { 381231437Sluigi 382231437Sluigi if (size > 32*1024) 383231437Sluigi num_bytes = 32*1024; 384231437Sluigi else 385231437Sluigi num_bytes = size; 386231437Sluigi size -= num_bytes; 387231437Sluigi 388231437Sluigi if (!size) 389231437Sluigi opcode = FLASHROM_OPER_FLASH; 390231437Sluigi else 391231437Sluigi opcode = FLASHROM_OPER_SAVE; 392231437Sluigi 393231437Sluigi memcpy(req->data_buffer, p, num_bytes); 394231437Sluigi p += num_bytes; 395231437Sluigi 396231437Sluigi rc = oce_mbox_write_flashrom(sc, optype, opcode, 397231437Sluigi &dma_mem, num_bytes); 398231437Sluigi if (rc) { 399231437Sluigi device_printf(sc->dev, 400231437Sluigi "cmd to write to flash rom failed.\n"); 401231437Sluigi rc = EIO; 402231437Sluigi goto ret; 403231437Sluigi } 404231437Sluigi /* Leave the CPU for others for some time */ 405231437Sluigi pause("yield", 10); 406231437Sluigi 407231437Sluigi } 408231437Sluigi } 409231437Sluigiret: 410231437Sluigi oce_dma_free(sc, &dma_mem); 411231437Sluigi return rc; 412231437Sluigi 413231437Sluigi} 414231437Sluigi 415231437Sluigi 416231437Sluigistatic boolean_t 417231437Sluigioce_phy_flashing_required(POCE_SOFTC sc) 418231437Sluigi{ 419231437Sluigi int status = 0; 420231437Sluigi struct oce_phy_info phy_info; 421231437Sluigi 422231437Sluigi status = oce_mbox_get_phy_info(sc, &phy_info); 423231437Sluigi if (status) 424231437Sluigi return FALSE; 425231437Sluigi 426231437Sluigi if ((phy_info.phy_type == TN_8022) && 427231437Sluigi (phy_info.interface_type == PHY_TYPE_BASET_10GB)) { 428231437Sluigi return TRUE; 429231437Sluigi } 430231437Sluigi 431231437Sluigi return FALSE; 432231437Sluigi} 433231437Sluigi 434231437Sluigi 435231437Sluigistatic boolean_t 436231437Sluigioce_img_flashing_required(POCE_SOFTC sc, const char *p, 437231437Sluigi int img_optype, uint32_t img_offset, 438231437Sluigi uint32_t img_size, uint32_t hdrs_size) 439231437Sluigi{ 440231437Sluigi uint32_t crc_offset; 441231437Sluigi uint8_t flashed_crc[4]; 442231437Sluigi int status; 443231437Sluigi 444231437Sluigi crc_offset = hdrs_size + img_offset + img_size - 4; 445231437Sluigi 446231437Sluigi p += crc_offset; 447231437Sluigi 448231437Sluigi status = oce_mbox_get_flashrom_crc(sc, flashed_crc, 449231437Sluigi (img_size - 4), img_optype); 450231437Sluigi if (status) 451231437Sluigi return TRUE; /* Some thing worng. ReFlash */ 452231437Sluigi 453231437Sluigi /*update redboot only if crc does not match*/ 454231437Sluigi if (bcmp(flashed_crc, p, 4)) 455231437Sluigi return TRUE; 456231437Sluigi else 457231437Sluigi return FALSE; 458231437Sluigi} 459231437Sluigi 460231437Sluigi 461231437Sluigistatic int 462231437Sluigioce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 463231437Sluigi{ 464231437Sluigi 465231437Sluigi int rc = 0; 466231437Sluigi OCE_DMA_MEM dma_mem; 467231437Sluigi const uint8_t *data = NULL; 468231437Sluigi uint8_t *dest_image_ptr = NULL; 469231437Sluigi size_t size = 0; 470231437Sluigi uint32_t data_written = 0, chunk_size = 0; 471231437Sluigi uint32_t offset = 0, add_status = 0; 472231437Sluigi 473231437Sluigi if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) { 474231437Sluigi device_printf(sc->dev, 475231437Sluigi "Lancer FW image is not 4 byte aligned."); 476231437Sluigi return EINVAL; 477231437Sluigi } 478231437Sluigi 479231437Sluigi rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0); 480231437Sluigi if (rc) { 481231437Sluigi device_printf(sc->dev, 482231437Sluigi "Memory allocation failure while flashing Lancer\n"); 483231437Sluigi return ENOMEM; 484231437Sluigi } 485231437Sluigi 486231437Sluigi size = fw->datasize; 487231437Sluigi data = fw->data; 488231437Sluigi dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t); 489231437Sluigi 490231437Sluigi while (size) { 491231437Sluigi chunk_size = MIN(size, (32*1024)); 492231437Sluigi 493231437Sluigi bcopy(data, dest_image_ptr, chunk_size); 494231437Sluigi 495231437Sluigi rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset, 496231437Sluigi &dma_mem, &data_written, &add_status); 497231437Sluigi 498231437Sluigi if (rc) 499231437Sluigi break; 500231437Sluigi 501231437Sluigi size -= data_written; 502231437Sluigi data += data_written; 503231437Sluigi offset += data_written; 504231437Sluigi pause("yield", 10); 505231437Sluigi 506231437Sluigi } 507231437Sluigi 508231437Sluigi if (!rc) 509231437Sluigi /* Commit the firmware*/ 510231437Sluigi rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem, 511231437Sluigi &data_written, &add_status); 512231437Sluigi if (rc) { 513231437Sluigi device_printf(sc->dev, "Lancer firmware load error. " 514231437Sluigi "Addstatus = 0x%x, status = %d \n", add_status, rc); 515231437Sluigi rc = EIO; 516231437Sluigi } 517231437Sluigi oce_dma_free(sc, &dma_mem); 518231437Sluigi return rc; 519231437Sluigi 520231437Sluigi} 521231437Sluigi 522231437Sluigi 523231437Sluigistatic void 524231437Sluigioce_add_stats_sysctls_be3(POCE_SOFTC sc, 525231437Sluigi struct sysctl_ctx_list *ctx, 526231437Sluigi struct sysctl_oid *stats_node) 527231437Sluigi{ 528231437Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 529231437Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 530231437Sluigi struct sysctl_oid_list *queue_stats_list; 531231437Sluigi struct sysctl_oid *queue_stats_node; 532231437Sluigi struct oce_drv_stats *stats; 533231437Sluigi char prefix[32]; 534231437Sluigi int i; 535231437Sluigi 536231437Sluigi stats = &sc->oce_stats_info; 537231437Sluigi 538231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 539231437Sluigi SYSCTL_CHILDREN(stats_node), 540231437Sluigi OID_AUTO,"rx", CTLFLAG_RD, 541231437Sluigi NULL, "RX Ethernet Statistics"); 542231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 543231437Sluigi 544231437Sluigi 545231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 546231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 547231437Sluigi "Total Received Packets"); 548231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 549231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 550231437Sluigi "Total Received Bytes"); 551231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 552231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 553231437Sluigi "Total Received Fragements"); 554231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 555231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 556231437Sluigi "Total Received Multicast Packets"); 557231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 558231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 559231437Sluigi "Total Received Unicast Packets"); 560231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 561231437Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 562231437Sluigi "Total Receive completion errors"); 563231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 564231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0, 565231437Sluigi "Pause Frames"); 566231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames", 567231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0, 568231437Sluigi "Priority Pause Frames"); 569231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 570231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0, 571231437Sluigi "Control Frames"); 572231437Sluigi 573231437Sluigi for (i = 0; i < sc->nrqs; i++) { 574231437Sluigi sprintf(prefix, "queue%d",i); 575231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 576231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 577231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 578231437Sluigi NULL, "Queue name"); 579231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 580231437Sluigi 581231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 582231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 583231437Sluigi "Receive Packets"); 584231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 585231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 586231437Sluigi "Recived Bytes"); 587231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 588231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 589231437Sluigi "Received Fragments"); 590231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 591231437Sluigi "rx_mcast_pkts", CTLFLAG_RD, 592231437Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 593231437Sluigi "Received Multicast Packets"); 594231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 595231437Sluigi "rx_ucast_pkts", CTLFLAG_RD, 596231437Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 597231437Sluigi "Received Unicast Packets"); 598231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 599231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 600231437Sluigi "Received Completion Errors"); 601231437Sluigi 602231437Sluigi } 603231437Sluigi 604231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 605231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 606231437Sluigi OID_AUTO, "err", CTLFLAG_RD, 607231437Sluigi NULL, "Receive Error Stats"); 608231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 609231437Sluigi 610231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 611231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0, 612231437Sluigi "CRC Errors"); 613231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors", 614231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0, 615231437Sluigi "Drops due to pbuf full"); 616231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors", 617231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0, 618231437Sluigi "ERX Errors"); 619231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 620231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0, 621231437Sluigi "RX Alignmnet Errors"); 622231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 623231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0, 624231437Sluigi "In Range Errors"); 625231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 626231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0, 627231437Sluigi "Out Range Errors"); 628231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 629231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0, 630231437Sluigi "Frame Too Long"); 631231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 632231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0, 633231437Sluigi "Address Match Errors"); 634231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 635231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0, 636231437Sluigi "Dropped Too Small"); 637231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 638231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0, 639231437Sluigi "Dropped Too Short"); 640231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 641231437Sluigi "dropped_header_too_small", CTLFLAG_RD, 642231437Sluigi &stats->u0.be.rx_dropped_header_too_small, 0, 643231437Sluigi "Dropped Header Too Small"); 644231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length", 645231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0, 646231437Sluigi "Dropped TCP Length"); 647231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 648231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0, 649231437Sluigi "Dropped runt"); 650231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 651231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0, 652231437Sluigi "IP Checksum Errors"); 653231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 654231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0, 655231437Sluigi "TCP Checksum Errors"); 656231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 657231437Sluigi CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0, 658231437Sluigi "UDP Checksum Errors"); 659231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop", 660231437Sluigi CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0, 661231437Sluigi "FIFO Overflow Drop"); 662231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 663231437Sluigi "input_fifo_overflow_drop", CTLFLAG_RD, 664231437Sluigi &stats->u0.be.rx_input_fifo_overflow_drop, 0, 665231437Sluigi "Input FIFO Overflow Drop"); 666231437Sluigi 667231437Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 668231437Sluigi SYSCTL_CHILDREN(stats_node), OID_AUTO, 669231437Sluigi "tx",CTLFLAG_RD, NULL, 670231437Sluigi "TX Ethernet Statistics"); 671231437Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 672231437Sluigi 673231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 674231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 675231437Sluigi "Total Transmit Packets"); 676231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 677231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 678231437Sluigi "Total Transmit Bytes"); 679231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 680231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 681231437Sluigi "Total Transmit Requests"); 682231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 683231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 684231437Sluigi "Total Transmit Stops"); 685231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 686231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 687231437Sluigi "Total Transmit WRB's"); 688231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 689231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 690231437Sluigi "Total Transmit Completions"); 691231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 692231437Sluigi "total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 693231437Sluigi &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 694231437Sluigi "Total Transmit IPV6 Drops"); 695231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 696231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0, 697231437Sluigi "Pause Frames"); 698231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes", 699231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0, 700231437Sluigi "Priority Pauseframes"); 701231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 702231437Sluigi CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0, 703231437Sluigi "Tx Control Frames"); 704231437Sluigi 705231437Sluigi for (i = 0; i < sc->nwqs; i++) { 706231437Sluigi sprintf(prefix, "queue%d",i); 707231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 708231437Sluigi SYSCTL_CHILDREN(tx_stats_node), 709231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 710231437Sluigi NULL, "Queue name"); 711231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 712231437Sluigi 713231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 714231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 715231437Sluigi "Transmit Packets"); 716231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 717231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 718231437Sluigi "Transmit Bytes"); 719231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 720231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 721231437Sluigi "Transmit Requests"); 722231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 723231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 724231437Sluigi "Transmit Stops"); 725231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 726231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 727231437Sluigi "Transmit WRB's"); 728231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 729231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 730231437Sluigi "Transmit Completions"); 731231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 732231437Sluigi "ipv6_ext_hdr_tx_drop",CTLFLAG_RD, 733231437Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 734231437Sluigi "Transmit IPV6 Ext Header Drop"); 735231437Sluigi 736231437Sluigi } 737231437Sluigi return; 738231437Sluigi} 739231437Sluigi 740231437Sluigi 741231437Sluigistatic void 742231437Sluigioce_add_stats_sysctls_xe201(POCE_SOFTC sc, 743231437Sluigi struct sysctl_ctx_list *ctx, 744231437Sluigi struct sysctl_oid *stats_node) 745231437Sluigi{ 746231437Sluigi struct sysctl_oid *rx_stats_node, *tx_stats_node; 747231437Sluigi struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 748231437Sluigi struct sysctl_oid_list *queue_stats_list; 749231437Sluigi struct sysctl_oid *queue_stats_node; 750231437Sluigi struct oce_drv_stats *stats; 751231437Sluigi char prefix[32]; 752231437Sluigi int i; 753231437Sluigi 754231437Sluigi stats = &sc->oce_stats_info; 755231437Sluigi 756231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 757231437Sluigi SYSCTL_CHILDREN(stats_node), 758231437Sluigi OID_AUTO, "rx", CTLFLAG_RD, 759231437Sluigi NULL, "RX Ethernet Statistics"); 760231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 761231437Sluigi 762231437Sluigi 763231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 764231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_pkts, 765231437Sluigi "Total Received Packets"); 766231437Sluigi SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 767231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_bytes, 768231437Sluigi "Total Received Bytes"); 769231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 770231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 771231437Sluigi "Total Received Fragements"); 772231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 773231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 774231437Sluigi "Total Received Multicast Packets"); 775231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 776231437Sluigi CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 777231437Sluigi "Total Received Unicast Packets"); 778231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 779231437Sluigi CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 780231437Sluigi "Total Receive completion errors"); 781231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 782231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 0, 783231437Sluigi "Pause Frames"); 784231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 785231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 0, 786231437Sluigi "Control Frames"); 787231437Sluigi 788231437Sluigi for (i = 0; i < sc->nrqs; i++) { 789231437Sluigi sprintf(prefix, "queue%d",i); 790231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 791231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 792231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 793231437Sluigi NULL, "Queue name"); 794231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 795231437Sluigi 796231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 797231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 798231437Sluigi "Receive Packets"); 799231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 800231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 801231437Sluigi "Recived Bytes"); 802231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 803231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 804231437Sluigi "Received Fragments"); 805231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 806231437Sluigi "rx_mcast_pkts", CTLFLAG_RD, 807231437Sluigi &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 808231437Sluigi "Received Multicast Packets"); 809231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 810231437Sluigi "rx_ucast_pkts",CTLFLAG_RD, 811231437Sluigi &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 812231437Sluigi "Received Unicast Packets"); 813231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 814231437Sluigi CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 815231437Sluigi "Received Completion Errors"); 816231437Sluigi 817231437Sluigi } 818231437Sluigi 819231437Sluigi rx_stats_node = SYSCTL_ADD_NODE(ctx, 820231437Sluigi SYSCTL_CHILDREN(rx_stats_node), 821231437Sluigi OID_AUTO, "err", CTLFLAG_RD, 822231437Sluigi NULL, "Receive Error Stats"); 823231437Sluigi rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 824231437Sluigi 825231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 826231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 0, 827231437Sluigi "CRC Errors"); 828231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 829231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 0, 830231437Sluigi "RX Alignmnet Errors"); 831231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 832231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0, 833231437Sluigi "In Range Errors"); 834231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 835231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0, 836231437Sluigi "Out Range Errors"); 837231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 838231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 0, 839231437Sluigi "Frame Too Long"); 840231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 841231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0, 842231437Sluigi "Address Match Errors"); 843231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 844231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0, 845231437Sluigi "Dropped Too Small"); 846231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 847231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0, 848231437Sluigi "Dropped Too Short"); 849231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 850231437Sluigi "dropped_header_too_small", CTLFLAG_RD, 851231437Sluigi &stats->u0.xe201.rx_dropped_header_too_small, 0, 852231437Sluigi "Dropped Header Too Small"); 853231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 854231437Sluigi "dropped_tcp_length", CTLFLAG_RD, 855231437Sluigi &stats->u0.xe201.rx_dropped_invalid_tcp_length, 0, 856231437Sluigi "Dropped TCP Length"); 857231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 858231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0, 859231437Sluigi "Dropped runt"); 860231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 861231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0, 862231437Sluigi "IP Checksum Errors"); 863231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 864231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0, 865231437Sluigi "TCP Checksum Errors"); 866231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 867231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0, 868231437Sluigi "UDP Checksum Errors"); 869231437Sluigi SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop", 870231437Sluigi CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0, 871231437Sluigi "Input FIFO Overflow Drop"); 872231437Sluigi 873231437Sluigi tx_stats_node = SYSCTL_ADD_NODE(ctx, 874231437Sluigi SYSCTL_CHILDREN(stats_node), 875231437Sluigi OID_AUTO, "tx", CTLFLAG_RD, 876231437Sluigi NULL, "TX Ethernet Statistics"); 877231437Sluigi tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 878231437Sluigi 879231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 880231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_pkts, 881231437Sluigi "Total Transmit Packets"); 882231437Sluigi SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 883231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_bytes, 884231437Sluigi "Total Transmit Bytes"); 885231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 886231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 887231437Sluigi "Total Transmit Requests"); 888231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 889231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 890231437Sluigi "Total Transmit Stops"); 891231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 892231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 893231437Sluigi "Total Transmit WRB's"); 894231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 895231437Sluigi CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 896231437Sluigi "Total Transmit Completions"); 897231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 898231437Sluigi "total_ipv6_ext_hdr_tx_drop", 899231437Sluigi CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 900231437Sluigi "Total Transmit IPV6 Drops"); 901231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 902231437Sluigi CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 0, 903231437Sluigi "Pause Frames"); 904231437Sluigi SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 905231437Sluigi CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 0, 906231437Sluigi "Tx Control Frames"); 907231437Sluigi 908231437Sluigi for (i = 0; i < sc->nwqs; i++) { 909231437Sluigi sprintf(prefix, "queue%d",i); 910231437Sluigi queue_stats_node = SYSCTL_ADD_NODE(ctx, 911231437Sluigi SYSCTL_CHILDREN(tx_stats_node), 912231437Sluigi OID_AUTO, prefix, CTLFLAG_RD, 913231437Sluigi NULL, "Queue name"); 914231437Sluigi queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 915231437Sluigi 916231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 917231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 918231437Sluigi "Transmit Packets"); 919231437Sluigi SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 920231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 921231437Sluigi "Transmit Bytes"); 922231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 923231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 924231437Sluigi "Transmit Requests"); 925231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 926231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 927231437Sluigi "Transmit Stops"); 928231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 929231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 930231437Sluigi "Transmit WRB's"); 931231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 932231437Sluigi CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 933231437Sluigi "Transmit Completions"); 934231437Sluigi SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 935231437Sluigi "ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 936231437Sluigi &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 937231437Sluigi "Transmit IPV6 Ext Header Drop"); 938231437Sluigi 939231437Sluigi } 940231437Sluigi return; 941231437Sluigi} 942231437Sluigi 943231437Sluigi 944231437Sluigivoid 945231437Sluigioce_refresh_queue_stats(POCE_SOFTC sc) 946231437Sluigi{ 947231437Sluigi struct oce_drv_stats *adapter_stats; 948231437Sluigi int i; 949231437Sluigi 950231437Sluigi adapter_stats = &sc->oce_stats_info; 951231437Sluigi 952231437Sluigi /* Caluculate total TX and TXstats from all queues */ 953231437Sluigi 954231437Sluigi bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats)); 955231437Sluigi for (i = 0; i < sc->nrqs; i++) { 956231437Sluigi 957231437Sluigi adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts; 958231437Sluigi adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes; 959231437Sluigi adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags; 960231437Sluigi adapter_stats->rx.t_rx_mcast_pkts += 961231437Sluigi sc->rq[i]->rx_stats.rx_mcast_pkts; 962231437Sluigi adapter_stats->rx.t_rx_ucast_pkts += 963231437Sluigi sc->rq[i]->rx_stats.rx_ucast_pkts; 964231437Sluigi adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err; 965231437Sluigi } 966231437Sluigi 967231437Sluigi bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats)); 968231437Sluigi for (i = 0; i < sc->nwqs; i++) { 969231437Sluigi adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs; 970231437Sluigi adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops; 971231437Sluigi adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs; 972231437Sluigi adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl; 973231437Sluigi adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes; 974231437Sluigi adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts; 975231437Sluigi adapter_stats->tx.t_ipv6_ext_hdr_tx_drop += 976231437Sluigi sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop; 977231437Sluigi } 978231437Sluigi 979231437Sluigi} 980231437Sluigi 981231437Sluigi 982231437Sluigi 983231437Sluigistatic void 984231437Sluigicopy_stats_to_sc_xe201(POCE_SOFTC sc) 985231437Sluigi{ 986231437Sluigi struct oce_xe201_stats *adapter_stats; 987231437Sluigi struct mbx_get_pport_stats *nic_mbx; 988231437Sluigi struct pport_stats *port_stats; 989231437Sluigi 990231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats); 991231437Sluigi port_stats = &nic_mbx->params.rsp.pps; 992231437Sluigi adapter_stats = &sc->oce_stats_info.u0.xe201; 993231437Sluigi 994231437Sluigi adapter_stats->tx_pkts = port_stats->tx_pkts; 995231437Sluigi adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts; 996231437Sluigi adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts; 997231437Sluigi adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts; 998231437Sluigi adapter_stats->tx_bytes = port_stats->tx_bytes; 999231437Sluigi adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes; 1000231437Sluigi adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes; 1001231437Sluigi adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes; 1002231437Sluigi adapter_stats->tx_discards = port_stats->tx_discards; 1003231437Sluigi adapter_stats->tx_errors = port_stats->tx_errors; 1004231437Sluigi adapter_stats->tx_pause_frames = port_stats->tx_pause_frames; 1005231437Sluigi adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames; 1006231437Sluigi adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames; 1007231437Sluigi adapter_stats->tx_internal_mac_errors = 1008231437Sluigi port_stats->tx_internal_mac_errors; 1009231437Sluigi adapter_stats->tx_control_frames = port_stats->tx_control_frames; 1010231437Sluigi adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes; 1011231437Sluigi adapter_stats->tx_pkts_65_to_127_bytes = 1012231437Sluigi port_stats->tx_pkts_65_to_127_bytes; 1013231437Sluigi adapter_stats->tx_pkts_128_to_255_bytes = 1014231437Sluigi port_stats->tx_pkts_128_to_255_bytes; 1015231437Sluigi adapter_stats->tx_pkts_256_to_511_bytes = 1016231437Sluigi port_stats->tx_pkts_256_to_511_bytes; 1017231437Sluigi adapter_stats->tx_pkts_512_to_1023_bytes = 1018231437Sluigi port_stats->tx_pkts_512_to_1023_bytes; 1019231437Sluigi adapter_stats->tx_pkts_1024_to_1518_bytes = 1020231437Sluigi port_stats->tx_pkts_1024_to_1518_bytes; 1021231437Sluigi adapter_stats->tx_pkts_1519_to_2047_bytes = 1022231437Sluigi port_stats->tx_pkts_1519_to_2047_bytes; 1023231437Sluigi adapter_stats->tx_pkts_2048_to_4095_bytes = 1024231437Sluigi port_stats->tx_pkts_2048_to_4095_bytes; 1025231437Sluigi adapter_stats->tx_pkts_4096_to_8191_bytes = 1026231437Sluigi port_stats->tx_pkts_4096_to_8191_bytes; 1027231437Sluigi adapter_stats->tx_pkts_8192_to_9216_bytes = 1028231437Sluigi port_stats->tx_pkts_8192_to_9216_bytes; 1029231437Sluigi adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts; 1030231437Sluigi adapter_stats->rx_pkts = port_stats->rx_pkts; 1031231437Sluigi adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts; 1032231437Sluigi adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts; 1033231437Sluigi adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts; 1034231437Sluigi adapter_stats->rx_bytes = port_stats->rx_bytes; 1035231437Sluigi adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes; 1036231437Sluigi adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes; 1037231437Sluigi adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes; 1038231437Sluigi adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos; 1039231437Sluigi adapter_stats->rx_discards = port_stats->rx_discards; 1040231437Sluigi adapter_stats->rx_errors = port_stats->rx_errors; 1041231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1042231437Sluigi adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors; 1043231437Sluigi adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors; 1044231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1045231437Sluigi adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames; 1046231437Sluigi adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames; 1047231437Sluigi adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long; 1048231437Sluigi adapter_stats->rx_internal_mac_errors = 1049231437Sluigi port_stats->rx_internal_mac_errors; 1050231437Sluigi adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts; 1051231437Sluigi adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts; 1052231437Sluigi adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts; 1053231437Sluigi adapter_stats->rx_jabbers = port_stats->rx_jabbers; 1054231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1055231437Sluigi adapter_stats->rx_control_frames_unknown_opcode = 1056231437Sluigi port_stats->rx_control_frames_unknown_opcode; 1057231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1058231437Sluigi adapter_stats->rx_out_of_range_errors = 1059231437Sluigi port_stats->rx_out_of_range_errors; 1060231437Sluigi adapter_stats->rx_address_match_errors = 1061231437Sluigi port_stats->rx_address_match_errors; 1062231437Sluigi adapter_stats->rx_vlan_mismatch_errors = 1063231437Sluigi port_stats->rx_vlan_mismatch_errors; 1064231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1065231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1066231437Sluigi adapter_stats->rx_dropped_header_too_small = 1067231437Sluigi port_stats->rx_dropped_header_too_small; 1068231437Sluigi adapter_stats->rx_dropped_invalid_tcp_length = 1069231437Sluigi port_stats->rx_dropped_invalid_tcp_length; 1070231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1071231437Sluigi adapter_stats->rx_ip_checksum_errors = 1072231437Sluigi port_stats->rx_ip_checksum_errors; 1073231437Sluigi adapter_stats->rx_tcp_checksum_errors = 1074231437Sluigi port_stats->rx_tcp_checksum_errors; 1075231437Sluigi adapter_stats->rx_udp_checksum_errors = 1076231437Sluigi port_stats->rx_udp_checksum_errors; 1077231437Sluigi adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts; 1078231437Sluigi adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts; 1079231437Sluigi adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts; 1080231437Sluigi adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes; 1081231437Sluigi adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes; 1082231437Sluigi adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts; 1083231437Sluigi adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts; 1084231437Sluigi adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts; 1085231437Sluigi adapter_stats->rx_management_pkts = port_stats->rx_management_pkts; 1086231437Sluigi adapter_stats->rx_switched_unicast_pkts = 1087231437Sluigi port_stats->rx_switched_unicast_pkts; 1088231437Sluigi adapter_stats->rx_switched_multicast_pkts = 1089231437Sluigi port_stats->rx_switched_multicast_pkts; 1090231437Sluigi adapter_stats->rx_switched_broadcast_pkts = 1091231437Sluigi port_stats->rx_switched_broadcast_pkts; 1092231437Sluigi adapter_stats->num_forwards = port_stats->num_forwards; 1093231437Sluigi adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow; 1094231437Sluigi adapter_stats->rx_input_fifo_overflow = 1095231437Sluigi port_stats->rx_input_fifo_overflow; 1096231437Sluigi adapter_stats->rx_drops_too_many_frags = 1097231437Sluigi port_stats->rx_drops_too_many_frags; 1098231437Sluigi adapter_stats->rx_drops_invalid_queue = 1099231437Sluigi port_stats->rx_drops_invalid_queue; 1100231437Sluigi adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu; 1101231437Sluigi adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes; 1102231437Sluigi adapter_stats->rx_pkts_65_to_127_bytes = 1103231437Sluigi port_stats->rx_pkts_65_to_127_bytes; 1104231437Sluigi adapter_stats->rx_pkts_128_to_255_bytes = 1105231437Sluigi port_stats->rx_pkts_128_to_255_bytes; 1106231437Sluigi adapter_stats->rx_pkts_256_to_511_bytes = 1107231437Sluigi port_stats->rx_pkts_256_to_511_bytes; 1108231437Sluigi adapter_stats->rx_pkts_512_to_1023_bytes = 1109231437Sluigi port_stats->rx_pkts_512_to_1023_bytes; 1110231437Sluigi adapter_stats->rx_pkts_1024_to_1518_bytes = 1111231437Sluigi port_stats->rx_pkts_1024_to_1518_bytes; 1112231437Sluigi adapter_stats->rx_pkts_1519_to_2047_bytes = 1113231437Sluigi port_stats->rx_pkts_1519_to_2047_bytes; 1114231437Sluigi adapter_stats->rx_pkts_2048_to_4095_bytes = 1115231437Sluigi port_stats->rx_pkts_2048_to_4095_bytes; 1116231437Sluigi adapter_stats->rx_pkts_4096_to_8191_bytes = 1117231437Sluigi port_stats->rx_pkts_4096_to_8191_bytes; 1118231437Sluigi adapter_stats->rx_pkts_8192_to_9216_bytes = 1119231437Sluigi port_stats->rx_pkts_8192_to_9216_bytes; 1120231437Sluigi} 1121231437Sluigi 1122231437Sluigi 1123231437Sluigi 1124231437Sluigistatic void 1125231437Sluigicopy_stats_to_sc_be2(POCE_SOFTC sc) 1126231437Sluigi{ 1127231437Sluigi struct oce_be_stats *adapter_stats; 1128231437Sluigi struct oce_pmem_stats *pmem; 1129231437Sluigi struct oce_rxf_stats_v0 *rxf_stats; 1130231437Sluigi struct oce_port_rxf_stats_v0 *port_stats; 1131231437Sluigi struct mbx_get_nic_stats_v0 *nic_mbx; 1132231437Sluigi uint32_t port = sc->port_id; 1133231437Sluigi 1134231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0); 1135231437Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1136231437Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1137231437Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1138231437Sluigi 1139231437Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1140231437Sluigi 1141231437Sluigi 1142231437Sluigi /* Update stats */ 1143231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1144231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1145231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1146231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1147231437Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1148231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1149231437Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1150231437Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1151231437Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1152231437Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1153231437Sluigi port_stats->rxpp_fifo_overflow_drop; 1154231437Sluigi adapter_stats->rx_dropped_tcp_length = 1155231437Sluigi port_stats->rx_dropped_tcp_length; 1156231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1157231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1158231437Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1159231437Sluigi adapter_stats->rx_dropped_header_too_small = 1160231437Sluigi port_stats->rx_dropped_header_too_small; 1161231437Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1162231437Sluigi port_stats->rx_input_fifo_overflow_drop; 1163231437Sluigi adapter_stats->rx_address_match_errors = 1164231437Sluigi port_stats->rx_address_match_errors; 1165231437Sluigi adapter_stats->rx_alignment_symbol_errors = 1166231437Sluigi port_stats->rx_alignment_symbol_errors; 1167231437Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1168231437Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1169231437Sluigi 1170231437Sluigi if (sc->if_id) 1171231437Sluigi adapter_stats->jabber_events = rxf_stats->port1_jabber_events; 1172231437Sluigi else 1173231437Sluigi adapter_stats->jabber_events = rxf_stats->port0_jabber_events; 1174231437Sluigi 1175231437Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1176231437Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1177231437Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1178231437Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1179231437Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1180231437Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1181231437Sluigi adapter_stats->rx_drops_no_tpre_descr = 1182231437Sluigi rxf_stats->rx_drops_no_tpre_descr; 1183231437Sluigi adapter_stats->rx_drops_too_many_frags = 1184231437Sluigi rxf_stats->rx_drops_too_many_frags; 1185231437Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1186231437Sluigi} 1187231437Sluigi 1188231437Sluigi 1189231437Sluigistatic void 1190231437Sluigicopy_stats_to_sc_be3(POCE_SOFTC sc) 1191231437Sluigi{ 1192231437Sluigi struct oce_be_stats *adapter_stats; 1193231437Sluigi struct oce_pmem_stats *pmem; 1194231437Sluigi struct oce_rxf_stats_v1 *rxf_stats; 1195231437Sluigi struct oce_port_rxf_stats_v1 *port_stats; 1196231437Sluigi struct mbx_get_nic_stats *nic_mbx; 1197231437Sluigi uint32_t port = sc->port_id; 1198231437Sluigi 1199231437Sluigi nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats); 1200231437Sluigi pmem = &nic_mbx->params.rsp.stats.pmem; 1201231437Sluigi rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1202231437Sluigi port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1203231437Sluigi 1204231437Sluigi adapter_stats = &sc->oce_stats_info.u0.be; 1205231437Sluigi 1206231437Sluigi /* Update stats */ 1207231437Sluigi adapter_stats->pmem_fifo_overflow_drop = 1208231437Sluigi port_stats->pmem_fifo_overflow_drop; 1209231437Sluigi adapter_stats->rx_priority_pause_frames = 1210231437Sluigi port_stats->rx_priority_pause_frames; 1211231437Sluigi adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1212231437Sluigi adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1213231437Sluigi adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1214231437Sluigi adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1215231437Sluigi adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1216231437Sluigi adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1217231437Sluigi adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1218231437Sluigi adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1219231437Sluigi adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1220231437Sluigi adapter_stats->rx_dropped_tcp_length = 1221231437Sluigi port_stats->rx_dropped_tcp_length; 1222231437Sluigi adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1223231437Sluigi adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1224231437Sluigi adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1225231437Sluigi adapter_stats->rx_dropped_header_too_small = 1226231437Sluigi port_stats->rx_dropped_header_too_small; 1227231437Sluigi adapter_stats->rx_input_fifo_overflow_drop = 1228231437Sluigi port_stats->rx_input_fifo_overflow_drop; 1229231437Sluigi adapter_stats->rx_address_match_errors = 1230231437Sluigi port_stats->rx_address_match_errors; 1231231437Sluigi adapter_stats->rx_alignment_symbol_errors = 1232231437Sluigi port_stats->rx_alignment_symbol_errors; 1233231437Sluigi adapter_stats->rxpp_fifo_overflow_drop = 1234231437Sluigi port_stats->rxpp_fifo_overflow_drop; 1235231437Sluigi adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1236231437Sluigi adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1237231437Sluigi adapter_stats->jabber_events = port_stats->jabber_events; 1238231437Sluigi 1239231437Sluigi adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1240231437Sluigi adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1241231437Sluigi adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1242231437Sluigi adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1243231437Sluigi adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1244231437Sluigi adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1245231437Sluigi adapter_stats->rx_drops_no_tpre_descr = 1246231437Sluigi rxf_stats->rx_drops_no_tpre_descr; 1247231437Sluigi adapter_stats->rx_drops_too_many_frags = 1248231437Sluigi rxf_stats->rx_drops_too_many_frags; 1249231437Sluigi 1250231437Sluigi adapter_stats->eth_red_drops = pmem->eth_red_drops; 1251231437Sluigi} 1252231437Sluigi 1253231437Sluigi 1254231437Sluigiint 1255231437Sluigioce_stats_init(POCE_SOFTC sc) 1256231437Sluigi{ 1257231437Sluigi int rc = 0, sz; 1258231437Sluigi 1259231437Sluigi if (IS_BE(sc)) { 1260231437Sluigi if (sc->flags & OCE_FLAGS_BE2) 1261231437Sluigi sz = sizeof(struct mbx_get_nic_stats_v0); 1262231437Sluigi else 1263231437Sluigi sz = sizeof(struct mbx_get_nic_stats); 1264231437Sluigi } else 1265231437Sluigi sz = sizeof(struct mbx_get_pport_stats); 1266231437Sluigi 1267231437Sluigi rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0); 1268231437Sluigi 1269231437Sluigi return rc; 1270231437Sluigi} 1271231437Sluigi 1272231437Sluigi 1273231437Sluigivoid 1274231437Sluigioce_stats_free(POCE_SOFTC sc) 1275231437Sluigi{ 1276231437Sluigi 1277231437Sluigi oce_dma_free(sc, &sc->stats_mem); 1278231437Sluigi 1279231437Sluigi} 1280231437Sluigi 1281231437Sluigi 1282231437Sluigiint 1283231437Sluigioce_refresh_nic_stats(POCE_SOFTC sc) 1284231437Sluigi{ 1285231437Sluigi int rc = 0, reset = 0; 1286231437Sluigi 1287231437Sluigi if (IS_BE(sc)) { 1288231437Sluigi if (sc->flags & OCE_FLAGS_BE2) { 1289231437Sluigi rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem); 1290231437Sluigi if (!rc) 1291231437Sluigi copy_stats_to_sc_be2(sc); 1292231437Sluigi } else { 1293231437Sluigi rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem); 1294231437Sluigi if (!rc) 1295231437Sluigi copy_stats_to_sc_be3(sc); 1296231437Sluigi } 1297231437Sluigi 1298231437Sluigi } else { 1299231437Sluigi rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset); 1300231437Sluigi if (!rc) 1301231437Sluigi copy_stats_to_sc_xe201(sc); 1302231437Sluigi } 1303231437Sluigi 1304231437Sluigi return rc; 1305231437Sluigi} 1306