net/qede/base: fix for adapter specific stats
authorRasesh Mody <rasesh.mody@cavium.com>
Mon, 24 Jul 2017 10:19:04 +0000 (03:19 -0700)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 31 Jul 2017 17:58:41 +0000 (19:58 +0200)
Handle different MAC statistic fields between two chip variants by
reading the MAC counters from the adapter suitable statistics bins.

Fixes: ec94dbc57362 ("qede: add base driver")
Cc: stable@dpdk.org
Signed-off-by: Rasesh Mody <rasesh.mody@cavium.com>
drivers/net/qede/base/bcm_osal.c
drivers/net/qede/base/ecore_dev_api.h
drivers/net/qede/base/ecore_l2.c
drivers/net/qede/base/mcp_public.h
drivers/net/qede/qede_ethdev.c

index 968fb76..2603a8b 100644 (file)
@@ -249,8 +249,11 @@ qede_get_mcp_proto_stats(struct ecore_dev *edev,
 
        if (type == ECORE_MCP_LAN_STATS) {
                ecore_get_vport_stats(edev, &lan_stats);
-               stats->lan_stats.ucast_rx_pkts = lan_stats.rx_ucast_pkts;
-               stats->lan_stats.ucast_tx_pkts = lan_stats.tx_ucast_pkts;
+
+               /* @DPDK */
+               stats->lan_stats.ucast_rx_pkts = lan_stats.common.rx_ucast_pkts;
+               stats->lan_stats.ucast_tx_pkts = lan_stats.common.tx_ucast_pkts;
+
                stats->lan_stats.fcs_err = -1;
        } else {
                DP_INFO(edev, "Statistics request type %d not supported\n",
index eea22e0..9126cf9 100644 (file)
@@ -241,7 +241,7 @@ void ecore_ptt_release(struct ecore_hwfn *p_hwfn,
                       struct ecore_ptt *p_ptt);
 
 #ifndef __EXTRACT__LINUX__
-struct ecore_eth_stats {
+struct ecore_eth_stats_common {
        u64 no_buff_discards;
        u64 packet_too_big_discard;
        u64 ttl0_discard;
@@ -273,11 +273,6 @@ struct ecore_eth_stats {
        u64 rx_256_to_511_byte_packets;
        u64 rx_512_to_1023_byte_packets;
        u64 rx_1024_to_1518_byte_packets;
-       u64 rx_1519_to_1522_byte_packets;
-       u64 rx_1519_to_2047_byte_packets;
-       u64 rx_2048_to_4095_byte_packets;
-       u64 rx_4096_to_9216_byte_packets;
-       u64 rx_9217_to_16383_byte_packets;
        u64 rx_crc_errors;
        u64 rx_mac_crtl_frames;
        u64 rx_pause_frames;
@@ -294,14 +289,8 @@ struct ecore_eth_stats {
        u64 tx_256_to_511_byte_packets;
        u64 tx_512_to_1023_byte_packets;
        u64 tx_1024_to_1518_byte_packets;
-       u64 tx_1519_to_2047_byte_packets;
-       u64 tx_2048_to_4095_byte_packets;
-       u64 tx_4096_to_9216_byte_packets;
-       u64 tx_9217_to_16383_byte_packets;
        u64 tx_pause_frames;
        u64 tx_pfc_frames;
-       u64 tx_lpi_entry_count;
-       u64 tx_total_collisions;
        u64 brb_truncates;
        u64 brb_discards;
        u64 rx_mac_bytes;
@@ -315,6 +304,33 @@ struct ecore_eth_stats {
        u64 tx_mac_bc_packets;
        u64 tx_mac_ctrl_frames;
 };
+
+struct ecore_eth_stats_bb {
+       u64 rx_1519_to_1522_byte_packets;
+       u64 rx_1519_to_2047_byte_packets;
+       u64 rx_2048_to_4095_byte_packets;
+       u64 rx_4096_to_9216_byte_packets;
+       u64 rx_9217_to_16383_byte_packets;
+       u64 tx_1519_to_2047_byte_packets;
+       u64 tx_2048_to_4095_byte_packets;
+       u64 tx_4096_to_9216_byte_packets;
+       u64 tx_9217_to_16383_byte_packets;
+       u64 tx_lpi_entry_count;
+       u64 tx_total_collisions;
+};
+
+struct ecore_eth_stats_ah {
+       u64 rx_1519_to_max_byte_packets;
+       u64 tx_1519_to_max_byte_packets;
+};
+
+struct ecore_eth_stats {
+       struct ecore_eth_stats_common common;
+       union {
+               struct ecore_eth_stats_bb bb;
+               struct ecore_eth_stats_ah ah;
+       };
+};
 #endif
 
 enum ecore_dmae_address_type_t {
index 4ab8fd5..e58b8fa 100644 (file)
@@ -1714,13 +1714,20 @@ static void __ecore_get_vport_pstats(struct ecore_hwfn *p_hwfn,
        OSAL_MEMSET(&pstats, 0, sizeof(pstats));
        ecore_memcpy_from(p_hwfn, p_ptt, &pstats, pstats_addr, pstats_len);
 
-       p_stats->tx_ucast_bytes += HILO_64_REGPAIR(pstats.sent_ucast_bytes);
-       p_stats->tx_mcast_bytes += HILO_64_REGPAIR(pstats.sent_mcast_bytes);
-       p_stats->tx_bcast_bytes += HILO_64_REGPAIR(pstats.sent_bcast_bytes);
-       p_stats->tx_ucast_pkts += HILO_64_REGPAIR(pstats.sent_ucast_pkts);
-       p_stats->tx_mcast_pkts += HILO_64_REGPAIR(pstats.sent_mcast_pkts);
-       p_stats->tx_bcast_pkts += HILO_64_REGPAIR(pstats.sent_bcast_pkts);
-       p_stats->tx_err_drop_pkts += HILO_64_REGPAIR(pstats.error_drop_pkts);
+       p_stats->common.tx_ucast_bytes +=
+               HILO_64_REGPAIR(pstats.sent_ucast_bytes);
+       p_stats->common.tx_mcast_bytes +=
+               HILO_64_REGPAIR(pstats.sent_mcast_bytes);
+       p_stats->common.tx_bcast_bytes +=
+               HILO_64_REGPAIR(pstats.sent_bcast_bytes);
+       p_stats->common.tx_ucast_pkts +=
+               HILO_64_REGPAIR(pstats.sent_ucast_pkts);
+       p_stats->common.tx_mcast_pkts +=
+               HILO_64_REGPAIR(pstats.sent_mcast_pkts);
+       p_stats->common.tx_bcast_pkts +=
+               HILO_64_REGPAIR(pstats.sent_bcast_pkts);
+       p_stats->common.tx_err_drop_pkts +=
+               HILO_64_REGPAIR(pstats.error_drop_pkts);
 }
 
 static void __ecore_get_vport_tstats(struct ecore_hwfn *p_hwfn,
@@ -1746,10 +1753,10 @@ static void __ecore_get_vport_tstats(struct ecore_hwfn *p_hwfn,
        OSAL_MEMSET(&tstats, 0, sizeof(tstats));
        ecore_memcpy_from(p_hwfn, p_ptt, &tstats, tstats_addr, tstats_len);
 
-       p_stats->mftag_filter_discards +=
-           HILO_64_REGPAIR(tstats.mftag_filter_discard);
-       p_stats->mac_filter_discards +=
-           HILO_64_REGPAIR(tstats.eth_mac_filter_discard);
+       p_stats->common.mftag_filter_discards +=
+               HILO_64_REGPAIR(tstats.mftag_filter_discard);
+       p_stats->common.mac_filter_discards +=
+               HILO_64_REGPAIR(tstats.eth_mac_filter_discard);
 }
 
 static void __ecore_get_vport_ustats_addrlen(struct ecore_hwfn *p_hwfn,
@@ -1783,12 +1790,18 @@ static void __ecore_get_vport_ustats(struct ecore_hwfn *p_hwfn,
        OSAL_MEMSET(&ustats, 0, sizeof(ustats));
        ecore_memcpy_from(p_hwfn, p_ptt, &ustats, ustats_addr, ustats_len);
 
-       p_stats->rx_ucast_bytes += HILO_64_REGPAIR(ustats.rcv_ucast_bytes);
-       p_stats->rx_mcast_bytes += HILO_64_REGPAIR(ustats.rcv_mcast_bytes);
-       p_stats->rx_bcast_bytes += HILO_64_REGPAIR(ustats.rcv_bcast_bytes);
-       p_stats->rx_ucast_pkts += HILO_64_REGPAIR(ustats.rcv_ucast_pkts);
-       p_stats->rx_mcast_pkts += HILO_64_REGPAIR(ustats.rcv_mcast_pkts);
-       p_stats->rx_bcast_pkts += HILO_64_REGPAIR(ustats.rcv_bcast_pkts);
+       p_stats->common.rx_ucast_bytes +=
+               HILO_64_REGPAIR(ustats.rcv_ucast_bytes);
+       p_stats->common.rx_mcast_bytes +=
+               HILO_64_REGPAIR(ustats.rcv_mcast_bytes);
+       p_stats->common.rx_bcast_bytes +=
+               HILO_64_REGPAIR(ustats.rcv_bcast_bytes);
+       p_stats->common.rx_ucast_pkts +=
+               HILO_64_REGPAIR(ustats.rcv_ucast_pkts);
+       p_stats->common.rx_mcast_pkts +=
+               HILO_64_REGPAIR(ustats.rcv_mcast_pkts);
+       p_stats->common.rx_bcast_pkts +=
+               HILO_64_REGPAIR(ustats.rcv_bcast_pkts);
 }
 
 static void __ecore_get_vport_mstats_addrlen(struct ecore_hwfn *p_hwfn,
@@ -1822,23 +1835,27 @@ static void __ecore_get_vport_mstats(struct ecore_hwfn *p_hwfn,
        OSAL_MEMSET(&mstats, 0, sizeof(mstats));
        ecore_memcpy_from(p_hwfn, p_ptt, &mstats, mstats_addr, mstats_len);
 
-       p_stats->no_buff_discards += HILO_64_REGPAIR(mstats.no_buff_discard);
-       p_stats->packet_too_big_discard +=
-           HILO_64_REGPAIR(mstats.packet_too_big_discard);
-       p_stats->ttl0_discard += HILO_64_REGPAIR(mstats.ttl0_discard);
-       p_stats->tpa_coalesced_pkts +=
-           HILO_64_REGPAIR(mstats.tpa_coalesced_pkts);
-       p_stats->tpa_coalesced_events +=
-           HILO_64_REGPAIR(mstats.tpa_coalesced_events);
-       p_stats->tpa_aborts_num += HILO_64_REGPAIR(mstats.tpa_aborts_num);
-       p_stats->tpa_coalesced_bytes +=
-           HILO_64_REGPAIR(mstats.tpa_coalesced_bytes);
+       p_stats->common.no_buff_discards +=
+               HILO_64_REGPAIR(mstats.no_buff_discard);
+       p_stats->common.packet_too_big_discard +=
+               HILO_64_REGPAIR(mstats.packet_too_big_discard);
+       p_stats->common.ttl0_discard +=
+               HILO_64_REGPAIR(mstats.ttl0_discard);
+       p_stats->common.tpa_coalesced_pkts +=
+               HILO_64_REGPAIR(mstats.tpa_coalesced_pkts);
+       p_stats->common.tpa_coalesced_events +=
+               HILO_64_REGPAIR(mstats.tpa_coalesced_events);
+       p_stats->common.tpa_aborts_num +=
+               HILO_64_REGPAIR(mstats.tpa_aborts_num);
+       p_stats->common.tpa_coalesced_bytes +=
+               HILO_64_REGPAIR(mstats.tpa_coalesced_bytes);
 }
 
 static void __ecore_get_vport_port_stats(struct ecore_hwfn *p_hwfn,
                                         struct ecore_ptt *p_ptt,
                                         struct ecore_eth_stats *p_stats)
 {
+       struct ecore_eth_stats_common *p_common = &p_stats->common;
        struct port_stats port_stats;
        int j;
 
@@ -1849,54 +1866,75 @@ static void __ecore_get_vport_port_stats(struct ecore_hwfn *p_hwfn,
                          OFFSETOF(struct public_port, stats),
                          sizeof(port_stats));
 
-       p_stats->rx_64_byte_packets += port_stats.eth.r64;
-       p_stats->rx_65_to_127_byte_packets += port_stats.eth.r127;
-       p_stats->rx_128_to_255_byte_packets += port_stats.eth.r255;
-       p_stats->rx_256_to_511_byte_packets += port_stats.eth.r511;
-       p_stats->rx_512_to_1023_byte_packets += port_stats.eth.r1023;
-       p_stats->rx_1024_to_1518_byte_packets += port_stats.eth.r1518;
-       p_stats->rx_1519_to_1522_byte_packets += port_stats.eth.r1522;
-       p_stats->rx_1519_to_2047_byte_packets += port_stats.eth.r2047;
-       p_stats->rx_2048_to_4095_byte_packets += port_stats.eth.r4095;
-       p_stats->rx_4096_to_9216_byte_packets += port_stats.eth.r9216;
-       p_stats->rx_9217_to_16383_byte_packets += port_stats.eth.r16383;
-       p_stats->rx_crc_errors += port_stats.eth.rfcs;
-       p_stats->rx_mac_crtl_frames += port_stats.eth.rxcf;
-       p_stats->rx_pause_frames += port_stats.eth.rxpf;
-       p_stats->rx_pfc_frames += port_stats.eth.rxpp;
-       p_stats->rx_align_errors += port_stats.eth.raln;
-       p_stats->rx_carrier_errors += port_stats.eth.rfcr;
-       p_stats->rx_oversize_packets += port_stats.eth.rovr;
-       p_stats->rx_jabbers += port_stats.eth.rjbr;
-       p_stats->rx_undersize_packets += port_stats.eth.rund;
-       p_stats->rx_fragments += port_stats.eth.rfrg;
-       p_stats->tx_64_byte_packets += port_stats.eth.t64;
-       p_stats->tx_65_to_127_byte_packets += port_stats.eth.t127;
-       p_stats->tx_128_to_255_byte_packets += port_stats.eth.t255;
-       p_stats->tx_256_to_511_byte_packets += port_stats.eth.t511;
-       p_stats->tx_512_to_1023_byte_packets += port_stats.eth.t1023;
-       p_stats->tx_1024_to_1518_byte_packets += port_stats.eth.t1518;
-       p_stats->tx_1519_to_2047_byte_packets += port_stats.eth.t2047;
-       p_stats->tx_2048_to_4095_byte_packets += port_stats.eth.t4095;
-       p_stats->tx_4096_to_9216_byte_packets += port_stats.eth.t9216;
-       p_stats->tx_9217_to_16383_byte_packets += port_stats.eth.t16383;
-       p_stats->tx_pause_frames += port_stats.eth.txpf;
-       p_stats->tx_pfc_frames += port_stats.eth.txpp;
-       p_stats->tx_lpi_entry_count += port_stats.eth.tlpiec;
-       p_stats->tx_total_collisions += port_stats.eth.tncl;
-       p_stats->rx_mac_bytes += port_stats.eth.rbyte;
-       p_stats->rx_mac_uc_packets += port_stats.eth.rxuca;
-       p_stats->rx_mac_mc_packets += port_stats.eth.rxmca;
-       p_stats->rx_mac_bc_packets += port_stats.eth.rxbca;
-       p_stats->rx_mac_frames_ok += port_stats.eth.rxpok;
-       p_stats->tx_mac_bytes += port_stats.eth.tbyte;
-       p_stats->tx_mac_uc_packets += port_stats.eth.txuca;
-       p_stats->tx_mac_mc_packets += port_stats.eth.txmca;
-       p_stats->tx_mac_bc_packets += port_stats.eth.txbca;
-       p_stats->tx_mac_ctrl_frames += port_stats.eth.txcf;
+       p_common->rx_64_byte_packets += port_stats.eth.r64;
+       p_common->rx_65_to_127_byte_packets += port_stats.eth.r127;
+       p_common->rx_128_to_255_byte_packets += port_stats.eth.r255;
+       p_common->rx_256_to_511_byte_packets += port_stats.eth.r511;
+       p_common->rx_512_to_1023_byte_packets += port_stats.eth.r1023;
+       p_common->rx_1024_to_1518_byte_packets += port_stats.eth.r1518;
+       p_common->rx_crc_errors += port_stats.eth.rfcs;
+       p_common->rx_mac_crtl_frames += port_stats.eth.rxcf;
+       p_common->rx_pause_frames += port_stats.eth.rxpf;
+       p_common->rx_pfc_frames += port_stats.eth.rxpp;
+       p_common->rx_align_errors += port_stats.eth.raln;
+       p_common->rx_carrier_errors += port_stats.eth.rfcr;
+       p_common->rx_oversize_packets += port_stats.eth.rovr;
+       p_common->rx_jabbers += port_stats.eth.rjbr;
+       p_common->rx_undersize_packets += port_stats.eth.rund;
+       p_common->rx_fragments += port_stats.eth.rfrg;
+       p_common->tx_64_byte_packets += port_stats.eth.t64;
+       p_common->tx_65_to_127_byte_packets += port_stats.eth.t127;
+       p_common->tx_128_to_255_byte_packets += port_stats.eth.t255;
+       p_common->tx_256_to_511_byte_packets += port_stats.eth.t511;
+       p_common->tx_512_to_1023_byte_packets += port_stats.eth.t1023;
+       p_common->tx_1024_to_1518_byte_packets += port_stats.eth.t1518;
+       p_common->tx_pause_frames += port_stats.eth.txpf;
+       p_common->tx_pfc_frames += port_stats.eth.txpp;
+       p_common->rx_mac_bytes += port_stats.eth.rbyte;
+       p_common->rx_mac_uc_packets += port_stats.eth.rxuca;
+       p_common->rx_mac_mc_packets += port_stats.eth.rxmca;
+       p_common->rx_mac_bc_packets += port_stats.eth.rxbca;
+       p_common->rx_mac_frames_ok += port_stats.eth.rxpok;
+       p_common->tx_mac_bytes += port_stats.eth.tbyte;
+       p_common->tx_mac_uc_packets += port_stats.eth.txuca;
+       p_common->tx_mac_mc_packets += port_stats.eth.txmca;
+       p_common->tx_mac_bc_packets += port_stats.eth.txbca;
+       p_common->tx_mac_ctrl_frames += port_stats.eth.txcf;
        for (j = 0; j < 8; j++) {
-               p_stats->brb_truncates += port_stats.brb.brb_truncate[j];
-               p_stats->brb_discards += port_stats.brb.brb_discard[j];
+               p_common->brb_truncates += port_stats.brb.brb_truncate[j];
+               p_common->brb_discards += port_stats.brb.brb_discard[j];
+       }
+
+       if (ECORE_IS_BB(p_hwfn->p_dev)) {
+               struct ecore_eth_stats_bb *p_bb = &p_stats->bb;
+
+               p_bb->rx_1519_to_1522_byte_packets +=
+                       port_stats.eth.u0.bb0.r1522;
+               p_bb->rx_1519_to_2047_byte_packets +=
+                       port_stats.eth.u0.bb0.r2047;
+               p_bb->rx_2048_to_4095_byte_packets +=
+                       port_stats.eth.u0.bb0.r4095;
+               p_bb->rx_4096_to_9216_byte_packets +=
+                       port_stats.eth.u0.bb0.r9216;
+               p_bb->rx_9217_to_16383_byte_packets +=
+                       port_stats.eth.u0.bb0.r16383;
+               p_bb->tx_1519_to_2047_byte_packets +=
+                       port_stats.eth.u1.bb1.t2047;
+               p_bb->tx_2048_to_4095_byte_packets +=
+                       port_stats.eth.u1.bb1.t4095;
+               p_bb->tx_4096_to_9216_byte_packets +=
+                       port_stats.eth.u1.bb1.t9216;
+               p_bb->tx_9217_to_16383_byte_packets +=
+                       port_stats.eth.u1.bb1.t16383;
+               p_bb->tx_lpi_entry_count += port_stats.eth.u2.bb2.tlpiec;
+               p_bb->tx_total_collisions += port_stats.eth.u2.bb2.tncl;
+       } else {
+               struct ecore_eth_stats_ah *p_ah = &p_stats->ah;
+
+               p_ah->rx_1519_to_max_byte_packets +=
+                       port_stats.eth.u0.ah0.r1519_to_max;
+               p_ah->tx_1519_to_max_byte_packets =
+                       port_stats.eth.u1.ah1.t1519_to_max;
        }
 }
 
index fcf9847..1ad8a96 100644 (file)
@@ -132,13 +132,28 @@ struct eth_stats {
        u64 r1023; /* 0x04 (Offset 0x20 ) RX 512 to 1023 byte frame counter*/
 /* 0x05 (Offset 0x28 ) RX 1024 to 1518 byte frame counter */
        u64 r1518;
+       union {
+               struct { /* bb */
 /* 0x06 (Offset 0x30 ) RX 1519 to 1522 byte VLAN-tagged frame counter */
-       u64 r1522;
-       u64 r2047; /* 0x07 (Offset 0x38 ) RX 1519 to 2047 byte frame counter*/
-       u64 r4095; /* 0x08 (Offset 0x40 ) RX 2048 to 4095 byte frame counter*/
-       u64 r9216; /* 0x09 (Offset 0x48 ) RX 4096 to 9216 byte frame counter*/
+                       u64 r1522;
+/* 0x07 (Offset 0x38 ) RX 1519 to 2047 byte frame counter*/
+                       u64 r2047;
+/* 0x08 (Offset 0x40 ) RX 2048 to 4095 byte frame counter*/
+                       u64 r4095;
+/* 0x09 (Offset 0x48 ) RX 4096 to 9216 byte frame counter*/
+                       u64 r9216;
 /* 0x0A (Offset 0x50 ) RX 9217 to 16383 byte frame counter */
-       u64 r16383;
+                       u64 r16383;
+               } bb0;
+               struct { /* ah */
+                       u64 unused1;
+/* 0x07 (Offset 0x38 ) RX 1519 to max byte frame counter*/
+                       u64 r1519_to_max;
+                       u64 unused2;
+                       u64 unused3;
+                       u64 unused4;
+               } ah0;
+       } u0;
        u64 rfcs;       /* 0x0F (Offset 0x58 ) RX FCS error frame counter*/
        u64 rxcf;       /* 0x10 (Offset 0x60 ) RX control frame counter*/
        u64 rxpf;       /* 0x11 (Offset 0x68 ) RX pause frame counter*/
@@ -156,19 +171,40 @@ struct eth_stats {
        u64 t1023; /* 0x44 (Offset 0xc8 ) TX 512 to 1023 byte frame counter*/
 /* 0x45 (Offset 0xd0 ) TX 1024 to 1518 byte frame counter */
        u64 t1518;
+       union {
+               struct { /* bb */
 /* 0x47 (Offset 0xd8 ) TX 1519 to 2047 byte frame counter */
-       u64 t2047;
+                       u64 t2047;
 /* 0x48 (Offset 0xe0 ) TX 2048 to 4095 byte frame counter */
-       u64 t4095;
+                       u64 t4095;
 /* 0x49 (Offset 0xe8 ) TX 4096 to 9216 byte frame counter */
-       u64 t9216;
+                       u64 t9216;
 /* 0x4A (Offset 0xf0 ) TX 9217 to 16383 byte frame counter */
-       u64 t16383;
+                       u64 t16383;
+               } bb1;
+               struct { /* ah */
+/* 0x47 (Offset 0xd8 ) TX 1519 to max byte frame counter */
+                       u64 t1519_to_max;
+                       u64 unused6;
+                       u64 unused7;
+                       u64 unused8;
+               } ah1;
+       } u1;
        u64 txpf;       /* 0x50 (Offset 0xf8 ) TX pause frame counter */
        u64 txpp;       /* 0x51 (Offset 0x100) TX PFC frame counter */
 /* 0x6C (Offset 0x108) Transmit Logical Type LLFC message counter */
-       u64 tlpiec;
-       u64 tncl; /* 0x6E (Offset 0x110) Transmit Total Collision Counter */
+       union {
+               struct { /* bb */
+/* 0x6C (Offset 0x108) Transmit Logical Type LLFC message counter */
+                       u64 tlpiec;
+/* 0x6E (Offset 0x110) Transmit Total Collision Counter */
+                       u64 tncl;
+               } bb2;
+               struct { /* ah */
+                       u64 unused9;
+                       u64 unused10;
+               } ah2;
+       } u2;
        u64 rbyte;      /* 0x3d (Offset 0x118) RX byte counter */
        u64 rxuca;      /* 0x0c (Offset 0x120) RX UC frame counter */
        u64 rxmca;      /* 0x0d (Offset 0x128) RX MC frame counter */
index a0616a4..ac58ae5 100644 (file)
@@ -125,143 +125,199 @@ struct rte_qede_xstats_name_off {
 };
 
 static const struct rte_qede_xstats_name_off qede_xstats_strings[] = {
-       {"rx_unicast_bytes", offsetof(struct ecore_eth_stats, rx_ucast_bytes)},
+       {"rx_unicast_bytes",
+               offsetof(struct ecore_eth_stats_common, rx_ucast_bytes)},
        {"rx_multicast_bytes",
-               offsetof(struct ecore_eth_stats, rx_mcast_bytes)},
+               offsetof(struct ecore_eth_stats_common, rx_mcast_bytes)},
        {"rx_broadcast_bytes",
-               offsetof(struct ecore_eth_stats, rx_bcast_bytes)},
-       {"rx_unicast_packets", offsetof(struct ecore_eth_stats, rx_ucast_pkts)},
+               offsetof(struct ecore_eth_stats_common, rx_bcast_bytes)},
+       {"rx_unicast_packets",
+               offsetof(struct ecore_eth_stats_common, rx_ucast_pkts)},
        {"rx_multicast_packets",
-               offsetof(struct ecore_eth_stats, rx_mcast_pkts)},
+               offsetof(struct ecore_eth_stats_common, rx_mcast_pkts)},
        {"rx_broadcast_packets",
-               offsetof(struct ecore_eth_stats, rx_bcast_pkts)},
+               offsetof(struct ecore_eth_stats_common, rx_bcast_pkts)},
 
-       {"tx_unicast_bytes", offsetof(struct ecore_eth_stats, tx_ucast_bytes)},
+       {"tx_unicast_bytes",
+               offsetof(struct ecore_eth_stats_common, tx_ucast_bytes)},
        {"tx_multicast_bytes",
-               offsetof(struct ecore_eth_stats, tx_mcast_bytes)},
+               offsetof(struct ecore_eth_stats_common, tx_mcast_bytes)},
        {"tx_broadcast_bytes",
-               offsetof(struct ecore_eth_stats, tx_bcast_bytes)},
-       {"tx_unicast_packets", offsetof(struct ecore_eth_stats, tx_ucast_pkts)},
+               offsetof(struct ecore_eth_stats_common, tx_bcast_bytes)},
+       {"tx_unicast_packets",
+               offsetof(struct ecore_eth_stats_common, tx_ucast_pkts)},
        {"tx_multicast_packets",
-               offsetof(struct ecore_eth_stats, tx_mcast_pkts)},
+               offsetof(struct ecore_eth_stats_common, tx_mcast_pkts)},
        {"tx_broadcast_packets",
-               offsetof(struct ecore_eth_stats, tx_bcast_pkts)},
+               offsetof(struct ecore_eth_stats_common, tx_bcast_pkts)},
 
        {"rx_64_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_64_byte_packets)},
+               offsetof(struct ecore_eth_stats_common, rx_64_byte_packets)},
        {"rx_65_to_127_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_65_to_127_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        rx_65_to_127_byte_packets)},
        {"rx_128_to_255_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_128_to_255_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        rx_128_to_255_byte_packets)},
        {"rx_256_to_511_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_256_to_511_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        rx_256_to_511_byte_packets)},
        {"rx_512_to_1023_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_512_to_1023_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        rx_512_to_1023_byte_packets)},
        {"rx_1024_to_1518_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_1024_to_1518_byte_packets)},
-       {"rx_1519_to_1522_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_1519_to_1522_byte_packets)},
-       {"rx_1519_to_2047_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_1519_to_2047_byte_packets)},
-       {"rx_2048_to_4095_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_2048_to_4095_byte_packets)},
-       {"rx_4096_to_9216_byte_packets",
-               offsetof(struct ecore_eth_stats, rx_4096_to_9216_byte_packets)},
-       {"rx_9217_to_16383_byte_packets",
-               offsetof(struct ecore_eth_stats,
-                        rx_9217_to_16383_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        rx_1024_to_1518_byte_packets)},
        {"tx_64_byte_packets",
-               offsetof(struct ecore_eth_stats, tx_64_byte_packets)},
+               offsetof(struct ecore_eth_stats_common, tx_64_byte_packets)},
        {"tx_65_to_127_byte_packets",
-               offsetof(struct ecore_eth_stats, tx_65_to_127_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        tx_65_to_127_byte_packets)},
        {"tx_128_to_255_byte_packets",
-               offsetof(struct ecore_eth_stats, tx_128_to_255_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        tx_128_to_255_byte_packets)},
        {"tx_256_to_511_byte_packets",
-               offsetof(struct ecore_eth_stats, tx_256_to_511_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        tx_256_to_511_byte_packets)},
        {"tx_512_to_1023_byte_packets",
-               offsetof(struct ecore_eth_stats, tx_512_to_1023_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        tx_512_to_1023_byte_packets)},
        {"tx_1024_to_1518_byte_packets",
-               offsetof(struct ecore_eth_stats, tx_1024_to_1518_byte_packets)},
-       {"trx_1519_to_1522_byte_packets",
-               offsetof(struct ecore_eth_stats, tx_1519_to_2047_byte_packets)},
-       {"tx_2048_to_4095_byte_packets",
-               offsetof(struct ecore_eth_stats, tx_2048_to_4095_byte_packets)},
-       {"tx_4096_to_9216_byte_packets",
-               offsetof(struct ecore_eth_stats, tx_4096_to_9216_byte_packets)},
-       {"tx_9217_to_16383_byte_packets",
-               offsetof(struct ecore_eth_stats,
-                        tx_9217_to_16383_byte_packets)},
+               offsetof(struct ecore_eth_stats_common,
+                        tx_1024_to_1518_byte_packets)},
 
        {"rx_mac_crtl_frames",
-               offsetof(struct ecore_eth_stats, rx_mac_crtl_frames)},
+               offsetof(struct ecore_eth_stats_common, rx_mac_crtl_frames)},
        {"tx_mac_control_frames",
-               offsetof(struct ecore_eth_stats, tx_mac_ctrl_frames)},
-       {"rx_pause_frames", offsetof(struct ecore_eth_stats, rx_pause_frames)},
-       {"tx_pause_frames", offsetof(struct ecore_eth_stats, tx_pause_frames)},
+               offsetof(struct ecore_eth_stats_common, tx_mac_ctrl_frames)},
+       {"rx_pause_frames",
+               offsetof(struct ecore_eth_stats_common, rx_pause_frames)},
+       {"tx_pause_frames",
+               offsetof(struct ecore_eth_stats_common, tx_pause_frames)},
        {"rx_priority_flow_control_frames",
-               offsetof(struct ecore_eth_stats, rx_pfc_frames)},
+               offsetof(struct ecore_eth_stats_common, rx_pfc_frames)},
        {"tx_priority_flow_control_frames",
-               offsetof(struct ecore_eth_stats, tx_pfc_frames)},
+               offsetof(struct ecore_eth_stats_common, tx_pfc_frames)},
 
-       {"rx_crc_errors", offsetof(struct ecore_eth_stats, rx_crc_errors)},
-       {"rx_align_errors", offsetof(struct ecore_eth_stats, rx_align_errors)},
+       {"rx_crc_errors",
+               offsetof(struct ecore_eth_stats_common, rx_crc_errors)},
+       {"rx_align_errors",
+               offsetof(struct ecore_eth_stats_common, rx_align_errors)},
        {"rx_carrier_errors",
-               offsetof(struct ecore_eth_stats, rx_carrier_errors)},
+               offsetof(struct ecore_eth_stats_common, rx_carrier_errors)},
        {"rx_oversize_packet_errors",
-               offsetof(struct ecore_eth_stats, rx_oversize_packets)},
-       {"rx_jabber_errors", offsetof(struct ecore_eth_stats, rx_jabbers)},
+               offsetof(struct ecore_eth_stats_common, rx_oversize_packets)},
+       {"rx_jabber_errors",
+               offsetof(struct ecore_eth_stats_common, rx_jabbers)},
        {"rx_undersize_packet_errors",
-               offsetof(struct ecore_eth_stats, rx_undersize_packets)},
-       {"rx_fragments", offsetof(struct ecore_eth_stats, rx_fragments)},
+               offsetof(struct ecore_eth_stats_common, rx_undersize_packets)},
+       {"rx_fragments", offsetof(struct ecore_eth_stats_common, rx_fragments)},
        {"rx_host_buffer_not_available",
-               offsetof(struct ecore_eth_stats, no_buff_discards)},
+               offsetof(struct ecore_eth_stats_common, no_buff_discards)},
        /* Number of packets discarded because they are bigger than MTU */
        {"rx_packet_too_big_discards",
-               offsetof(struct ecore_eth_stats, packet_too_big_discard)},
+               offsetof(struct ecore_eth_stats_common,
+                        packet_too_big_discard)},
        {"rx_ttl_zero_discards",
-               offsetof(struct ecore_eth_stats, ttl0_discard)},
+               offsetof(struct ecore_eth_stats_common, ttl0_discard)},
        {"rx_multi_function_tag_filter_discards",
-               offsetof(struct ecore_eth_stats, mftag_filter_discards)},
+               offsetof(struct ecore_eth_stats_common, mftag_filter_discards)},
        {"rx_mac_filter_discards",
-               offsetof(struct ecore_eth_stats, mac_filter_discards)},
+               offsetof(struct ecore_eth_stats_common, mac_filter_discards)},
        {"rx_hw_buffer_truncates",
-               offsetof(struct ecore_eth_stats, brb_truncates)},
+               offsetof(struct ecore_eth_stats_common, brb_truncates)},
        {"rx_hw_buffer_discards",
-               offsetof(struct ecore_eth_stats, brb_discards)},
-       {"tx_lpi_entry_count",
-               offsetof(struct ecore_eth_stats, tx_lpi_entry_count)},
-       {"tx_total_collisions",
-               offsetof(struct ecore_eth_stats, tx_total_collisions)},
+               offsetof(struct ecore_eth_stats_common, brb_discards)},
        {"tx_error_drop_packets",
-               offsetof(struct ecore_eth_stats, tx_err_drop_pkts)},
+               offsetof(struct ecore_eth_stats_common, tx_err_drop_pkts)},
 
