2 * Copyright (C) 2013 Emulex
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
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.
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.
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.
31 * Contact Information:
32 * freebsd-drivers@emulex.com
36 * Costa Mesa, CA 92626
43 static void copy_stats_to_sc_xe201(POCE_SOFTC sc);
44 static void copy_stats_to_sc_be3(POCE_SOFTC sc);
45 static void copy_stats_to_sc_be2(POCE_SOFTC sc);
46 static int oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
47 static int oce_sys_aic_enable(SYSCTL_HANDLER_ARGS);
48 static int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
49 static int oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
50 static int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
51 static int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
52 static int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
53 static boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
54 static boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
55 int img_optype, uint32_t img_offset,
56 uint32_t img_size, uint32_t hdrs_size);
57 static void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
58 struct sysctl_ctx_list *ctx,
59 struct sysctl_oid *stats_node);
60 static void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
61 struct sysctl_ctx_list *ctx,
62 struct sysctl_oid *stats_node);
65 extern char component_revision[32];
66 uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
68 struct flash_img_attri {
77 oce_add_sysctls(POCE_SOFTC sc)
80 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
81 struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
82 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
83 struct sysctl_oid *stats_node;
85 SYSCTL_ADD_STRING(ctx, child,
86 OID_AUTO, "component_revision",
89 sizeof(component_revision),
90 "EMULEX One-Connect device driver revision");
92 SYSCTL_ADD_STRING(ctx, child,
93 OID_AUTO, "firmware_version",
96 sizeof(sc->fw_version),
97 "EMULEX One-Connect Firmware Version");
99 SYSCTL_ADD_INT(ctx, child,
100 OID_AUTO, "max_rsp_handled",
102 &oce_max_rsp_handled,
103 sizeof(oce_max_rsp_handled),
104 "Maximum receive frames handled per interupt");
106 if ((sc->function_mode & FNM_FLEX10_MODE) ||
107 (sc->function_mode & FNM_UMC_MODE))
108 SYSCTL_ADD_UINT(ctx, child,
114 SYSCTL_ADD_UINT(ctx, child,
120 if (sc->function_mode & FNM_UMC_MODE)
121 SYSCTL_ADD_UINT(ctx, child,
127 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back",
128 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0,
129 oce_sysctl_loopback, "I", "Loop Back Tests");
131 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade",
132 CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0,
133 oce_sys_fwupgrade, "A", "Firmware ufi file");
135 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "aic_enable",
136 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 1,
137 oce_sys_aic_enable, "I", "aic flags");
140 * Dumps Transceiver data
141 * "sysctl dev.oce.0.sfp_vpd_dump=0"
142 * "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump
143 * "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump
145 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump",
146 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump,
147 "I", "Initiate a sfp_vpd_dump operation");
148 SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer",
149 CTLFLAG_RD, sfp_vpd_dump_buffer,
150 TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer");
152 stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
153 CTLFLAG_RD, NULL, "Ethernet Statistics");
155 if (IS_BE(sc) || IS_SH(sc))
156 oce_add_stats_sysctls_be3(sc, ctx, stats_node);
158 oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
165 oce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
169 oce_mbox_cmd_set_loopback(sc, sc->port_id, loopback_type, 1);
170 status = oce_mbox_cmd_test_loopback(sc, sc->port_id, loopback_type,
172 oce_mbox_cmd_set_loopback(sc, sc->port_id, OCE_NO_LOOPBACK, 1);
178 oce_sys_aic_enable(SYSCTL_HANDLER_ARGS)
181 uint32_t status, vector;
182 POCE_SOFTC sc = (struct oce_softc *)arg1;
183 struct oce_aic_obj *aic;
185 status = sysctl_handle_int(oidp, &value, 0, req);
186 if (status || !req->newptr)
189 for (vector = 0; vector < sc->intr_count; vector++) {
190 aic = &sc->aic_obj[vector];
193 aic->max_eqd = aic->min_eqd = aic->et_eqd = 0;
197 aic->max_eqd = OCE_MAX_EQD;
198 aic->min_eqd = OCE_MIN_EQD;
199 aic->et_eqd = OCE_MIN_EQD;
207 oce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
211 struct oce_softc *sc = (struct oce_softc *)arg1;
213 status = sysctl_handle_int(oidp, &value, 0, req);
214 if (status || !req->newptr)
218 device_printf(sc->dev,
219 "Not a Valid value. Set to loop_back=1 to run tests\n");
223 if ((status = oce_loopback_test(sc, OCE_MAC_LOOPBACK))) {
224 device_printf(sc->dev,
225 "MAC Loopback Test = Failed (Error status = %d)\n",
228 device_printf(sc->dev, "MAC Loopback Test = Success\n");
230 if ((status = oce_loopback_test(sc, OCE_PHY_LOOPBACK))) {
231 device_printf(sc->dev,
232 "PHY Loopback Test = Failed (Error status = %d)\n",
235 device_printf(sc->dev, "PHY Loopback Test = Success\n");
237 if ((status = oce_loopback_test(sc, OCE_ONE_PORT_EXT_LOOPBACK))) {
238 device_printf(sc->dev,
239 "EXT Loopback Test = Failed (Error status = %d)\n",
242 device_printf(sc->dev, "EXT Loopback Test = Success\n");
249 oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS)
251 char ufiname[256] = {0};
253 struct oce_softc *sc = (struct oce_softc *)arg1;
254 const struct firmware *fw;
256 status = sysctl_handle_string(oidp, ufiname, sizeof(ufiname), req);
257 if (status || !req->newptr)
260 fw = firmware_get(ufiname);
262 device_printf(sc->dev, "Unable to get Firmware. "
263 "Make sure %s is copied to /boot/modules\n", ufiname);
268 if ((sc->flags & OCE_FLAGS_BE2)) {
269 device_printf(sc->dev,
270 "Flashing not supported for BE2 yet.\n");
274 status = oce_be3_fwupgrade(sc, fw);
275 } else if (IS_SH(sc)) {
276 status = oce_skyhawk_fwupgrade(sc,fw);
278 status = oce_lancer_fwupgrade(sc, fw);
281 device_printf(sc->dev, "Firmware Upgrade failed\n");
283 device_printf(sc->dev, "Firmware Flashed successfully\n");
286 /* Release Firmware*/
287 firmware_put(fw, FIRMWARE_UNLOAD);
292 static void oce_fill_flash_img_data(POCE_SOFTC sc, const struct flash_sec_info * fsec,
293 struct flash_img_attri *pimg, int i,
294 const struct firmware *fw, int bin_offset)
297 pimg->img_offset = HOST_32(fsec->fsec_entry[i].offset);
298 pimg->img_size = HOST_32(fsec->fsec_entry[i].pad_size);
301 pimg->img_type = HOST_32(fsec->fsec_entry[i].type);
302 pimg->skip_image = FALSE;
303 switch (pimg->img_type) {
307 pimg->img_offset = 2097152;
308 pimg->img_size = 2097152;
314 pimg->img_offset = 262144;
315 pimg->img_size = 1048576;
317 if (!oce_img_flashing_required(sc, fw->data,
322 pimg->skip_image = TRUE;
327 pimg->img_offset = 12582912;
328 pimg->img_size = 524288;
334 pimg->img_offset = 13107200;
335 pimg->img_size = 524288;
341 pimg->img_offset = 13631488;
342 pimg->img_size = 524288;
348 pimg->img_offset = 4194304;
349 pimg->img_size = 2097152;
355 pimg->img_offset = 6291456;
356 pimg->img_size = 2097152;
362 pimg->img_offset = 8388608;
363 pimg->img_size = 2097152;
369 pimg->img_offset = 15990784;
370 pimg->img_size = 262144;
376 pimg->img_offset = 1310720;
377 pimg->img_size = 262144;
379 if (!oce_phy_flashing_required(sc))
380 pimg->skip_image = TRUE;
383 pimg->skip_image = TRUE;
390 oce_sh_be3_flashdata(POCE_SOFTC sc, const struct firmware *fw, int32_t num_imgs)
392 char cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "};
393 const char *p = (const char *)fw->data;
394 const struct flash_sec_info *fsec = NULL;
395 struct mbx_common_read_write_flashrom *req;
396 int rc = 0, i, bin_offset = 0, opcode, num_bytes;
398 struct flash_img_attri imgatt;
400 /* Validate Cookie */
401 bin_offset = (sizeof(struct flash_file_hdr) +
402 (num_imgs * sizeof(struct image_hdr)));
404 while (p < ((const char *)fw->data + fw->datasize)) {
405 fsec = (const struct flash_sec_info *)p;
406 if (!memcmp(cookie, fsec->cookie, sizeof(cookie)))
413 device_printf(sc->dev,
414 "Invalid Cookie. Firmware image corrupted ?\n");
418 rc = oce_dma_alloc(sc, sizeof(struct mbx_common_read_write_flashrom),
421 device_printf(sc->dev,
422 "Memory allocation failure while flashing\n");
425 req = OCE_DMAPTR(&dma_mem, struct mbx_common_read_write_flashrom);
428 num_imgs = HOST_32(fsec->fsec_hdr.num_images);
430 num_imgs = MAX_FLASH_COMP;
432 for (i = 0; i < num_imgs; i++) {
434 bzero(&imgatt, sizeof(struct flash_img_attri));
436 oce_fill_flash_img_data(sc, fsec, &imgatt, i, fw, bin_offset);
438 if (imgatt.skip_image)
442 p = p + bin_offset + imgatt.img_offset;
444 if ((p + imgatt.img_size) > ((const char *)fw->data + fw->datasize)) {
449 while (imgatt.img_size) {
451 if (imgatt.img_size > 32*1024)
454 num_bytes = imgatt.img_size;
455 imgatt.img_size -= num_bytes;
457 if (!imgatt.img_size)
458 opcode = FLASHROM_OPER_FLASH;
460 opcode = FLASHROM_OPER_SAVE;
462 memcpy(req->data_buffer, p, num_bytes);
465 rc = oce_mbox_write_flashrom(sc, imgatt.optype, opcode,
466 &dma_mem, num_bytes);
468 device_printf(sc->dev,
469 "cmd to write to flash rom failed.\n");
473 /* Leave the CPU for others for some time */
481 oce_dma_free(sc, &dma_mem);
487 #define UFI_TYPE3R 10
489 #define UFI_TYPE4R 11
490 static int oce_get_ufi_type(POCE_SOFTC sc,
491 const struct flash_file_hdr *fhdr)
494 goto be_get_ufi_exit;
496 if (IS_SH(sc) && fhdr->build[0] == '4') {
497 if (fhdr->asic_type_rev >= 0x10)
501 } else if (IS_BE3(sc) && fhdr->build[0] == '3') {
502 if (fhdr->asic_type_rev == 0x10)
506 } else if (IS_BE2(sc) && fhdr->build[0] == '2')
510 device_printf(sc->dev,
511 "UFI and Interface are not compatible for flashing\n");
517 oce_skyhawk_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
519 int rc = 0, num_imgs = 0, i = 0, ufi_type;
520 const struct flash_file_hdr *fhdr;
521 const struct image_hdr *img_ptr;
523 fhdr = (const struct flash_file_hdr *)fw->data;
525 ufi_type = oce_get_ufi_type(sc, fhdr);
527 /* Display flash version */
528 device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
530 num_imgs = fhdr->num_imgs;
531 for (i = 0; i < num_imgs; i++) {
532 img_ptr = (const struct image_hdr *)((const char *)fw->data +
533 sizeof(struct flash_file_hdr) +
534 (i * sizeof(struct image_hdr)));
536 if (img_ptr->imageid != 1)
541 rc = oce_sh_be3_flashdata(sc, fw,
545 if (sc->asic_revision < 0x10)
546 rc = oce_sh_be3_flashdata(sc, fw,
550 device_printf(sc->dev,
551 "Cant load SH A0 UFI on B0\n");
565 oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
567 int rc = 0, num_imgs = 0, i = 0;
568 const struct flash_file_hdr *fhdr;
569 const struct image_hdr *img_ptr;
571 fhdr = (const struct flash_file_hdr *)fw->data;
572 if (fhdr->build[0] != '3') {
573 device_printf(sc->dev, "Invalid BE3 firmware image\n");
576 /* Display flash version */
577 device_printf(sc->dev, "Flashing Firmware %s\n", &fhdr->build[2]);
579 num_imgs = fhdr->num_imgs;
580 for (i = 0; i < num_imgs; i++) {
581 img_ptr = (const struct image_hdr *)((const char *)fw->data +
582 sizeof(struct flash_file_hdr) +
583 (i * sizeof(struct image_hdr)));
584 if (img_ptr->imageid == 1) {
585 rc = oce_sh_be3_flashdata(sc, fw, num_imgs);
596 oce_phy_flashing_required(POCE_SOFTC sc)
599 struct oce_phy_info phy_info;
601 status = oce_mbox_get_phy_info(sc, &phy_info);
605 if ((phy_info.phy_type == TN_8022) &&
606 (phy_info.interface_type == PHY_TYPE_BASET_10GB)) {
615 oce_img_flashing_required(POCE_SOFTC sc, const char *p,
616 int img_optype, uint32_t img_offset,
617 uint32_t img_size, uint32_t hdrs_size)
620 uint8_t flashed_crc[4];
623 crc_offset = hdrs_size + img_offset + img_size - 4;
627 status = oce_mbox_get_flashrom_crc(sc, flashed_crc,
628 (img_size - 4), img_optype);
630 return TRUE; /* Some thing worng. ReFlash */
632 /*update redboot only if crc does not match*/
633 if (bcmp(flashed_crc, p, 4))
641 oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw)
646 const uint8_t *data = NULL;
647 uint8_t *dest_image_ptr = NULL;
649 uint32_t data_written = 0, chunk_size = 0;
650 uint32_t offset = 0, add_status = 0;
652 if (!IS_ALIGNED(fw->datasize, sizeof(uint32_t))) {
653 device_printf(sc->dev,
654 "Lancer FW image is not 4 byte aligned.");
658 rc = oce_dma_alloc(sc, 32*1024, &dma_mem, 0);
660 device_printf(sc->dev,
661 "Memory allocation failure while flashing Lancer\n");
667 dest_image_ptr = OCE_DMAPTR(&dma_mem, uint8_t);
670 chunk_size = MIN(size, (32*1024));
672 bcopy(data, dest_image_ptr, chunk_size);
674 rc = oce_mbox_lancer_write_flashrom(sc, chunk_size, offset,
675 &dma_mem, &data_written, &add_status);
680 size -= data_written;
681 data += data_written;
682 offset += data_written;
688 /* Commit the firmware*/
689 rc = oce_mbox_lancer_write_flashrom(sc, 0, offset, &dma_mem,
690 &data_written, &add_status);
692 device_printf(sc->dev, "Lancer firmware load error. "
693 "Addstatus = 0x%x, status = %d \n", add_status, rc);
696 oce_dma_free(sc, &dma_mem);
703 oce_add_stats_sysctls_be3(POCE_SOFTC sc,
704 struct sysctl_ctx_list *ctx,
705 struct sysctl_oid *stats_node)
707 struct sysctl_oid *rx_stats_node, *tx_stats_node;
708 struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
709 struct sysctl_oid_list *queue_stats_list;
710 struct sysctl_oid *queue_stats_node;
711 struct oce_drv_stats *stats;
715 stats = &sc->oce_stats_info;
717 rx_stats_node = SYSCTL_ADD_NODE(ctx,
718 SYSCTL_CHILDREN(stats_node),
719 OID_AUTO,"rx", CTLFLAG_RD,
720 NULL, "RX Ethernet Statistics");
721 rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
724 SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
725 CTLFLAG_RD, &stats->rx.t_rx_pkts,
726 "Total Received Packets");
727 SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
728 CTLFLAG_RD, &stats->rx.t_rx_bytes,
729 "Total Received Bytes");
730 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
731 CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
732 "Total Received Fragements");
733 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
734 CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
735 "Total Received Multicast Packets");
736 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
737 CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
738 "Total Received Unicast Packets");
739 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
740 CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
741 "Total Receive completion errors");
742 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pause_frames",
743 CTLFLAG_RD, &stats->u0.be.rx_pause_frames, 0,
745 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "priority_pause_frames",
746 CTLFLAG_RD, &stats->u0.be.rx_priority_pause_frames, 0,
747 "Priority Pause Frames");
748 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "control_frames",
749 CTLFLAG_RD, &stats->u0.be.rx_control_frames, 0,
752 for (i = 0; i < sc->nrqs; i++) {
753 sprintf(prefix, "queue%d",i);
754 queue_stats_node = SYSCTL_ADD_NODE(ctx,
755 SYSCTL_CHILDREN(rx_stats_node),
756 OID_AUTO, prefix, CTLFLAG_RD,
758 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
760 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
761 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
763 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
764 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
766 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
767 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
768 "Received Fragments");
769 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
770 "rx_mcast_pkts", CTLFLAG_RD,
771 &sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
772 "Received Multicast Packets");
773 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
774 "rx_ucast_pkts", CTLFLAG_RD,
775 &sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
776 "Received Unicast Packets");
777 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
778 CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
779 "Received Completion Errors");
783 rx_stats_node = SYSCTL_ADD_NODE(ctx,
784 SYSCTL_CHILDREN(rx_stats_node),
785 OID_AUTO, "err", CTLFLAG_RD,
786 NULL, "Receive Error Stats");
787 rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
789 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "crc_errs",
790 CTLFLAG_RD, &stats->u0.be.rx_crc_errors, 0,
792 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "pbuf_errors",
793 CTLFLAG_RD, &stats->u0.be.rx_drops_no_pbuf, 0,
794 "Drops due to pbuf full");
795 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "erx_errors",
796 CTLFLAG_RD, &stats->u0.be.rx_drops_no_erx_descr, 0,
798 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
799 CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0,
800 "RX Alignmnet Errors");
801 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
802 CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0,
804 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
805 CTLFLAG_RD, &stats->u0.be.rx_out_range_errors, 0,
807 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
808 CTLFLAG_RD, &stats->u0.be.rx_frame_too_long, 0,
810 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
811 CTLFLAG_RD, &stats->u0.be.rx_address_match_errors, 0,
812 "Address Match Errors");
813 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
814 CTLFLAG_RD, &stats->u0.be.rx_dropped_too_small, 0,
815 "Dropped Too Small");
816 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
817 CTLFLAG_RD, &stats->u0.be.rx_dropped_too_short, 0,
818 "Dropped Too Short");
819 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
820 "dropped_header_too_small", CTLFLAG_RD,
821 &stats->u0.be.rx_dropped_header_too_small, 0,
822 "Dropped Header Too Small");
823 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_tcp_length",
824 CTLFLAG_RD, &stats->u0.be.rx_dropped_tcp_length, 0,
825 "Dropped TCP Length");
826 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
827 CTLFLAG_RD, &stats->u0.be.rx_dropped_runt, 0,
829 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
830 CTLFLAG_RD, &stats->u0.be.rx_ip_checksum_errs, 0,
831 "IP Checksum Errors");
832 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
833 CTLFLAG_RD, &stats->u0.be.rx_tcp_checksum_errs, 0,
834 "TCP Checksum Errors");
835 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
836 CTLFLAG_RD, &stats->u0.be.rx_udp_checksum_errs, 0,
837 "UDP Checksum Errors");
838 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "fifo_overflow_drop",
839 CTLFLAG_RD, &stats->u0.be.rxpp_fifo_overflow_drop, 0,
840 "FIFO Overflow Drop");
841 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
842 "input_fifo_overflow_drop", CTLFLAG_RD,
843 &stats->u0.be.rx_input_fifo_overflow_drop, 0,
844 "Input FIFO Overflow Drop");
846 tx_stats_node = SYSCTL_ADD_NODE(ctx,
847 SYSCTL_CHILDREN(stats_node), OID_AUTO,
848 "tx",CTLFLAG_RD, NULL,
849 "TX Ethernet Statistics");
850 tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
852 SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
853 CTLFLAG_RD, &stats->tx.t_tx_pkts,
854 "Total Transmit Packets");
855 SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
856 CTLFLAG_RD, &stats->tx.t_tx_bytes,
857 "Total Transmit Bytes");
858 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
859 CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
860 "Total Transmit Requests");
861 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
862 CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
863 "Total Transmit Stops");
864 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
865 CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
866 "Total Transmit WRB's");
867 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
868 CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
869 "Total Transmit Completions");
870 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
871 "total_ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
872 &stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
873 "Total Transmit IPV6 Drops");
874 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "pauseframes",
875 CTLFLAG_RD, &stats->u0.be.tx_pauseframes, 0,
877 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "priority_pauseframes",
878 CTLFLAG_RD, &stats->u0.be.tx_priority_pauseframes, 0,
879 "Priority Pauseframes");
880 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "controlframes",
881 CTLFLAG_RD, &stats->u0.be.tx_controlframes, 0,
882 "Tx Control Frames");
884 for (i = 0; i < sc->nwqs; i++) {
885 sprintf(prefix, "queue%d",i);
886 queue_stats_node = SYSCTL_ADD_NODE(ctx,
887 SYSCTL_CHILDREN(tx_stats_node),
888 OID_AUTO, prefix, CTLFLAG_RD,
890 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
892 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
893 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
895 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
896 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
898 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
899 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
900 "Transmit Requests");
901 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
902 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
904 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
905 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
907 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
908 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
909 "Transmit Completions");
910 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
911 "ipv6_ext_hdr_tx_drop",CTLFLAG_RD,
912 &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
913 "Transmit IPV6 Ext Header Drop");
921 oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
922 struct sysctl_ctx_list *ctx,
923 struct sysctl_oid *stats_node)
925 struct sysctl_oid *rx_stats_node, *tx_stats_node;
926 struct sysctl_oid_list *rx_stat_list, *tx_stat_list;
927 struct sysctl_oid_list *queue_stats_list;
928 struct sysctl_oid *queue_stats_node;
929 struct oce_drv_stats *stats;
933 stats = &sc->oce_stats_info;
935 rx_stats_node = SYSCTL_ADD_NODE(ctx,
936 SYSCTL_CHILDREN(stats_node),
937 OID_AUTO, "rx", CTLFLAG_RD,
938 NULL, "RX Ethernet Statistics");
939 rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
942 SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_pkts",
943 CTLFLAG_RD, &stats->rx.t_rx_pkts,
944 "Total Received Packets");
945 SYSCTL_ADD_QUAD(ctx, rx_stat_list, OID_AUTO, "total_bytes",
946 CTLFLAG_RD, &stats->rx.t_rx_bytes,
947 "Total Received Bytes");
948 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",
949 CTLFLAG_RD, &stats->rx.t_rx_frags, 0,
950 "Total Received Fragements");
951 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",
952 CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,
953 "Total Received Multicast Packets");
954 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_ucast_pkts",
955 CTLFLAG_RD, &stats->rx.t_rx_ucast_pkts, 0,
956 "Total Received Unicast Packets");
957 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_rxcp_errs",
958 CTLFLAG_RD, &stats->rx.t_rxcp_errs, 0,
959 "Total Receive completion errors");
960 SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "pause_frames",
961 CTLFLAG_RD, &stats->u0.xe201.rx_pause_frames,
963 SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "control_frames",
964 CTLFLAG_RD, &stats->u0.xe201.rx_control_frames,
967 for (i = 0; i < sc->nrqs; i++) {
968 sprintf(prefix, "queue%d",i);
969 queue_stats_node = SYSCTL_ADD_NODE(ctx,
970 SYSCTL_CHILDREN(rx_stats_node),
971 OID_AUTO, prefix, CTLFLAG_RD,
973 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
975 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_pkts",
976 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_pkts,
978 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",
979 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes,
981 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",
982 CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,
983 "Received Fragments");
984 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
985 "rx_mcast_pkts", CTLFLAG_RD,
986 &sc->rq[i]->rx_stats.rx_mcast_pkts, 0,
987 "Received Multicast Packets");
988 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
989 "rx_ucast_pkts",CTLFLAG_RD,
990 &sc->rq[i]->rx_stats.rx_ucast_pkts, 0,
991 "Received Unicast Packets");
992 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rxcp_err",
993 CTLFLAG_RD, &sc->rq[i]->rx_stats.rxcp_err, 0,
994 "Received Completion Errors");
998 rx_stats_node = SYSCTL_ADD_NODE(ctx,
999 SYSCTL_CHILDREN(rx_stats_node),
1000 OID_AUTO, "err", CTLFLAG_RD,
1001 NULL, "Receive Error Stats");
1002 rx_stat_list = SYSCTL_CHILDREN(rx_stats_node);
1004 SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "crc_errs",
1005 CTLFLAG_RD, &stats->u0.xe201.rx_crc_errors,
1007 SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "alignment_errors",
1008 CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors,
1009 "RX Alignmnet Errors");
1010 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",
1011 CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0,
1013 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "out_range_errors",
1014 CTLFLAG_RD, &stats->u0.xe201.rx_out_of_range_errors, 0,
1015 "Out Range Errors");
1016 SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "frame_too_long",
1017 CTLFLAG_RD, &stats->u0.xe201.rx_frames_too_long,
1019 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "address_match_errors",
1020 CTLFLAG_RD, &stats->u0.xe201.rx_address_match_errors, 0,
1021 "Address Match Errors");
1022 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_small",
1023 CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_small, 0,
1024 "Dropped Too Small");
1025 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_too_short",
1026 CTLFLAG_RD, &stats->u0.xe201.rx_dropped_too_short, 0,
1027 "Dropped Too Short");
1028 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
1029 "dropped_header_too_small", CTLFLAG_RD,
1030 &stats->u0.xe201.rx_dropped_header_too_small, 0,
1031 "Dropped Header Too Small");
1032 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO,
1033 "dropped_tcp_length", CTLFLAG_RD,
1034 &stats->u0.xe201.rx_dropped_invalid_tcp_length, 0,
1035 "Dropped TCP Length");
1036 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "dropped_runt",
1037 CTLFLAG_RD, &stats->u0.xe201.rx_dropped_runt, 0,
1039 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "ip_checksum_errs",
1040 CTLFLAG_RD, &stats->u0.xe201.rx_ip_checksum_errors, 0,
1041 "IP Checksum Errors");
1042 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "tcp_checksum_errs",
1043 CTLFLAG_RD, &stats->u0.xe201.rx_tcp_checksum_errors, 0,
1044 "TCP Checksum Errors");
1045 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "udp_checksum_errs",
1046 CTLFLAG_RD, &stats->u0.xe201.rx_udp_checksum_errors, 0,
1047 "UDP Checksum Errors");
1048 SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "input_fifo_overflow_drop",
1049 CTLFLAG_RD, &stats->u0.xe201.rx_fifo_overflow, 0,
1050 "Input FIFO Overflow Drop");
1052 tx_stats_node = SYSCTL_ADD_NODE(ctx,
1053 SYSCTL_CHILDREN(stats_node),
1054 OID_AUTO, "tx", CTLFLAG_RD,
1055 NULL, "TX Ethernet Statistics");
1056 tx_stat_list = SYSCTL_CHILDREN(tx_stats_node);
1058 SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_pkts",
1059 CTLFLAG_RD, &stats->tx.t_tx_pkts,
1060 "Total Transmit Packets");
1061 SYSCTL_ADD_QUAD(ctx, tx_stat_list, OID_AUTO, "total_tx_bytes",
1062 CTLFLAG_RD, &stats->tx.t_tx_bytes,
1063 "Total Transmit Bytes");
1064 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_reqs",
1065 CTLFLAG_RD, &stats->tx.t_tx_reqs, 0,
1066 "Total Transmit Requests");
1067 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_stops",
1068 CTLFLAG_RD, &stats->tx.t_tx_stops, 0,
1069 "Total Transmit Stops");
1070 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_wrbs",
1071 CTLFLAG_RD, &stats->tx.t_tx_wrbs, 0,
1072 "Total Transmit WRB's");
1073 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO, "total_tx_compl",
1074 CTLFLAG_RD, &stats->tx.t_tx_compl, 0,
1075 "Total Transmit Completions");
1076 SYSCTL_ADD_UINT(ctx, tx_stat_list, OID_AUTO,
1077 "total_ipv6_ext_hdr_tx_drop",
1078 CTLFLAG_RD, &stats->tx.t_ipv6_ext_hdr_tx_drop, 0,
1079 "Total Transmit IPV6 Drops");
1080 SYSCTL_ADD_UQUAD(ctx, tx_stat_list, OID_AUTO, "pauseframes",
1081 CTLFLAG_RD, &stats->u0.xe201.tx_pause_frames,
1083 SYSCTL_ADD_UQUAD(ctx, tx_stat_list, OID_AUTO, "controlframes",
1084 CTLFLAG_RD, &stats->u0.xe201.tx_control_frames,
1085 "Tx Control Frames");
1087 for (i = 0; i < sc->nwqs; i++) {
1088 sprintf(prefix, "queue%d",i);
1089 queue_stats_node = SYSCTL_ADD_NODE(ctx,
1090 SYSCTL_CHILDREN(tx_stats_node),
1091 OID_AUTO, prefix, CTLFLAG_RD,
1092 NULL, "Queue name");
1093 queue_stats_list = SYSCTL_CHILDREN(queue_stats_node);
1095 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_pkts",
1096 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_pkts,
1097 "Transmit Packets");
1098 SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "tx_bytes",
1099 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_bytes,
1101 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_reqs",
1102 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_reqs, 0,
1103 "Transmit Requests");
1104 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_stops",
1105 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_stops, 0,
1107 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_wrbs",
1108 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_wrbs, 0,
1110 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "tx_compl",
1111 CTLFLAG_RD, &sc->wq[i]->tx_stats.tx_compl, 0,
1112 "Transmit Completions");
1113 SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO,
1114 "ipv6_ext_hdr_tx_drop", CTLFLAG_RD,
1115 &sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop, 0,
1116 "Transmit IPV6 Ext Header Drop");
1124 oce_refresh_queue_stats(POCE_SOFTC sc)
1126 struct oce_drv_stats *adapter_stats;
1129 adapter_stats = &sc->oce_stats_info;
1131 /* Caluculate total TX and TXstats from all queues */
1133 bzero(&adapter_stats->rx, sizeof(struct oce_rx_stats));
1134 for (i = 0; i < sc->nrqs; i++) {
1136 adapter_stats->rx.t_rx_pkts += sc->rq[i]->rx_stats.rx_pkts;
1137 adapter_stats->rx.t_rx_bytes += sc->rq[i]->rx_stats.rx_bytes;
1138 adapter_stats->rx.t_rx_frags += sc->rq[i]->rx_stats.rx_frags;
1139 adapter_stats->rx.t_rx_mcast_pkts +=
1140 sc->rq[i]->rx_stats.rx_mcast_pkts;
1141 adapter_stats->rx.t_rx_ucast_pkts +=
1142 sc->rq[i]->rx_stats.rx_ucast_pkts;
1143 adapter_stats->rx.t_rxcp_errs += sc-> rq[i]->rx_stats.rxcp_err;
1146 bzero(&adapter_stats->tx, sizeof(struct oce_tx_stats));
1147 for (i = 0; i < sc->nwqs; i++) {
1148 adapter_stats->tx.t_tx_reqs += sc->wq[i]->tx_stats.tx_reqs;
1149 adapter_stats->tx.t_tx_stops += sc->wq[i]->tx_stats.tx_stops;
1150 adapter_stats->tx.t_tx_wrbs += sc->wq[i]->tx_stats.tx_wrbs;
1151 adapter_stats->tx.t_tx_compl += sc->wq[i]->tx_stats.tx_compl;
1152 adapter_stats->tx.t_tx_bytes += sc->wq[i]->tx_stats.tx_bytes;
1153 adapter_stats->tx.t_tx_pkts += sc->wq[i]->tx_stats.tx_pkts;
1154 adapter_stats->tx.t_ipv6_ext_hdr_tx_drop +=
1155 sc->wq[i]->tx_stats.ipv6_ext_hdr_tx_drop;
1163 copy_stats_to_sc_xe201(POCE_SOFTC sc)
1165 struct oce_xe201_stats *adapter_stats;
1166 struct mbx_get_pport_stats *nic_mbx;
1167 struct pport_stats *port_stats;
1169 nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_pport_stats);
1170 port_stats = &nic_mbx->params.rsp.pps;
1171 adapter_stats = &sc->oce_stats_info.u0.xe201;
1173 adapter_stats->tx_pkts = port_stats->tx_pkts;
1174 adapter_stats->tx_unicast_pkts = port_stats->tx_unicast_pkts;
1175 adapter_stats->tx_multicast_pkts = port_stats->tx_multicast_pkts;
1176 adapter_stats->tx_broadcast_pkts = port_stats->tx_broadcast_pkts;
1177 adapter_stats->tx_bytes = port_stats->tx_bytes;
1178 adapter_stats->tx_unicast_bytes = port_stats->tx_unicast_bytes;
1179 adapter_stats->tx_multicast_bytes = port_stats->tx_multicast_bytes;
1180 adapter_stats->tx_broadcast_bytes = port_stats->tx_broadcast_bytes;
1181 adapter_stats->tx_discards = port_stats->tx_discards;
1182 adapter_stats->tx_errors = port_stats->tx_errors;
1183 adapter_stats->tx_pause_frames = port_stats->tx_pause_frames;
1184 adapter_stats->tx_pause_on_frames = port_stats->tx_pause_on_frames;
1185 adapter_stats->tx_pause_off_frames = port_stats->tx_pause_off_frames;
1186 adapter_stats->tx_internal_mac_errors =
1187 port_stats->tx_internal_mac_errors;
1188 adapter_stats->tx_control_frames = port_stats->tx_control_frames;
1189 adapter_stats->tx_pkts_64_bytes = port_stats->tx_pkts_64_bytes;
1190 adapter_stats->tx_pkts_65_to_127_bytes =
1191 port_stats->tx_pkts_65_to_127_bytes;
1192 adapter_stats->tx_pkts_128_to_255_bytes =
1193 port_stats->tx_pkts_128_to_255_bytes;
1194 adapter_stats->tx_pkts_256_to_511_bytes =
1195 port_stats->tx_pkts_256_to_511_bytes;
1196 adapter_stats->tx_pkts_512_to_1023_bytes =
1197 port_stats->tx_pkts_512_to_1023_bytes;
1198 adapter_stats->tx_pkts_1024_to_1518_bytes =
1199 port_stats->tx_pkts_1024_to_1518_bytes;
1200 adapter_stats->tx_pkts_1519_to_2047_bytes =
1201 port_stats->tx_pkts_1519_to_2047_bytes;
1202 adapter_stats->tx_pkts_2048_to_4095_bytes =
1203 port_stats->tx_pkts_2048_to_4095_bytes;
1204 adapter_stats->tx_pkts_4096_to_8191_bytes =
1205 port_stats->tx_pkts_4096_to_8191_bytes;
1206 adapter_stats->tx_pkts_8192_to_9216_bytes =
1207 port_stats->tx_pkts_8192_to_9216_bytes;
1208 adapter_stats->tx_lso_pkts = port_stats->tx_lso_pkts;
1209 adapter_stats->rx_pkts = port_stats->rx_pkts;
1210 adapter_stats->rx_unicast_pkts = port_stats->rx_unicast_pkts;
1211 adapter_stats->rx_multicast_pkts = port_stats->rx_multicast_pkts;
1212 adapter_stats->rx_broadcast_pkts = port_stats->rx_broadcast_pkts;
1213 adapter_stats->rx_bytes = port_stats->rx_bytes;
1214 adapter_stats->rx_unicast_bytes = port_stats->rx_unicast_bytes;
1215 adapter_stats->rx_multicast_bytes = port_stats->rx_multicast_bytes;
1216 adapter_stats->rx_broadcast_bytes = port_stats->rx_broadcast_bytes;
1217 adapter_stats->rx_unknown_protos = port_stats->rx_unknown_protos;
1218 adapter_stats->rx_discards = port_stats->rx_discards;
1219 adapter_stats->rx_errors = port_stats->rx_errors;
1220 adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1221 adapter_stats->rx_alignment_errors = port_stats->rx_alignment_errors;
1222 adapter_stats->rx_symbol_errors = port_stats->rx_symbol_errors;
1223 adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1224 adapter_stats->rx_pause_on_frames = port_stats->rx_pause_on_frames;
1225 adapter_stats->rx_pause_off_frames = port_stats->rx_pause_off_frames;
1226 adapter_stats->rx_frames_too_long = port_stats->rx_frames_too_long;
1227 adapter_stats->rx_internal_mac_errors =
1228 port_stats->rx_internal_mac_errors;
1229 adapter_stats->rx_undersize_pkts = port_stats->rx_undersize_pkts;
1230 adapter_stats->rx_oversize_pkts = port_stats->rx_oversize_pkts;
1231 adapter_stats->rx_fragment_pkts = port_stats->rx_fragment_pkts;
1232 adapter_stats->rx_jabbers = port_stats->rx_jabbers;
1233 adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1234 adapter_stats->rx_control_frames_unknown_opcode =
1235 port_stats->rx_control_frames_unknown_opcode;
1236 adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1237 adapter_stats->rx_out_of_range_errors =
1238 port_stats->rx_out_of_range_errors;
1239 adapter_stats->rx_address_match_errors =
1240 port_stats->rx_address_match_errors;
1241 adapter_stats->rx_vlan_mismatch_errors =
1242 port_stats->rx_vlan_mismatch_errors;
1243 adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1244 adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1245 adapter_stats->rx_dropped_header_too_small =
1246 port_stats->rx_dropped_header_too_small;
1247 adapter_stats->rx_dropped_invalid_tcp_length =
1248 port_stats->rx_dropped_invalid_tcp_length;
1249 adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1250 adapter_stats->rx_ip_checksum_errors =
1251 port_stats->rx_ip_checksum_errors;
1252 adapter_stats->rx_tcp_checksum_errors =
1253 port_stats->rx_tcp_checksum_errors;
1254 adapter_stats->rx_udp_checksum_errors =
1255 port_stats->rx_udp_checksum_errors;
1256 adapter_stats->rx_non_rss_pkts = port_stats->rx_non_rss_pkts;
1257 adapter_stats->rx_ipv4_pkts = port_stats->rx_ipv4_pkts;
1258 adapter_stats->rx_ipv6_pkts = port_stats->rx_ipv6_pkts;
1259 adapter_stats->rx_ipv4_bytes = port_stats->rx_ipv4_bytes;
1260 adapter_stats->rx_ipv6_bytes = port_stats->rx_ipv6_bytes;
1261 adapter_stats->rx_nic_pkts = port_stats->rx_nic_pkts;
1262 adapter_stats->rx_tcp_pkts = port_stats->rx_tcp_pkts;
1263 adapter_stats->rx_iscsi_pkts = port_stats->rx_iscsi_pkts;
1264 adapter_stats->rx_management_pkts = port_stats->rx_management_pkts;
1265 adapter_stats->rx_switched_unicast_pkts =
1266 port_stats->rx_switched_unicast_pkts;
1267 adapter_stats->rx_switched_multicast_pkts =
1268 port_stats->rx_switched_multicast_pkts;
1269 adapter_stats->rx_switched_broadcast_pkts =
1270 port_stats->rx_switched_broadcast_pkts;
1271 adapter_stats->num_forwards = port_stats->num_forwards;
1272 adapter_stats->rx_fifo_overflow = port_stats->rx_fifo_overflow;
1273 adapter_stats->rx_input_fifo_overflow =
1274 port_stats->rx_input_fifo_overflow;
1275 adapter_stats->rx_drops_too_many_frags =
1276 port_stats->rx_drops_too_many_frags;
1277 adapter_stats->rx_drops_invalid_queue =
1278 port_stats->rx_drops_invalid_queue;
1279 adapter_stats->rx_drops_mtu = port_stats->rx_drops_mtu;
1280 adapter_stats->rx_pkts_64_bytes = port_stats->rx_pkts_64_bytes;
1281 adapter_stats->rx_pkts_65_to_127_bytes =
1282 port_stats->rx_pkts_65_to_127_bytes;
1283 adapter_stats->rx_pkts_128_to_255_bytes =
1284 port_stats->rx_pkts_128_to_255_bytes;
1285 adapter_stats->rx_pkts_256_to_511_bytes =
1286 port_stats->rx_pkts_256_to_511_bytes;
1287 adapter_stats->rx_pkts_512_to_1023_bytes =
1288 port_stats->rx_pkts_512_to_1023_bytes;
1289 adapter_stats->rx_pkts_1024_to_1518_bytes =
1290 port_stats->rx_pkts_1024_to_1518_bytes;
1291 adapter_stats->rx_pkts_1519_to_2047_bytes =
1292 port_stats->rx_pkts_1519_to_2047_bytes;
1293 adapter_stats->rx_pkts_2048_to_4095_bytes =
1294 port_stats->rx_pkts_2048_to_4095_bytes;
1295 adapter_stats->rx_pkts_4096_to_8191_bytes =
1296 port_stats->rx_pkts_4096_to_8191_bytes;
1297 adapter_stats->rx_pkts_8192_to_9216_bytes =
1298 port_stats->rx_pkts_8192_to_9216_bytes;
1304 copy_stats_to_sc_be2(POCE_SOFTC sc)
1306 struct oce_be_stats *adapter_stats;
1307 struct oce_pmem_stats *pmem;
1308 struct oce_rxf_stats_v0 *rxf_stats;
1309 struct oce_port_rxf_stats_v0 *port_stats;
1310 struct mbx_get_nic_stats_v0 *nic_mbx;
1311 uint32_t port = sc->port_id;
1313 nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats_v0);
1314 pmem = &nic_mbx->params.rsp.stats.pmem;
1315 rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1316 port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1318 adapter_stats = &sc->oce_stats_info.u0.be;
1322 adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1323 adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1324 adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1325 adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1326 adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1327 adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1328 adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1329 adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1330 adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1331 adapter_stats->rxpp_fifo_overflow_drop =
1332 port_stats->rxpp_fifo_overflow_drop;
1333 adapter_stats->rx_dropped_tcp_length =
1334 port_stats->rx_dropped_tcp_length;
1335 adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1336 adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1337 adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1338 adapter_stats->rx_dropped_header_too_small =
1339 port_stats->rx_dropped_header_too_small;
1340 adapter_stats->rx_input_fifo_overflow_drop =
1341 port_stats->rx_input_fifo_overflow_drop;
1342 adapter_stats->rx_address_match_errors =
1343 port_stats->rx_address_match_errors;
1344 adapter_stats->rx_alignment_symbol_errors =
1345 port_stats->rx_alignment_symbol_errors;
1346 adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1347 adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1350 adapter_stats->jabber_events = rxf_stats->port1_jabber_events;
1352 adapter_stats->jabber_events = rxf_stats->port0_jabber_events;
1354 adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1355 adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1356 adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1357 adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1358 adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1359 adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1360 adapter_stats->rx_drops_no_tpre_descr =
1361 rxf_stats->rx_drops_no_tpre_descr;
1362 adapter_stats->rx_drops_too_many_frags =
1363 rxf_stats->rx_drops_too_many_frags;
1364 adapter_stats->eth_red_drops = pmem->eth_red_drops;
1369 copy_stats_to_sc_be3(POCE_SOFTC sc)
1371 struct oce_be_stats *adapter_stats;
1372 struct oce_pmem_stats *pmem;
1373 struct oce_rxf_stats_v1 *rxf_stats;
1374 struct oce_port_rxf_stats_v1 *port_stats;
1375 struct mbx_get_nic_stats *nic_mbx;
1376 uint32_t port = sc->port_id;
1378 nic_mbx = OCE_DMAPTR(&sc->stats_mem, struct mbx_get_nic_stats);
1379 pmem = &nic_mbx->params.rsp.stats.pmem;
1380 rxf_stats = &nic_mbx->params.rsp.stats.rxf;
1381 port_stats = &nic_mbx->params.rsp.stats.rxf.port[port];
1383 adapter_stats = &sc->oce_stats_info.u0.be;
1386 adapter_stats->pmem_fifo_overflow_drop =
1387 port_stats->pmem_fifo_overflow_drop;
1388 adapter_stats->rx_priority_pause_frames =
1389 port_stats->rx_priority_pause_frames;
1390 adapter_stats->rx_pause_frames = port_stats->rx_pause_frames;
1391 adapter_stats->rx_crc_errors = port_stats->rx_crc_errors;
1392 adapter_stats->rx_control_frames = port_stats->rx_control_frames;
1393 adapter_stats->rx_in_range_errors = port_stats->rx_in_range_errors;
1394 adapter_stats->rx_frame_too_long = port_stats->rx_frame_too_long;
1395 adapter_stats->rx_dropped_runt = port_stats->rx_dropped_runt;
1396 adapter_stats->rx_ip_checksum_errs = port_stats->rx_ip_checksum_errs;
1397 adapter_stats->rx_tcp_checksum_errs = port_stats->rx_tcp_checksum_errs;
1398 adapter_stats->rx_udp_checksum_errs = port_stats->rx_udp_checksum_errs;
1399 adapter_stats->rx_dropped_tcp_length =
1400 port_stats->rx_dropped_tcp_length;
1401 adapter_stats->rx_dropped_too_small = port_stats->rx_dropped_too_small;
1402 adapter_stats->rx_dropped_too_short = port_stats->rx_dropped_too_short;
1403 adapter_stats->rx_out_range_errors = port_stats->rx_out_range_errors;
1404 adapter_stats->rx_dropped_header_too_small =
1405 port_stats->rx_dropped_header_too_small;
1406 adapter_stats->rx_input_fifo_overflow_drop =
1407 port_stats->rx_input_fifo_overflow_drop;
1408 adapter_stats->rx_address_match_errors =
1409 port_stats->rx_address_match_errors;
1410 adapter_stats->rx_alignment_symbol_errors =
1411 port_stats->rx_alignment_symbol_errors;
1412 adapter_stats->rxpp_fifo_overflow_drop =
1413 port_stats->rxpp_fifo_overflow_drop;
1414 adapter_stats->tx_pauseframes = port_stats->tx_pauseframes;
1415 adapter_stats->tx_controlframes = port_stats->tx_controlframes;
1416 adapter_stats->jabber_events = port_stats->jabber_events;
1418 adapter_stats->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
1419 adapter_stats->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
1420 adapter_stats->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
1421 adapter_stats->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
1422 adapter_stats->forwarded_packets = rxf_stats->forwarded_packets;
1423 adapter_stats->rx_drops_mtu = rxf_stats->rx_drops_mtu;
1424 adapter_stats->rx_drops_no_tpre_descr =
1425 rxf_stats->rx_drops_no_tpre_descr;
1426 adapter_stats->rx_drops_too_many_frags =
1427 rxf_stats->rx_drops_too_many_frags;
1429 adapter_stats->eth_red_drops = pmem->eth_red_drops;
1434 oce_stats_init(POCE_SOFTC sc)
1438 if (IS_BE(sc) || IS_SH(sc)) {
1439 if (sc->flags & OCE_FLAGS_BE2)
1440 sz = sizeof(struct mbx_get_nic_stats_v0);
1442 sz = sizeof(struct mbx_get_nic_stats);
1444 sz = sizeof(struct mbx_get_pport_stats);
1446 rc = oce_dma_alloc(sc, sz, &sc->stats_mem, 0);
1453 oce_stats_free(POCE_SOFTC sc)
1456 oce_dma_free(sc, &sc->stats_mem);
1462 oce_refresh_nic_stats(POCE_SOFTC sc)
1464 int rc = 0, reset = 0;
1466 if (IS_BE(sc) || IS_SH(sc)) {
1467 if (sc->flags & OCE_FLAGS_BE2) {
1468 rc = oce_mbox_get_nic_stats_v0(sc, &sc->stats_mem);
1470 copy_stats_to_sc_be2(sc);
1472 rc = oce_mbox_get_nic_stats(sc, &sc->stats_mem);
1474 copy_stats_to_sc_be3(sc);
1478 rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset);
1480 copy_stats_to_sc_xe201(sc);
1487 oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS)
1489 int result = 0, error;
1491 POCE_SOFTC sc = (POCE_SOFTC) arg1;
1493 /* sysctl default handler */
1494 error = sysctl_handle_int(oidp, &result, 0, req);
1495 if (error || !req->newptr)
1501 bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE);
1503 rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0);
1507 rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2);