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