-       {"rx_mac_bytes", offsetof(struct ecore_eth_stats, rx_mac_bytes)},
+       {"rx_mac_bytes", offsetof(struct ecore_eth_stats_common, rx_mac_bytes)},
        {"rx_mac_unicast_packets",
-               offsetof(struct ecore_eth_stats, rx_mac_uc_packets)},
+               offsetof(struct ecore_eth_stats_common, rx_mac_uc_packets)},
        {"rx_mac_multicast_packets",
-               offsetof(struct ecore_eth_stats, rx_mac_mc_packets)},
+               offsetof(struct ecore_eth_stats_common, rx_mac_mc_packets)},
        {"rx_mac_broadcast_packets",
-               offsetof(struct ecore_eth_stats, rx_mac_bc_packets)},
+               offsetof(struct ecore_eth_stats_common, rx_mac_bc_packets)},
        {"rx_mac_frames_ok",
-               offsetof(struct ecore_eth_stats, rx_mac_frames_ok)},
-       {"tx_mac_bytes", offsetof(struct ecore_eth_stats, tx_mac_bytes)},
+               offsetof(struct ecore_eth_stats_common, rx_mac_frames_ok)},
+       {"tx_mac_bytes", offsetof(struct ecore_eth_stats_common, tx_mac_bytes)},
        {"tx_mac_unicast_packets",
-               offsetof(struct ecore_eth_stats, tx_mac_uc_packets)},
+               offsetof(struct ecore_eth_stats_common, tx_mac_uc_packets)},
        {"tx_mac_multicast_packets",
-               offsetof(struct ecore_eth_stats, tx_mac_mc_packets)},
+               offsetof(struct ecore_eth_stats_common, tx_mac_mc_packets)},
        {"tx_mac_broadcast_packets",
-               offsetof(struct ecore_eth_stats, tx_mac_bc_packets)},
+               offsetof(struct ecore_eth_stats_common, tx_mac_bc_packets)},
 
        {"lro_coalesced_packets",
-               offsetof(struct ecore_eth_stats, tpa_coalesced_pkts)},
+               offsetof(struct ecore_eth_stats_common, tpa_coalesced_pkts)},
        {"lro_coalesced_events",
-               offsetof(struct ecore_eth_stats, tpa_coalesced_events)},
+               offsetof(struct ecore_eth_stats_common, tpa_coalesced_events)},
        {"lro_aborts_num",
-               offsetof(struct ecore_eth_stats, tpa_aborts_num)},
+               offsetof(struct ecore_eth_stats_common, tpa_aborts_num)},
        {"lro_not_coalesced_packets",
-               offsetof(struct ecore_eth_stats, tpa_not_coalesced_pkts)},
+               offsetof(struct ecore_eth_stats_common,
+                        tpa_not_coalesced_pkts)},
        {"lro_coalesced_bytes",
-               offsetof(struct ecore_eth_stats, tpa_coalesced_bytes)},
+               offsetof(struct ecore_eth_stats_common,
+                        tpa_coalesced_bytes)},
+};
+
+static const struct rte_qede_xstats_name_off qede_bb_xstats_strings[] = {
+       {"rx_1519_to_1522_byte_packets",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb,
+                        rx_1519_to_1522_byte_packets)},
+       {"rx_1519_to_2047_byte_packets",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb,
+                        rx_1519_to_2047_byte_packets)},
+       {"rx_2048_to_4095_byte_packets",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb,
+                        rx_2048_to_4095_byte_packets)},
+       {"rx_4096_to_9216_byte_packets",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb,
+                        rx_4096_to_9216_byte_packets)},
+       {"rx_9217_to_16383_byte_packets",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb,
+                        rx_9217_to_16383_byte_packets)},
+
+       {"tx_1519_to_2047_byte_packets",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb,
+                        tx_1519_to_2047_byte_packets)},
+       {"tx_2048_to_4095_byte_packets",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb,
+                        tx_2048_to_4095_byte_packets)},
+       {"tx_4096_to_9216_byte_packets",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb,
+                        tx_4096_to_9216_byte_packets)},
+       {"tx_9217_to_16383_byte_packets",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb,
+                        tx_9217_to_16383_byte_packets)},
+
+       {"tx_lpi_entry_count",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb, tx_lpi_entry_count)},
+       {"tx_total_collisions",
+               offsetof(struct ecore_eth_stats, bb) +
+               offsetof(struct ecore_eth_stats_bb, tx_total_collisions)},
+};
+
+static const struct rte_qede_xstats_name_off qede_ah_xstats_strings[] = {
+       {"rx_1519_to_max_byte_packets",
+               offsetof(struct ecore_eth_stats, ah) +
+               offsetof(struct ecore_eth_stats_ah,
+                        rx_1519_to_max_byte_packets)},
+       {"tx_1519_to_max_byte_packets",
+               offsetof(struct ecore_eth_stats, ah) +
+               offsetof(struct ecore_eth_stats_ah,
+                        tx_1519_to_max_byte_packets)},
 };
 
 static const struct rte_qede_xstats_name_off qede_rxq_xstats_strings[] = {
@@ -1416,32 +1472,33 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)
        ecore_get_vport_stats(edev, &stats);
 
        /* RX Stats */
