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