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