-       eth_stats->ipackets = stats.rx_ucast_pkts +
-           stats.rx_mcast_pkts + stats.rx_bcast_pkts;
+       eth_stats->ipackets = stats.common.rx_ucast_pkts +
+           stats.common.rx_mcast_pkts + stats.common.rx_bcast_pkts;
 
-       eth_stats->ibytes = stats.rx_ucast_bytes +
-           stats.rx_mcast_bytes + stats.rx_bcast_bytes;
+       eth_stats->ibytes = stats.common.rx_ucast_bytes +
+           stats.common.rx_mcast_bytes + stats.common.rx_bcast_bytes;
 
-       eth_stats->ierrors = stats.rx_crc_errors +
-           stats.rx_align_errors +
-           stats.rx_carrier_errors +
-           stats.rx_oversize_packets +
-           stats.rx_jabbers + stats.rx_undersize_packets;
+       eth_stats->ierrors = stats.common.rx_crc_errors +
+           stats.common.rx_align_errors +
+           stats.common.rx_carrier_errors +
+           stats.common.rx_oversize_packets +
+           stats.common.rx_jabbers + stats.common.rx_undersize_packets;
 
-       eth_stats->rx_nombuf = stats.no_buff_discards;
+       eth_stats->rx_nombuf = stats.common.no_buff_discards;
 
