1 /*- 2 * Copyright (C) 2013 Emulex 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * 3. Neither the name of the Emulex Corporation nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 * 31 * Contact Information: 32 * freebsd-drivers@emulex.com 33 * 34 * Emulex 35 * 3333 Susan Street 36 * Costa Mesa, CA 92626 37 */ 38 39 /* $FreeBSD$ */ 40 41 #include "oce_if.h" 42 43 static void copy_stats_to_sc_xe201(POCE_SOFTC sc); 44 static void copy_stats_to_sc_be3(POCE_SOFTC sc); 45 static void copy_stats_to_sc_be2(POCE_SOFTC sc); 46 static int oce_sysctl_loopback(SYSCTL_HANDLER_ARGS); 47 static int oce_sys_aic_enable(SYSCTL_HANDLER_ARGS); 48 static int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 49 static int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 50 static int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS); 51 static int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw); 52 static int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS); 53 static boolean_t oce_phy_flashing_required(POCE_SOFTC sc); 54 static boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p, 55 int img_optype, uint32_t img_offset, 56 uint32_t img_size, uint32_t hdrs_size); 57 static void oce_add_stats_sysctls_be3(POCE_SOFTC sc, 58 struct sysctl_ctx_list *ctx, 59 struct sysctl_oid *stats_node); 60 static void oce_add_stats_sysctls_xe201(POCE_SOFTC sc, 61 struct sysctl_ctx_list *ctx, 62 struct sysctl_oid *stats_node); 63 64 65 extern char component_revision[32]; 66 uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE]; 67 68 struct flash_img_attri { 69 int img_offset; 70 int img_size; 71 int img_type; 72 bool skip_image; 73 int optype; 74 }; 75 76 void 77 oce_add_sysctls(POCE_SOFTC sc) 78 { 79 80 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev); 81 struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev); 82 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree); 83 struct sysctl_oid *stats_node; 84 85 SYSCTL_ADD_STRING(ctx, child, 86 OID_AUTO, "component_revision", 87 CTLTYPE_INT | CTLFLAG_RD, 88 &component_revision, 89 sizeof(component_revision), 90 "EMULEX One-Connect device driver revision"); 91 92 SYSCTL_ADD_STRING(ctx, child, 93 OID_AUTO, "firmware_version", 94 CTLTYPE_INT | CTLFLAG_RD, 95 &sc->fw_version, 96 sizeof(sc->fw_version), 97 "EMULEX One-Connect Firmware Version"); 98 99 SYSCTL_ADD_INT(ctx, child, 100 OID_AUTO, "max_rsp_handled", 101 CTLTYPE_INT | CTLFLAG_RW, 102 &oce_max_rsp_handled, 103 sizeof(oce_max_rsp_handled), 104 "Maximum receive frames handled per interupt"); 105 106 if ((sc->function_mode & FNM_FLEX10_MODE) || 107 (sc->function_mode & FNM_UMC_MODE)) 108 SYSCTL_ADD_UINT(ctx, child, 109 OID_AUTO, "speed", 110 CTLFLAG_RD, 111 &sc->qos_link_speed, 112 0,"QOS Speed"); 113 else 114 SYSCTL_ADD_UINT(ctx, child, 115 OID_AUTO, "speed", 116 CTLFLAG_RD, 117 &sc->speed, 118 0,"Link Speed"); 119 120 if (sc->function_mode & FNM_UMC_MODE) 121 SYSCTL_ADD_UINT(ctx, child, 122 OID_AUTO, "pvid", 123 CTLFLAG_RD, 124 &sc->pvid, 125 0,"PVID"); 126 127 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back", 128 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, 129 oce_sysctl_loopback, "I", "Loop Back Tests"); 130 131 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade", 132 CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0, 133 oce_sys_fwupgrade, "A", "Firmware ufi file"); 134 135 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "aic_enable", 136 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 1, 137 oce_sys_aic_enable, "I", "aic flags"); 138 139 /* 140 * Dumps Transceiver data 141 * "sysctl dev.oce.0.sfp_vpd_dump=0" 142 * "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump 143 * "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump 144 */ 145 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump", 146 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump, 147 "I", "Initiate a sfp_vpd_dump operation"); 148 SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer", 149 CTLFLAG_RD, sfp_vpd_dump_buffer, 150 TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer"); 151 152 stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", 153 CTLFLAG_RD, NULL, "Ethernet Statistics"); 154 155 if (IS_BE(sc) || IS_SH(sc)) 156 oce_add_stats_sysctls_be3(sc, ctx, stats_node); 157 else 158 oce_add_stats_sysctls_xe201(sc, ctx, stats_node); 159 160 161 } 162 163 164 static uint32_t 165 oce_loopback_test(struct oce_softc *sc, uint8_t loopback_type) 166 { 167 uint32_t status = 0; 168 169 oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1); 170 status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type, 171 1500, 2, 0xabc); 172 oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1); 173 174 return status; 175 } 176 177 static int 178 oce_sys_aic_enable(SYSCTL_HANDLER_ARGS) 179 { 180 int value = 0; 181 uint32_t status, vector; 182 POCE_SOFTC sc = (struct oce_softc *)arg1; 183 struct oce_aic_obj *aic; 184 185 status = sysctl_handle_int(oidp, &value, 0, req); 186 if (status || !req->newptr) 187 return status; 188 189 for (vector = 0; vector < sc->intr_count; vector++) { 190 aic = &sc->aic_obj[vector]; 191 192 if (value == 0){ 193 aic->max_eqd = aic->min_eqd = aic->et_eqd = 0; 194 aic->enable = 0; 195 } 196 else { 197 aic->max_eqd = OCE_MAX_EQD; 198 aic->min_eqd = OCE_MIN_EQD; 199 aic->et_eqd = OCE_MIN_EQD; 200 aic->enable = TRUE; 201 } 202 } 203 return 0; 204 } 205 206 static int 207 oce_sysctl_loopback(SYSCTL_HANDLER_ARGS) 208 { 209 int value = 0; 210 uint32_t status; 211 struct oce_softc *sc = (struct oce_softc *)arg1; 212 213 status = sysctl_handle_int(oidp, &value, 0, req); 214 if (status || !req->newptr) 215 return status; 216 217 if (value != 1) { 218 device_printf(sc->dev, 219 "Not a Valid value. Set to loop_back=1 to run tests\n"); 220 return 0; 221 } 222 223 if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) { 224 device_printf(sc->dev, 225 "MAC Loopback Test = Failed (Error status = %d)\n", 226 status); 227 } else 228 device_printf(sc->dev, "MAC Loopback Test = Success\n"); 229 230 if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) { 231 device_printf(sc->dev, 232 "PHY Loopback Test = Failed (Error status = %d)\n", 233 status); 234 } else 235 device_printf(sc->dev, "PHY Loopback Test = Success\n"); 236 237 if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) { 238 device_printf(sc->dev, 239 "EXT Loopback Test = Failed (Error status = %d)\n", 240 status); 241 } else 242 device_printf(sc->dev, "EXT Loopback Test = Success\n"); 243 244 return 0; 245 } 246 247 248 static int 249 oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS) 250 { 251 char ufiname[256] = {0}; 252 uint32_t status = 1; 253 struct oce_softc *sc = (struct oce_softc *)arg1; 254 const struct firmware *fw; 255 256 status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req); 257 if (status || !req->newptr) 258 return status; 259 260 fw = firmware_get(ufiname); 261 if (fw == NULL) { 262 device_printf(sc->dev, "Unable to get Firmware. " 263 "Make sure %s is copied to /boot/modules\n", ufiname); 264 return ENOENT; 265 } 266 267 if (IS_BE(sc)) { 268 if ((sc->flags & OCE_FLAGS_BE2)) { 269 device_printf(sc->dev, 270 "Flashing not supported for BE2 yet.\n"); 271 status = 1; 272 goto done; 273 } 274 status = oce_be3_fwupgrade(sc, fw); 275 } else if (IS_SH(sc)) { 276 status = oce_skyhawk_fwupgrade(sc,fw); 277 } else 278 status = oce_lancer_fwupgrade(sc, fw); 279 done: 280 if (status) { 281 device_printf(sc->dev, "Firmware Upgrade failed\n"); 282 } else { 283 device_printf(sc->dev, "Firmware Flashed successfully\n"); 284 } 285 286 /* Release Firmware*/ 287 firmware_put(fw, FIRMWARE_UNLOAD); 288 289 return status; 290 } 291 292 static void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec, 293 struct flash_img_attri *pimg, int i, 294 const struct firmware *fw, int bin_offset) 295 { 296 if (IS_SH(sc)) { 297 pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset); 298 pimg->img_size = HOST_32(fsec->fsec_entry[i].pad_size); 299 } 300 301 pimg->img_type = HOST_32(fsec->fsec_entry[i].type); 302 pimg->skip_image = FALSE; 303 switch (pimg->img_type) { 304 case IMG_ISCSI: 305 pimg->optype = 0; 306 if (IS_BE3(sc)) { 307 pimg->img_offset = 2097152; 308 pimg->img_size = 2097152; 309 } 310 break; 311 case IMG_REDBOOT: 312 pimg->optype = 1; 313 if (IS_BE3(sc)) { 314 pimg->img_offset = 262144; 315 pimg->img_size = 1048576; 316 } 317 if (!oce_img_flashing_required(sc, fw->data, 318 pimg->optype, 319 pimg->img_offset, 320 pimg->img_size, 321 bin_offset)) 322 pimg->skip_image = TRUE; 323 break; 324 case IMG_BIOS: 325 pimg->optype = 2; 326 if (IS_BE3(sc)) { 327 pimg->img_offset = 12582912; 328 pimg->img_size = 524288; 329 } 330 break; 331 case IMG_PXEBIOS: 332 pimg->optype = 3; 333 if (IS_BE3(sc)) { 334 pimg->img_offset = 13107200;; 335 pimg->img_size = 524288; 336 } 337 break; 338 case IMG_FCOEBIOS: 339 pimg->optype = 8; 340 if (IS_BE3(sc)) { 341 pimg->img_offset = 13631488; 342 pimg->img_size = 524288; 343 } 344 break; 345 case IMG_ISCSI_BAK: 346 pimg->optype = 9; 347 if (IS_BE3(sc)) { 348 pimg->img_offset = 4194304; 349 pimg->img_size = 2097152; 350 } 351 break; 352 case IMG_FCOE: 353 pimg->optype = 10; 354 if (IS_BE3(sc)) { 355 pimg->img_offset = 6291456; 356 pimg->img_size = 2097152; 357 } 358 break; 359 case IMG_FCOE_BAK: 360 pimg->optype = 11; 361 if (IS_BE3(sc)) { 362 pimg->img_offset = 8388608; 363 pimg->img_size = 2097152; 364 } 365 break; 366 case IMG_NCSI: 367 pimg->optype = 13; 368 if (IS_BE3(sc)) { 369 pimg->img_offset = 15990784; 370 pimg->img_size = 262144; 371 } 372 break; 373 case IMG_PHY: 374 pimg->optype = 99; 375 if (IS_BE3(sc)) { 376 pimg->img_offset = 1310720; 377 pimg->img_size = 262144; 378 } 379 if (!oce_phy_flashing_required(sc)) 380 pimg->skip_image = TRUE; 381 break; 382 default: 383 pimg->skip_image = TRUE; 384 break; 385 } 386 387 } 388 389 static int 390 oce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs) 391 { 392 char cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "}; 393 const char *p = (const char *)fw->data; 394 const struct flash_sec_info *fsec = NULL; 395 struct mbx_common_read_write_flashrom *req; 396 int rc = 0, i, bin_offset = 0, opcode, num_bytes; 397 OCE_DMA_MEM dma_mem; 398 struct flash_img_attri imgatt; 399 400 /* Validate Cookie */ 401 bin_offset = (sizeof(struct flash_file_hdr) + 402 (num_imgs * sizeof(struct image_hdr))); 403 p += bin_offset; 404 while (p < ((const char *)fw->data + fw->datasize)) { 405 fsec = (const struct flash_sec_info *)p; 406 if (!memcmp(cookie, fsec->cookie, sizeof(cookie))) 407 break; 408 fsec = NULL; 409 p += 32; 410 } 411 412 if (!fsec) { 413 device_printf(sc->dev, 414 "Invalid Cookie. Firmware image corrupted ?\n"); 415 return EINVAL; 416 } 417 418 rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom), 419 &dma_mem, 0); 420 if (rc) { 421 device_printf(sc->dev, 422 "Memory allocation failure while flashing\n"); 423 return ENOMEM; 424 } 425 req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom); 426 427 if (IS_SH(sc)) 428 num_imgs = HOST_32(fsec->fsec_hdr.num_images); 429 else if (IS_BE3(sc)) 430 num_imgs = MAX_FLASH_COMP; 431 432 for (i = 0; i < num_imgs; i++) { 433 434 bzero(&imgatt, sizeof(struct flash_img_attri)); 435 436 oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset); 437 438 if (imgatt.skip_image) 439 continue; 440 441 p = fw->data; 442 p = p + bin_offset + imgatt.img_offset; 443 444 if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) { 445 rc = 1; 446 goto ret; 447 } 448 449 while (imgatt.img_size) { 450 451 if (imgatt.img_size > 32*1024) 452 num_bytes = 32*1024; 453 else 454 num_bytes = imgatt.img_size; 455 imgatt.img_size -= num_bytes; 456 457 if (!imgatt.img_size) 458 opcode = FLASHROM_OPER_FLASH; 459 else 460 opcode = FLASHROM_OPER_SAVE; 461 462 memcpy(req->data_buffer, p, num_bytes); 463 p += num_bytes; 464 465 rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode, 466 &dma_mem, num_bytes); 467 if (rc) { 468 device_printf(sc->dev, 469 "cmd to write to flash rom failed.\n"); 470 rc = EIO; 471 goto ret; 472 } 473 /* Leave the CPU for others for some time */ 474 pause("yield", 10); 475 476 } 477 478 } 479 480 ret: 481 oce_dma_free(sc, &dma_mem); 482 return rc; 483 } 484 485 #define UFI_TYPE2 2 486 #define UFI_TYPE3 3 487 #define UFI_TYPE3R 10 488 #define UFI_TYPE4 4 489 #define UFI_TYPE4R 11 490 static int oce_get_ufi_type(POCE_SOFTC sc, 491 const struct flash_file_hdr *fhdr) 492 { 493 if (fhdr == NULL) 494 goto be_get_ufi_exit; 495 496 if (IS_SH(sc) && fhdr->build[0] == '4') { 497 if (fhdr->asic_type_rev >= 0x10) 498 return UFI_TYPE4R; 499 else 500 return UFI_TYPE4; 501 } else if (IS_BE3(sc) && fhdr->build[0] == '3') { 502 if (fhdr->asic_type_rev == 0x10) 503 return UFI_TYPE3R; 504 else 505 return UFI_TYPE3; 506 } else if (IS_BE2(sc) && fhdr->build[0] == '2') 507 return UFI_TYPE2; 508 509 be_get_ufi_exit: 510 device_printf(sc->dev, 511 "UFI and Interface are not compatible for flashing\n"); 512 return -1; 513 } 514 515 516 static int 517 oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 518 { 519 int rc = 0, num_imgs = 0, i = 0, ufi_type; 520 const struct flash_file_hdr *fhdr; 521 const struct image_hdr *img_ptr; 522 523 fhdr = (const struct flash_file_hdr *)fw->data; 524 525 ufi_type = oce_get_ufi_type(sc, fhdr); 526 527 /* Display flash version */ 528 device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 529 530 num_imgs = fhdr->num_imgs; 531 for (i = 0; i < num_imgs; i++) { 532 img_ptr = (const struct image_hdr *)((const char *)fw->data + 533 sizeof(struct flash_file_hdr) + 534 (i * sizeof(struct image_hdr))); 535 536 if (img_ptr->imageid != 1) 537 continue; 538 539 switch (ufi_type) { 540 case UFI_TYPE4R: 541 rc = oce_sh_be3_flashdata(sc, fw, 542 num_imgs); 543 break; 544 case UFI_TYPE4: 545 if (sc->asic_revision < 0x10) 546 rc = oce_sh_be3_flashdata(sc, fw, 547 num_imgs); 548 else { 549 rc = -1; 550 device_printf(sc->dev, 551 "Cant load SH A0 UFI on B0\n"); 552 } 553 break; 554 default: 555 rc = -1; 556 break; 557 558 } 559 } 560 561 return rc; 562 } 563 564 static int 565 oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 566 { 567 int rc = 0, num_imgs = 0, i = 0; 568 const struct flash_file_hdr *fhdr; 569 const struct image_hdr *img_ptr; 570 571 fhdr = (const struct flash_file_hdr *)fw->data; 572 if (fhdr->build[0] != '3') { 573 device_printf(sc->dev, "Invalid BE3 firmware image\n"); 574 return EINVAL; 575 } 576 /* Display flash version */ 577 device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]); 578 579 num_imgs = fhdr->num_imgs; 580 for (i = 0; i < num_imgs; i++) { 581 img_ptr = (const struct image_hdr *)((const char *)fw->data + 582 sizeof(struct flash_file_hdr) + 583 (i * sizeof(struct image_hdr))); 584 if (img_ptr->imageid == 1) { 585 rc = oce_sh_be3_flashdata(sc, fw, num_imgs); 586 587 break; 588 } 589 } 590 591 return rc; 592 } 593 594 595 static boolean_t 596 oce_phy_flashing_required(POCE_SOFTC sc) 597 { 598 int status = 0; 599 struct oce_phy_info phy_info; 600 601 status = oce_mbox_get_phy_info(sc, &phy_info); 602 if (status) 603 return FALSE; 604 605 if ((phy_info.phy_type == TN_8022) && 606 (phy_info.interface_type == PHY_TYPE_BASET_10GB)) { 607 return TRUE; 608 } 609 610 return FALSE; 611 } 612 613 614 static boolean_t 615 oce_img_flashing_required(POCE_SOFTC sc, const char *p, 616 int img_optype, uint32_t img_offset, 617 uint32_t img_size, uint32_t hdrs_size) 618 { 619 uint32_t crc_offset; 620 uint8_t flashed_crc[4]; 621 int status; 622 623 crc_offset = hdrs_size + img_offset + img_size - 4; 624 625 p += crc_offset; 626 627 status = oce_mbox_get_flashrom_crc(sc, flashed_crc, 628 (img_size - 4), img_optype); 629 if (status) 630 return TRUE; /* Some thing worng. ReFlash */ 631 632 /*update redboot only if crc does not match*/ 633 if (bcmp(flashed_crc, p, 4)) 634 return TRUE; 635 else 636 return FALSE; 637 } 638 639 640 static int 641 oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw) 642 { 643 644 int rc = 0; 645 OCE_DMA_MEM dma_mem; 646 const uint8_t *data = NULL; 647 uint8_t *dest_image_ptr = NULL; 648 size_t size = 0; 649 uint32_t data_written = 0, chunk_size = 0; 650 uint32_t offset = 0, add_status = 0; 651 652 if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) { 653 device_printf(sc->dev, 654 "Lancer FW image is not 4 byte aligned."); 655 return EINVAL; 656 } 657 658 rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0); 659 if (rc) { 660 device_printf(sc->dev, 661 "Memory allocation failure while flashing Lancer\n"); 662 return ENOMEM; 663 } 664 665 size = fw->datasize; 666 data = fw->data; 667 dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t); 668 669 while (size) { 670 chunk_size = MIN(size, (32*1024)); 671 672 bcopy(data, dest_image_ptr, chunk_size); 673 674 rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset, 675 &dma_mem, &data_written, &add_status); 676 677 if (rc) 678 break; 679 680 size -= data_written; 681 data += data_written; 682 offset += data_written; 683 pause("yield", 10); 684 685 } 686 687 if (!rc) 688 /* Commit the firmware*/ 689 rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem, 690 &data_written, &add_status); 691 if (rc) { 692 device_printf(sc->dev, "Lancer firmware load error. " 693 "Addstatus = 0x%x, status = %d \n", add_status, rc); 694 rc = EIO; 695 } 696 oce_dma_free(sc, &dma_mem); 697 return rc; 698 699 } 700 701 702 static void 703 oce_add_stats_sysctls_be3(POCE_SOFTC sc, 704 struct sysctl_ctx_list *ctx, 705 struct sysctl_oid *stats_node) 706 { 707 struct sysctl_oid *rx_stats_node, *tx_stats_node; 708 struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 709 struct sysctl_oid_list *queue_stats_list; 710 struct sysctl_oid *queue_stats_node; 711 struct oce_drv_stats *stats; 712 char prefix[32]; 713 int i; 714 715 stats = &sc->oce_stats_info; 716 717 rx_stats_node = SYSCTL_ADD_NODE(ctx, 718 SYSCTL_CHILDREN(stats_node), 719 OID_AUTO,"rx", CTLFLAG_RD, 720 NULL, "RX Ethernet Statistics"); 721 rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 722 723 724 SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 725 CTLFLAG_RD, &stats->rx.t_rx_pkts, 726 "Total Received Packets"); 727 SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 728 CTLFLAG_RD, &stats->rx.t_rx_bytes, 729 "Total Received Bytes"); 730 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 731 CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 732 "Total Received Fragements"); 733 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 734 CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 735 "Total Received Multicast Packets"); 736 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 737 CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 738 "Total Received Unicast Packets"); 739 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 740 CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 741 "Total Receive completion errors"); 742 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 743 CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0, 744 "Pause Frames"); 745 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames", 746 CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0, 747 "Priority Pause Frames"); 748 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 749 CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0, 750 "Control Frames"); 751 752 for (i = 0; i < sc->nrqs; i++) { 753 sprintf(prefix, "queue%d",i); 754 queue_stats_node = SYSCTL_ADD_NODE(ctx, 755 SYSCTL_CHILDREN(rx_stats_node), 756 OID_AUTO, prefix, CTLFLAG_RD, 757 NULL, "Queue name"); 758 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 759 760 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 761 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 762 "Receive Packets"); 763 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 764 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 765 "Recived Bytes"); 766 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 767 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 768 "Received Fragments"); 769 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 770 "rx_mcast_pkts", CTLFLAG_RD, 771 &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 772 "Received Multicast Packets"); 773 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 774 "rx_ucast_pkts", CTLFLAG_RD, 775 &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 776 "Received Unicast Packets"); 777 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 778 CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 779 "Received Completion Errors"); 780 781 } 782 783 rx_stats_node = SYSCTL_ADD_NODE(ctx, 784 SYSCTL_CHILDREN(rx_stats_node), 785 OID_AUTO, "err", CTLFLAG_RD, 786 NULL, "Receive Error Stats"); 787 rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 788 789 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 790 CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0, 791 "CRC Errors"); 792 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors", 793 CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0, 794 "Drops due to pbuf full"); 795 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors", 796 CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0, 797 "ERX Errors"); 798 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 799 CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0, 800 "RX Alignmnet Errors"); 801 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 802 CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0, 803 "In Range Errors"); 804 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 805 CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0, 806 "Out Range Errors"); 807 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 808 CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0, 809 "Frame Too Long"); 810 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 811 CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0, 812 "Address Match Errors"); 813 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 814 CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0, 815 "Dropped Too Small"); 816 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 817 CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0, 818 "Dropped Too Short"); 819 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 820 "dropped_header_too_small", CTLFLAG_RD, 821 &stats->u0.be.rx_dropped_header_too_small, 0, 822 "Dropped Header Too Small"); 823 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length", 824 CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0, 825 "Dropped TCP Length"); 826 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 827 CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0, 828 "Dropped runt"); 829 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 830 CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0, 831 "IP Checksum Errors"); 832 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 833 CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0, 834 "TCP Checksum Errors"); 835 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 836 CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0, 837 "UDP Checksum Errors"); 838 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop", 839 CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0, 840 "FIFO Overflow Drop"); 841 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 842 "input_fifo_overflow_drop", CTLFLAG_RD, 843 &stats->u0.be.rx_input_fifo_overflow_drop, 0, 844 "Input FIFO Overflow Drop"); 845 846 tx_stats_node = SYSCTL_ADD_NODE(ctx, 847 SYSCTL_CHILDREN(stats_node), OID_AUTO, 848 "tx",CTLFLAG_RD, NULL, 849 "TX Ethernet Statistics"); 850 tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 851 852 SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 853 CTLFLAG_RD, &stats->tx.t_tx_pkts, 854 "Total Transmit Packets"); 855 SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 856 CTLFLAG_RD, &stats->tx.t_tx_bytes, 857 "Total Transmit Bytes"); 858 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 859 CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 860 "Total Transmit Requests"); 861 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 862 CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 863 "Total Transmit Stops"); 864 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 865 CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 866 "Total Transmit WRB's"); 867 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 868 CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 869 "Total Transmit Completions"); 870 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 871 "total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 872 &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 873 "Total Transmit IPV6 Drops"); 874 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 875 CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0, 876 "Pause Frames"); 877 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes", 878 CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0, 879 "Priority Pauseframes"); 880 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 881 CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0, 882 "Tx Control Frames"); 883 884 for (i = 0; i < sc->nwqs; i++) { 885 sprintf(prefix, "queue%d",i); 886 queue_stats_node = SYSCTL_ADD_NODE(ctx, 887 SYSCTL_CHILDREN(tx_stats_node), 888 OID_AUTO, prefix, CTLFLAG_RD, 889 NULL, "Queue name"); 890 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 891 892 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 893 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 894 "Transmit Packets"); 895 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 896 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 897 "Transmit Bytes"); 898 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 899 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 900 "Transmit Requests"); 901 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 902 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 903 "Transmit Stops"); 904 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 905 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 906 "Transmit WRB's"); 907 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 908 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 909 "Transmit Completions"); 910 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 911 "ipv6_ext_hdr_tx_drop",CTLFLAG_RD, 912 &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 913 "Transmit IPV6 Ext Header Drop"); 914 915 } 916 return; 917 } 918 919 920 static void 921 oce_add_stats_sysctls_xe201(POCE_SOFTC sc, 922 struct sysctl_ctx_list *ctx, 923 struct sysctl_oid *stats_node) 924 { 925 struct sysctl_oid *rx_stats_node, *tx_stats_node; 926 struct sysctl_oid_list *rx_stat_list, *tx_stat_list; 927 struct sysctl_oid_list *queue_stats_list; 928 struct sysctl_oid *queue_stats_node; 929 struct oce_drv_stats *stats; 930 char prefix[32]; 931 int i; 932 933 stats = &sc->oce_stats_info; 934 935 rx_stats_node = SYSCTL_ADD_NODE(ctx, 936 SYSCTL_CHILDREN(stats_node), 937 OID_AUTO, "rx", CTLFLAG_RD, 938 NULL, "RX Ethernet Statistics"); 939 rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 940 941 942 SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts", 943 CTLFLAG_RD, &stats->rx.t_rx_pkts, 944 "Total Received Packets"); 945 SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes", 946 CTLFLAG_RD, &stats->rx.t_rx_bytes, 947 "Total Received Bytes"); 948 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags", 949 CTLFLAG_RD, &stats->rx.t_rx_frags, 0, 950 "Total Received Fragements"); 951 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts", 952 CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0, 953 "Total Received Multicast Packets"); 954 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts", 955 CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0, 956 "Total Received Unicast Packets"); 957 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs", 958 CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0, 959 "Total Receive completion errors"); 960 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames", 961 CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames, 0, 962 "Pause Frames"); 963 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames", 964 CTLFLAG_RD, &stats->u0.xe201.rx_control_frames, 0, 965 "Control Frames"); 966 967 for (i = 0; i < sc->nrqs; i++) { 968 sprintf(prefix, "queue%d",i); 969 queue_stats_node = SYSCTL_ADD_NODE(ctx, 970 SYSCTL_CHILDREN(rx_stats_node), 971 OID_AUTO, prefix, CTLFLAG_RD, 972 NULL, "Queue name"); 973 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 974 975 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts", 976 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts, 977 "Receive Packets"); 978 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes", 979 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, 980 "Recived Bytes"); 981 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags", 982 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0, 983 "Received Fragments"); 984 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 985 "rx_mcast_pkts", CTLFLAG_RD, 986 &sc->rq[i]->rx_stats.rx_mcast_pkts, 0, 987 "Received Multicast Packets"); 988 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 989 "rx_ucast_pkts",CTLFLAG_RD, 990 &sc->rq[i]->rx_stats.rx_ucast_pkts, 0, 991 "Received Unicast Packets"); 992 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err", 993 CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0, 994 "Received Completion Errors"); 995 996 } 997 998 rx_stats_node = SYSCTL_ADD_NODE(ctx, 999 SYSCTL_CHILDREN(rx_stats_node), 1000 OID_AUTO, "err", CTLFLAG_RD, 1001 NULL, "Receive Error Stats"); 1002 rx_stat_list = SYSCTL_CHILDREN(rx_stats_node); 1003 1004 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs", 1005 CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors, 0, 1006 "CRC Errors"); 1007 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors", 1008 CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, 0, 1009 "RX Alignmnet Errors"); 1010 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors", 1011 CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0, 1012 "In Range Errors"); 1013 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors", 1014 CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0, 1015 "Out Range Errors"); 1016 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long", 1017 CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long, 0, 1018 "Frame Too Long"); 1019 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors", 1020 CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0, 1021 "Address Match Errors"); 1022 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small", 1023 CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0, 1024 "Dropped Too Small"); 1025 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short", 1026 CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0, 1027 "Dropped Too Short"); 1028 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 1029 "dropped_header_too_small", CTLFLAG_RD, 1030 &stats->u0.xe201.rx_dropped_header_too_small, 0, 1031 "Dropped Header Too Small"); 1032 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, 1033 "dropped_tcp_length", CTLFLAG_RD, 1034 &stats->u0.xe201.rx_dropped_invalid_tcp_length, 0, 1035 "Dropped TCP Length"); 1036 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt", 1037 CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0, 1038 "Dropped runt"); 1039 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs", 1040 CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0, 1041 "IP Checksum Errors"); 1042 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs", 1043 CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0, 1044 "TCP Checksum Errors"); 1045 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs", 1046 CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0, 1047 "UDP Checksum Errors"); 1048 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop", 1049 CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0, 1050 "Input FIFO Overflow Drop"); 1051 1052 tx_stats_node = SYSCTL_ADD_NODE(ctx, 1053 SYSCTL_CHILDREN(stats_node), 1054 OID_AUTO, "tx", CTLFLAG_RD, 1055 NULL, "TX Ethernet Statistics"); 1056 tx_stat_list = SYSCTL_CHILDREN(tx_stats_node); 1057 1058 SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts", 1059 CTLFLAG_RD, &stats->tx.t_tx_pkts, 1060 "Total Transmit Packets"); 1061 SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes", 1062 CTLFLAG_RD, &stats->tx.t_tx_bytes, 1063 "Total Transmit Bytes"); 1064 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs", 1065 CTLFLAG_RD, &stats->tx.t_tx_reqs, 0, 1066 "Total Transmit Requests"); 1067 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops", 1068 CTLFLAG_RD, &stats->tx.t_tx_stops, 0, 1069 "Total Transmit Stops"); 1070 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs", 1071 CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0, 1072 "Total Transmit WRB's"); 1073 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl", 1074 CTLFLAG_RD, &stats->tx.t_tx_compl, 0, 1075 "Total Transmit Completions"); 1076 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, 1077 "total_ipv6_ext_hdr_tx_drop", 1078 CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0, 1079 "Total Transmit IPV6 Drops"); 1080 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes", 1081 CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames, 0, 1082 "Pause Frames"); 1083 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes", 1084 CTLFLAG_RD, &stats->u0.xe201.tx_control_frames, 0, 1085 "Tx Control Frames"); 1086 1087 for (i = 0; i < sc->nwqs; i++) { 1088 sprintf(prefix, "queue%d",i); 1089 queue_stats_node = SYSCTL_ADD_NODE(ctx, 1090 SYSCTL_CHILDREN(tx_stats_node), 1091 OID_AUTO, prefix, CTLFLAG_RD, 1092 NULL, "Queue name"); 1093 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node); 1094 1095 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts", 1096 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts, 1097 "Transmit Packets"); 1098 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes", 1099 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes, 1100 "Transmit Bytes"); 1101 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs", 1102 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0, 1103 "Transmit Requests"); 1104 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops", 1105 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0, 1106 "Transmit Stops"); 1107 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs", 1108 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0, 1109 "Transmit WRB's"); 1110 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl", 1111 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0, 1112 "Transmit Completions"); 1113 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, 1114 "ipv6_ext_hdr_tx_drop", CTLFLAG_RD, 1115 &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0, 1116 "Transmit IPV6 Ext Header Drop"); 1117 1118 } 1119 return; 1120 } 1121 1122 1123 void 1124 oce_refresh_queue_stats(POCE_SOFTC sc) 1125 { 1126 struct oce_drv_stats *adapter_stats; 1127 int i; 1128 1129 adapter_stats = &sc->oce_stats_info; 1130 1131 /* Caluculate total TX and TXstats from all queues */ 1132 1133 bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats)); 1134 for (i = 0; i < sc->nrqs; i++) { 1135 1136 adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts; 1137 adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes; 1138 adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags; 1139 adapter_stats->rx.t_rx_mcast_pkts += 1140 sc->rq[i]->rx_stats.rx_mcast_pkts; 1141 adapter_stats->rx.t_rx_ucast_pkts += 1142 sc->rq[i]->rx_stats.rx_ucast_pkts; 1143 adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err; 1144 } 1145 1146 bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats)); 1147 for (i = 0; i < sc->nwqs; i++) { 1148 adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs; 1149 adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops; 1150 adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs; 1151 adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl; 1152 adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes; 1153 adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts; 1154 adapter_stats->tx.t_ipv6_ext_hdr_tx_drop += 1155 sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop; 1156 } 1157 1158 } 1159 1160 1161 1162 static void 1163 copy_stats_to_sc_xe201(POCE_SOFTC sc) 1164 { 1165 struct oce_xe201_stats *adapter_stats; 1166 struct mbx_get_pport_stats *nic_mbx; 1167 struct pport_stats *port_stats; 1168 1169 nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats); 1170 port_stats = &nic_mbx->params.rsp.pps; 1171 adapter_stats = &sc->oce_stats_info.u0.xe201; 1172 1173 adapter_stats->tx_pkts = port_stats->tx_pkts; 1174 adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts; 1175 adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts; 1176 adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts; 1177 adapter_stats->tx_bytes = port_stats->tx_bytes; 1178 adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes; 1179 adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes; 1180 adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes; 1181 adapter_stats->tx_discards = port_stats->tx_discards; 1182 adapter_stats->tx_errors = port_stats->tx_errors; 1183 adapter_stats->tx_pause_frames = port_stats->tx_pause_frames; 1184 adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames; 1185 adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames; 1186 adapter_stats->tx_internal_mac_errors = 1187 port_stats->tx_internal_mac_errors; 1188 adapter_stats->tx_control_frames = port_stats->tx_control_frames; 1189 adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes; 1190 adapter_stats->tx_pkts_65_to_127_bytes = 1191 port_stats->tx_pkts_65_to_127_bytes; 1192 adapter_stats->tx_pkts_128_to_255_bytes = 1193 port_stats->tx_pkts_128_to_255_bytes; 1194 adapter_stats->tx_pkts_256_to_511_bytes = 1195 port_stats->tx_pkts_256_to_511_bytes; 1196 adapter_stats->tx_pkts_512_to_1023_bytes = 1197 port_stats->tx_pkts_512_to_1023_bytes; 1198 adapter_stats->tx_pkts_1024_to_1518_bytes = 1199 port_stats->tx_pkts_1024_to_1518_bytes; 1200 adapter_stats->tx_pkts_1519_to_2047_bytes = 1201 port_stats->tx_pkts_1519_to_2047_bytes; 1202 adapter_stats->tx_pkts_2048_to_4095_bytes = 1203 port_stats->tx_pkts_2048_to_4095_bytes; 1204 adapter_stats->tx_pkts_4096_to_8191_bytes = 1205 port_stats->tx_pkts_4096_to_8191_bytes; 1206 adapter_stats->tx_pkts_8192_to_9216_bytes = 1207 port_stats->tx_pkts_8192_to_9216_bytes; 1208 adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts; 1209 adapter_stats->rx_pkts = port_stats->rx_pkts; 1210 adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts; 1211 adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts; 1212 adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts; 1213 adapter_stats->rx_bytes = port_stats->rx_bytes; 1214 adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes; 1215 adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes; 1216 adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes; 1217 adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos; 1218 adapter_stats->rx_discards = port_stats->rx_discards; 1219 adapter_stats->rx_errors = port_stats->rx_errors; 1220 adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1221 adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors; 1222 adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors; 1223 adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1224 adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames; 1225 adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames; 1226 adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long; 1227 adapter_stats->rx_internal_mac_errors = 1228 port_stats->rx_internal_mac_errors; 1229 adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts; 1230 adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts; 1231 adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts; 1232 adapter_stats->rx_jabbers = port_stats->rx_jabbers; 1233 adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1234 adapter_stats->rx_control_frames_unknown_opcode = 1235 port_stats->rx_control_frames_unknown_opcode; 1236 adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1237 adapter_stats->rx_out_of_range_errors = 1238 port_stats->rx_out_of_range_errors; 1239 adapter_stats->rx_address_match_errors = 1240 port_stats->rx_address_match_errors; 1241 adapter_stats->rx_vlan_mismatch_errors = 1242 port_stats->rx_vlan_mismatch_errors; 1243 adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1244 adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1245 adapter_stats->rx_dropped_header_too_small = 1246 port_stats->rx_dropped_header_too_small; 1247 adapter_stats->rx_dropped_invalid_tcp_length = 1248 port_stats->rx_dropped_invalid_tcp_length; 1249 adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1250 adapter_stats->rx_ip_checksum_errors = 1251 port_stats->rx_ip_checksum_errors; 1252 adapter_stats->rx_tcp_checksum_errors = 1253 port_stats->rx_tcp_checksum_errors; 1254 adapter_stats->rx_udp_checksum_errors = 1255 port_stats->rx_udp_checksum_errors; 1256 adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts; 1257 adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts; 1258 adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts; 1259 adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes; 1260 adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes; 1261 adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts; 1262 adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts; 1263 adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts; 1264 adapter_stats->rx_management_pkts = port_stats->rx_management_pkts; 1265 adapter_stats->rx_switched_unicast_pkts = 1266 port_stats->rx_switched_unicast_pkts; 1267 adapter_stats->rx_switched_multicast_pkts = 1268 port_stats->rx_switched_multicast_pkts; 1269 adapter_stats->rx_switched_broadcast_pkts = 1270 port_stats->rx_switched_broadcast_pkts; 1271 adapter_stats->num_forwards = port_stats->num_forwards; 1272 adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow; 1273 adapter_stats->rx_input_fifo_overflow = 1274 port_stats->rx_input_fifo_overflow; 1275 adapter_stats->rx_drops_too_many_frags = 1276 port_stats->rx_drops_too_many_frags; 1277 adapter_stats->rx_drops_invalid_queue = 1278 port_stats->rx_drops_invalid_queue; 1279 adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu; 1280 adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes; 1281 adapter_stats->rx_pkts_65_to_127_bytes = 1282 port_stats->rx_pkts_65_to_127_bytes; 1283 adapter_stats->rx_pkts_128_to_255_bytes = 1284 port_stats->rx_pkts_128_to_255_bytes; 1285 adapter_stats->rx_pkts_256_to_511_bytes = 1286 port_stats->rx_pkts_256_to_511_bytes; 1287 adapter_stats->rx_pkts_512_to_1023_bytes = 1288 port_stats->rx_pkts_512_to_1023_bytes; 1289 adapter_stats->rx_pkts_1024_to_1518_bytes = 1290 port_stats->rx_pkts_1024_to_1518_bytes; 1291 adapter_stats->rx_pkts_1519_to_2047_bytes = 1292 port_stats->rx_pkts_1519_to_2047_bytes; 1293 adapter_stats->rx_pkts_2048_to_4095_bytes = 1294 port_stats->rx_pkts_2048_to_4095_bytes; 1295 adapter_stats->rx_pkts_4096_to_8191_bytes = 1296 port_stats->rx_pkts_4096_to_8191_bytes; 1297 adapter_stats->rx_pkts_8192_to_9216_bytes = 1298 port_stats->rx_pkts_8192_to_9216_bytes; 1299 } 1300 1301 1302 1303 static void 1304 copy_stats_to_sc_be2(POCE_SOFTC sc) 1305 { 1306 struct oce_be_stats *adapter_stats; 1307 struct oce_pmem_stats *pmem; 1308 struct oce_rxf_stats_v0 *rxf_stats; 1309 struct oce_port_rxf_stats_v0 *port_stats; 1310 struct mbx_get_nic_stats_v0 *nic_mbx; 1311 uint32_t port = sc->port_id; 1312 1313 nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0); 1314 pmem = &nic_mbx->params.rsp.stats.pmem; 1315 rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1316 port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1317 1318 adapter_stats = &sc->oce_stats_info.u0.be; 1319 1320 1321 /* Update stats */ 1322 adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1323 adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1324 adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1325 adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1326 adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1327 adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1328 adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1329 adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1330 adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1331 adapter_stats->rxpp_fifo_overflow_drop = 1332 port_stats->rxpp_fifo_overflow_drop; 1333 adapter_stats->rx_dropped_tcp_length = 1334 port_stats->rx_dropped_tcp_length; 1335 adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1336 adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1337 adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1338 adapter_stats->rx_dropped_header_too_small = 1339 port_stats->rx_dropped_header_too_small; 1340 adapter_stats->rx_input_fifo_overflow_drop = 1341 port_stats->rx_input_fifo_overflow_drop; 1342 adapter_stats->rx_address_match_errors = 1343 port_stats->rx_address_match_errors; 1344 adapter_stats->rx_alignment_symbol_errors = 1345 port_stats->rx_alignment_symbol_errors; 1346 adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1347 adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1348 1349 if (sc->if_id) 1350 adapter_stats->jabber_events = rxf_stats->port1_jabber_events; 1351 else 1352 adapter_stats->jabber_events = rxf_stats->port0_jabber_events; 1353 1354 adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1355 adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1356 adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1357 adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1358 adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1359 adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1360 adapter_stats->rx_drops_no_tpre_descr = 1361 rxf_stats->rx_drops_no_tpre_descr; 1362 adapter_stats->rx_drops_too_many_frags = 1363 rxf_stats->rx_drops_too_many_frags; 1364 adapter_stats->eth_red_drops = pmem->eth_red_drops; 1365 } 1366 1367 1368 static void 1369 copy_stats_to_sc_be3(POCE_SOFTC sc) 1370 { 1371 struct oce_be_stats *adapter_stats; 1372 struct oce_pmem_stats *pmem; 1373 struct oce_rxf_stats_v1 *rxf_stats; 1374 struct oce_port_rxf_stats_v1 *port_stats; 1375 struct mbx_get_nic_stats *nic_mbx; 1376 uint32_t port = sc->port_id; 1377 1378 nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats); 1379 pmem = &nic_mbx->params.rsp.stats.pmem; 1380 rxf_stats = &nic_mbx->params.rsp.stats.rxf; 1381 port_stats = &nic_mbx->params.rsp.stats.rxf.port[port]; 1382 1383 adapter_stats = &sc->oce_stats_info.u0.be; 1384 1385 /* Update stats */ 1386 adapter_stats->pmem_fifo_overflow_drop = 1387 port_stats->pmem_fifo_overflow_drop; 1388 adapter_stats->rx_priority_pause_frames = 1389 port_stats->rx_priority_pause_frames; 1390 adapter_stats->rx_pause_frames = port_stats->rx_pause_frames; 1391 adapter_stats->rx_crc_errors = port_stats->rx_crc_errors; 1392 adapter_stats->rx_control_frames = port_stats->rx_control_frames; 1393 adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors; 1394 adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long; 1395 adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt; 1396 adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs; 1397 adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs; 1398 adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs; 1399 adapter_stats->rx_dropped_tcp_length = 1400 port_stats->rx_dropped_tcp_length; 1401 adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small; 1402 adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short; 1403 adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors; 1404 adapter_stats->rx_dropped_header_too_small = 1405 port_stats->rx_dropped_header_too_small; 1406 adapter_stats->rx_input_fifo_overflow_drop = 1407 port_stats->rx_input_fifo_overflow_drop; 1408 adapter_stats->rx_address_match_errors = 1409 port_stats->rx_address_match_errors; 1410 adapter_stats->rx_alignment_symbol_errors = 1411 port_stats->rx_alignment_symbol_errors; 1412 adapter_stats->rxpp_fifo_overflow_drop = 1413 port_stats->rxpp_fifo_overflow_drop; 1414 adapter_stats->tx_pauseframes = port_stats->tx_pauseframes; 1415 adapter_stats->tx_controlframes = port_stats->tx_controlframes; 1416 adapter_stats->jabber_events = port_stats->jabber_events; 1417 1418 adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 1419 adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb; 1420 adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 1421 adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring; 1422 adapter_stats->forwarded_packets = rxf_stats->forwarded_packets; 1423 adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu; 1424 adapter_stats->rx_drops_no_tpre_descr = 1425 rxf_stats->rx_drops_no_tpre_descr; 1426 adapter_stats->rx_drops_too_many_frags = 1427 rxf_stats->rx_drops_too_many_frags; 1428 1429 adapter_stats->eth_red_drops = pmem->eth_red_drops; 1430 } 1431 1432 1433 int 1434 oce_stats_init(POCE_SOFTC sc) 1435 { 1436 int rc = 0, sz; 1437 1438 if (IS_BE(sc) || IS_SH(sc)) { 1439 if (sc->flags & OCE_FLAGS_BE2) 1440 sz = sizeof(struct mbx_get_nic_stats_v0); 1441 else 1442 sz = sizeof(struct mbx_get_nic_stats); 1443 } else 1444 sz = sizeof(struct mbx_get_pport_stats); 1445 1446 rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0); 1447 1448 return rc; 1449 } 1450 1451 1452 void 1453 oce_stats_free(POCE_SOFTC sc) 1454 { 1455 1456 oce_dma_free(sc, &sc->stats_mem); 1457 1458 } 1459 1460 1461 int 1462 oce_refresh_nic_stats(POCE_SOFTC sc) 1463 { 1464 int rc = 0, reset = 0; 1465 1466 if (IS_BE(sc) || IS_SH(sc)) { 1467 if (sc->flags & OCE_FLAGS_BE2) { 1468 rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem); 1469 if (!rc) 1470 copy_stats_to_sc_be2(sc); 1471 } else { 1472 rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem); 1473 if (!rc) 1474 copy_stats_to_sc_be3(sc); 1475 } 1476 1477 } else { 1478 rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset); 1479 if (!rc) 1480 copy_stats_to_sc_xe201(sc); 1481 } 1482 1483 return rc; 1484 } 1485 1486 static int 1487 oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS) 1488 { 1489 int result = 0, error; 1490 int rc = 0; 1491 POCE_SOFTC sc = (POCE_SOFTC) arg1; 1492 1493 /* sysctl default handler */ 1494 error = sysctl_handle_int(oidp, &result, 0, req); 1495 if (error || !req->newptr) 1496 return (error); 1497 1498 if(result == -1) { 1499 return EINVAL; 1500 } 1501 bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE); 1502 1503 rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0); 1504 if(rc) 1505 return rc; 1506 1507 rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2); 1508 if(rc) 1509 return rc; 1510 1511 return rc; 1512 } 1513