xref: /freebsd/sys/dev/bxe/bxe_stats.c (revision 717568ad8d17f48064dd1530aeb91e00b50f7780)
14e400768SDavid Christensen /*-
2e36ffbddSDavid C Somayajulu  * Copyright (c) 2007-2014 QLogic Corporation. All rights reserved.
34e400768SDavid Christensen  *
44e400768SDavid Christensen  * Redistribution and use in source and binary forms, with or without
54e400768SDavid Christensen  * modification, are permitted provided that the following conditions
64e400768SDavid Christensen  * are met:
74e400768SDavid Christensen  *
84e400768SDavid Christensen  * 1. Redistributions of source code must retain the above copyright
94e400768SDavid Christensen  *    notice, this list of conditions and the following disclaimer.
104e400768SDavid Christensen  * 2. Redistributions in binary form must reproduce the above copyright
114e400768SDavid Christensen  *    notice, this list of conditions and the following disclaimer in the
124e400768SDavid Christensen  *    documentation and/or other materials provided with the distribution.
134e400768SDavid Christensen  *
144e400768SDavid Christensen  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
154e400768SDavid Christensen  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
164e400768SDavid Christensen  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
174e400768SDavid Christensen  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
184e400768SDavid Christensen  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
194e400768SDavid Christensen  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
204e400768SDavid Christensen  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
214e400768SDavid Christensen  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
224e400768SDavid Christensen  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
234e400768SDavid Christensen  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
244e400768SDavid Christensen  * THE POSSIBILITY OF SUCH DAMAGE.
254e400768SDavid Christensen  */
264e400768SDavid Christensen 
274e400768SDavid Christensen #include <sys/cdefs.h>
284e400768SDavid Christensen __FBSDID("$FreeBSD$");
294e400768SDavid Christensen 
304e400768SDavid Christensen #include "bxe.h"
314e400768SDavid Christensen #include "bxe_stats.h"
324e400768SDavid Christensen 
334e400768SDavid Christensen #ifdef __i386__
344e400768SDavid Christensen #define BITS_PER_LONG 32
354e400768SDavid Christensen #else
364e400768SDavid Christensen #define BITS_PER_LONG 64
374e400768SDavid Christensen #endif
384e400768SDavid Christensen 
394e400768SDavid Christensen static inline long
404e400768SDavid Christensen bxe_hilo(uint32_t *hiref)
414e400768SDavid Christensen {
424e400768SDavid Christensen     uint32_t lo = *(hiref + 1);
434e400768SDavid Christensen #if (BITS_PER_LONG == 64)
444e400768SDavid Christensen     uint32_t hi = *hiref;
454e400768SDavid Christensen     return (HILO_U64(hi, lo));
464e400768SDavid Christensen #else
474e400768SDavid Christensen     return (lo);
484e400768SDavid Christensen #endif
494e400768SDavid Christensen }
504e400768SDavid Christensen 
514e400768SDavid Christensen static inline uint16_t
524e400768SDavid Christensen bxe_get_port_stats_dma_len(struct bxe_softc *sc)
534e400768SDavid Christensen {
544e400768SDavid Christensen     uint16_t res = 0;
554e400768SDavid Christensen     uint32_t size;
564e400768SDavid Christensen 
574e400768SDavid Christensen     /* 'newest' convention - shmem2 contains the size of the port stats */
584e400768SDavid Christensen     if (SHMEM2_HAS(sc, sizeof_port_stats)) {
594e400768SDavid Christensen         size = SHMEM2_RD(sc, sizeof_port_stats);
604e400768SDavid Christensen         if (size) {
614e400768SDavid Christensen             res = size;
624e400768SDavid Christensen         }
634e400768SDavid Christensen 
644e400768SDavid Christensen         /* prevent newer BC from causing buffer overflow */
654e400768SDavid Christensen         if (res > sizeof(struct host_port_stats)) {
664e400768SDavid Christensen             res = sizeof(struct host_port_stats);
674e400768SDavid Christensen         }
684e400768SDavid Christensen     }
694e400768SDavid Christensen 
704e400768SDavid Christensen     /*
714e400768SDavid Christensen      * Older convention - all BCs support the port stats fields up until
724e400768SDavid Christensen      * the 'not_used' field
734e400768SDavid Christensen      */
744e400768SDavid Christensen     if (!res) {
754e400768SDavid Christensen         res = (offsetof(struct host_port_stats, not_used) + 4);
764e400768SDavid Christensen 
774e400768SDavid Christensen         /* if PFC stats are supported by the MFW, DMA them as well */
784e400768SDavid Christensen         if (sc->devinfo.bc_ver >= REQ_BC_VER_4_PFC_STATS_SUPPORTED) {
794e400768SDavid Christensen             res += (offsetof(struct host_port_stats, pfc_frames_rx_lo) -
804e400768SDavid Christensen                     offsetof(struct host_port_stats, pfc_frames_tx_hi) + 4);
814e400768SDavid Christensen         }
824e400768SDavid Christensen     }
834e400768SDavid Christensen 
844e400768SDavid Christensen     res >>= 2;
854e400768SDavid Christensen 
864e400768SDavid Christensen     DBASSERT(sc, !(res > 2 * DMAE_LEN32_RD_MAX), ("big stats dmae length\n"));
874e400768SDavid Christensen     return (res);
884e400768SDavid Christensen }
894e400768SDavid Christensen 
904e400768SDavid Christensen /*
914e400768SDavid Christensen  * Init service functions
924e400768SDavid Christensen  */
934e400768SDavid Christensen 
944e400768SDavid Christensen static void
954e400768SDavid Christensen bxe_dp_stats(struct bxe_softc *sc)
964e400768SDavid Christensen {
974e400768SDavid Christensen     int i;
984e400768SDavid Christensen 
994e400768SDavid Christensen     BLOGD(sc, DBG_STATS,
1004e400768SDavid Christensen           "dumping stats:\n"
1014e400768SDavid Christensen           "  fw_stats_req\n"
1024e400768SDavid Christensen           "    hdr\n"
1034e400768SDavid Christensen           "      cmd_num %d\n"
1044e400768SDavid Christensen           "      reserved0 %d\n"
1054e400768SDavid Christensen           "      drv_stats_counter %d\n"
1064e400768SDavid Christensen           "      reserved1 %d\n"
1074e400768SDavid Christensen           "      stats_counters_addrs %x %x\n",
1084e400768SDavid Christensen           sc->fw_stats_req->hdr.cmd_num,
1094e400768SDavid Christensen           sc->fw_stats_req->hdr.reserved0,
1104e400768SDavid Christensen           sc->fw_stats_req->hdr.drv_stats_counter,
1114e400768SDavid Christensen           sc->fw_stats_req->hdr.reserved1,
1124e400768SDavid Christensen           sc->fw_stats_req->hdr.stats_counters_addrs.hi,
1134e400768SDavid Christensen           sc->fw_stats_req->hdr.stats_counters_addrs.lo);
1144e400768SDavid Christensen 
1154e400768SDavid Christensen     for (i = 0; i < sc->fw_stats_req->hdr.cmd_num; i++) {
1164e400768SDavid Christensen         BLOGD(sc, DBG_STATS,
1174e400768SDavid Christensen               "query[%d]\n"
1184e400768SDavid Christensen               "  kind %d\n"
1194e400768SDavid Christensen               "  index %d\n"
1204e400768SDavid Christensen               "  funcID %d\n"
1214e400768SDavid Christensen               "  reserved %d\n"
1224e400768SDavid Christensen               "  address %x %x\n",
1234e400768SDavid Christensen               i,
1244e400768SDavid Christensen               sc->fw_stats_req->query[i].kind,
1254e400768SDavid Christensen               sc->fw_stats_req->query[i].index,
1264e400768SDavid Christensen               sc->fw_stats_req->query[i].funcID,
1274e400768SDavid Christensen               sc->fw_stats_req->query[i].reserved,
1284e400768SDavid Christensen               sc->fw_stats_req->query[i].address.hi,
1294e400768SDavid Christensen               sc->fw_stats_req->query[i].address.lo);
1304e400768SDavid Christensen     }
1314e400768SDavid Christensen }
1324e400768SDavid Christensen 
1334e400768SDavid Christensen /*
1344e400768SDavid Christensen  * Post the next statistics ramrod. Protect it with the lock in
1354e400768SDavid Christensen  * order to ensure the strict order between statistics ramrods
1364e400768SDavid Christensen  * (each ramrod has a sequence number passed in a
1374e400768SDavid Christensen  * sc->fw_stats_req->hdr.drv_stats_counter and ramrods must be
1384e400768SDavid Christensen  * sent in order).
1394e400768SDavid Christensen  */
1404e400768SDavid Christensen static void
1414e400768SDavid Christensen bxe_storm_stats_post(struct bxe_softc *sc)
1424e400768SDavid Christensen {
1434e400768SDavid Christensen     int rc;
1444e400768SDavid Christensen 
1454e400768SDavid Christensen     if (!sc->stats_pending) {
1464e400768SDavid Christensen         BXE_STATS_LOCK(sc);
1474e400768SDavid Christensen 
1484e400768SDavid Christensen         if (sc->stats_pending) {
1494e400768SDavid Christensen             BXE_STATS_UNLOCK(sc);
1504e400768SDavid Christensen             return;
1514e400768SDavid Christensen         }
1524e400768SDavid Christensen 
1534e400768SDavid Christensen         sc->fw_stats_req->hdr.drv_stats_counter =
1544e400768SDavid Christensen             htole16(sc->stats_counter++);
1554e400768SDavid Christensen 
1564e400768SDavid Christensen         BLOGD(sc, DBG_STATS,
1574e400768SDavid Christensen               "sending statistics ramrod %d\n",
1584e400768SDavid Christensen               le16toh(sc->fw_stats_req->hdr.drv_stats_counter));
1594e400768SDavid Christensen 
1604e400768SDavid Christensen         /* adjust the ramrod to include VF queues statistics */
1614e400768SDavid Christensen         // XXX bxe_iov_adjust_stats_req(sc);
1624e400768SDavid Christensen 
1634e400768SDavid Christensen         bxe_dp_stats(sc);
1644e400768SDavid Christensen 
1654e400768SDavid Christensen         /* send FW stats ramrod */
1664e400768SDavid Christensen         rc = bxe_sp_post(sc, RAMROD_CMD_ID_COMMON_STAT_QUERY, 0,
1674e400768SDavid Christensen                          U64_HI(sc->fw_stats_req_mapping),
1684e400768SDavid Christensen                          U64_LO(sc->fw_stats_req_mapping),
1694e400768SDavid Christensen                          NONE_CONNECTION_TYPE);
1704e400768SDavid Christensen         if (rc == 0) {
1714e400768SDavid Christensen             sc->stats_pending = 1;
1724e400768SDavid Christensen         }
1734e400768SDavid Christensen 
1744e400768SDavid Christensen         BXE_STATS_UNLOCK(sc);
1754e400768SDavid Christensen     }
1764e400768SDavid Christensen }
1774e400768SDavid Christensen 
1784e400768SDavid Christensen static void
1794e400768SDavid Christensen bxe_hw_stats_post(struct bxe_softc *sc)
1804e400768SDavid Christensen {
1814e400768SDavid Christensen     struct dmae_command *dmae = &sc->stats_dmae;
1824e400768SDavid Christensen     uint32_t *stats_comp = BXE_SP(sc, stats_comp);
1834e400768SDavid Christensen     int loader_idx;
1844e400768SDavid Christensen     uint32_t opcode;
1854e400768SDavid Christensen 
1864e400768SDavid Christensen     *stats_comp = DMAE_COMP_VAL;
1874e400768SDavid Christensen     if (CHIP_REV_IS_SLOW(sc)) {
1884e400768SDavid Christensen         return;
1894e400768SDavid Christensen     }
1904e400768SDavid Christensen 
1914e400768SDavid Christensen     /* Update MCP's statistics if possible */
1924e400768SDavid Christensen     if (sc->func_stx) {
1934e400768SDavid Christensen         memcpy(BXE_SP(sc, func_stats), &sc->func_stats,
1944e400768SDavid Christensen                sizeof(sc->func_stats));
1954e400768SDavid Christensen     }
1964e400768SDavid Christensen 
1974e400768SDavid Christensen     /* loader */
1984e400768SDavid Christensen     if (sc->executer_idx) {
1994e400768SDavid Christensen         loader_idx = PMF_DMAE_C(sc);
2004e400768SDavid Christensen         opcode =  bxe_dmae_opcode(sc, DMAE_SRC_PCI, DMAE_DST_GRC,
2014e400768SDavid Christensen                                   TRUE, DMAE_COMP_GRC);
2024e400768SDavid Christensen         opcode = bxe_dmae_opcode_clr_src_reset(opcode);
2034e400768SDavid Christensen 
2044e400768SDavid Christensen         memset(dmae, 0, sizeof(struct dmae_command));
2054e400768SDavid Christensen         dmae->opcode = opcode;
2064e400768SDavid Christensen         dmae->src_addr_lo = U64_LO(BXE_SP_MAPPING(sc, dmae[0]));
2074e400768SDavid Christensen         dmae->src_addr_hi = U64_HI(BXE_SP_MAPPING(sc, dmae[0]));
2084e400768SDavid Christensen         dmae->dst_addr_lo = ((DMAE_REG_CMD_MEM +
2094e400768SDavid Christensen                               sizeof(struct dmae_command) *
2104e400768SDavid Christensen                               (loader_idx + 1)) >> 2);
2114e400768SDavid Christensen         dmae->dst_addr_hi = 0;
2124e400768SDavid Christensen         dmae->len = sizeof(struct dmae_command) >> 2;
2134e400768SDavid Christensen         if (CHIP_IS_E1(sc)) {
2144e400768SDavid Christensen             dmae->len--;
2154e400768SDavid Christensen         }
2164e400768SDavid Christensen         dmae->comp_addr_lo = (dmae_reg_go_c[loader_idx + 1] >> 2);
2174e400768SDavid Christensen         dmae->comp_addr_hi = 0;
2184e400768SDavid Christensen         dmae->comp_val = 1;
2194e400768SDavid Christensen 
2204e400768SDavid Christensen         *stats_comp = 0;
2214e400768SDavid Christensen         bxe_post_dmae(sc, dmae, loader_idx);
2224e400768SDavid Christensen     } else if (sc->func_stx) {
2234e400768SDavid Christensen         *stats_comp = 0;
2244e400768SDavid Christensen         bxe_post_dmae(sc, dmae, INIT_DMAE_C(sc));
2254e400768SDavid Christensen     }
2264e400768SDavid Christensen }
2274e400768SDavid Christensen 
2284e400768SDavid Christensen static int
2294e400768SDavid Christensen bxe_stats_comp(struct bxe_softc *sc)
2304e400768SDavid Christensen {
2314e400768SDavid Christensen     uint32_t *stats_comp = BXE_SP(sc, stats_comp);
2324e400768SDavid Christensen     int cnt = 10;
2334e400768SDavid Christensen 
2344e400768SDavid Christensen     while (*stats_comp != DMAE_COMP_VAL) {
2354e400768SDavid Christensen         if (!cnt) {
2364e400768SDavid Christensen             BLOGE(sc, "Timeout waiting for stats finished\n");
2374e400768SDavid Christensen             break;
2384e400768SDavid Christensen         }
2394e400768SDavid Christensen 
2404e400768SDavid Christensen         cnt--;
2414e400768SDavid Christensen         DELAY(1000);
2424e400768SDavid Christensen     }
2434e400768SDavid Christensen 
2444e400768SDavid Christensen     return (1);
2454e400768SDavid Christensen }
2464e400768SDavid Christensen 
2474e400768SDavid Christensen /*
2484e400768SDavid Christensen  * Statistics service functions
2494e400768SDavid Christensen  */
2504e400768SDavid Christensen 
2514e400768SDavid Christensen static void
2524e400768SDavid Christensen bxe_stats_pmf_update(struct bxe_softc *sc)
2534e400768SDavid Christensen {
2544e400768SDavid Christensen     struct dmae_command *dmae;
2554e400768SDavid Christensen     uint32_t opcode;
2564e400768SDavid Christensen     int loader_idx = PMF_DMAE_C(sc);
2574e400768SDavid Christensen     uint32_t *stats_comp = BXE_SP(sc, stats_comp);
2584e400768SDavid Christensen 
2592bd40797SEric Davis     if (sc->devinfo.bc_ver <= 0x06001400) {
2602bd40797SEric Davis         /*
2612bd40797SEric Davis          * Bootcode v6.0.21 fixed a GRC timeout that occurs when accessing
2622bd40797SEric Davis          * BRB registers while the BRB block is in reset. The DMA transfer
2632bd40797SEric Davis          * below triggers this issue resulting in the DMAE to stop
2642bd40797SEric Davis          * functioning. Skip this initial stats transfer for old bootcode
2652bd40797SEric Davis          * versions <= 6.0.20.
2662bd40797SEric Davis          */
2672bd40797SEric Davis         return;
2682bd40797SEric Davis     }
2692bd40797SEric Davis 
2704e400768SDavid Christensen     /* sanity */
2714e400768SDavid Christensen     if (!sc->port.pmf || !sc->port.port_stx) {
2724e400768SDavid Christensen         BLOGE(sc, "BUG!\n");
2734e400768SDavid Christensen         return;
2744e400768SDavid Christensen     }
2754e400768SDavid Christensen 
2764e400768SDavid Christensen     sc->executer_idx = 0;
2774e400768SDavid Christensen 
2784e400768SDavid Christensen     opcode = bxe_dmae_opcode(sc, DMAE_SRC_GRC, DMAE_DST_PCI, FALSE, 0);
2794e400768SDavid Christensen 
2804e400768SDavid Christensen     dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
2814e400768SDavid Christensen     dmae->opcode = bxe_dmae_opcode_add_comp(opcode, DMAE_COMP_GRC);
2824e400768SDavid Christensen     dmae->src_addr_lo = (sc->port.port_stx >> 2);
2834e400768SDavid Christensen     dmae->src_addr_hi = 0;
2844e400768SDavid Christensen     dmae->dst_addr_lo = U64_LO(BXE_SP_MAPPING(sc, port_stats));
2854e400768SDavid Christensen     dmae->dst_addr_hi = U64_HI(BXE_SP_MAPPING(sc, port_stats));
2864e400768SDavid Christensen     dmae->len = DMAE_LEN32_RD_MAX;
2874e400768SDavid Christensen     dmae->comp_addr_lo = (dmae_reg_go_c[loader_idx] >> 2);
2884e400768SDavid Christensen     dmae->comp_addr_hi = 0;
2894e400768SDavid Christensen     dmae->comp_val = 1;
2904e400768SDavid Christensen 
2914e400768SDavid Christensen     dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
2924e400768SDavid Christensen     dmae->opcode = bxe_dmae_opcode_add_comp(opcode, DMAE_COMP_PCI);
2934e400768SDavid Christensen     dmae->src_addr_lo = ((sc->port.port_stx >> 2) + DMAE_LEN32_RD_MAX);
2944e400768SDavid Christensen     dmae->src_addr_hi = 0;
2954e400768SDavid Christensen     dmae->dst_addr_lo = U64_LO(BXE_SP_MAPPING(sc, port_stats) +
2964e400768SDavid Christensen                                DMAE_LEN32_RD_MAX * 4);
2974e400768SDavid Christensen     dmae->dst_addr_hi = U64_HI(BXE_SP_MAPPING(sc, port_stats) +
2984e400768SDavid Christensen                                DMAE_LEN32_RD_MAX * 4);
2994e400768SDavid Christensen     dmae->len = (bxe_get_port_stats_dma_len(sc) - DMAE_LEN32_RD_MAX);
3004e400768SDavid Christensen 
3014e400768SDavid Christensen     dmae->comp_addr_lo = U64_LO(BXE_SP_MAPPING(sc, stats_comp));
3024e400768SDavid Christensen     dmae->comp_addr_hi = U64_HI(BXE_SP_MAPPING(sc, stats_comp));
3034e400768SDavid Christensen     dmae->comp_val = DMAE_COMP_VAL;
3044e400768SDavid Christensen 
3054e400768SDavid Christensen     *stats_comp = 0;
3064e400768SDavid Christensen     bxe_hw_stats_post(sc);
3074e400768SDavid Christensen     bxe_stats_comp(sc);
3084e400768SDavid Christensen }
3094e400768SDavid Christensen 
3104e400768SDavid Christensen static void
3114e400768SDavid Christensen bxe_port_stats_init(struct bxe_softc *sc)
3124e400768SDavid Christensen {
3134e400768SDavid Christensen     struct dmae_command *dmae;
3144e400768SDavid Christensen     int port = SC_PORT(sc);
3154e400768SDavid Christensen     uint32_t opcode;
3164e400768SDavid Christensen     int loader_idx = PMF_DMAE_C(sc);
3174e400768SDavid Christensen     uint32_t mac_addr;
3184e400768SDavid Christensen     uint32_t *stats_comp = BXE_SP(sc, stats_comp);
3194e400768SDavid Christensen 
3204e400768SDavid Christensen     /* sanity */
3214e400768SDavid Christensen     if (!sc->link_vars.link_up || !sc->port.pmf) {
3224e400768SDavid Christensen         BLOGE(sc, "BUG!\n");
3234e400768SDavid Christensen         return;
3244e400768SDavid Christensen     }
3254e400768SDavid Christensen 
3264e400768SDavid Christensen     sc->executer_idx = 0;
3274e400768SDavid Christensen 
3284e400768SDavid Christensen     /* MCP */
3294e400768SDavid Christensen     opcode = bxe_dmae_opcode(sc, DMAE_SRC_PCI, DMAE_DST_GRC,
3304e400768SDavid Christensen                              TRUE, DMAE_COMP_GRC);
3314e400768SDavid Christensen 
3324e400768SDavid Christensen     if (sc->port.port_stx) {
3334e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
3344e400768SDavid Christensen         dmae->opcode = opcode;
3354e400768SDavid Christensen         dmae->src_addr_lo = U64_LO(BXE_SP_MAPPING(sc, port_stats));
3364e400768SDavid Christensen         dmae->src_addr_hi = U64_HI(BXE_SP_MAPPING(sc, port_stats));
3374e400768SDavid Christensen         dmae->dst_addr_lo = sc->port.port_stx >> 2;
3384e400768SDavid Christensen         dmae->dst_addr_hi = 0;
3394e400768SDavid Christensen         dmae->len = bxe_get_port_stats_dma_len(sc);
3404e400768SDavid Christensen         dmae->comp_addr_lo = dmae_reg_go_c[loader_idx] >> 2;
3414e400768SDavid Christensen         dmae->comp_addr_hi = 0;
3424e400768SDavid Christensen         dmae->comp_val = 1;
3434e400768SDavid Christensen     }
3444e400768SDavid Christensen 
3454e400768SDavid Christensen     if (sc->func_stx) {
3464e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
3474e400768SDavid Christensen         dmae->opcode = opcode;
3484e400768SDavid Christensen         dmae->src_addr_lo = U64_LO(BXE_SP_MAPPING(sc, func_stats));
3494e400768SDavid Christensen         dmae->src_addr_hi = U64_HI(BXE_SP_MAPPING(sc, func_stats));
3504e400768SDavid Christensen         dmae->dst_addr_lo = (sc->func_stx >> 2);
3514e400768SDavid Christensen         dmae->dst_addr_hi = 0;
3524e400768SDavid Christensen         dmae->len = (sizeof(struct host_func_stats) >> 2);
3534e400768SDavid Christensen         dmae->comp_addr_lo = (dmae_reg_go_c[loader_idx] >> 2);
3544e400768SDavid Christensen         dmae->comp_addr_hi = 0;
3554e400768SDavid Christensen         dmae->comp_val = 1;
3564e400768SDavid Christensen     }
3574e400768SDavid Christensen 
3584e400768SDavid Christensen     /* MAC */
3594e400768SDavid Christensen     opcode = bxe_dmae_opcode(sc, DMAE_SRC_GRC, DMAE_DST_PCI,
3604e400768SDavid Christensen                              TRUE, DMAE_COMP_GRC);
3614e400768SDavid Christensen 
3624e400768SDavid Christensen     /* EMAC is special */
3634e400768SDavid Christensen     if (sc->link_vars.mac_type == ELINK_MAC_TYPE_EMAC) {
3644e400768SDavid Christensen         mac_addr = (port ? GRCBASE_EMAC1 : GRCBASE_EMAC0);
3654e400768SDavid Christensen 
3664e400768SDavid Christensen         /* EMAC_REG_EMAC_RX_STAT_AC (EMAC_REG_EMAC_RX_STAT_AC_COUNT)*/
3674e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
3684e400768SDavid Christensen         dmae->opcode = opcode;
3694e400768SDavid Christensen         dmae->src_addr_lo = (mac_addr + EMAC_REG_EMAC_RX_STAT_AC) >> 2;
3704e400768SDavid Christensen         dmae->src_addr_hi = 0;
3714e400768SDavid Christensen         dmae->dst_addr_lo = U64_LO(BXE_SP_MAPPING(sc, mac_stats));
3724e400768SDavid Christensen         dmae->dst_addr_hi = U64_HI(BXE_SP_MAPPING(sc, mac_stats));
3734e400768SDavid Christensen         dmae->len = EMAC_REG_EMAC_RX_STAT_AC_COUNT;
3744e400768SDavid Christensen         dmae->comp_addr_lo = (dmae_reg_go_c[loader_idx] >> 2);
3754e400768SDavid Christensen         dmae->comp_addr_hi = 0;
3764e400768SDavid Christensen         dmae->comp_val = 1;
3774e400768SDavid Christensen 
3784e400768SDavid Christensen         /* EMAC_REG_EMAC_RX_STAT_AC_28 */
3794e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
3804e400768SDavid Christensen         dmae->opcode = opcode;
3814e400768SDavid Christensen         dmae->src_addr_lo = ((mac_addr + EMAC_REG_EMAC_RX_STAT_AC_28) >> 2);
3824e400768SDavid Christensen         dmae->src_addr_hi = 0;
3834e400768SDavid Christensen         dmae->dst_addr_lo = U64_LO(BXE_SP_MAPPING(sc, mac_stats) +
3844e400768SDavid Christensen                                    offsetof(struct emac_stats,
3854e400768SDavid Christensen                                             rx_stat_falsecarriererrors));
3864e400768SDavid Christensen         dmae->dst_addr_hi = U64_HI(BXE_SP_MAPPING(sc, mac_stats) +
3874e400768SDavid Christensen                                    offsetof(struct emac_stats,
3884e400768SDavid Christensen                                             rx_stat_falsecarriererrors));
3894e400768SDavid Christensen         dmae->len = 1;
3904e400768SDavid Christensen         dmae->comp_addr_lo = (dmae_reg_go_c[loader_idx] >> 2);
3914e400768SDavid Christensen         dmae->comp_addr_hi = 0;
3924e400768SDavid Christensen         dmae->comp_val = 1;
3934e400768SDavid Christensen 
3944e400768SDavid Christensen         /* EMAC_REG_EMAC_TX_STAT_AC (EMAC_REG_EMAC_TX_STAT_AC_COUNT)*/
3954e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
3964e400768SDavid Christensen         dmae->opcode = opcode;
3974e400768SDavid Christensen         dmae->src_addr_lo = ((mac_addr + EMAC_REG_EMAC_TX_STAT_AC) >> 2);
3984e400768SDavid Christensen         dmae->src_addr_hi = 0;
3994e400768SDavid Christensen         dmae->dst_addr_lo = U64_LO(BXE_SP_MAPPING(sc, mac_stats) +
4004e400768SDavid Christensen                                    offsetof(struct emac_stats,
4014e400768SDavid Christensen                                             tx_stat_ifhcoutoctets));
4024e400768SDavid Christensen         dmae->dst_addr_hi = U64_HI(BXE_SP_MAPPING(sc, mac_stats) +
4034e400768SDavid Christensen                                    offsetof(struct emac_stats,
4044e400768SDavid Christensen                                             tx_stat_ifhcoutoctets));
4054e400768SDavid Christensen         dmae->len = EMAC_REG_EMAC_TX_STAT_AC_COUNT;
4064e400768SDavid Christensen         dmae->comp_addr_lo = (dmae_reg_go_c[loader_idx] >> 2);
4074e400768SDavid Christensen         dmae->comp_addr_hi = 0;
4084e400768SDavid Christensen         dmae->comp_val = 1;
4094e400768SDavid Christensen     } else {
4104e400768SDavid Christensen         uint32_t tx_src_addr_lo, rx_src_addr_lo;
4114e400768SDavid Christensen         uint16_t rx_len, tx_len;
4124e400768SDavid Christensen 
4134e400768SDavid Christensen         /* configure the params according to MAC type */
4144e400768SDavid Christensen         switch (sc->link_vars.mac_type) {
4154e400768SDavid Christensen         case ELINK_MAC_TYPE_BMAC:
4164e400768SDavid Christensen             mac_addr = (port) ? NIG_REG_INGRESS_BMAC1_MEM :
4174e400768SDavid Christensen                                 NIG_REG_INGRESS_BMAC0_MEM;
4184e400768SDavid Christensen 
4194e400768SDavid Christensen             /* BIGMAC_REGISTER_TX_STAT_GTPKT ..
4204e400768SDavid Christensen                BIGMAC_REGISTER_TX_STAT_GTBYT */
4214e400768SDavid Christensen             if (CHIP_IS_E1x(sc)) {
4224e400768SDavid Christensen                 tx_src_addr_lo =
4234e400768SDavid Christensen                     ((mac_addr + BIGMAC_REGISTER_TX_STAT_GTPKT) >> 2);
4244e400768SDavid Christensen                 tx_len = ((8 + BIGMAC_REGISTER_TX_STAT_GTBYT -
4254e400768SDavid Christensen                            BIGMAC_REGISTER_TX_STAT_GTPKT) >> 2);
4264e400768SDavid Christensen                 rx_src_addr_lo =
4274e400768SDavid Christensen                     ((mac_addr + BIGMAC_REGISTER_RX_STAT_GR64) >> 2);
4284e400768SDavid Christensen                 rx_len = ((8 + BIGMAC_REGISTER_RX_STAT_GRIPJ -
4294e400768SDavid Christensen                            BIGMAC_REGISTER_RX_STAT_GR64) >> 2);
4304e400768SDavid Christensen             } else {
4314e400768SDavid Christensen                 tx_src_addr_lo =
4324e400768SDavid Christensen                     ((mac_addr + BIGMAC2_REGISTER_TX_STAT_GTPOK) >> 2);
4334e400768SDavid Christensen                 tx_len = ((8 + BIGMAC2_REGISTER_TX_STAT_GTBYT -
4344e400768SDavid Christensen                            BIGMAC2_REGISTER_TX_STAT_GTPOK) >> 2);
4354e400768SDavid Christensen                 rx_src_addr_lo =
4364e400768SDavid Christensen                     ((mac_addr + BIGMAC2_REGISTER_RX_STAT_GR64) >> 2);
4374e400768SDavid Christensen                 rx_len = ((8 + BIGMAC2_REGISTER_RX_STAT_GRIPJ -
4384e400768SDavid Christensen                            BIGMAC2_REGISTER_RX_STAT_GR64) >> 2);
4394e400768SDavid Christensen             }
4404e400768SDavid Christensen 
4414e400768SDavid Christensen             break;
4424e400768SDavid Christensen 
4434e400768SDavid Christensen         case ELINK_MAC_TYPE_UMAC: /* handled by MSTAT */
4444e400768SDavid Christensen         case ELINK_MAC_TYPE_XMAC: /* handled by MSTAT */
4454e400768SDavid Christensen         default:
4464e400768SDavid Christensen             mac_addr = (port) ? GRCBASE_MSTAT1 : GRCBASE_MSTAT0;
4474e400768SDavid Christensen             tx_src_addr_lo = ((mac_addr + MSTAT_REG_TX_STAT_GTXPOK_LO) >> 2);
4484e400768SDavid Christensen             rx_src_addr_lo = ((mac_addr + MSTAT_REG_RX_STAT_GR64_LO) >> 2);
4494e400768SDavid Christensen             tx_len =
4504e400768SDavid Christensen                 (sizeof(sc->sp->mac_stats.mstat_stats.stats_tx) >> 2);
4514e400768SDavid Christensen             rx_len =
4524e400768SDavid Christensen                 (sizeof(sc->sp->mac_stats.mstat_stats.stats_rx) >> 2);
4534e400768SDavid Christensen             break;
4544e400768SDavid Christensen         }
4554e400768SDavid Christensen 
4564e400768SDavid Christensen         /* TX stats */
4574e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
4584e400768SDavid Christensen         dmae->opcode = opcode;
4594e400768SDavid Christensen         dmae->src_addr_lo = tx_src_addr_lo;
4604e400768SDavid Christensen         dmae->src_addr_hi = 0;
4614e400768SDavid Christensen         dmae->len = tx_len;
4624e400768SDavid Christensen         dmae->dst_addr_lo = U64_LO(BXE_SP_MAPPING(sc, mac_stats));
4634e400768SDavid Christensen         dmae->dst_addr_hi = U64_HI(BXE_SP_MAPPING(sc, mac_stats));
4644e400768SDavid Christensen         dmae->comp_addr_lo = dmae_reg_go_c[loader_idx] >> 2;
4654e400768SDavid Christensen         dmae->comp_addr_hi = 0;
4664e400768SDavid Christensen         dmae->comp_val = 1;
4674e400768SDavid Christensen 
4684e400768SDavid Christensen         /* RX stats */
4694e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
4704e400768SDavid Christensen         dmae->opcode = opcode;
4714e400768SDavid Christensen         dmae->src_addr_hi = 0;
4724e400768SDavid Christensen         dmae->src_addr_lo = rx_src_addr_lo;
4734e400768SDavid Christensen         dmae->dst_addr_lo =
4744e400768SDavid Christensen             U64_LO(BXE_SP_MAPPING(sc, mac_stats) + (tx_len << 2));
4754e400768SDavid Christensen         dmae->dst_addr_hi =
4764e400768SDavid Christensen             U64_HI(BXE_SP_MAPPING(sc, mac_stats) + (tx_len << 2));
4774e400768SDavid Christensen         dmae->len = rx_len;
4784e400768SDavid Christensen         dmae->comp_addr_lo = dmae_reg_go_c[loader_idx] >> 2;
4794e400768SDavid Christensen         dmae->comp_addr_hi = 0;
4804e400768SDavid Christensen         dmae->comp_val = 1;
4814e400768SDavid Christensen     }
4824e400768SDavid Christensen 
4834e400768SDavid Christensen     /* NIG */
4844e400768SDavid Christensen     if (!CHIP_IS_E3(sc)) {
4854e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
4864e400768SDavid Christensen         dmae->opcode = opcode;
4874e400768SDavid Christensen         dmae->src_addr_lo =
4884e400768SDavid Christensen             (port ? NIG_REG_STAT1_EGRESS_MAC_PKT0 :
4894e400768SDavid Christensen                     NIG_REG_STAT0_EGRESS_MAC_PKT0) >> 2;
4904e400768SDavid Christensen         dmae->src_addr_hi = 0;
4914e400768SDavid Christensen         dmae->dst_addr_lo = U64_LO(BXE_SP_MAPPING(sc, nig_stats) +
4924e400768SDavid Christensen                                    offsetof(struct nig_stats,
4934e400768SDavid Christensen                                             egress_mac_pkt0_lo));
4944e400768SDavid Christensen         dmae->dst_addr_hi = U64_HI(BXE_SP_MAPPING(sc, nig_stats) +
4954e400768SDavid Christensen                                    offsetof(struct nig_stats,
4964e400768SDavid Christensen                                             egress_mac_pkt0_lo));
4974e400768SDavid Christensen         dmae->len = ((2 * sizeof(uint32_t)) >> 2);
4984e400768SDavid Christensen         dmae->comp_addr_lo = (dmae_reg_go_c[loader_idx] >> 2);
4994e400768SDavid Christensen         dmae->comp_addr_hi = 0;
5004e400768SDavid Christensen         dmae->comp_val = 1;
5014e400768SDavid Christensen 
5024e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
5034e400768SDavid Christensen         dmae->opcode = opcode;
5044e400768SDavid Christensen         dmae->src_addr_lo =
5054e400768SDavid Christensen             (port ? NIG_REG_STAT1_EGRESS_MAC_PKT1 :
5064e400768SDavid Christensen                     NIG_REG_STAT0_EGRESS_MAC_PKT1) >> 2;
5074e400768SDavid Christensen         dmae->src_addr_hi = 0;
5084e400768SDavid Christensen         dmae->dst_addr_lo = U64_LO(BXE_SP_MAPPING(sc, nig_stats) +
5094e400768SDavid Christensen                                    offsetof(struct nig_stats,
5104e400768SDavid Christensen                                             egress_mac_pkt1_lo));
5114e400768SDavid Christensen         dmae->dst_addr_hi = U64_HI(BXE_SP_MAPPING(sc, nig_stats) +
5124e400768SDavid Christensen                                    offsetof(struct nig_stats,
5134e400768SDavid Christensen                                             egress_mac_pkt1_lo));
5144e400768SDavid Christensen         dmae->len = ((2 * sizeof(uint32_t)) >> 2);
5154e400768SDavid Christensen         dmae->comp_addr_lo = (dmae_reg_go_c[loader_idx] >> 2);
5164e400768SDavid Christensen         dmae->comp_addr_hi = 0;
5174e400768SDavid Christensen         dmae->comp_val = 1;
5184e400768SDavid Christensen     }
5194e400768SDavid Christensen 
5204e400768SDavid Christensen     dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
5214e400768SDavid Christensen     dmae->opcode = bxe_dmae_opcode(sc, DMAE_SRC_GRC, DMAE_DST_PCI,
5224e400768SDavid Christensen                                    TRUE, DMAE_COMP_PCI);
5234e400768SDavid Christensen     dmae->src_addr_lo =
5244e400768SDavid Christensen         (port ? NIG_REG_STAT1_BRB_DISCARD :
5254e400768SDavid Christensen                 NIG_REG_STAT0_BRB_DISCARD) >> 2;
5264e400768SDavid Christensen     dmae->src_addr_hi = 0;
5274e400768SDavid Christensen     dmae->dst_addr_lo = U64_LO(BXE_SP_MAPPING(sc, nig_stats));
5284e400768SDavid Christensen     dmae->dst_addr_hi = U64_HI(BXE_SP_MAPPING(sc, nig_stats));
5294e400768SDavid Christensen     dmae->len = (sizeof(struct nig_stats) - 4*sizeof(uint32_t)) >> 2;
5304e400768SDavid Christensen 
5314e400768SDavid Christensen     dmae->comp_addr_lo = U64_LO(BXE_SP_MAPPING(sc, stats_comp));
5324e400768SDavid Christensen     dmae->comp_addr_hi = U64_HI(BXE_SP_MAPPING(sc, stats_comp));
5334e400768SDavid Christensen     dmae->comp_val = DMAE_COMP_VAL;
5344e400768SDavid Christensen 
5354e400768SDavid Christensen     *stats_comp = 0;
5364e400768SDavid Christensen }
5374e400768SDavid Christensen 
5384e400768SDavid Christensen static void
5394e400768SDavid Christensen bxe_func_stats_init(struct bxe_softc *sc)
5404e400768SDavid Christensen {
5414e400768SDavid Christensen     struct dmae_command *dmae = &sc->stats_dmae;
5424e400768SDavid Christensen     uint32_t *stats_comp = BXE_SP(sc, stats_comp);
5434e400768SDavid Christensen 
5444e400768SDavid Christensen     /* sanity */
5454e400768SDavid Christensen     if (!sc->func_stx) {
5464e400768SDavid Christensen         BLOGE(sc, "BUG!\n");
5474e400768SDavid Christensen         return;
5484e400768SDavid Christensen     }
5494e400768SDavid Christensen 
5504e400768SDavid Christensen     sc->executer_idx = 0;
5514e400768SDavid Christensen     memset(dmae, 0, sizeof(struct dmae_command));
5524e400768SDavid Christensen 
5534e400768SDavid Christensen     dmae->opcode = bxe_dmae_opcode(sc, DMAE_SRC_PCI, DMAE_DST_GRC,
5544e400768SDavid Christensen                                    TRUE, DMAE_COMP_PCI);
5554e400768SDavid Christensen     dmae->src_addr_lo = U64_LO(BXE_SP_MAPPING(sc, func_stats));
5564e400768SDavid Christensen     dmae->src_addr_hi = U64_HI(BXE_SP_MAPPING(sc, func_stats));
5574e400768SDavid Christensen     dmae->dst_addr_lo = (sc->func_stx >> 2);
5584e400768SDavid Christensen     dmae->dst_addr_hi = 0;
5594e400768SDavid Christensen     dmae->len = (sizeof(struct host_func_stats) >> 2);
5604e400768SDavid Christensen     dmae->comp_addr_lo = U64_LO(BXE_SP_MAPPING(sc, stats_comp));
5614e400768SDavid Christensen     dmae->comp_addr_hi = U64_HI(BXE_SP_MAPPING(sc, stats_comp));
5624e400768SDavid Christensen     dmae->comp_val = DMAE_COMP_VAL;
5634e400768SDavid Christensen 
5644e400768SDavid Christensen     *stats_comp = 0;
5654e400768SDavid Christensen }
5664e400768SDavid Christensen 
5674e400768SDavid Christensen static void
5684e400768SDavid Christensen bxe_stats_start(struct bxe_softc *sc)
5694e400768SDavid Christensen {
5704e400768SDavid Christensen     /*
5714e400768SDavid Christensen      * VFs travel through here as part of the statistics FSM, but no action
5724e400768SDavid Christensen      * is required
5734e400768SDavid Christensen      */
5744e400768SDavid Christensen     if (IS_VF(sc)) {
5754e400768SDavid Christensen         return;
5764e400768SDavid Christensen     }
5774e400768SDavid Christensen 
5784e400768SDavid Christensen     if (sc->port.pmf) {
5794e400768SDavid Christensen         bxe_port_stats_init(sc);
5804e400768SDavid Christensen     }
5814e400768SDavid Christensen 
5824e400768SDavid Christensen     else if (sc->func_stx) {
5834e400768SDavid Christensen         bxe_func_stats_init(sc);
5844e400768SDavid Christensen     }
5854e400768SDavid Christensen 
5864e400768SDavid Christensen     bxe_hw_stats_post(sc);
5874e400768SDavid Christensen     bxe_storm_stats_post(sc);
5884e400768SDavid Christensen }
5894e400768SDavid Christensen 
5904e400768SDavid Christensen static void
5914e400768SDavid Christensen bxe_stats_pmf_start(struct bxe_softc *sc)
5924e400768SDavid Christensen {
5934e400768SDavid Christensen     bxe_stats_comp(sc);
5944e400768SDavid Christensen     bxe_stats_pmf_update(sc);
5954e400768SDavid Christensen     bxe_stats_start(sc);
5964e400768SDavid Christensen }
5974e400768SDavid Christensen 
5984e400768SDavid Christensen static void
5994e400768SDavid Christensen bxe_stats_restart(struct bxe_softc *sc)
6004e400768SDavid Christensen {
6014e400768SDavid Christensen     /*
6024e400768SDavid Christensen      * VFs travel through here as part of the statistics FSM, but no action
6034e400768SDavid Christensen      * is required
6044e400768SDavid Christensen      */
6054e400768SDavid Christensen     if (IS_VF(sc)) {
6064e400768SDavid Christensen         return;
6074e400768SDavid Christensen     }
6084e400768SDavid Christensen 
6094e400768SDavid Christensen     bxe_stats_comp(sc);
6104e400768SDavid Christensen     bxe_stats_start(sc);
6114e400768SDavid Christensen }
6124e400768SDavid Christensen 
6134e400768SDavid Christensen static void
6144e400768SDavid Christensen bxe_bmac_stats_update(struct bxe_softc *sc)
6154e400768SDavid Christensen {
6164e400768SDavid Christensen     struct host_port_stats *pstats = BXE_SP(sc, port_stats);
6174e400768SDavid Christensen     struct bxe_eth_stats *estats = &sc->eth_stats;
6184e400768SDavid Christensen     struct {
6194e400768SDavid Christensen         uint32_t lo;
6204e400768SDavid Christensen         uint32_t hi;
6214e400768SDavid Christensen     } diff;
6224e400768SDavid Christensen 
6234e400768SDavid Christensen     if (CHIP_IS_E1x(sc)) {
6244e400768SDavid Christensen         struct bmac1_stats *new = BXE_SP(sc, mac_stats.bmac1_stats);
6254e400768SDavid Christensen 
6264e400768SDavid Christensen         /* the macros below will use "bmac1_stats" type */
6274e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grerb, rx_stat_ifhcinbadoctets);
6284e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grfcs, rx_stat_dot3statsfcserrors);
6294e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grund, rx_stat_etherstatsundersizepkts);
6304e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grovr, rx_stat_dot3statsframestoolong);
6314e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grfrg, rx_stat_etherstatsfragments);
6324e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grjbr, rx_stat_etherstatsjabbers);
6334e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grxcf, rx_stat_maccontrolframesreceived);
6344e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffstateentered);
6354e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grxpf, rx_stat_mac_xpf);
6364e400768SDavid Christensen 
6374e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gtxpf, tx_stat_outxoffsent);
6384e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gtxpf, tx_stat_flowcontroldone);
6394e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt64, tx_stat_etherstatspkts64octets);
6404e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt127,
6414e400768SDavid Christensen                       tx_stat_etherstatspkts65octetsto127octets);
6424e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt255,
6434e400768SDavid Christensen                       tx_stat_etherstatspkts128octetsto255octets);
6444e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt511,
6454e400768SDavid Christensen                       tx_stat_etherstatspkts256octetsto511octets);
6464e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt1023,
6474e400768SDavid Christensen                       tx_stat_etherstatspkts512octetsto1023octets);
6484e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt1518,
6494e400768SDavid Christensen                       tx_stat_etherstatspkts1024octetsto1522octets);
6504e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt2047, tx_stat_mac_2047);
6514e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt4095, tx_stat_mac_4095);
6524e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt9216, tx_stat_mac_9216);
6534e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt16383, tx_stat_mac_16383);
6544e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gterr,
6554e400768SDavid Christensen                       tx_stat_dot3statsinternalmactransmiterrors);
6564e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gtufl, tx_stat_mac_ufl);
6574e400768SDavid Christensen     } else {
6584e400768SDavid Christensen         struct bmac2_stats *new = BXE_SP(sc, mac_stats.bmac2_stats);
6594e400768SDavid Christensen         struct bxe_fw_port_stats_old *fwstats = &sc->fw_stats_old;
6604e400768SDavid Christensen 
6614e400768SDavid Christensen         /* the macros below will use "bmac2_stats" type */
6624e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grerb, rx_stat_ifhcinbadoctets);
6634e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grfcs, rx_stat_dot3statsfcserrors);
6644e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grund, rx_stat_etherstatsundersizepkts);
6654e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grovr, rx_stat_dot3statsframestoolong);
6664e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grfrg, rx_stat_etherstatsfragments);
6674e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grjbr, rx_stat_etherstatsjabbers);
6684e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grxcf, rx_stat_maccontrolframesreceived);
6694e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffstateentered);
6704e400768SDavid Christensen         UPDATE_STAT64(rx_stat_grxpf, rx_stat_mac_xpf);
6714e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gtxpf, tx_stat_outxoffsent);
6724e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gtxpf, tx_stat_flowcontroldone);
6734e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt64, tx_stat_etherstatspkts64octets);
6744e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt127,
6754e400768SDavid Christensen                       tx_stat_etherstatspkts65octetsto127octets);
6764e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt255,
6774e400768SDavid Christensen                       tx_stat_etherstatspkts128octetsto255octets);
6784e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt511,
6794e400768SDavid Christensen                       tx_stat_etherstatspkts256octetsto511octets);
6804e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt1023,
6814e400768SDavid Christensen                       tx_stat_etherstatspkts512octetsto1023octets);
6824e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt1518,
6834e400768SDavid Christensen                       tx_stat_etherstatspkts1024octetsto1522octets);
6844e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt2047, tx_stat_mac_2047);
6854e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt4095, tx_stat_mac_4095);
6864e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt9216, tx_stat_mac_9216);
6874e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gt16383, tx_stat_mac_16383);
6884e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gterr,
6894e400768SDavid Christensen                       tx_stat_dot3statsinternalmactransmiterrors);
6904e400768SDavid Christensen         UPDATE_STAT64(tx_stat_gtufl, tx_stat_mac_ufl);
6914e400768SDavid Christensen 
6924e400768SDavid Christensen         /* collect PFC stats */
6934e400768SDavid Christensen         pstats->pfc_frames_tx_hi = new->tx_stat_gtpp_hi;
6944e400768SDavid Christensen         pstats->pfc_frames_tx_lo = new->tx_stat_gtpp_lo;
6954e400768SDavid Christensen         ADD_64(pstats->pfc_frames_tx_hi, fwstats->pfc_frames_tx_hi,
6964e400768SDavid Christensen                pstats->pfc_frames_tx_lo, fwstats->pfc_frames_tx_lo);
6974e400768SDavid Christensen 
6984e400768SDavid Christensen         pstats->pfc_frames_rx_hi = new->rx_stat_grpp_hi;
6994e400768SDavid Christensen         pstats->pfc_frames_rx_lo = new->rx_stat_grpp_lo;
7004e400768SDavid Christensen         ADD_64(pstats->pfc_frames_rx_hi, fwstats->pfc_frames_rx_hi,
7014e400768SDavid Christensen                pstats->pfc_frames_rx_lo, fwstats->pfc_frames_rx_lo);
7024e400768SDavid Christensen     }
7034e400768SDavid Christensen 
7044e400768SDavid Christensen     estats->pause_frames_received_hi = pstats->mac_stx[1].rx_stat_mac_xpf_hi;
7054e400768SDavid Christensen     estats->pause_frames_received_lo = pstats->mac_stx[1].rx_stat_mac_xpf_lo;
7064e400768SDavid Christensen 
7074e400768SDavid Christensen     estats->pause_frames_sent_hi = pstats->mac_stx[1].tx_stat_outxoffsent_hi;
7084e400768SDavid Christensen     estats->pause_frames_sent_lo = pstats->mac_stx[1].tx_stat_outxoffsent_lo;
7094e400768SDavid Christensen 
7104e400768SDavid Christensen     estats->pfc_frames_received_hi = pstats->pfc_frames_rx_hi;
7114e400768SDavid Christensen     estats->pfc_frames_received_lo = pstats->pfc_frames_rx_lo;
7124e400768SDavid Christensen     estats->pfc_frames_sent_hi = pstats->pfc_frames_tx_hi;
7134e400768SDavid Christensen     estats->pfc_frames_sent_lo = pstats->pfc_frames_tx_lo;
7144e400768SDavid Christensen }
7154e400768SDavid Christensen 
7164e400768SDavid Christensen static void
7174e400768SDavid Christensen bxe_mstat_stats_update(struct bxe_softc *sc)
7184e400768SDavid Christensen {
7194e400768SDavid Christensen     struct host_port_stats *pstats = BXE_SP(sc, port_stats);
7204e400768SDavid Christensen     struct bxe_eth_stats *estats = &sc->eth_stats;
7214e400768SDavid Christensen     struct mstat_stats *new = BXE_SP(sc, mac_stats.mstat_stats);
7224e400768SDavid Christensen 
7234e400768SDavid Christensen     ADD_STAT64(stats_rx.rx_grerb, rx_stat_ifhcinbadoctets);
7244e400768SDavid Christensen     ADD_STAT64(stats_rx.rx_grfcs, rx_stat_dot3statsfcserrors);
7254e400768SDavid Christensen     ADD_STAT64(stats_rx.rx_grund, rx_stat_etherstatsundersizepkts);
7264e400768SDavid Christensen     ADD_STAT64(stats_rx.rx_grovr, rx_stat_dot3statsframestoolong);
7274e400768SDavid Christensen     ADD_STAT64(stats_rx.rx_grfrg, rx_stat_etherstatsfragments);
7284e400768SDavid Christensen     ADD_STAT64(stats_rx.rx_grxcf, rx_stat_maccontrolframesreceived);
7294e400768SDavid Christensen     ADD_STAT64(stats_rx.rx_grxpf, rx_stat_xoffstateentered);
7304e400768SDavid Christensen     ADD_STAT64(stats_rx.rx_grxpf, rx_stat_mac_xpf);
7314e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gtxpf, tx_stat_outxoffsent);
7324e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gtxpf, tx_stat_flowcontroldone);
7334e400768SDavid Christensen 
7344e400768SDavid Christensen     /* collect pfc stats */
7354e400768SDavid Christensen     ADD_64(pstats->pfc_frames_tx_hi, new->stats_tx.tx_gtxpp_hi,
7364e400768SDavid Christensen            pstats->pfc_frames_tx_lo, new->stats_tx.tx_gtxpp_lo);
7374e400768SDavid Christensen     ADD_64(pstats->pfc_frames_rx_hi, new->stats_rx.rx_grxpp_hi,
7384e400768SDavid Christensen            pstats->pfc_frames_rx_lo, new->stats_rx.rx_grxpp_lo);
7394e400768SDavid Christensen 
7404e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt64, tx_stat_etherstatspkts64octets);
7414e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt127, tx_stat_etherstatspkts65octetsto127octets);
7424e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt255, tx_stat_etherstatspkts128octetsto255octets);
7434e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt511, tx_stat_etherstatspkts256octetsto511octets);
7444e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt1023,
7454e400768SDavid Christensen                tx_stat_etherstatspkts512octetsto1023octets);
7464e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt1518,
7474e400768SDavid Christensen                tx_stat_etherstatspkts1024octetsto1522octets);
7484e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt2047, tx_stat_mac_2047);
7494e400768SDavid Christensen 
7504e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt4095, tx_stat_mac_4095);
7514e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt9216, tx_stat_mac_9216);
7524e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gt16383, tx_stat_mac_16383);
7534e400768SDavid Christensen 
7544e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gterr, tx_stat_dot3statsinternalmactransmiterrors);
7554e400768SDavid Christensen     ADD_STAT64(stats_tx.tx_gtufl, tx_stat_mac_ufl);
7564e400768SDavid Christensen 
7574e400768SDavid Christensen     estats->etherstatspkts1024octetsto1522octets_hi =
7584e400768SDavid Christensen         pstats->mac_stx[1].tx_stat_etherstatspkts1024octetsto1522octets_hi;
7594e400768SDavid Christensen     estats->etherstatspkts1024octetsto1522octets_lo =
7604e400768SDavid Christensen         pstats->mac_stx[1].tx_stat_etherstatspkts1024octetsto1522octets_lo;
7614e400768SDavid Christensen 
7624e400768SDavid Christensen     estats->etherstatspktsover1522octets_hi =
7634e400768SDavid Christensen         pstats->mac_stx[1].tx_stat_mac_2047_hi;
7644e400768SDavid Christensen     estats->etherstatspktsover1522octets_lo =
7654e400768SDavid Christensen         pstats->mac_stx[1].tx_stat_mac_2047_lo;
7664e400768SDavid Christensen 
7674e400768SDavid Christensen     ADD_64(estats->etherstatspktsover1522octets_hi,
7684e400768SDavid Christensen            pstats->mac_stx[1].tx_stat_mac_4095_hi,
7694e400768SDavid Christensen            estats->etherstatspktsover1522octets_lo,
7704e400768SDavid Christensen            pstats->mac_stx[1].tx_stat_mac_4095_lo);
7714e400768SDavid Christensen 
7724e400768SDavid Christensen     ADD_64(estats->etherstatspktsover1522octets_hi,
7734e400768SDavid Christensen            pstats->mac_stx[1].tx_stat_mac_9216_hi,
7744e400768SDavid Christensen            estats->etherstatspktsover1522octets_lo,
7754e400768SDavid Christensen            pstats->mac_stx[1].tx_stat_mac_9216_lo);
7764e400768SDavid Christensen 
7774e400768SDavid Christensen     ADD_64(estats->etherstatspktsover1522octets_hi,
7784e400768SDavid Christensen            pstats->mac_stx[1].tx_stat_mac_16383_hi,
7794e400768SDavid Christensen            estats->etherstatspktsover1522octets_lo,
7804e400768SDavid Christensen            pstats->mac_stx[1].tx_stat_mac_16383_lo);
7814e400768SDavid Christensen 
7824e400768SDavid Christensen     estats->pause_frames_received_hi = pstats->mac_stx[1].rx_stat_mac_xpf_hi;
7834e400768SDavid Christensen     estats->pause_frames_received_lo = pstats->mac_stx[1].rx_stat_mac_xpf_lo;
7844e400768SDavid Christensen 
7854e400768SDavid Christensen     estats->pause_frames_sent_hi = pstats->mac_stx[1].tx_stat_outxoffsent_hi;
7864e400768SDavid Christensen     estats->pause_frames_sent_lo = pstats->mac_stx[1].tx_stat_outxoffsent_lo;
7874e400768SDavid Christensen 
7884e400768SDavid Christensen     estats->pfc_frames_received_hi = pstats->pfc_frames_rx_hi;
7894e400768SDavid Christensen     estats->pfc_frames_received_lo = pstats->pfc_frames_rx_lo;
7904e400768SDavid Christensen     estats->pfc_frames_sent_hi = pstats->pfc_frames_tx_hi;
7914e400768SDavid Christensen     estats->pfc_frames_sent_lo = pstats->pfc_frames_tx_lo;
7924e400768SDavid Christensen }
7934e400768SDavid Christensen 
7944e400768SDavid Christensen static void
7954e400768SDavid Christensen bxe_emac_stats_update(struct bxe_softc *sc)
7964e400768SDavid Christensen {
7974e400768SDavid Christensen     struct emac_stats *new = BXE_SP(sc, mac_stats.emac_stats);
7984e400768SDavid Christensen     struct host_port_stats *pstats = BXE_SP(sc, port_stats);
7994e400768SDavid Christensen     struct bxe_eth_stats *estats = &sc->eth_stats;
8004e400768SDavid Christensen 
8014e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_ifhcinbadoctets);
8024e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_ifhcoutbadoctets);
8034e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_dot3statsfcserrors);
8044e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_dot3statsalignmenterrors);
8054e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_dot3statscarriersenseerrors);
8064e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_falsecarriererrors);
8074e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_etherstatsundersizepkts);
8084e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_dot3statsframestoolong);
8094e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_etherstatsfragments);
8104e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_etherstatsjabbers);
8114e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_maccontrolframesreceived);
8124e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_xoffstateentered);
8134e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_xonpauseframesreceived);
8144e400768SDavid Christensen     UPDATE_EXTEND_STAT(rx_stat_xoffpauseframesreceived);
8154e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_outxonsent);
8164e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_outxoffsent);
8174e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_flowcontroldone);
8184e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_etherstatscollisions);
8194e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_dot3statssinglecollisionframes);
8204e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_dot3statsmultiplecollisionframes);
8214e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_dot3statsdeferredtransmissions);
8224e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_dot3statsexcessivecollisions);
8234e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_dot3statslatecollisions);
8244e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_etherstatspkts64octets);
8254e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_etherstatspkts65octetsto127octets);
8264e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_etherstatspkts128octetsto255octets);
8274e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_etherstatspkts256octetsto511octets);
8284e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_etherstatspkts512octetsto1023octets);
8294e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_etherstatspkts1024octetsto1522octets);
8304e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_etherstatspktsover1522octets);
8314e400768SDavid Christensen     UPDATE_EXTEND_STAT(tx_stat_dot3statsinternalmactransmiterrors);
8324e400768SDavid Christensen 
8334e400768SDavid Christensen     estats->pause_frames_received_hi =
8344e400768SDavid Christensen         pstats->mac_stx[1].rx_stat_xonpauseframesreceived_hi;
8354e400768SDavid Christensen     estats->pause_frames_received_lo =
8364e400768SDavid Christensen         pstats->mac_stx[1].rx_stat_xonpauseframesreceived_lo;
8374e400768SDavid Christensen     ADD_64(estats->pause_frames_received_hi,
8384e400768SDavid Christensen            pstats->mac_stx[1].rx_stat_xoffpauseframesreceived_hi,
8394e400768SDavid Christensen            estats->pause_frames_received_lo,
8404e400768SDavid Christensen            pstats->mac_stx[1].rx_stat_xoffpauseframesreceived_lo);
8414e400768SDavid Christensen 
8424e400768SDavid Christensen     estats->pause_frames_sent_hi =
8434e400768SDavid Christensen         pstats->mac_stx[1].tx_stat_outxonsent_hi;
8444e400768SDavid Christensen     estats->pause_frames_sent_lo =
8454e400768SDavid Christensen         pstats->mac_stx[1].tx_stat_outxonsent_lo;
8464e400768SDavid Christensen     ADD_64(estats->pause_frames_sent_hi,
8474e400768SDavid Christensen            pstats->mac_stx[1].tx_stat_outxoffsent_hi,
8484e400768SDavid Christensen            estats->pause_frames_sent_lo,
8494e400768SDavid Christensen            pstats->mac_stx[1].tx_stat_outxoffsent_lo);
8504e400768SDavid Christensen }
8514e400768SDavid Christensen 
8524e400768SDavid Christensen static int
8534e400768SDavid Christensen bxe_hw_stats_update(struct bxe_softc *sc)
8544e400768SDavid Christensen {
8554e400768SDavid Christensen     struct nig_stats *new = BXE_SP(sc, nig_stats);
8564e400768SDavid Christensen     struct nig_stats *old = &(sc->port.old_nig_stats);
8574e400768SDavid Christensen     struct host_port_stats *pstats = BXE_SP(sc, port_stats);
8584e400768SDavid Christensen     struct bxe_eth_stats *estats = &sc->eth_stats;
8594e400768SDavid Christensen     uint32_t lpi_reg, nig_timer_max;
8604e400768SDavid Christensen     struct {
8614e400768SDavid Christensen         uint32_t lo;
8624e400768SDavid Christensen         uint32_t hi;
8634e400768SDavid Christensen     } diff;
8644e400768SDavid Christensen 
8654e400768SDavid Christensen     switch (sc->link_vars.mac_type) {
8664e400768SDavid Christensen     case ELINK_MAC_TYPE_BMAC:
8674e400768SDavid Christensen         bxe_bmac_stats_update(sc);
8684e400768SDavid Christensen         break;
8694e400768SDavid Christensen 
8704e400768SDavid Christensen     case ELINK_MAC_TYPE_EMAC:
8714e400768SDavid Christensen         bxe_emac_stats_update(sc);
8724e400768SDavid Christensen         break;
8734e400768SDavid Christensen 
8744e400768SDavid Christensen     case ELINK_MAC_TYPE_UMAC:
8754e400768SDavid Christensen     case ELINK_MAC_TYPE_XMAC:
8764e400768SDavid Christensen         bxe_mstat_stats_update(sc);
8774e400768SDavid Christensen         break;
8784e400768SDavid Christensen 
8794e400768SDavid Christensen     case ELINK_MAC_TYPE_NONE: /* unreached */
8804e400768SDavid Christensen         BLOGD(sc, DBG_STATS,
8814e400768SDavid Christensen               "stats updated by DMAE but no MAC active\n");
8824e400768SDavid Christensen         return (-1);
8834e400768SDavid Christensen 
8844e400768SDavid Christensen     default: /* unreached */
8854e400768SDavid Christensen         BLOGE(sc, "stats update failed, unknown MAC type\n");
8864e400768SDavid Christensen     }
8874e400768SDavid Christensen 
8884e400768SDavid Christensen     ADD_EXTEND_64(pstats->brb_drop_hi, pstats->brb_drop_lo,
8894e400768SDavid Christensen                   new->brb_discard - old->brb_discard);
8904e400768SDavid Christensen     ADD_EXTEND_64(estats->brb_truncate_hi, estats->brb_truncate_lo,
8914e400768SDavid Christensen                   new->brb_truncate - old->brb_truncate);
8924e400768SDavid Christensen 
8934e400768SDavid Christensen     if (!CHIP_IS_E3(sc)) {
8944e400768SDavid Christensen         UPDATE_STAT64_NIG(egress_mac_pkt0,
8954e400768SDavid Christensen                           etherstatspkts1024octetsto1522octets);
8964e400768SDavid Christensen         UPDATE_STAT64_NIG(egress_mac_pkt1,
8974e400768SDavid Christensen                           etherstatspktsover1522octets);
8984e400768SDavid Christensen     }
8994e400768SDavid Christensen 
9004e400768SDavid Christensen     memcpy(old, new, sizeof(struct nig_stats));
9014e400768SDavid Christensen 
9024e400768SDavid Christensen     memcpy(&(estats->rx_stat_ifhcinbadoctets_hi), &(pstats->mac_stx[1]),
9034e400768SDavid Christensen            sizeof(struct mac_stx));
9044e400768SDavid Christensen     estats->brb_drop_hi = pstats->brb_drop_hi;
9054e400768SDavid Christensen     estats->brb_drop_lo = pstats->brb_drop_lo;
9064e400768SDavid Christensen 
9074e400768SDavid Christensen     pstats->host_port_stats_counter++;
9084e400768SDavid Christensen 
9094e400768SDavid Christensen     if (CHIP_IS_E3(sc)) {
9104e400768SDavid Christensen         lpi_reg = (SC_PORT(sc)) ?
9114e400768SDavid Christensen                       MISC_REG_CPMU_LP_SM_ENT_CNT_P1 :
9124e400768SDavid Christensen                       MISC_REG_CPMU_LP_SM_ENT_CNT_P0;
9134e400768SDavid Christensen         estats->eee_tx_lpi += REG_RD(sc, lpi_reg);
9144e400768SDavid Christensen     }
9154e400768SDavid Christensen 
9164e400768SDavid Christensen     if (!BXE_NOMCP(sc)) {
9174e400768SDavid Christensen         nig_timer_max = SHMEM_RD(sc, port_mb[SC_PORT(sc)].stat_nig_timer);
9184e400768SDavid Christensen         if (nig_timer_max != estats->nig_timer_max) {
9194e400768SDavid Christensen             estats->nig_timer_max = nig_timer_max;
9204e400768SDavid Christensen             BLOGE(sc, "invalid NIG timer max (%u)\n",
9214e400768SDavid Christensen                   estats->nig_timer_max);
9224e400768SDavid Christensen         }
9234e400768SDavid Christensen     }
9244e400768SDavid Christensen 
9254e400768SDavid Christensen     return (0);
9264e400768SDavid Christensen }
9274e400768SDavid Christensen 
9284e400768SDavid Christensen static int
9294e400768SDavid Christensen bxe_storm_stats_validate_counters(struct bxe_softc *sc)
9304e400768SDavid Christensen {
9314e400768SDavid Christensen     struct stats_counter *counters = &sc->fw_stats_data->storm_counters;
9324e400768SDavid Christensen     uint16_t cur_stats_counter;
9334e400768SDavid Christensen 
9344e400768SDavid Christensen     /*
9354e400768SDavid Christensen      * Make sure we use the value of the counter
9364e400768SDavid Christensen      * used for sending the last stats ramrod.
9374e400768SDavid Christensen      */
9384e400768SDavid Christensen     BXE_STATS_LOCK(sc);
9394e400768SDavid Christensen     cur_stats_counter = (sc->stats_counter - 1);
9404e400768SDavid Christensen     BXE_STATS_UNLOCK(sc);
9414e400768SDavid Christensen 
9424e400768SDavid Christensen     /* are storm stats valid? */
9434e400768SDavid Christensen     if (le16toh(counters->xstats_counter) != cur_stats_counter) {
9444e400768SDavid Christensen         BLOGD(sc, DBG_STATS,
9454e400768SDavid Christensen               "stats not updated by xstorm, "
9464e400768SDavid Christensen               "counter 0x%x != stats_counter 0x%x\n",
9474e400768SDavid Christensen               le16toh(counters->xstats_counter), sc->stats_counter);
9484e400768SDavid Christensen         return (-EAGAIN);
9494e400768SDavid Christensen     }
9504e400768SDavid Christensen 
9514e400768SDavid Christensen     if (le16toh(counters->ustats_counter) != cur_stats_counter) {
9524e400768SDavid Christensen         BLOGD(sc, DBG_STATS,
9534e400768SDavid Christensen               "stats not updated by ustorm, "
9544e400768SDavid Christensen               "counter 0x%x != stats_counter 0x%x\n",
9554e400768SDavid Christensen               le16toh(counters->ustats_counter), sc->stats_counter);
9564e400768SDavid Christensen         return (-EAGAIN);
9574e400768SDavid Christensen     }
9584e400768SDavid Christensen 
9594e400768SDavid Christensen     if (le16toh(counters->cstats_counter) != cur_stats_counter) {
9604e400768SDavid Christensen         BLOGD(sc, DBG_STATS,
9614e400768SDavid Christensen               "stats not updated by cstorm, "
9624e400768SDavid Christensen               "counter 0x%x != stats_counter 0x%x\n",
9634e400768SDavid Christensen               le16toh(counters->cstats_counter), sc->stats_counter);
9644e400768SDavid Christensen         return (-EAGAIN);
9654e400768SDavid Christensen     }
9664e400768SDavid Christensen 
9674e400768SDavid Christensen     if (le16toh(counters->tstats_counter) != cur_stats_counter) {
9684e400768SDavid Christensen         BLOGD(sc, DBG_STATS,
9694e400768SDavid Christensen               "stats not updated by tstorm, "
9704e400768SDavid Christensen               "counter 0x%x != stats_counter 0x%x\n",
9714e400768SDavid Christensen               le16toh(counters->tstats_counter), sc->stats_counter);
9724e400768SDavid Christensen         return (-EAGAIN);
9734e400768SDavid Christensen     }
9744e400768SDavid Christensen 
9754e400768SDavid Christensen     return (0);
9764e400768SDavid Christensen }
9774e400768SDavid Christensen 
9784e400768SDavid Christensen static int
9794e400768SDavid Christensen bxe_storm_stats_update(struct bxe_softc *sc)
9804e400768SDavid Christensen {
9814e400768SDavid Christensen     struct tstorm_per_port_stats *tport =
9824e400768SDavid Christensen         &sc->fw_stats_data->port.tstorm_port_statistics;
9834e400768SDavid Christensen     struct tstorm_per_pf_stats *tfunc =
9844e400768SDavid Christensen         &sc->fw_stats_data->pf.tstorm_pf_statistics;
9854e400768SDavid Christensen     struct host_func_stats *fstats = &sc->func_stats;
9864e400768SDavid Christensen     struct bxe_eth_stats *estats = &sc->eth_stats;
9874e400768SDavid Christensen     struct bxe_eth_stats_old *estats_old = &sc->eth_stats_old;
9884e400768SDavid Christensen     int i;
9894e400768SDavid Christensen 
9904e400768SDavid Christensen     /* vfs stat counter is managed by pf */
9914e400768SDavid Christensen     if (IS_PF(sc) && bxe_storm_stats_validate_counters(sc)) {
9924e400768SDavid Christensen         return (-EAGAIN);
9934e400768SDavid Christensen     }
9944e400768SDavid Christensen 
9954e400768SDavid Christensen     estats->error_bytes_received_hi = 0;
9964e400768SDavid Christensen     estats->error_bytes_received_lo = 0;
9974e400768SDavid Christensen 
9984e400768SDavid Christensen     for (i = 0; i < sc->num_queues; i++) {
9994e400768SDavid Christensen         struct bxe_fastpath *fp = &sc->fp[i];
10004e400768SDavid Christensen         struct tstorm_per_queue_stats *tclient =
10014e400768SDavid Christensen             &sc->fw_stats_data->queue_stats[i].tstorm_queue_statistics;
10024e400768SDavid Christensen         struct tstorm_per_queue_stats *old_tclient = &fp->old_tclient;
10034e400768SDavid Christensen         struct ustorm_per_queue_stats *uclient =
10044e400768SDavid Christensen             &sc->fw_stats_data->queue_stats[i].ustorm_queue_statistics;
10054e400768SDavid Christensen         struct ustorm_per_queue_stats *old_uclient = &fp->old_uclient;
10064e400768SDavid Christensen         struct xstorm_per_queue_stats *xclient =
10074e400768SDavid Christensen             &sc->fw_stats_data->queue_stats[i].xstorm_queue_statistics;
10084e400768SDavid Christensen         struct xstorm_per_queue_stats *old_xclient = &fp->old_xclient;
10094e400768SDavid Christensen         struct bxe_eth_q_stats *qstats = &fp->eth_q_stats;
10104e400768SDavid Christensen         struct bxe_eth_q_stats_old *qstats_old = &fp->eth_q_stats_old;
10114e400768SDavid Christensen 
10124e400768SDavid Christensen         uint32_t diff;
10134e400768SDavid Christensen 
10144e400768SDavid Christensen         BLOGD(sc, DBG_STATS,
10154e400768SDavid Christensen               "queue[%d]: ucast_sent 0x%x bcast_sent 0x%x mcast_sent 0x%x\n",
10164e400768SDavid Christensen               i, xclient->ucast_pkts_sent, xclient->bcast_pkts_sent,
10174e400768SDavid Christensen               xclient->mcast_pkts_sent);
10184e400768SDavid Christensen 
10194e400768SDavid Christensen         BLOGD(sc, DBG_STATS, "---------------\n");
10204e400768SDavid Christensen 
10214e400768SDavid Christensen         UPDATE_QSTAT(tclient->rcv_bcast_bytes,
10224e400768SDavid Christensen                      total_broadcast_bytes_received);
10234e400768SDavid Christensen         UPDATE_QSTAT(tclient->rcv_mcast_bytes,
10244e400768SDavid Christensen                      total_multicast_bytes_received);
10254e400768SDavid Christensen         UPDATE_QSTAT(tclient->rcv_ucast_bytes,
10264e400768SDavid Christensen                      total_unicast_bytes_received);
10274e400768SDavid Christensen 
10284e400768SDavid Christensen         /*
10294e400768SDavid Christensen          * sum to total_bytes_received all
10304e400768SDavid Christensen          * unicast/multicast/broadcast
10314e400768SDavid Christensen          */
10324e400768SDavid Christensen         qstats->total_bytes_received_hi =
10334e400768SDavid Christensen             qstats->total_broadcast_bytes_received_hi;
10344e400768SDavid Christensen         qstats->total_bytes_received_lo =
10354e400768SDavid Christensen             qstats->total_broadcast_bytes_received_lo;
10364e400768SDavid Christensen 
10374e400768SDavid Christensen         ADD_64(qstats->total_bytes_received_hi,
10384e400768SDavid Christensen                qstats->total_multicast_bytes_received_hi,
10394e400768SDavid Christensen                qstats->total_bytes_received_lo,
10404e400768SDavid Christensen                qstats->total_multicast_bytes_received_lo);
10414e400768SDavid Christensen 
10424e400768SDavid Christensen         ADD_64(qstats->total_bytes_received_hi,
10434e400768SDavid Christensen                qstats->total_unicast_bytes_received_hi,
10444e400768SDavid Christensen                qstats->total_bytes_received_lo,
10454e400768SDavid Christensen                qstats->total_unicast_bytes_received_lo);
10464e400768SDavid Christensen 
10474e400768SDavid Christensen         qstats->valid_bytes_received_hi = qstats->total_bytes_received_hi;
10484e400768SDavid Christensen         qstats->valid_bytes_received_lo = qstats->total_bytes_received_lo;
10494e400768SDavid Christensen 
10504e400768SDavid Christensen         UPDATE_EXTEND_TSTAT(rcv_ucast_pkts, total_unicast_packets_received);
10514e400768SDavid Christensen         UPDATE_EXTEND_TSTAT(rcv_mcast_pkts, total_multicast_packets_received);
10524e400768SDavid Christensen         UPDATE_EXTEND_TSTAT(rcv_bcast_pkts, total_broadcast_packets_received);
10534e400768SDavid Christensen         UPDATE_EXTEND_E_TSTAT(pkts_too_big_discard,
10544e400768SDavid Christensen                               etherstatsoverrsizepkts, 32);
10554e400768SDavid Christensen         UPDATE_EXTEND_E_TSTAT(no_buff_discard, no_buff_discard, 16);
10564e400768SDavid Christensen 
10574e400768SDavid Christensen         SUB_EXTEND_USTAT(ucast_no_buff_pkts, total_unicast_packets_received);
10584e400768SDavid Christensen         SUB_EXTEND_USTAT(mcast_no_buff_pkts,
10594e400768SDavid Christensen                          total_multicast_packets_received);
10604e400768SDavid Christensen         SUB_EXTEND_USTAT(bcast_no_buff_pkts,
10614e400768SDavid Christensen                          total_broadcast_packets_received);
10624e400768SDavid Christensen         UPDATE_EXTEND_E_USTAT(ucast_no_buff_pkts, no_buff_discard);
10634e400768SDavid Christensen         UPDATE_EXTEND_E_USTAT(mcast_no_buff_pkts, no_buff_discard);
10644e400768SDavid Christensen         UPDATE_EXTEND_E_USTAT(bcast_no_buff_pkts, no_buff_discard);
10654e400768SDavid Christensen 
10664e400768SDavid Christensen         UPDATE_QSTAT(xclient->bcast_bytes_sent,
10674e400768SDavid Christensen                      total_broadcast_bytes_transmitted);
10684e400768SDavid Christensen         UPDATE_QSTAT(xclient->mcast_bytes_sent,
10694e400768SDavid Christensen                      total_multicast_bytes_transmitted);
10704e400768SDavid Christensen         UPDATE_QSTAT(xclient->ucast_bytes_sent,
10714e400768SDavid Christensen                      total_unicast_bytes_transmitted);
10724e400768SDavid Christensen 
10734e400768SDavid Christensen         /*
10744e400768SDavid Christensen          * sum to total_bytes_transmitted all
10754e400768SDavid Christensen          * unicast/multicast/broadcast
10764e400768SDavid Christensen          */
10774e400768SDavid Christensen         qstats->total_bytes_transmitted_hi =
10784e400768SDavid Christensen             qstats->total_unicast_bytes_transmitted_hi;
10794e400768SDavid Christensen         qstats->total_bytes_transmitted_lo =
10804e400768SDavid Christensen             qstats->total_unicast_bytes_transmitted_lo;
10814e400768SDavid Christensen 
10824e400768SDavid Christensen         ADD_64(qstats->total_bytes_transmitted_hi,
10834e400768SDavid Christensen                qstats->total_broadcast_bytes_transmitted_hi,
10844e400768SDavid Christensen                qstats->total_bytes_transmitted_lo,
10854e400768SDavid Christensen                qstats->total_broadcast_bytes_transmitted_lo);
10864e400768SDavid Christensen 
10874e400768SDavid Christensen         ADD_64(qstats->total_bytes_transmitted_hi,
10884e400768SDavid Christensen                qstats->total_multicast_bytes_transmitted_hi,
10894e400768SDavid Christensen                qstats->total_bytes_transmitted_lo,
10904e400768SDavid Christensen                qstats->total_multicast_bytes_transmitted_lo);
10914e400768SDavid Christensen 
10924e400768SDavid Christensen         UPDATE_EXTEND_XSTAT(ucast_pkts_sent,
10934e400768SDavid Christensen                             total_unicast_packets_transmitted);
10944e400768SDavid Christensen         UPDATE_EXTEND_XSTAT(mcast_pkts_sent,
10954e400768SDavid Christensen                             total_multicast_packets_transmitted);
10964e400768SDavid Christensen         UPDATE_EXTEND_XSTAT(bcast_pkts_sent,
10974e400768SDavid Christensen                             total_broadcast_packets_transmitted);
10984e400768SDavid Christensen 
10994e400768SDavid Christensen         UPDATE_EXTEND_TSTAT(checksum_discard,
11004e400768SDavid Christensen                             total_packets_received_checksum_discarded);
11014e400768SDavid Christensen         UPDATE_EXTEND_TSTAT(ttl0_discard,
11024e400768SDavid Christensen                             total_packets_received_ttl0_discarded);
11034e400768SDavid Christensen 
11044e400768SDavid Christensen         UPDATE_EXTEND_XSTAT(error_drop_pkts,
11054e400768SDavid Christensen                             total_transmitted_dropped_packets_error);
11064e400768SDavid Christensen 
11074e400768SDavid Christensen         /* TPA aggregations completed */
11084e400768SDavid Christensen         UPDATE_EXTEND_E_USTAT(coalesced_events, total_tpa_aggregations);
11094e400768SDavid Christensen         /* Number of network frames aggregated by TPA */
11104e400768SDavid Christensen         UPDATE_EXTEND_E_USTAT(coalesced_pkts, total_tpa_aggregated_frames);
11114e400768SDavid Christensen         /* Total number of bytes in completed TPA aggregations */
11124e400768SDavid Christensen         UPDATE_QSTAT(uclient->coalesced_bytes, total_tpa_bytes);
11134e400768SDavid Christensen 
11144e400768SDavid Christensen         UPDATE_ESTAT_QSTAT_64(total_tpa_bytes);
11154e400768SDavid Christensen 
11164e400768SDavid Christensen         UPDATE_FSTAT_QSTAT(total_bytes_received);
11174e400768SDavid Christensen         UPDATE_FSTAT_QSTAT(total_bytes_transmitted);
11184e400768SDavid Christensen         UPDATE_FSTAT_QSTAT(total_unicast_packets_received);
11194e400768SDavid Christensen         UPDATE_FSTAT_QSTAT(total_multicast_packets_received);
11204e400768SDavid Christensen         UPDATE_FSTAT_QSTAT(total_broadcast_packets_received);
11214e400768SDavid Christensen         UPDATE_FSTAT_QSTAT(total_unicast_packets_transmitted);
11224e400768SDavid Christensen         UPDATE_FSTAT_QSTAT(total_multicast_packets_transmitted);
11234e400768SDavid Christensen         UPDATE_FSTAT_QSTAT(total_broadcast_packets_transmitted);
11244e400768SDavid Christensen         UPDATE_FSTAT_QSTAT(valid_bytes_received);
11254e400768SDavid Christensen     }
11264e400768SDavid Christensen 
11274e400768SDavid Christensen     ADD_64(estats->total_bytes_received_hi,
11284e400768SDavid Christensen            estats->rx_stat_ifhcinbadoctets_hi,
11294e400768SDavid Christensen            estats->total_bytes_received_lo,
11304e400768SDavid Christensen            estats->rx_stat_ifhcinbadoctets_lo);
11314e400768SDavid Christensen 
11324e400768SDavid Christensen     ADD_64_LE(estats->total_bytes_received_hi,
11334e400768SDavid Christensen               tfunc->rcv_error_bytes.hi,
11344e400768SDavid Christensen               estats->total_bytes_received_lo,
11354e400768SDavid Christensen               tfunc->rcv_error_bytes.lo);
11364e400768SDavid Christensen 
11374e400768SDavid Christensen     ADD_64_LE(estats->error_bytes_received_hi,
11384e400768SDavid Christensen               tfunc->rcv_error_bytes.hi,
11394e400768SDavid Christensen               estats->error_bytes_received_lo,
11404e400768SDavid Christensen               tfunc->rcv_error_bytes.lo);
11414e400768SDavid Christensen 
11424e400768SDavid Christensen     UPDATE_ESTAT(etherstatsoverrsizepkts, rx_stat_dot3statsframestoolong);
11434e400768SDavid Christensen 
11444e400768SDavid Christensen     ADD_64(estats->error_bytes_received_hi,
11454e400768SDavid Christensen            estats->rx_stat_ifhcinbadoctets_hi,
11464e400768SDavid Christensen            estats->error_bytes_received_lo,
11474e400768SDavid Christensen            estats->rx_stat_ifhcinbadoctets_lo);
11484e400768SDavid Christensen 
11494e400768SDavid Christensen     if (sc->port.pmf) {
11504e400768SDavid Christensen         struct bxe_fw_port_stats_old *fwstats = &sc->fw_stats_old;
11514e400768SDavid Christensen         UPDATE_FW_STAT(mac_filter_discard);
11524e400768SDavid Christensen         UPDATE_FW_STAT(mf_tag_discard);
11534e400768SDavid Christensen         UPDATE_FW_STAT(brb_truncate_discard);
11544e400768SDavid Christensen         UPDATE_FW_STAT(mac_discard);
11554e400768SDavid Christensen     }
11564e400768SDavid Christensen 
11574e400768SDavid Christensen     fstats->host_func_stats_start = ++fstats->host_func_stats_end;
11584e400768SDavid Christensen 
11594e400768SDavid Christensen     sc->stats_pending = 0;
11604e400768SDavid Christensen 
11614e400768SDavid Christensen     return (0);
11624e400768SDavid Christensen }
11634e400768SDavid Christensen 
11644e400768SDavid Christensen static void
11654e400768SDavid Christensen bxe_net_stats_update(struct bxe_softc *sc)
11664e400768SDavid Christensen {
11674e400768SDavid Christensen     struct bxe_eth_stats *estats = &sc->eth_stats;
1168*717568adSMarcel Moolenaar     if_t ifnet = sc->ifp;
11694e400768SDavid Christensen     int i;
11704e400768SDavid Christensen 
1171*717568adSMarcel Moolenaar     if_setipackets(ifnet,
11724e400768SDavid Christensen         bxe_hilo(&estats->total_unicast_packets_received_hi) +
11734e400768SDavid Christensen         bxe_hilo(&estats->total_multicast_packets_received_hi) +
1174*717568adSMarcel Moolenaar         bxe_hilo(&estats->total_broadcast_packets_received_hi));
11754e400768SDavid Christensen 
1176*717568adSMarcel Moolenaar     if_setopackets(ifnet,
11774e400768SDavid Christensen         bxe_hilo(&estats->total_unicast_packets_transmitted_hi) +
11784e400768SDavid Christensen         bxe_hilo(&estats->total_multicast_packets_transmitted_hi) +
1179*717568adSMarcel Moolenaar         bxe_hilo(&estats->total_broadcast_packets_transmitted_hi));
11804e400768SDavid Christensen 
1181*717568adSMarcel Moolenaar     if_setibytes(ifnet, bxe_hilo(&estats->total_bytes_received_hi));
11824e400768SDavid Christensen 
1183*717568adSMarcel Moolenaar     if_setobytes(ifnet, bxe_hilo(&estats->total_bytes_transmitted_hi));
11844e400768SDavid Christensen 
11854e400768SDavid Christensen     for (i = 0; i < sc->num_queues; i++) {
11864e400768SDavid Christensen         struct tstorm_per_queue_stats *old_tclient =
11874e400768SDavid Christensen             &sc->fp[i].old_tclient;
1188*717568adSMarcel Moolenaar         if_inciqdrops(ifnet, le32toh(old_tclient->checksum_discard));
11894e400768SDavid Christensen     }
11904e400768SDavid Christensen 
1191*717568adSMarcel Moolenaar     if_setierrors(ifnet,
11924e400768SDavid Christensen         bxe_hilo(&estats->rx_stat_etherstatsundersizepkts_hi) +
11934e400768SDavid Christensen         bxe_hilo(&estats->etherstatsoverrsizepkts_hi) +
11944e400768SDavid Christensen         bxe_hilo(&estats->brb_drop_hi) +
11954e400768SDavid Christensen         bxe_hilo(&estats->brb_truncate_hi) +
11964e400768SDavid Christensen         bxe_hilo(&estats->rx_stat_dot3statsfcserrors_hi) +
11974e400768SDavid Christensen         bxe_hilo(&estats->rx_stat_dot3statsalignmenterrors_hi) +
1198*717568adSMarcel Moolenaar         bxe_hilo(&estats->no_buff_discard_hi));
11994e400768SDavid Christensen 
1200*717568adSMarcel Moolenaar     if_setoerrors(ifnet,
12014e400768SDavid Christensen         bxe_hilo(&estats->rx_stat_dot3statscarriersenseerrors_hi) +
1202*717568adSMarcel Moolenaar         bxe_hilo(&estats->tx_stat_dot3statsinternalmactransmiterrors_hi));
12034e400768SDavid Christensen 
1204*717568adSMarcel Moolenaar     if_setimcasts(ifnet,
1205*717568adSMarcel Moolenaar         bxe_hilo(&estats->total_multicast_packets_received_hi));
12064e400768SDavid Christensen 
1207*717568adSMarcel Moolenaar     if_setcollisions(ifnet,
12084e400768SDavid Christensen         bxe_hilo(&estats->tx_stat_etherstatscollisions_hi) +
12094e400768SDavid Christensen         bxe_hilo(&estats->tx_stat_dot3statslatecollisions_hi) +
1210*717568adSMarcel Moolenaar         bxe_hilo(&estats->tx_stat_dot3statsexcessivecollisions_hi));
12114e400768SDavid Christensen }
12124e400768SDavid Christensen 
12134e400768SDavid Christensen static void
12144e400768SDavid Christensen bxe_drv_stats_update(struct bxe_softc *sc)
12154e400768SDavid Christensen {
12164e400768SDavid Christensen     struct bxe_eth_stats *estats = &sc->eth_stats;
12174e400768SDavid Christensen     int i;
12184e400768SDavid Christensen 
12194e400768SDavid Christensen     for (i = 0; i < sc->num_queues; i++) {
12204e400768SDavid Christensen         struct bxe_eth_q_stats *qstats = &sc->fp[i].eth_q_stats;
12214e400768SDavid Christensen         struct bxe_eth_q_stats_old *qstats_old = &sc->fp[i].eth_q_stats_old;
12224e400768SDavid Christensen 
12234e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(rx_calls);
12244e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(rx_pkts);
12254e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(rx_tpa_pkts);
12264e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(rx_soft_errors);
12274e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(rx_hw_csum_errors);
12284e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(rx_ofld_frames_csum_ip);
12294e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(rx_ofld_frames_csum_tcp_udp);
12304e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(rx_budget_reached);
12314e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_pkts);
12324e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_soft_errors);
12334e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_ofld_frames_csum_ip);
12344e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_ofld_frames_csum_tcp);
12354e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_ofld_frames_csum_udp);
12364e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_ofld_frames_lso);
12374e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_ofld_frames_lso_hdr_splits);
12384e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_encap_failures);
12394e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_hw_queue_full);
12404e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_hw_max_queue_depth);
12414e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_dma_mapping_failure);
12424e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_max_drbr_queue_depth);
12434e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_window_violation_std);
12444e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_window_violation_tso);
12454e400768SDavid Christensen         //UPDATE_ESTAT_QSTAT(tx_unsupported_tso_request_ipv6);
12464e400768SDavid Christensen         //UPDATE_ESTAT_QSTAT(tx_unsupported_tso_request_not_tcp);
12474e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_chain_lost_mbuf);
12484e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_frames_deferred);
12494e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(tx_queue_xoff);
12504e400768SDavid Christensen 
12514e400768SDavid Christensen         /* mbuf driver statistics */
12524e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_defrag_attempts);
12534e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_defrag_failures);
12544e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_rx_bd_alloc_failed);
12554e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_rx_bd_mapping_failed);
12564e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_rx_tpa_alloc_failed);
12574e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_rx_tpa_mapping_failed);
12584e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_rx_sge_alloc_failed);
12594e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_rx_sge_mapping_failed);
12604e400768SDavid Christensen 
12614e400768SDavid Christensen         /* track the number of allocated mbufs */
12624e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_alloc_tx);
12634e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_alloc_rx);
12644e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_alloc_sge);
12654e400768SDavid Christensen         UPDATE_ESTAT_QSTAT(mbuf_alloc_tpa);
12664e400768SDavid Christensen     }
12674e400768SDavid Christensen }
12684e400768SDavid Christensen 
12694e400768SDavid Christensen static uint8_t
12704e400768SDavid Christensen bxe_edebug_stats_stopped(struct bxe_softc *sc)
12714e400768SDavid Christensen {
12724e400768SDavid Christensen     uint32_t val;
12734e400768SDavid Christensen 
12744e400768SDavid Christensen     if (SHMEM2_HAS(sc, edebug_driver_if[1])) {
12754e400768SDavid Christensen         val = SHMEM2_RD(sc, edebug_driver_if[1]);
12764e400768SDavid Christensen 
12774e400768SDavid Christensen         if (val == EDEBUG_DRIVER_IF_OP_CODE_DISABLE_STAT) {
12784e400768SDavid Christensen             return (TRUE);
12794e400768SDavid Christensen         }
12804e400768SDavid Christensen     }
12814e400768SDavid Christensen 
12824e400768SDavid Christensen     return (FALSE);
12834e400768SDavid Christensen }
12844e400768SDavid Christensen 
12854e400768SDavid Christensen static void
12864e400768SDavid Christensen bxe_stats_update(struct bxe_softc *sc)
12874e400768SDavid Christensen {
12884e400768SDavid Christensen     uint32_t *stats_comp = BXE_SP(sc, stats_comp);
12894e400768SDavid Christensen 
12904e400768SDavid Christensen     if (bxe_edebug_stats_stopped(sc)) {
12914e400768SDavid Christensen         return;
12924e400768SDavid Christensen     }
12934e400768SDavid Christensen 
12944e400768SDavid Christensen     if (IS_PF(sc)) {
12954e400768SDavid Christensen         if (*stats_comp != DMAE_COMP_VAL) {
12964e400768SDavid Christensen             return;
12974e400768SDavid Christensen         }
12984e400768SDavid Christensen 
12994e400768SDavid Christensen         if (sc->port.pmf) {
13004e400768SDavid Christensen             bxe_hw_stats_update(sc);
13014e400768SDavid Christensen         }
13024e400768SDavid Christensen 
13034e400768SDavid Christensen         if (bxe_storm_stats_update(sc)) {
13044e400768SDavid Christensen             if (sc->stats_pending++ == 3) {
13054e400768SDavid Christensen                 bxe_panic(sc, ("storm stats not updated for 3 times\n"));
13064e400768SDavid Christensen             }
13074e400768SDavid Christensen             return;
13084e400768SDavid Christensen         }
13094e400768SDavid Christensen     } else {
13104e400768SDavid Christensen         /*
13114e400768SDavid Christensen          * VF doesn't collect HW statistics, and doesn't get completions,
13124e400768SDavid Christensen          * performs only update.
13134e400768SDavid Christensen          */
13144e400768SDavid Christensen         bxe_storm_stats_update(sc);
13154e400768SDavid Christensen     }
13164e400768SDavid Christensen 
13174e400768SDavid Christensen     bxe_net_stats_update(sc);
13184e400768SDavid Christensen     bxe_drv_stats_update(sc);
13194e400768SDavid Christensen 
13204e400768SDavid Christensen     /* vf is done */
13214e400768SDavid Christensen     if (IS_VF(sc)) {
13224e400768SDavid Christensen         return;
13234e400768SDavid Christensen     }
13244e400768SDavid Christensen 
13254e400768SDavid Christensen     bxe_hw_stats_post(sc);
13264e400768SDavid Christensen     bxe_storm_stats_post(sc);
13274e400768SDavid Christensen }
13284e400768SDavid Christensen 
13294e400768SDavid Christensen static void
13304e400768SDavid Christensen bxe_port_stats_stop(struct bxe_softc *sc)
13314e400768SDavid Christensen {
13324e400768SDavid Christensen     struct dmae_command *dmae;
13334e400768SDavid Christensen     uint32_t opcode;
13344e400768SDavid Christensen     int loader_idx = PMF_DMAE_C(sc);
13354e400768SDavid Christensen     uint32_t *stats_comp = BXE_SP(sc, stats_comp);
13364e400768SDavid Christensen 
13374e400768SDavid Christensen     sc->executer_idx = 0;
13384e400768SDavid Christensen 
13394e400768SDavid Christensen     opcode = bxe_dmae_opcode(sc, DMAE_SRC_PCI, DMAE_DST_GRC, FALSE, 0);
13404e400768SDavid Christensen 
13414e400768SDavid Christensen     if (sc->port.port_stx) {
13424e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
13434e400768SDavid Christensen 
13444e400768SDavid Christensen         if (sc->func_stx) {
13454e400768SDavid Christensen             dmae->opcode = bxe_dmae_opcode_add_comp(opcode, DMAE_COMP_GRC);
13464e400768SDavid Christensen         } else {
13474e400768SDavid Christensen             dmae->opcode = bxe_dmae_opcode_add_comp(opcode, DMAE_COMP_PCI);
13484e400768SDavid Christensen         }
13494e400768SDavid Christensen 
13504e400768SDavid Christensen         dmae->src_addr_lo = U64_LO(BXE_SP_MAPPING(sc, port_stats));
13514e400768SDavid Christensen         dmae->src_addr_hi = U64_HI(BXE_SP_MAPPING(sc, port_stats));
13524e400768SDavid Christensen         dmae->dst_addr_lo = sc->port.port_stx >> 2;
13534e400768SDavid Christensen         dmae->dst_addr_hi = 0;
13544e400768SDavid Christensen         dmae->len = bxe_get_port_stats_dma_len(sc);
13554e400768SDavid Christensen         if (sc->func_stx) {
13564e400768SDavid Christensen             dmae->comp_addr_lo = (dmae_reg_go_c[loader_idx] >> 2);
13574e400768SDavid Christensen             dmae->comp_addr_hi = 0;
13584e400768SDavid Christensen             dmae->comp_val = 1;
13594e400768SDavid Christensen         } else {
13604e400768SDavid Christensen             dmae->comp_addr_lo = U64_LO(BXE_SP_MAPPING(sc, stats_comp));
13614e400768SDavid Christensen             dmae->comp_addr_hi = U64_HI(BXE_SP_MAPPING(sc, stats_comp));
13624e400768SDavid Christensen             dmae->comp_val = DMAE_COMP_VAL;
13634e400768SDavid Christensen 
13644e400768SDavid Christensen             *stats_comp = 0;
13654e400768SDavid Christensen         }
13664e400768SDavid Christensen     }
13674e400768SDavid Christensen 
13684e400768SDavid Christensen     if (sc->func_stx) {
13694e400768SDavid Christensen         dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
13704e400768SDavid Christensen         dmae->opcode = bxe_dmae_opcode_add_comp(opcode, DMAE_COMP_PCI);
13714e400768SDavid Christensen         dmae->src_addr_lo = U64_LO(BXE_SP_MAPPING(sc, func_stats));
13724e400768SDavid Christensen         dmae->src_addr_hi = U64_HI(BXE_SP_MAPPING(sc, func_stats));
13734e400768SDavid Christensen         dmae->dst_addr_lo = (sc->func_stx >> 2);
13744e400768SDavid Christensen         dmae->dst_addr_hi = 0;
13754e400768SDavid Christensen         dmae->len = (sizeof(struct host_func_stats) >> 2);
13764e400768SDavid Christensen         dmae->comp_addr_lo = U64_LO(BXE_SP_MAPPING(sc, stats_comp));
13774e400768SDavid Christensen         dmae->comp_addr_hi = U64_HI(BXE_SP_MAPPING(sc, stats_comp));
13784e400768SDavid Christensen         dmae->comp_val = DMAE_COMP_VAL;
13794e400768SDavid Christensen 
13804e400768SDavid Christensen         *stats_comp = 0;
13814e400768SDavid Christensen     }
13824e400768SDavid Christensen }
13834e400768SDavid Christensen 
13844e400768SDavid Christensen static void
13854e400768SDavid Christensen bxe_stats_stop(struct bxe_softc *sc)
13864e400768SDavid Christensen {
13874e400768SDavid Christensen     uint8_t update = FALSE;
13884e400768SDavid Christensen 
13894e400768SDavid Christensen     bxe_stats_comp(sc);
13904e400768SDavid Christensen 
13914e400768SDavid Christensen     if (sc->port.pmf) {
13924e400768SDavid Christensen         update = bxe_hw_stats_update(sc) == 0;
13934e400768SDavid Christensen     }
13944e400768SDavid Christensen 
13954e400768SDavid Christensen     update |= bxe_storm_stats_update(sc) == 0;
13964e400768SDavid Christensen 
13974e400768SDavid Christensen     if (update) {
13984e400768SDavid Christensen         bxe_net_stats_update(sc);
13994e400768SDavid Christensen 
14004e400768SDavid Christensen         if (sc->port.pmf) {
14014e400768SDavid Christensen             bxe_port_stats_stop(sc);
14024e400768SDavid Christensen         }
14034e400768SDavid Christensen 
14044e400768SDavid Christensen         bxe_hw_stats_post(sc);
14054e400768SDavid Christensen         bxe_stats_comp(sc);
14064e400768SDavid Christensen     }
14074e400768SDavid Christensen }
14084e400768SDavid Christensen 
14094e400768SDavid Christensen static void
14104e400768SDavid Christensen bxe_stats_do_nothing(struct bxe_softc *sc)
14114e400768SDavid Christensen {
14124e400768SDavid Christensen     return;
14134e400768SDavid Christensen }
14144e400768SDavid Christensen 
14154e400768SDavid Christensen static const struct {
14164e400768SDavid Christensen     void (*action)(struct bxe_softc *sc);
14174e400768SDavid Christensen     enum bxe_stats_state next_state;
14184e400768SDavid Christensen } bxe_stats_stm[STATS_STATE_MAX][STATS_EVENT_MAX] = {
14194e400768SDavid Christensen     {
14204e400768SDavid Christensen     /* DISABLED PMF */ { bxe_stats_pmf_update, STATS_STATE_DISABLED },
14214e400768SDavid Christensen     /*      LINK_UP */ { bxe_stats_start,      STATS_STATE_ENABLED },
14224e400768SDavid Christensen     /*      UPDATE  */ { bxe_stats_do_nothing, STATS_STATE_DISABLED },
14234e400768SDavid Christensen     /*      STOP    */ { bxe_stats_do_nothing, STATS_STATE_DISABLED }
14244e400768SDavid Christensen     },
14254e400768SDavid Christensen     {
14264e400768SDavid Christensen     /* ENABLED  PMF */ { bxe_stats_pmf_start,  STATS_STATE_ENABLED },
14274e400768SDavid Christensen     /*      LINK_UP */ { bxe_stats_restart,    STATS_STATE_ENABLED },
14284e400768SDavid Christensen     /*      UPDATE  */ { bxe_stats_update,     STATS_STATE_ENABLED },
14294e400768SDavid Christensen     /*      STOP    */ { bxe_stats_stop,       STATS_STATE_DISABLED }
14304e400768SDavid Christensen     }
14314e400768SDavid Christensen };
14324e400768SDavid Christensen 
14334e400768SDavid Christensen void bxe_stats_handle(struct bxe_softc     *sc,
14344e400768SDavid Christensen                       enum bxe_stats_event event)
14354e400768SDavid Christensen {
14364e400768SDavid Christensen     enum bxe_stats_state state;
14374e400768SDavid Christensen 
14384e400768SDavid Christensen     if (__predict_false(sc->panic)) {
14394e400768SDavid Christensen         return;
14404e400768SDavid Christensen     }
14414e400768SDavid Christensen 
14424e400768SDavid Christensen     BXE_STATS_LOCK(sc);
14434e400768SDavid Christensen     state = sc->stats_state;
14444e400768SDavid Christensen     sc->stats_state = bxe_stats_stm[state][event].next_state;
14454e400768SDavid Christensen     BXE_STATS_UNLOCK(sc);
14464e400768SDavid Christensen 
14474e400768SDavid Christensen     bxe_stats_stm[state][event].action(sc);
14484e400768SDavid Christensen 
14494e400768SDavid Christensen     if (event != STATS_EVENT_UPDATE) {
14504e400768SDavid Christensen         BLOGD(sc, DBG_STATS,
14514e400768SDavid Christensen               "state %d -> event %d -> state %d\n",
14524e400768SDavid Christensen               state, event, sc->stats_state);
14534e400768SDavid Christensen     }
14544e400768SDavid Christensen }
14554e400768SDavid Christensen 
14564e400768SDavid Christensen static void
14574e400768SDavid Christensen bxe_port_stats_base_init(struct bxe_softc *sc)
14584e400768SDavid Christensen {
14594e400768SDavid Christensen     struct dmae_command *dmae;
14604e400768SDavid Christensen     uint32_t *stats_comp = BXE_SP(sc, stats_comp);
14614e400768SDavid Christensen 
14624e400768SDavid Christensen     /* sanity */
14634e400768SDavid Christensen     if (!sc->port.pmf || !sc->port.port_stx) {
14644e400768SDavid Christensen         BLOGE(sc, "BUG!\n");
14654e400768SDavid Christensen         return;
14664e400768SDavid Christensen     }
14674e400768SDavid Christensen 
14684e400768SDavid Christensen     sc->executer_idx = 0;
14694e400768SDavid Christensen 
14704e400768SDavid Christensen     dmae = BXE_SP(sc, dmae[sc->executer_idx++]);
14714e400768SDavid Christensen     dmae->opcode = bxe_dmae_opcode(sc, DMAE_SRC_PCI, DMAE_DST_GRC,
14724e400768SDavid Christensen                                    TRUE, DMAE_COMP_PCI);
14734e400768SDavid Christensen     dmae->src_addr_lo = U64_LO(BXE_SP_MAPPING(sc, port_stats));
14744e400768SDavid Christensen     dmae->src_addr_hi = U64_HI(BXE_SP_MAPPING(sc, port_stats));
14754e400768SDavid Christensen     dmae->dst_addr_lo = (sc->port.port_stx >> 2);
14764e400768SDavid Christensen     dmae->dst_addr_hi = 0;
14774e400768SDavid Christensen     dmae->len = bxe_get_port_stats_dma_len(sc);
14784e400768SDavid Christensen     dmae->comp_addr_lo = U64_LO(BXE_SP_MAPPING(sc, stats_comp));
14794e400768SDavid Christensen     dmae->comp_addr_hi = U64_HI(BXE_SP_MAPPING(sc, stats_comp));
14804e400768SDavid Christensen     dmae->comp_val = DMAE_COMP_VAL;
14814e400768SDavid Christensen 
14824e400768SDavid Christensen     *stats_comp = 0;
14834e400768SDavid Christensen     bxe_hw_stats_post(sc);
14844e400768SDavid Christensen     bxe_stats_comp(sc);
14854e400768SDavid Christensen }
14864e400768SDavid Christensen 
14874e400768SDavid Christensen /*
14884e400768SDavid Christensen  * This function will prepare the statistics ramrod data the way
14894e400768SDavid Christensen  * we will only have to increment the statistics counter and
14904e400768SDavid Christensen  * send the ramrod each time we have to.
14914e400768SDavid Christensen  */
14924e400768SDavid Christensen static void
14934e400768SDavid Christensen bxe_prep_fw_stats_req(struct bxe_softc *sc)
14944e400768SDavid Christensen {
14954e400768SDavid Christensen     int i;
14964e400768SDavid Christensen     int first_queue_query_index;
14974e400768SDavid Christensen     struct stats_query_header *stats_hdr = &sc->fw_stats_req->hdr;
14984e400768SDavid Christensen     bus_addr_t cur_data_offset;
14994e400768SDavid Christensen     struct stats_query_entry *cur_query_entry;
15004e400768SDavid Christensen 
15014e400768SDavid Christensen     stats_hdr->cmd_num = sc->fw_stats_num;
15024e400768SDavid Christensen     stats_hdr->drv_stats_counter = 0;
15034e400768SDavid Christensen 
15044e400768SDavid Christensen     /*
15054e400768SDavid Christensen      * The storm_counters struct contains the counters of completed
15064e400768SDavid Christensen      * statistics requests per storm which are incremented by FW
15074e400768SDavid Christensen      * each time it completes hadning a statistics ramrod. We will
15084e400768SDavid Christensen      * check these counters in the timer handler and discard a
15094e400768SDavid Christensen      * (statistics) ramrod completion.
15104e400768SDavid Christensen      */
15114e400768SDavid Christensen     cur_data_offset = (sc->fw_stats_data_mapping +
15124e400768SDavid Christensen                        offsetof(struct bxe_fw_stats_data, storm_counters));
15134e400768SDavid Christensen 
15144e400768SDavid Christensen     stats_hdr->stats_counters_addrs.hi = htole32(U64_HI(cur_data_offset));
15154e400768SDavid Christensen     stats_hdr->stats_counters_addrs.lo = htole32(U64_LO(cur_data_offset));
15164e400768SDavid Christensen 
15174e400768SDavid Christensen     /*
15184e400768SDavid Christensen      * Prepare the first stats ramrod (will be completed with
15194e400768SDavid Christensen      * the counters equal to zero) - init counters to somethig different.
15204e400768SDavid Christensen      */
15214e400768SDavid Christensen     memset(&sc->fw_stats_data->storm_counters, 0xff,
15224e400768SDavid Christensen            sizeof(struct stats_counter));
15234e400768SDavid Christensen 
15244e400768SDavid Christensen     /**** Port FW statistics data ****/
15254e400768SDavid Christensen     cur_data_offset = (sc->fw_stats_data_mapping +
15264e400768SDavid Christensen                        offsetof(struct bxe_fw_stats_data, port));
15274e400768SDavid Christensen 
15284e400768SDavid Christensen     cur_query_entry = &sc->fw_stats_req->query[BXE_PORT_QUERY_IDX];
15294e400768SDavid Christensen 
15304e400768SDavid Christensen     cur_query_entry->kind = STATS_TYPE_PORT;
15314e400768SDavid Christensen     /* For port query index is a DONT CARE */
15324e400768SDavid Christensen     cur_query_entry->index = SC_PORT(sc);
15334e400768SDavid Christensen     /* For port query funcID is a DONT CARE */
15344e400768SDavid Christensen     cur_query_entry->funcID = htole16(SC_FUNC(sc));
15354e400768SDavid Christensen     cur_query_entry->address.hi = htole32(U64_HI(cur_data_offset));
15364e400768SDavid Christensen     cur_query_entry->address.lo = htole32(U64_LO(cur_data_offset));
15374e400768SDavid Christensen 
15384e400768SDavid Christensen     /**** PF FW statistics data ****/
15394e400768SDavid Christensen     cur_data_offset = (sc->fw_stats_data_mapping +
15404e400768SDavid Christensen                        offsetof(struct bxe_fw_stats_data, pf));
15414e400768SDavid Christensen 
15424e400768SDavid Christensen     cur_query_entry = &sc->fw_stats_req->query[BXE_PF_QUERY_IDX];
15434e400768SDavid Christensen 
15444e400768SDavid Christensen     cur_query_entry->kind = STATS_TYPE_PF;
15454e400768SDavid Christensen     /* For PF query index is a DONT CARE */
15464e400768SDavid Christensen     cur_query_entry->index = SC_PORT(sc);
15474e400768SDavid Christensen     cur_query_entry->funcID = htole16(SC_FUNC(sc));
15484e400768SDavid Christensen     cur_query_entry->address.hi = htole32(U64_HI(cur_data_offset));
15494e400768SDavid Christensen     cur_query_entry->address.lo = htole32(U64_LO(cur_data_offset));
15504e400768SDavid Christensen 
15514e400768SDavid Christensen #if 0
15524e400768SDavid Christensen     /**** FCoE FW statistics data ****/
15534e400768SDavid Christensen     if (!NO_FCOE(sc)) {
15544e400768SDavid Christensen         cur_data_offset = (sc->fw_stats_data_mapping +
15554e400768SDavid Christensen                            offsetof(struct bxe_fw_stats_data, fcoe));
15564e400768SDavid Christensen 
15574e400768SDavid Christensen         cur_query_entry = &sc->fw_stats_req->query[BXE_FCOE_QUERY_IDX];
15584e400768SDavid Christensen 
15594e400768SDavid Christensen         cur_query_entry->kind = STATS_TYPE_FCOE;
15604e400768SDavid Christensen         /* For FCoE query index is a DONT CARE */
15614e400768SDavid Christensen         cur_query_entry->index = SC_PORT(sc);
15624e400768SDavid Christensen         cur_query_entry->funcID = cpu_to_le16(SC_FUNC(sc));
15634e400768SDavid Christensen         cur_query_entry->address.hi = htole32(U64_HI(cur_data_offset));
15644e400768SDavid Christensen         cur_query_entry->address.lo = htole32(U64_LO(cur_data_offset));
15654e400768SDavid Christensen     }
15664e400768SDavid Christensen #endif
15674e400768SDavid Christensen 
15684e400768SDavid Christensen     /**** Clients' queries ****/
15694e400768SDavid Christensen     cur_data_offset = (sc->fw_stats_data_mapping +
15704e400768SDavid Christensen                        offsetof(struct bxe_fw_stats_data, queue_stats));
15714e400768SDavid Christensen 
15724e400768SDavid Christensen     /*
15734e400768SDavid Christensen      * First queue query index depends whether FCoE offloaded request will
15744e400768SDavid Christensen      * be included in the ramrod
15754e400768SDavid Christensen      */
15764e400768SDavid Christensen #if 0
15774e400768SDavid Christensen     if (!NO_FCOE(sc))
15784e400768SDavid Christensen         first_queue_query_index = BXE_FIRST_QUEUE_QUERY_IDX;
15794e400768SDavid Christensen     else
15804e400768SDavid Christensen #endif
15814e400768SDavid Christensen         first_queue_query_index = (BXE_FIRST_QUEUE_QUERY_IDX - 1);
15824e400768SDavid Christensen 
15834e400768SDavid Christensen     for (i = 0; i < sc->num_queues; i++) {
15844e400768SDavid Christensen         cur_query_entry =
15854e400768SDavid Christensen             &sc->fw_stats_req->query[first_queue_query_index + i];
15864e400768SDavid Christensen 
15874e400768SDavid Christensen         cur_query_entry->kind = STATS_TYPE_QUEUE;
15884e400768SDavid Christensen         cur_query_entry->index = bxe_stats_id(&sc->fp[i]);
15894e400768SDavid Christensen         cur_query_entry->funcID = htole16(SC_FUNC(sc));
15904e400768SDavid Christensen         cur_query_entry->address.hi = htole32(U64_HI(cur_data_offset));
15914e400768SDavid Christensen         cur_query_entry->address.lo = htole32(U64_LO(cur_data_offset));
15924e400768SDavid Christensen 
15934e400768SDavid Christensen         cur_data_offset += sizeof(struct per_queue_stats);
15944e400768SDavid Christensen     }
15954e400768SDavid Christensen 
15964e400768SDavid Christensen #if 0
15974e400768SDavid Christensen     /* add FCoE queue query if needed */
15984e400768SDavid Christensen     if (!NO_FCOE(sc)) {
15994e400768SDavid Christensen         cur_query_entry =
16004e400768SDavid Christensen             &sc->fw_stats_req->query[first_queue_query_index + i];
16014e400768SDavid Christensen 
16024e400768SDavid Christensen         cur_query_entry->kind = STATS_TYPE_QUEUE;
16034e400768SDavid Christensen         cur_query_entry->index = bxe_stats_id(&sc->fp[FCOE_IDX(sc)]);
16044e400768SDavid Christensen         cur_query_entry->funcID = htole16(SC_FUNC(sc));
16054e400768SDavid Christensen         cur_query_entry->address.hi = htole32(U64_HI(cur_data_offset));
16064e400768SDavid Christensen         cur_query_entry->address.lo = htole32(U64_LO(cur_data_offset));
16074e400768SDavid Christensen     }
16084e400768SDavid Christensen #endif
16094e400768SDavid Christensen }
16104e400768SDavid Christensen 
16114e400768SDavid Christensen void
16124e400768SDavid Christensen bxe_stats_init(struct bxe_softc *sc)
16134e400768SDavid Christensen {
16144e400768SDavid Christensen     int /*abs*/port = SC_PORT(sc);
16154e400768SDavid Christensen     int mb_idx = SC_FW_MB_IDX(sc);
16164e400768SDavid Christensen     int i;
16174e400768SDavid Christensen 
16184e400768SDavid Christensen     sc->stats_pending = 0;
16194e400768SDavid Christensen     sc->executer_idx = 0;
16204e400768SDavid Christensen     sc->stats_counter = 0;
16214e400768SDavid Christensen 
16224e400768SDavid Christensen     /* port and func stats for management */
16234e400768SDavid Christensen     if (!BXE_NOMCP(sc)) {
16244e400768SDavid Christensen         sc->port.port_stx = SHMEM_RD(sc, port_mb[port].port_stx);
16254e400768SDavid Christensen         sc->func_stx = SHMEM_RD(sc, func_mb[mb_idx].fw_mb_param);
16264e400768SDavid Christensen     } else {
16274e400768SDavid Christensen         sc->port.port_stx = 0;
16284e400768SDavid Christensen         sc->func_stx = 0;
16294e400768SDavid Christensen     }
16304e400768SDavid Christensen 
16314e400768SDavid Christensen     BLOGD(sc, DBG_STATS, "port_stx 0x%x func_stx 0x%x\n",
16324e400768SDavid Christensen           sc->port.port_stx, sc->func_stx);
16334e400768SDavid Christensen 
16344e400768SDavid Christensen     /* pmf should retrieve port statistics from SP on a non-init*/
16354e400768SDavid Christensen     if (!sc->stats_init && sc->port.pmf && sc->port.port_stx) {
16364e400768SDavid Christensen         bxe_stats_handle(sc, STATS_EVENT_PMF);
16374e400768SDavid Christensen     }
16384e400768SDavid Christensen 
16394e400768SDavid Christensen     port = SC_PORT(sc);
16404e400768SDavid Christensen     /* port stats */
16414e400768SDavid Christensen     memset(&(sc->port.old_nig_stats), 0, sizeof(struct nig_stats));
16424e400768SDavid Christensen     sc->port.old_nig_stats.brb_discard =
16434e400768SDavid Christensen         REG_RD(sc, NIG_REG_STAT0_BRB_DISCARD + port*0x38);
16444e400768SDavid Christensen     sc->port.old_nig_stats.brb_truncate =
16454e400768SDavid Christensen         REG_RD(sc, NIG_REG_STAT0_BRB_TRUNCATE + port*0x38);
16464e400768SDavid Christensen     if (!CHIP_IS_E3(sc)) {
16474e400768SDavid Christensen         REG_RD_DMAE(sc, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50,
16484e400768SDavid Christensen                     &(sc->port.old_nig_stats.egress_mac_pkt0_lo), 2);
16494e400768SDavid Christensen         REG_RD_DMAE(sc, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50,
16504e400768SDavid Christensen                     &(sc->port.old_nig_stats.egress_mac_pkt1_lo), 2);
16514e400768SDavid Christensen     }
16524e400768SDavid Christensen 
16534e400768SDavid Christensen     /* function stats */
16544e400768SDavid Christensen     for (i = 0; i < sc->num_queues; i++) {
16554e400768SDavid Christensen         memset(&sc->fp[i].old_tclient, 0, sizeof(sc->fp[i].old_tclient));
16564e400768SDavid Christensen         memset(&sc->fp[i].old_uclient, 0, sizeof(sc->fp[i].old_uclient));
16574e400768SDavid Christensen         memset(&sc->fp[i].old_xclient, 0, sizeof(sc->fp[i].old_xclient));
16584e400768SDavid Christensen         if (sc->stats_init) {
16594e400768SDavid Christensen             memset(&sc->fp[i].eth_q_stats, 0,
16604e400768SDavid Christensen                    sizeof(sc->fp[i].eth_q_stats));
16614e400768SDavid Christensen             memset(&sc->fp[i].eth_q_stats_old, 0,
16624e400768SDavid Christensen                    sizeof(sc->fp[i].eth_q_stats_old));
16634e400768SDavid Christensen         }
16644e400768SDavid Christensen     }
16654e400768SDavid Christensen 
16664e400768SDavid Christensen     /* prepare statistics ramrod data */
16674e400768SDavid Christensen     bxe_prep_fw_stats_req(sc);
16684e400768SDavid Christensen 
1669*717568adSMarcel Moolenaar     if_setipackets(sc->ifp, 0);
1670*717568adSMarcel Moolenaar     if_setopackets(sc->ifp, 0);
1671*717568adSMarcel Moolenaar     if_setibytes(sc->ifp, 0);
1672*717568adSMarcel Moolenaar     if_setobytes(sc->ifp, 0);
1673*717568adSMarcel Moolenaar     if_setierrors(sc->ifp, 0);
1674*717568adSMarcel Moolenaar     if_setoerrors(sc->ifp, 0);
1675*717568adSMarcel Moolenaar     if_setimcasts(sc->ifp, 0);
1676*717568adSMarcel Moolenaar     if_setcollisions(sc->ifp, 0);
16774e400768SDavid Christensen 
16784e400768SDavid Christensen     if (sc->stats_init) {
16794e400768SDavid Christensen         memset(&sc->net_stats_old, 0, sizeof(sc->net_stats_old));
16804e400768SDavid Christensen         memset(&sc->fw_stats_old, 0, sizeof(sc->fw_stats_old));
16814e400768SDavid Christensen         memset(&sc->eth_stats_old, 0, sizeof(sc->eth_stats_old));
16824e400768SDavid Christensen         memset(&sc->eth_stats, 0, sizeof(sc->eth_stats));
16834e400768SDavid Christensen         memset(&sc->func_stats, 0, sizeof(sc->func_stats));
16844e400768SDavid Christensen 
16854e400768SDavid Christensen         /* Clean SP from previous statistics */
16864e400768SDavid Christensen         if (sc->func_stx) {
16874e400768SDavid Christensen             memset(BXE_SP(sc, func_stats), 0, sizeof(struct host_func_stats));
16884e400768SDavid Christensen             bxe_func_stats_init(sc);
16894e400768SDavid Christensen             bxe_hw_stats_post(sc);
16904e400768SDavid Christensen             bxe_stats_comp(sc);
16914e400768SDavid Christensen         }
16924e400768SDavid Christensen     }
16934e400768SDavid Christensen 
16944e400768SDavid Christensen     sc->stats_state = STATS_STATE_DISABLED;
16954e400768SDavid Christensen 
16964e400768SDavid Christensen     if (sc->port.pmf && sc->port.port_stx) {
16974e400768SDavid Christensen         bxe_port_stats_base_init(sc);
16984e400768SDavid Christensen     }
16994e400768SDavid Christensen 
17004e400768SDavid Christensen     /* mark the end of statistics initializiation */
17014e400768SDavid Christensen     sc->stats_init = FALSE;
17024e400768SDavid Christensen }
17034e400768SDavid Christensen 
17044e400768SDavid Christensen void
17054e400768SDavid Christensen bxe_save_statistics(struct bxe_softc *sc)
17064e400768SDavid Christensen {
17074e400768SDavid Christensen     int i;
17084e400768SDavid Christensen 
17094e400768SDavid Christensen     /* save queue statistics */
17104e400768SDavid Christensen     for (i = 0; i < sc->num_queues; i++) {
17114e400768SDavid Christensen         struct bxe_fastpath *fp = &sc->fp[i];
17124e400768SDavid Christensen         struct bxe_eth_q_stats *qstats = &fp->eth_q_stats;
17134e400768SDavid Christensen         struct bxe_eth_q_stats_old *qstats_old = &fp->eth_q_stats_old;
17144e400768SDavid Christensen 
17154e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_unicast_bytes_received_hi);
17164e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_unicast_bytes_received_lo);
17174e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_broadcast_bytes_received_hi);
17184e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_broadcast_bytes_received_lo);
17194e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_multicast_bytes_received_hi);
17204e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_multicast_bytes_received_lo);
17214e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_unicast_bytes_transmitted_hi);
17224e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_unicast_bytes_transmitted_lo);
17234e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_broadcast_bytes_transmitted_hi);
17244e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_broadcast_bytes_transmitted_lo);
17254e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_multicast_bytes_transmitted_hi);
17264e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_multicast_bytes_transmitted_lo);
17274e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_tpa_bytes_hi);
17284e400768SDavid Christensen         UPDATE_QSTAT_OLD(total_tpa_bytes_lo);
17294e400768SDavid Christensen     }
17304e400768SDavid Christensen 
17314e400768SDavid Christensen     /* save net_device_stats statistics */
1732*717568adSMarcel Moolenaar     sc->net_stats_old.rx_dropped = if_getiqdrops(sc->ifp);
17334e400768SDavid Christensen 
17344e400768SDavid Christensen     /* store port firmware statistics */
17354e400768SDavid Christensen     if (sc->port.pmf) {
17364e400768SDavid Christensen         struct bxe_eth_stats *estats = &sc->eth_stats;
17374e400768SDavid Christensen         struct bxe_fw_port_stats_old *fwstats = &sc->fw_stats_old;
17384e400768SDavid Christensen         struct host_port_stats *pstats = BXE_SP(sc, port_stats);
17394e400768SDavid Christensen 
17404e400768SDavid Christensen         fwstats->pfc_frames_rx_hi = pstats->pfc_frames_rx_hi;
17414e400768SDavid Christensen         fwstats->pfc_frames_rx_lo = pstats->pfc_frames_rx_lo;
17424e400768SDavid Christensen         fwstats->pfc_frames_tx_hi = pstats->pfc_frames_tx_hi;
17434e400768SDavid Christensen         fwstats->pfc_frames_tx_lo = pstats->pfc_frames_tx_lo;
17444e400768SDavid Christensen 
17454e400768SDavid Christensen         if (IS_MF(sc)) {
17464e400768SDavid Christensen             UPDATE_FW_STAT_OLD(mac_filter_discard);
17474e400768SDavid Christensen             UPDATE_FW_STAT_OLD(mf_tag_discard);
17484e400768SDavid Christensen             UPDATE_FW_STAT_OLD(brb_truncate_discard);
17494e400768SDavid Christensen             UPDATE_FW_STAT_OLD(mac_discard);
17504e400768SDavid Christensen         }
17514e400768SDavid Christensen     }
17524e400768SDavid Christensen }
17534e400768SDavid Christensen 
17544e400768SDavid Christensen void
17554e400768SDavid Christensen bxe_afex_collect_stats(struct bxe_softc *sc,
17564e400768SDavid Christensen                        void             *void_afex_stats,
17574e400768SDavid Christensen                        uint32_t         stats_type)
17584e400768SDavid Christensen {
17594e400768SDavid Christensen     int i;
17604e400768SDavid Christensen     struct afex_stats *afex_stats = (struct afex_stats *)void_afex_stats;
17614e400768SDavid Christensen     struct bxe_eth_stats *estats = &sc->eth_stats;
17624e400768SDavid Christensen #if 0
17634e400768SDavid Christensen     struct per_queue_stats *fcoe_q_stats =
17644e400768SDavid Christensen         &sc->fw_stats_data->queue_stats[FCOE_IDX(sc)];
17654e400768SDavid Christensen 
17664e400768SDavid Christensen     struct tstorm_per_queue_stats *fcoe_q_tstorm_stats =
17674e400768SDavid Christensen         &fcoe_q_stats->tstorm_queue_statistics;
17684e400768SDavid Christensen 
17694e400768SDavid Christensen     struct ustorm_per_queue_stats *fcoe_q_ustorm_stats =
17704e400768SDavid Christensen         &fcoe_q_stats->ustorm_queue_statistics;
17714e400768SDavid Christensen 
17724e400768SDavid Christensen     struct xstorm_per_queue_stats *fcoe_q_xstorm_stats =
17734e400768SDavid Christensen         &fcoe_q_stats->xstorm_queue_statistics;
17744e400768SDavid Christensen 
17754e400768SDavid Christensen     struct fcoe_statistics_params *fw_fcoe_stat =
17764e400768SDavid Christensen         &sc->fw_stats_data->fcoe;
17774e400768SDavid Christensen #endif
17784e400768SDavid Christensen 
17794e400768SDavid Christensen     memset(afex_stats, 0, sizeof(struct afex_stats));
17804e400768SDavid Christensen 
17814e400768SDavid Christensen     for (i = 0; i < sc->num_queues; i++) {
17824e400768SDavid Christensen         struct bxe_eth_q_stats *qstats = &sc->fp[i].eth_q_stats;
17834e400768SDavid Christensen 
17844e400768SDavid Christensen         ADD_64(afex_stats->rx_unicast_bytes_hi,
17854e400768SDavid Christensen                qstats->total_unicast_bytes_received_hi,
17864e400768SDavid Christensen                afex_stats->rx_unicast_bytes_lo,
17874e400768SDavid Christensen                qstats->total_unicast_bytes_received_lo);
17884e400768SDavid Christensen 
17894e400768SDavid Christensen         ADD_64(afex_stats->rx_broadcast_bytes_hi,
17904e400768SDavid Christensen                qstats->total_broadcast_bytes_received_hi,
17914e400768SDavid Christensen                afex_stats->rx_broadcast_bytes_lo,
17924e400768SDavid Christensen                qstats->total_broadcast_bytes_received_lo);
17934e400768SDavid Christensen 
17944e400768SDavid Christensen         ADD_64(afex_stats->rx_multicast_bytes_hi,
17954e400768SDavid Christensen                qstats->total_multicast_bytes_received_hi,
17964e400768SDavid Christensen                afex_stats->rx_multicast_bytes_lo,
17974e400768SDavid Christensen                qstats->total_multicast_bytes_received_lo);
17984e400768SDavid Christensen 
17994e400768SDavid Christensen         ADD_64(afex_stats->rx_unicast_frames_hi,
18004e400768SDavid Christensen                qstats->total_unicast_packets_received_hi,
18014e400768SDavid Christensen                afex_stats->rx_unicast_frames_lo,
18024e400768SDavid Christensen                qstats->total_unicast_packets_received_lo);
18034e400768SDavid Christensen 
18044e400768SDavid Christensen         ADD_64(afex_stats->rx_broadcast_frames_hi,
18054e400768SDavid Christensen                qstats->total_broadcast_packets_received_hi,
18064e400768SDavid Christensen                afex_stats->rx_broadcast_frames_lo,
18074e400768SDavid Christensen                qstats->total_broadcast_packets_received_lo);
18084e400768SDavid Christensen 
18094e400768SDavid Christensen         ADD_64(afex_stats->rx_multicast_frames_hi,
18104e400768SDavid Christensen                qstats->total_multicast_packets_received_hi,
18114e400768SDavid Christensen                afex_stats->rx_multicast_frames_lo,
18124e400768SDavid Christensen                qstats->total_multicast_packets_received_lo);
18134e400768SDavid Christensen 
18144e400768SDavid Christensen         /*
18154e400768SDavid Christensen          * sum to rx_frames_discarded all discarded
18164e400768SDavid Christensen          * packets due to size, ttl0 and checksum
18174e400768SDavid Christensen          */
18184e400768SDavid Christensen         ADD_64(afex_stats->rx_frames_discarded_hi,
18194e400768SDavid Christensen                qstats->total_packets_received_checksum_discarded_hi,
18204e400768SDavid Christensen                afex_stats->rx_frames_discarded_lo,
18214e400768SDavid Christensen                qstats->total_packets_received_checksum_discarded_lo);
18224e400768SDavid Christensen 
18234e400768SDavid Christensen         ADD_64(afex_stats->rx_frames_discarded_hi,
18244e400768SDavid Christensen                qstats->total_packets_received_ttl0_discarded_hi,
18254e400768SDavid Christensen                afex_stats->rx_frames_discarded_lo,
18264e400768SDavid Christensen                qstats->total_packets_received_ttl0_discarded_lo);
18274e400768SDavid Christensen 
18284e400768SDavid Christensen         ADD_64(afex_stats->rx_frames_discarded_hi,
18294e400768SDavid Christensen                qstats->etherstatsoverrsizepkts_hi,
18304e400768SDavid Christensen                afex_stats->rx_frames_discarded_lo,
18314e400768SDavid Christensen                qstats->etherstatsoverrsizepkts_lo);
18324e400768SDavid Christensen 
18334e400768SDavid Christensen         ADD_64(afex_stats->rx_frames_dropped_hi,
18344e400768SDavid Christensen                qstats->no_buff_discard_hi,
18354e400768SDavid Christensen                afex_stats->rx_frames_dropped_lo,
18364e400768SDavid Christensen                qstats->no_buff_discard_lo);
18374e400768SDavid Christensen 
18384e400768SDavid Christensen         ADD_64(afex_stats->tx_unicast_bytes_hi,
18394e400768SDavid Christensen                qstats->total_unicast_bytes_transmitted_hi,
18404e400768SDavid Christensen                afex_stats->tx_unicast_bytes_lo,
18414e400768SDavid Christensen                qstats->total_unicast_bytes_transmitted_lo);
18424e400768SDavid Christensen 
18434e400768SDavid Christensen         ADD_64(afex_stats->tx_broadcast_bytes_hi,
18444e400768SDavid Christensen                qstats->total_broadcast_bytes_transmitted_hi,
18454e400768SDavid Christensen                afex_stats->tx_broadcast_bytes_lo,
18464e400768SDavid Christensen                qstats->total_broadcast_bytes_transmitted_lo);
18474e400768SDavid Christensen 
18484e400768SDavid Christensen         ADD_64(afex_stats->tx_multicast_bytes_hi,
18494e400768SDavid Christensen                qstats->total_multicast_bytes_transmitted_hi,
18504e400768SDavid Christensen                afex_stats->tx_multicast_bytes_lo,
18514e400768SDavid Christensen                qstats->total_multicast_bytes_transmitted_lo);
18524e400768SDavid Christensen 
18534e400768SDavid Christensen         ADD_64(afex_stats->tx_unicast_frames_hi,
18544e400768SDavid Christensen                qstats->total_unicast_packets_transmitted_hi,
18554e400768SDavid Christensen                afex_stats->tx_unicast_frames_lo,
18564e400768SDavid Christensen                qstats->total_unicast_packets_transmitted_lo);
18574e400768SDavid Christensen 
18584e400768SDavid Christensen         ADD_64(afex_stats->tx_broadcast_frames_hi,
18594e400768SDavid Christensen                qstats->total_broadcast_packets_transmitted_hi,
18604e400768SDavid Christensen                afex_stats->tx_broadcast_frames_lo,
18614e400768SDavid Christensen                qstats->total_broadcast_packets_transmitted_lo);
18624e400768SDavid Christensen 
18634e400768SDavid Christensen         ADD_64(afex_stats->tx_multicast_frames_hi,
18644e400768SDavid Christensen                qstats->total_multicast_packets_transmitted_hi,
18654e400768SDavid Christensen                afex_stats->tx_multicast_frames_lo,
18664e400768SDavid Christensen                qstats->total_multicast_packets_transmitted_lo);
18674e400768SDavid Christensen 
18684e400768SDavid Christensen         ADD_64(afex_stats->tx_frames_dropped_hi,
18694e400768SDavid Christensen                qstats->total_transmitted_dropped_packets_error_hi,
18704e400768SDavid Christensen                afex_stats->tx_frames_dropped_lo,
18714e400768SDavid Christensen                qstats->total_transmitted_dropped_packets_error_lo);
18724e400768SDavid Christensen     }
18734e400768SDavid Christensen 
18744e400768SDavid Christensen #if 0
18754e400768SDavid Christensen     /*
18764e400768SDavid Christensen      * Now add FCoE statistics which are collected separately
18774e400768SDavid Christensen      * (both offloaded and non offloaded)
18784e400768SDavid Christensen      */
18794e400768SDavid Christensen     if (!NO_FCOE(sc)) {
18804e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_unicast_bytes_hi,
18814e400768SDavid Christensen                   LE32_0,
18824e400768SDavid Christensen                   afex_stats->rx_unicast_bytes_lo,
18834e400768SDavid Christensen                   fw_fcoe_stat->rx_stat0.fcoe_rx_byte_cnt);
18844e400768SDavid Christensen 
18854e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_unicast_bytes_hi,
18864e400768SDavid Christensen                   fcoe_q_tstorm_stats->rcv_ucast_bytes.hi,
18874e400768SDavid Christensen                   afex_stats->rx_unicast_bytes_lo,
18884e400768SDavid Christensen                   fcoe_q_tstorm_stats->rcv_ucast_bytes.lo);
18894e400768SDavid Christensen 
18904e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_broadcast_bytes_hi,
18914e400768SDavid Christensen                   fcoe_q_tstorm_stats->rcv_bcast_bytes.hi,
18924e400768SDavid Christensen                   afex_stats->rx_broadcast_bytes_lo,
18934e400768SDavid Christensen                   fcoe_q_tstorm_stats->rcv_bcast_bytes.lo);
18944e400768SDavid Christensen 
18954e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_multicast_bytes_hi,
18964e400768SDavid Christensen                   fcoe_q_tstorm_stats->rcv_mcast_bytes.hi,
18974e400768SDavid Christensen                   afex_stats->rx_multicast_bytes_lo,
18984e400768SDavid Christensen                   fcoe_q_tstorm_stats->rcv_mcast_bytes.lo);
18994e400768SDavid Christensen 
19004e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_unicast_frames_hi,
19014e400768SDavid Christensen                   LE32_0,
19024e400768SDavid Christensen                   afex_stats->rx_unicast_frames_lo,
19034e400768SDavid Christensen                   fw_fcoe_stat->rx_stat0.fcoe_rx_pkt_cnt);
19044e400768SDavid Christensen 
19054e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_unicast_frames_hi,
19064e400768SDavid Christensen                   LE32_0,
19074e400768SDavid Christensen                   afex_stats->rx_unicast_frames_lo,
19084e400768SDavid Christensen                   fcoe_q_tstorm_stats->rcv_ucast_pkts);
19094e400768SDavid Christensen 
19104e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_broadcast_frames_hi,
19114e400768SDavid Christensen                   LE32_0,
19124e400768SDavid Christensen                   afex_stats->rx_broadcast_frames_lo,
19134e400768SDavid Christensen                   fcoe_q_tstorm_stats->rcv_bcast_pkts);
19144e400768SDavid Christensen 
19154e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_multicast_frames_hi,
19164e400768SDavid Christensen                   LE32_0,
19174e400768SDavid Christensen                   afex_stats->rx_multicast_frames_lo,
19184e400768SDavid Christensen                   fcoe_q_tstorm_stats->rcv_ucast_pkts);
19194e400768SDavid Christensen 
19204e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_frames_discarded_hi,
19214e400768SDavid Christensen                   LE32_0,
19224e400768SDavid Christensen                   afex_stats->rx_frames_discarded_lo,
19234e400768SDavid Christensen                   fcoe_q_tstorm_stats->checksum_discard);
19244e400768SDavid Christensen 
19254e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_frames_discarded_hi,
19264e400768SDavid Christensen                   LE32_0,
19274e400768SDavid Christensen                   afex_stats->rx_frames_discarded_lo,
19284e400768SDavid Christensen                   fcoe_q_tstorm_stats->pkts_too_big_discard);
19294e400768SDavid Christensen 
19304e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_frames_discarded_hi,
19314e400768SDavid Christensen                   LE32_0,
19324e400768SDavid Christensen                   afex_stats->rx_frames_discarded_lo,
19334e400768SDavid Christensen                   fcoe_q_tstorm_stats->ttl0_discard);
19344e400768SDavid Christensen 
19354e400768SDavid Christensen         ADD_64_LE16(afex_stats->rx_frames_dropped_hi,
19364e400768SDavid Christensen                     LE16_0,
19374e400768SDavid Christensen                     afex_stats->rx_frames_dropped_lo,
19384e400768SDavid Christensen                     fcoe_q_tstorm_stats->no_buff_discard);
19394e400768SDavid Christensen 
19404e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_frames_dropped_hi,
19414e400768SDavid Christensen                   LE32_0,
19424e400768SDavid Christensen                   afex_stats->rx_frames_dropped_lo,
19434e400768SDavid Christensen                   fcoe_q_ustorm_stats->ucast_no_buff_pkts);
19444e400768SDavid Christensen 
19454e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_frames_dropped_hi,
19464e400768SDavid Christensen                   LE32_0,
19474e400768SDavid Christensen                   afex_stats->rx_frames_dropped_lo,
19484e400768SDavid Christensen                   fcoe_q_ustorm_stats->mcast_no_buff_pkts);
19494e400768SDavid Christensen 
19504e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_frames_dropped_hi,
19514e400768SDavid Christensen                   LE32_0,
19524e400768SDavid Christensen                   afex_stats->rx_frames_dropped_lo,
19534e400768SDavid Christensen                   fcoe_q_ustorm_stats->bcast_no_buff_pkts);
19544e400768SDavid Christensen 
19554e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_frames_dropped_hi,
19564e400768SDavid Christensen                   LE32_0,
19574e400768SDavid Christensen                   afex_stats->rx_frames_dropped_lo,
19584e400768SDavid Christensen                   fw_fcoe_stat->rx_stat1.fcoe_rx_drop_pkt_cnt);
19594e400768SDavid Christensen 
19604e400768SDavid Christensen         ADD_64_LE(afex_stats->rx_frames_dropped_hi,
19614e400768SDavid Christensen                   LE32_0,
19624e400768SDavid Christensen                   afex_stats->rx_frames_dropped_lo,
19634e400768SDavid Christensen                   fw_fcoe_stat->rx_stat2.fcoe_rx_drop_pkt_cnt);
19644e400768SDavid Christensen 
19654e400768SDavid Christensen         ADD_64_LE(afex_stats->tx_unicast_bytes_hi,
19664e400768SDavid Christensen                   LE32_0,
19674e400768SDavid Christensen                   afex_stats->tx_unicast_bytes_lo,
19684e400768SDavid Christensen                   fw_fcoe_stat->tx_stat.fcoe_tx_byte_cnt);
19694e400768SDavid Christensen 
19704e400768SDavid Christensen         ADD_64_LE(afex_stats->tx_unicast_bytes_hi,
19714e400768SDavid Christensen                   fcoe_q_xstorm_stats->ucast_bytes_sent.hi,
19724e400768SDavid Christensen                   afex_stats->tx_unicast_bytes_lo,
19734e400768SDavid Christensen                   fcoe_q_xstorm_stats->ucast_bytes_sent.lo);
19744e400768SDavid Christensen 
19754e400768SDavid Christensen         ADD_64_LE(afex_stats->tx_broadcast_bytes_hi,
19764e400768SDavid Christensen                   fcoe_q_xstorm_stats->bcast_bytes_sent.hi,
19774e400768SDavid Christensen                   afex_stats->tx_broadcast_bytes_lo,
19784e400768SDavid Christensen                   fcoe_q_xstorm_stats->bcast_bytes_sent.lo);
19794e400768SDavid Christensen 
19804e400768SDavid Christensen         ADD_64_LE(afex_stats->tx_multicast_bytes_hi,
19814e400768SDavid Christensen                   fcoe_q_xstorm_stats->mcast_bytes_sent.hi,
19824e400768SDavid Christensen                   afex_stats->tx_multicast_bytes_lo,
19834e400768SDavid Christensen                   fcoe_q_xstorm_stats->mcast_bytes_sent.lo);
19844e400768SDavid Christensen 
19854e400768SDavid Christensen         ADD_64_LE(afex_stats->tx_unicast_frames_hi,
19864e400768SDavid Christensen                   LE32_0,
19874e400768SDavid Christensen                   afex_stats->tx_unicast_frames_lo,
19884e400768SDavid Christensen                   fw_fcoe_stat->tx_stat.fcoe_tx_pkt_cnt);
19894e400768SDavid Christensen 
19904e400768SDavid Christensen         ADD_64_LE(afex_stats->tx_unicast_frames_hi,
19914e400768SDavid Christensen                   LE32_0,
19924e400768SDavid Christensen                   afex_stats->tx_unicast_frames_lo,
19934e400768SDavid Christensen                   fcoe_q_xstorm_stats->ucast_pkts_sent);
19944e400768SDavid Christensen 
19954e400768SDavid Christensen         ADD_64_LE(afex_stats->tx_broadcast_frames_hi,
19964e400768SDavid Christensen                   LE32_0,
19974e400768SDavid Christensen                   afex_stats->tx_broadcast_frames_lo,
19984e400768SDavid Christensen                   fcoe_q_xstorm_stats->bcast_pkts_sent);
19994e400768SDavid Christensen 
20004e400768SDavid Christensen         ADD_64_LE(afex_stats->tx_multicast_frames_hi,
20014e400768SDavid Christensen                   LE32_0,
20024e400768SDavid Christensen                   afex_stats->tx_multicast_frames_lo,
20034e400768SDavid Christensen                   fcoe_q_xstorm_stats->mcast_pkts_sent);
20044e400768SDavid Christensen 
20054e400768SDavid Christensen         ADD_64_LE(afex_stats->tx_frames_dropped_hi,
20064e400768SDavid Christensen                   LE32_0,
20074e400768SDavid Christensen                   afex_stats->tx_frames_dropped_lo,
20084e400768SDavid Christensen                   fcoe_q_xstorm_stats->error_drop_pkts);
20094e400768SDavid Christensen     }
20104e400768SDavid Christensen #endif
20114e400768SDavid Christensen 
20124e400768SDavid Christensen     /*
20134e400768SDavid Christensen      * If port stats are requested, add them to the PMF
20144e400768SDavid Christensen      * stats, as anyway they will be accumulated by the
20154e400768SDavid Christensen      * MCP before sent to the switch
20164e400768SDavid Christensen      */
20174e400768SDavid Christensen     if ((sc->port.pmf) && (stats_type == VICSTATST_UIF_INDEX)) {
20184e400768SDavid Christensen         ADD_64(afex_stats->rx_frames_dropped_hi,
20194e400768SDavid Christensen                0,
20204e400768SDavid Christensen                afex_stats->rx_frames_dropped_lo,
20214e400768SDavid Christensen                estats->mac_filter_discard);
20224e400768SDavid Christensen         ADD_64(afex_stats->rx_frames_dropped_hi,
20234e400768SDavid Christensen                0,
20244e400768SDavid Christensen                afex_stats->rx_frames_dropped_lo,
20254e400768SDavid Christensen                estats->brb_truncate_discard);
20264e400768SDavid Christensen         ADD_64(afex_stats->rx_frames_discarded_hi,
20274e400768SDavid Christensen                0,
20284e400768SDavid Christensen                afex_stats->rx_frames_discarded_lo,
20294e400768SDavid Christensen                estats->mac_discard);
20304e400768SDavid Christensen     }
20314e400768SDavid Christensen }
20324e400768SDavid Christensen 
2033