-       eth_stats->imissed = stats.mftag_filter_discards +
-           stats.mac_filter_discards +
-           stats.no_buff_discards + stats.brb_truncates + stats.brb_discards;
+       eth_stats->imissed = stats.common.mftag_filter_discards +
+           stats.common.mac_filter_discards +
+           stats.common.no_buff_discards +
+           stats.common.brb_truncates + stats.common.brb_discards;
 
        /* TX stats */
-       eth_stats->opackets = stats.tx_ucast_pkts +
-           stats.tx_mcast_pkts + stats.tx_bcast_pkts;
+       eth_stats->opackets = stats.common.tx_ucast_pkts +
+           stats.common.tx_mcast_pkts + stats.common.tx_bcast_pkts;
 
-       eth_stats->obytes = stats.tx_ucast_bytes +
-           stats.tx_mcast_bytes + stats.tx_bcast_bytes;
+       eth_stats->obytes = stats.common.tx_ucast_bytes +
+           stats.common.tx_mcast_bytes + stats.common.tx_bcast_bytes;
 
-       eth_stats->oerrors = stats.tx_err_drop_pkts;
+       eth_stats->oerrors = stats.common.tx_err_drop_pkts;
 
        /* Queue stats */
        rxq_stat_cntrs = RTE_MIN(QEDE_RSS_COUNT(qdev),
@@ -1490,10 +1547,18 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)
 
 static unsigned
 qede_get_xstats_count(struct qede_dev *qdev) {
-       return RTE_DIM(qede_xstats_strings) +
-               (RTE_DIM(qede_rxq_xstats_strings) *
-                RTE_MIN(QEDE_RSS_COUNT(qdev),
-                        RTE_ETHDEV_QUEUE_STAT_CNTRS));
+       if (ECORE_IS_BB(&qdev->edev))
+               return RTE_DIM(qede_xstats_strings) +
+                      RTE_DIM(qede_bb_xstats_strings) +
+                      (RTE_DIM(qede_rxq_xstats_strings) *
+                       RTE_MIN(QEDE_RSS_COUNT(qdev),
+                               RTE_ETHDEV_QUEUE_STAT_CNTRS));
+       else
+               return RTE_DIM(qede_xstats_strings) +
+                      RTE_DIM(qede_ah_xstats_strings) +
+                      (RTE_DIM(qede_rxq_xstats_strings) *
+                       RTE_MIN(QEDE_RSS_COUNT(qdev),
+                               RTE_ETHDEV_QUEUE_STAT_CNTRS));
 }
 
 static int
@@ -1502,6 +1567,7 @@ qede_get_xstats_names(struct rte_eth_dev *dev,
                      __rte_unused unsigned int limit)
 {
        struct qede_dev *qdev = dev->data->dev_private;
+       struct ecore_dev *edev = &qdev->edev;
        const unsigned int stat_cnt = qede_get_xstats_count(qdev);
        unsigned int i, qid, stat_idx = 0;
        unsigned int rxq_stat_cntrs;
@@ -1515,6 +1581,24 @@ qede_get_xstats_names(struct rte_eth_dev *dev,
                        stat_idx++;
                }
 
+               if (ECORE_IS_BB(edev)) {
+                       for (i = 0; i < RTE_DIM(qede_bb_xstats_strings); i++) {
+                               snprintf(xstats_names[stat_idx].name,
+                                       sizeof(xstats_names[stat_idx].name),
+                                       "%s",
+                                       qede_bb_xstats_strings[i].name);
+                               stat_idx++;
+                       }
+               } else {
+                       for (i = 0; i < RTE_DIM(qede_ah_xstats_strings); i++) {
+                               snprintf(xstats_names[stat_idx].name,
+                                       sizeof(xstats_names[stat_idx].name),
+                                       "%s",
+                                       qede_ah_xstats_strings[i].name);
+                               stat_idx++;
+                       }
+               }
+
                rxq_stat_cntrs = RTE_MIN(QEDE_RSS_COUNT(qdev),
                                         RTE_ETHDEV_QUEUE_STAT_CNTRS);
                for (qid = 0; qid < rxq_stat_cntrs; qid++) {
@@ -1555,6 +1639,24 @@ qede_get_xstats(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
                stat_idx++;
        }
 
+       if (ECORE_IS_BB(edev)) {
+               for (i = 0; i < RTE_DIM(qede_bb_xstats_strings); i++) {
+                       xstats[stat_idx].value =
+                                       *(uint64_t *)(((char *)&stats) +
+                                       qede_bb_xstats_strings[i].offset);
+                       xstats[stat_idx].id = stat_idx;
+                       stat_idx++;
+               }
+       } else {
+               for (i = 0; i < RTE_DIM(qede_ah_xstats_strings); i++) {
+                       xstats[stat_idx].value =
+                                       *(uint64_t *)(((char *)&stats) +
+                                       qede_ah_xstats_strings[i].offset);
+                       xstats[stat_idx].id = stat_idx;
+                       stat_idx++;
+               }
+       }
+
        rxq_stat_cntrs = RTE_MIN(QEDE_RSS_COUNT(qdev),
                                 RTE_ETHDEV_QUEUE_STAT_CNTRS);
        for (qid = 0; qid < rxq_stat_cntrs; qid++) {