]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/bnx2x/bnx2x_stats.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-next-2.6
[mv-sheeva.git] / drivers / net / bnx2x / bnx2x_stats.c
index c74724461020aa9ba60265a43907eabca6a40454..4733c835dad950a7ba8966a94d284752a345656a 100644 (file)
@@ -14,8 +14,8 @@
  * Statistics and Link management by Yitchak Gertner
  *
  */
- #include "bnx2x_cmn.h"
- #include "bnx2x_stats.h"
+#include "bnx2x_cmn.h"
+#include "bnx2x_stats.h"
 
 /* Statistics */
 
@@ -153,7 +153,7 @@ static inline long bnx2x_hilo(u32 *hiref)
 static void bnx2x_storm_stats_post(struct bnx2x *bp)
 {
        if (!bp->stats_pending) {
-               struct eth_query_ramrod_data ramrod_data = {0};
+               struct common_query_ramrod_data ramrod_data = {0};
                int i, rc;
 
                spin_lock_bh(&bp->stats_lock);
@@ -163,14 +163,11 @@ static void bnx2x_storm_stats_post(struct bnx2x *bp)
                for_each_queue(bp, i)
                        ramrod_data.ctr_id_vector |= (1 << bp->fp[i].cl_id);
 
-               rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_STAT_QUERY, 0,
+               rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_STAT_QUERY, 0,
                                   ((u32 *)&ramrod_data)[1],
-                                  ((u32 *)&ramrod_data)[0], 0);
-               if (rc == 0) {
-                       /* stats ramrod has it's own slot on the spq */
-                       bp->spq_left++;
+                                  ((u32 *)&ramrod_data)[0], 1);
+               if (rc == 0)
                        bp->stats_pending = 1;
-               }
 
                spin_unlock_bh(&bp->stats_lock);
        }
@@ -188,20 +185,12 @@ static void bnx2x_hw_stats_post(struct bnx2x *bp)
        /* loader */
        if (bp->executer_idx) {
                int loader_idx = PMF_DMAE_C(bp);
+               u32 opcode =  bnx2x_dmae_opcode(bp, DMAE_SRC_PCI, DMAE_DST_GRC,
+                                                true, DMAE_COMP_GRC);
+               opcode = bnx2x_dmae_opcode_clr_src_reset(opcode);
 
                memset(dmae, 0, sizeof(struct dmae_command));
-
-               dmae->opcode = (DMAE_CMD_SRC_PCI | DMAE_CMD_DST_GRC |
-                               DMAE_CMD_C_DST_GRC | DMAE_CMD_C_ENABLE |
-                               DMAE_CMD_DST_RESET |
-#ifdef __BIG_ENDIAN
-                               DMAE_CMD_ENDIANITY_B_DW_SWAP |
-#else
-                               DMAE_CMD_ENDIANITY_DW_SWAP |
-#endif
-                               (BP_PORT(bp) ? DMAE_CMD_PORT_1 :
-                                              DMAE_CMD_PORT_0) |
-                               (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT));
+               dmae->opcode = opcode;
                dmae->src_addr_lo = U64_LO(bnx2x_sp_mapping(bp, dmae[0]));
                dmae->src_addr_hi = U64_HI(bnx2x_sp_mapping(bp, dmae[0]));
                dmae->dst_addr_lo = (DMAE_REG_CMD_MEM +
@@ -253,26 +242,17 @@ static void bnx2x_stats_pmf_update(struct bnx2x *bp)
        u32 *stats_comp = bnx2x_sp(bp, stats_comp);
 
        /* sanity */
-       if (!IS_E1HMF(bp) || !bp->port.pmf || !bp->port.port_stx) {
+       if (!IS_MF(bp) || !bp->port.pmf || !bp->port.port_stx) {
                BNX2X_ERR("BUG!\n");
                return;
        }
 
        bp->executer_idx = 0;
 
-       opcode = (DMAE_CMD_SRC_GRC | DMAE_CMD_DST_PCI |
-                 DMAE_CMD_C_ENABLE |
-                 DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET |
-#ifdef __BIG_ENDIAN
-                 DMAE_CMD_ENDIANITY_B_DW_SWAP |
-#else
-                 DMAE_CMD_ENDIANITY_DW_SWAP |
-#endif
-                 (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) |
-                 (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT));
+       opcode = bnx2x_dmae_opcode(bp, DMAE_SRC_GRC, DMAE_DST_PCI, false, 0);
 
        dmae = bnx2x_sp(bp, dmae[bp->executer_idx++]);
-       dmae->opcode = (opcode | DMAE_CMD_C_DST_GRC);
+       dmae->opcode = bnx2x_dmae_opcode_add_comp(opcode, DMAE_COMP_GRC);
        dmae->src_addr_lo = bp->port.port_stx >> 2;
        dmae->src_addr_hi = 0;
        dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, port_stats));
@@ -283,7 +263,7 @@ static void bnx2x_stats_pmf_update(struct bnx2x *bp)
        dmae->comp_val = 1;
 
        dmae = bnx2x_sp(bp, dmae[bp->executer_idx++]);
-       dmae->opcode = (opcode | DMAE_CMD_C_DST_PCI);
+       dmae->opcode = bnx2x_dmae_opcode_add_comp(opcode, DMAE_COMP_PCI);
        dmae->src_addr_lo = (bp->port.port_stx >> 2) + DMAE_LEN32_RD_MAX;
        dmae->src_addr_hi = 0;
        dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, port_stats) +
@@ -304,7 +284,6 @@ static void bnx2x_port_stats_init(struct bnx2x *bp)
 {
        struct dmae_command *dmae;
        int port = BP_PORT(bp);
-       int vn = BP_E1HVN(bp);
        u32 opcode;
        int loader_idx = PMF_DMAE_C(bp);
        u32 mac_addr;
@@ -319,16 +298,8 @@ static void bnx2x_port_stats_init(struct bnx2x *bp)
        bp->executer_idx = 0;
 
        /* MCP */
-       opcode = (DMAE_CMD_SRC_PCI | DMAE_CMD_DST_GRC |
-                 DMAE_CMD_C_DST_GRC | DMAE_CMD_C_ENABLE |
-                 DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET |
-#ifdef __BIG_ENDIAN
-                 DMAE_CMD_ENDIANITY_B_DW_SWAP |
-#else
-                 DMAE_CMD_ENDIANITY_DW_SWAP |
-#endif
-                 (port ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) |
-                 (vn << DMAE_CMD_E1HVN_SHIFT));
+       opcode = bnx2x_dmae_opcode(bp, DMAE_SRC_PCI, DMAE_DST_GRC,
+                                   true, DMAE_COMP_GRC);
 
        if (bp->port.port_stx) {
 
@@ -359,16 +330,8 @@ static void bnx2x_port_stats_init(struct bnx2x *bp)
        }
 
        /* MAC */
-       opcode = (DMAE_CMD_SRC_GRC | DMAE_CMD_DST_PCI |
-                 DMAE_CMD_C_DST_GRC | DMAE_CMD_C_ENABLE |
-                 DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET |
-#ifdef __BIG_ENDIAN
-                 DMAE_CMD_ENDIANITY_B_DW_SWAP |
-#else
-                 DMAE_CMD_ENDIANITY_DW_SWAP |
-#endif
-                 (port ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) |
-                 (vn << DMAE_CMD_E1HVN_SHIFT));
+       opcode = bnx2x_dmae_opcode(bp, DMAE_SRC_GRC, DMAE_DST_PCI,
+                                  true, DMAE_COMP_GRC);
 
        if (bp->link_vars.mac_type == MAC_TYPE_BMAC) {
 
@@ -379,13 +342,21 @@ static void bnx2x_port_stats_init(struct bnx2x *bp)
                   BIGMAC_REGISTER_TX_STAT_GTBYT */
                dmae = bnx2x_sp(bp, dmae[bp->executer_idx++]);
                dmae->opcode = opcode;
-               dmae->src_addr_lo = (mac_addr +
+               if (CHIP_IS_E1x(bp)) {
+                       dmae->src_addr_lo = (mac_addr +
                                     BIGMAC_REGISTER_TX_STAT_GTPKT) >> 2;
+                       dmae->len = (8 + BIGMAC_REGISTER_TX_STAT_GTBYT -
+                                    BIGMAC_REGISTER_TX_STAT_GTPKT) >> 2;
+               } else {
+                       dmae->src_addr_lo = (mac_addr +
+                                    BIGMAC2_REGISTER_TX_STAT_GTPOK) >> 2;
+                       dmae->len = (8 + BIGMAC2_REGISTER_TX_STAT_GTBYT -
+                                    BIGMAC2_REGISTER_TX_STAT_GTPOK) >> 2;
+               }
+
                dmae->src_addr_hi = 0;
                dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, mac_stats));
                dmae->dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, mac_stats));
-               dmae->len = (8 + BIGMAC_REGISTER_TX_STAT_GTBYT -
-                            BIGMAC_REGISTER_TX_STAT_GTPKT) >> 2;
                dmae->comp_addr_lo = dmae_reg_go_c[loader_idx] >> 2;
                dmae->comp_addr_hi = 0;
                dmae->comp_val = 1;
@@ -394,15 +365,31 @@ static void bnx2x_port_stats_init(struct bnx2x *bp)
                   BIGMAC_REGISTER_RX_STAT_GRIPJ */
                dmae = bnx2x_sp(bp, dmae[bp->executer_idx++]);
                dmae->opcode = opcode;
-               dmae->src_addr_lo = (mac_addr +
-                                    BIGMAC_REGISTER_RX_STAT_GR64) >> 2;
                dmae->src_addr_hi = 0;
-               dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, mac_stats) +
-                               offsetof(struct bmac_stats, rx_stat_gr64_lo));
-               dmae->dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, mac_stats) +
-                               offsetof(struct bmac_stats, rx_stat_gr64_lo));
-               dmae->len = (8 + BIGMAC_REGISTER_RX_STAT_GRIPJ -
-                            BIGMAC_REGISTER_RX_STAT_GR64) >> 2;
+               if (CHIP_IS_E1x(bp)) {
+                       dmae->src_addr_lo = (mac_addr +
+                                            BIGMAC_REGISTER_RX_STAT_GR64) >> 2;
+                       dmae->dst_addr_lo =
+                               U64_LO(bnx2x_sp_mapping(bp, mac_stats) +
+                               offsetof(struct bmac1_stats, rx_stat_gr64_lo));
+                       dmae->dst_addr_hi =
+                               U64_HI(bnx2x_sp_mapping(bp, mac_stats) +
+                               offsetof(struct bmac1_stats, rx_stat_gr64_lo));
+                       dmae->len = (8 + BIGMAC_REGISTER_RX_STAT_GRIPJ -
+                                    BIGMAC_REGISTER_RX_STAT_GR64) >> 2;
+               } else {
+                       dmae->src_addr_lo =
+                               (mac_addr + BIGMAC2_REGISTER_RX_STAT_GR64) >> 2;
+                       dmae->dst_addr_lo =
+                               U64_LO(bnx2x_sp_mapping(bp, mac_stats) +
+                               offsetof(struct bmac2_stats, rx_stat_gr64_lo));
+                       dmae->dst_addr_hi =
+                               U64_HI(bnx2x_sp_mapping(bp, mac_stats) +
+                               offsetof(struct bmac2_stats, rx_stat_gr64_lo));
+                       dmae->len = (8 + BIGMAC2_REGISTER_RX_STAT_GRIPJ -
+                                    BIGMAC2_REGISTER_RX_STAT_GR64) >> 2;
+               }
+
                dmae->comp_addr_lo = dmae_reg_go_c[loader_idx] >> 2;
                dmae->comp_addr_hi = 0;
                dmae->comp_val = 1;
@@ -483,16 +470,8 @@ static void bnx2x_port_stats_init(struct bnx2x *bp)
        dmae->comp_val = 1;
 
        dmae = bnx2x_sp(bp, dmae[bp->executer_idx++]);
-       dmae->opcode = (DMAE_CMD_SRC_GRC | DMAE_CMD_DST_PCI |
-                       DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE |
-                       DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET |
-#ifdef __BIG_ENDIAN
-                       DMAE_CMD_ENDIANITY_B_DW_SWAP |
-#else
-                       DMAE_CMD_ENDIANITY_DW_SWAP |
-#endif
-                       (port ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) |
-                       (vn << DMAE_CMD_E1HVN_SHIFT));
+       dmae->opcode = bnx2x_dmae_opcode(bp, DMAE_SRC_GRC, DMAE_DST_PCI,
+                                        true, DMAE_COMP_PCI);
        dmae->src_addr_lo = (port ? NIG_REG_STAT1_EGRESS_MAC_PKT1 :
                                    NIG_REG_STAT0_EGRESS_MAC_PKT1) >> 2;
        dmae->src_addr_hi = 0;
@@ -522,16 +501,8 @@ static void bnx2x_func_stats_init(struct bnx2x *bp)
        bp->executer_idx = 0;
        memset(dmae, 0, sizeof(struct dmae_command));
 
-       dmae->opcode = (DMAE_CMD_SRC_PCI | DMAE_CMD_DST_GRC |
-                       DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE |
-                       DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET |
-#ifdef __BIG_ENDIAN
-                       DMAE_CMD_ENDIANITY_B_DW_SWAP |
-#else
-                       DMAE_CMD_ENDIANITY_DW_SWAP |
-#endif
-                       (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) |
-                       (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT));
+       dmae->opcode = bnx2x_dmae_opcode(bp, DMAE_SRC_PCI, DMAE_DST_GRC,
+                                        true, DMAE_COMP_PCI);
        dmae->src_addr_lo = U64_LO(bnx2x_sp_mapping(bp, func_stats));
        dmae->src_addr_hi = U64_HI(bnx2x_sp_mapping(bp, func_stats));
        dmae->dst_addr_lo = bp->func_stx >> 2;
@@ -571,7 +542,6 @@ static void bnx2x_stats_restart(struct bnx2x *bp)
 
 static void bnx2x_bmac_stats_update(struct bnx2x *bp)
 {
-       struct bmac_stats *new = bnx2x_sp(bp, mac_stats.bmac_stats);
        struct host_port_stats *pstats = bnx2x_sp(bp, port_stats);
        struct bnx2x_eth_stats *estats = &bp->eth_stats;
        struct {
@@ -579,35 +549,74 @@ static void bnx2x_bmac_stats_update(struct bnx2x *bp)
                u32 hi;
        } diff;
 
-       UPDATE_STAT64(rx_stat_grerb, rx_stat_ifhcinbadoctets);
-       UPDATE_STAT64(rx_stat_grfcs, rx_stat_dot3statsfcserrors);
-       UPDATE_STAT64(rx_stat_grund, rx_stat_etherstatsundersizepkts);
-       UPDATE_STAT64(rx_stat_grovr, rx_stat_dot3statsframestoolong);
-       UPDATE_STAT64(rx_stat_grfrg, rx_stat_etherstatsfragments);
-       UPDATE_STAT64(rx_stat_grjbr, rx_stat_etherstatsjabbers);
-       UPDATE_STAT64(rx_stat_grxcf, rx_stat_maccontrolframesreceived);
-       UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffstateentered);
-       UPDATE_STAT64(rx_stat_grxpf, rx_stat_bmac_xpf);
-       UPDATE_STAT64(tx_stat_gtxpf, tx_stat_outxoffsent);
-       UPDATE_STAT64(tx_stat_gtxpf, tx_stat_flowcontroldone);
-       UPDATE_STAT64(tx_stat_gt64, tx_stat_etherstatspkts64octets);
-       UPDATE_STAT64(tx_stat_gt127,
+       if (CHIP_IS_E1x(bp)) {
+               struct bmac1_stats *new = bnx2x_sp(bp, mac_stats.bmac1_stats);
+
+               /* the macros below will use "bmac1_stats" type */
+               UPDATE_STAT64(rx_stat_grerb, rx_stat_ifhcinbadoctets);
+               UPDATE_STAT64(rx_stat_grfcs, rx_stat_dot3statsfcserrors);
+               UPDATE_STAT64(rx_stat_grund, rx_stat_etherstatsundersizepkts);
+               UPDATE_STAT64(rx_stat_grovr, rx_stat_dot3statsframestoolong);
+               UPDATE_STAT64(rx_stat_grfrg, rx_stat_etherstatsfragments);
+               UPDATE_STAT64(rx_stat_grjbr, rx_stat_etherstatsjabbers);
+               UPDATE_STAT64(rx_stat_grxcf, rx_stat_maccontrolframesreceived);
+               UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffstateentered);
+               UPDATE_STAT64(rx_stat_grxpf, rx_stat_bmac_xpf);
+               UPDATE_STAT64(tx_stat_gtxpf, tx_stat_outxoffsent);
+               UPDATE_STAT64(tx_stat_gtxpf, tx_stat_flowcontroldone);
+               UPDATE_STAT64(tx_stat_gt64, tx_stat_etherstatspkts64octets);
+               UPDATE_STAT64(tx_stat_gt127,
+                               tx_stat_etherstatspkts65octetsto127octets);
+               UPDATE_STAT64(tx_stat_gt255,
+                               tx_stat_etherstatspkts128octetsto255octets);
+               UPDATE_STAT64(tx_stat_gt511,
+                               tx_stat_etherstatspkts256octetsto511octets);
+               UPDATE_STAT64(tx_stat_gt1023,
+                               tx_stat_etherstatspkts512octetsto1023octets);
+               UPDATE_STAT64(tx_stat_gt1518,
+                               tx_stat_etherstatspkts1024octetsto1522octets);
+               UPDATE_STAT64(tx_stat_gt2047, tx_stat_bmac_2047);
+               UPDATE_STAT64(tx_stat_gt4095, tx_stat_bmac_4095);
+               UPDATE_STAT64(tx_stat_gt9216, tx_stat_bmac_9216);
+               UPDATE_STAT64(tx_stat_gt16383, tx_stat_bmac_16383);
+               UPDATE_STAT64(tx_stat_gterr,
+                               tx_stat_dot3statsinternalmactransmiterrors);
+               UPDATE_STAT64(tx_stat_gtufl, tx_stat_bmac_ufl);
+
+       } else {
+               struct bmac2_stats *new = bnx2x_sp(bp, mac_stats.bmac2_stats);
+
+               /* the macros below will use "bmac2_stats" type */
+               UPDATE_STAT64(rx_stat_grerb, rx_stat_ifhcinbadoctets);
+               UPDATE_STAT64(rx_stat_grfcs, rx_stat_dot3statsfcserrors);
+               UPDATE_STAT64(rx_stat_grund, rx_stat_etherstatsundersizepkts);
+               UPDATE_STAT64(rx_stat_grovr, rx_stat_dot3statsframestoolong);
+               UPDATE_STAT64(rx_stat_grfrg, rx_stat_etherstatsfragments);
+               UPDATE_STAT64(rx_stat_grjbr, rx_stat_etherstatsjabbers);
+               UPDATE_STAT64(rx_stat_grxcf, rx_stat_maccontrolframesreceived);
+               UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffstateentered);
+               UPDATE_STAT64(rx_stat_grxpf, rx_stat_bmac_xpf);
+               UPDATE_STAT64(tx_stat_gtxpf, tx_stat_outxoffsent);
+               UPDATE_STAT64(tx_stat_gtxpf, tx_stat_flowcontroldone);
+               UPDATE_STAT64(tx_stat_gt64, tx_stat_etherstatspkts64octets);
+               UPDATE_STAT64(tx_stat_gt127,
                                tx_stat_etherstatspkts65octetsto127octets);
-       UPDATE_STAT64(tx_stat_gt255,
+               UPDATE_STAT64(tx_stat_gt255,
                                tx_stat_etherstatspkts128octetsto255octets);
-       UPDATE_STAT64(tx_stat_gt511,
+               UPDATE_STAT64(tx_stat_gt511,
                                tx_stat_etherstatspkts256octetsto511octets);
-       UPDATE_STAT64(tx_stat_gt1023,
+               UPDATE_STAT64(tx_stat_gt1023,
                                tx_stat_etherstatspkts512octetsto1023octets);
-       UPDATE_STAT64(tx_stat_gt1518,
+               UPDATE_STAT64(tx_stat_gt1518,
                                tx_stat_etherstatspkts1024octetsto1522octets);
-       UPDATE_STAT64(tx_stat_gt2047, tx_stat_bmac_2047);
-       UPDATE_STAT64(tx_stat_gt4095, tx_stat_bmac_4095);
-       UPDATE_STAT64(tx_stat_gt9216, tx_stat_bmac_9216);
-       UPDATE_STAT64(tx_stat_gt16383, tx_stat_bmac_16383);
-       UPDATE_STAT64(tx_stat_gterr,
+               UPDATE_STAT64(tx_stat_gt2047, tx_stat_bmac_2047);
+               UPDATE_STAT64(tx_stat_gt4095, tx_stat_bmac_4095);
+               UPDATE_STAT64(tx_stat_gt9216, tx_stat_bmac_9216);
+               UPDATE_STAT64(tx_stat_gt16383, tx_stat_bmac_16383);
+               UPDATE_STAT64(tx_stat_gterr,
                                tx_stat_dot3statsinternalmactransmiterrors);
-       UPDATE_STAT64(tx_stat_gtufl, tx_stat_bmac_ufl);
+               UPDATE_STAT64(tx_stat_gtufl, tx_stat_bmac_ufl);
+       }
 
        estats->pause_frames_received_hi =
                                pstats->mac_stx[1].rx_stat_bmac_xpf_hi;
@@ -969,6 +978,7 @@ static void bnx2x_net_stats_update(struct bnx2x *bp)
 {
        struct bnx2x_eth_stats *estats = &bp->eth_stats;
        struct net_device_stats *nstats = &bp->dev->stats;
+       unsigned long tmp;
        int i;
 
        nstats->rx_packets =
@@ -985,10 +995,10 @@ static void bnx2x_net_stats_update(struct bnx2x *bp)
 
        nstats->tx_bytes = bnx2x_hilo(&estats->total_bytes_transmitted_hi);
 
-       nstats->rx_dropped = estats->mac_discard;
+       tmp = estats->mac_discard;
        for_each_queue(bp, i)
-               nstats->rx_dropped +=
-                       le32_to_cpu(bp->fp[i].old_tclient.checksum_discard);
+               tmp += le32_to_cpu(bp->fp[i].old_tclient.checksum_discard);
+       nstats->rx_dropped = tmp;
 
        nstats->tx_dropped = 0;
 
@@ -1123,24 +1133,17 @@ static void bnx2x_port_stats_stop(struct bnx2x *bp)
 
        bp->executer_idx = 0;
 
-       opcode = (DMAE_CMD_SRC_PCI | DMAE_CMD_DST_GRC |
-                 DMAE_CMD_C_ENABLE |
-                 DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET |
-#ifdef __BIG_ENDIAN
-                 DMAE_CMD_ENDIANITY_B_DW_SWAP |
-#else
-                 DMAE_CMD_ENDIANITY_DW_SWAP |
-#endif
-                 (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) |
-                 (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT));
+       opcode = bnx2x_dmae_opcode(bp, DMAE_SRC_PCI, DMAE_DST_GRC, false, 0);
 
        if (bp->port.port_stx) {
 
                dmae = bnx2x_sp(bp, dmae[bp->executer_idx++]);
                if (bp->func_stx)
-                       dmae->opcode = (opcode | DMAE_CMD_C_DST_GRC);
+                       dmae->opcode = bnx2x_dmae_opcode_add_comp(
+                                               opcode, DMAE_COMP_GRC);
                else
-                       dmae->opcode = (opcode | DMAE_CMD_C_DST_PCI);
+                       dmae->opcode = bnx2x_dmae_opcode_add_comp(
+                                               opcode, DMAE_COMP_PCI);
                dmae->src_addr_lo = U64_LO(bnx2x_sp_mapping(bp, port_stats));
                dmae->src_addr_hi = U64_HI(bnx2x_sp_mapping(bp, port_stats));
                dmae->dst_addr_lo = bp->port.port_stx >> 2;
@@ -1164,7 +1167,8 @@ static void bnx2x_port_stats_stop(struct bnx2x *bp)
        if (bp->func_stx) {
 
                dmae = bnx2x_sp(bp, dmae[bp->executer_idx++]);
-               dmae->opcode = (opcode | DMAE_CMD_C_DST_PCI);
+               dmae->opcode =
+                       bnx2x_dmae_opcode_add_comp(opcode, DMAE_COMP_PCI);
                dmae->src_addr_lo = U64_LO(bnx2x_sp_mapping(bp, func_stats));
                dmae->src_addr_hi = U64_HI(bnx2x_sp_mapping(bp, func_stats));
                dmae->dst_addr_lo = bp->func_stx >> 2;
@@ -1257,16 +1261,8 @@ static void bnx2x_port_stats_base_init(struct bnx2x *bp)
        bp->executer_idx = 0;
 
        dmae = bnx2x_sp(bp, dmae[bp->executer_idx++]);
-       dmae->opcode = (DMAE_CMD_SRC_PCI | DMAE_CMD_DST_GRC |
-                       DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE |
-                       DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET |
-#ifdef __BIG_ENDIAN
-                       DMAE_CMD_ENDIANITY_B_DW_SWAP |
-#else
-                       DMAE_CMD_ENDIANITY_DW_SWAP |
-#endif
-                       (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) |
-                       (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT));
+       dmae->opcode = bnx2x_dmae_opcode(bp, DMAE_SRC_PCI, DMAE_DST_GRC,
+                                        true, DMAE_COMP_PCI);
        dmae->src_addr_lo = U64_LO(bnx2x_sp_mapping(bp, port_stats));
        dmae->src_addr_hi = U64_HI(bnx2x_sp_mapping(bp, port_stats));
        dmae->dst_addr_lo = bp->port.port_stx >> 2;
@@ -1283,9 +1279,7 @@ static void bnx2x_port_stats_base_init(struct bnx2x *bp)
 
 static void bnx2x_func_stats_base_init(struct bnx2x *bp)
 {
-       int vn, vn_max = IS_E1HMF(bp) ? E1HVN_MAX : E1VN_MAX;
-       int port = BP_PORT(bp);
-       int func;
+       int vn, vn_max = IS_MF(bp) ? E1HVN_MAX : E1VN_MAX;
        u32 func_stx;
 
        /* sanity */
@@ -1298,9 +1292,9 @@ static void bnx2x_func_stats_base_init(struct bnx2x *bp)
        func_stx = bp->func_stx;
 
        for (vn = VN_0; vn < vn_max; vn++) {
-               func = 2*vn + port;
+               int mb_idx = !CHIP_IS_E2(bp) ? 2*vn + BP_PORT(bp) : vn;
 
-               bp->func_stx = SHMEM_RD(bp, func_mb[func].fw_mb_param);
+               bp->func_stx = SHMEM_RD(bp, func_mb[mb_idx].fw_mb_param);
                bnx2x_func_stats_init(bp);
                bnx2x_hw_stats_post(bp);
                bnx2x_stats_comp(bp);
@@ -1324,16 +1318,8 @@ static void bnx2x_func_stats_base_update(struct bnx2x *bp)
        bp->executer_idx = 0;
        memset(dmae, 0, sizeof(struct dmae_command));
 
-       dmae->opcode = (DMAE_CMD_SRC_GRC | DMAE_CMD_DST_PCI |
-                       DMAE_CMD_C_DST_PCI | DMAE_CMD_C_ENABLE |
-                       DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET |
-#ifdef __BIG_ENDIAN
-                       DMAE_CMD_ENDIANITY_B_DW_SWAP |
-#else
-                       DMAE_CMD_ENDIANITY_DW_SWAP |
-#endif
-                       (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0) |
-                       (BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT));
+       dmae->opcode = bnx2x_dmae_opcode(bp, DMAE_SRC_GRC, DMAE_DST_PCI,
+                                        true, DMAE_COMP_PCI);
        dmae->src_addr_lo = bp->func_stx >> 2;
        dmae->src_addr_hi = 0;
        dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, func_stats_base));
@@ -1351,8 +1337,9 @@ static void bnx2x_func_stats_base_update(struct bnx2x *bp)
 void bnx2x_stats_init(struct bnx2x *bp)
 {
        int port = BP_PORT(bp);
-       int func = BP_FUNC(bp);
+       int mb_idx = BP_FW_MB_IDX(bp);
        int i;
+       struct eth_stats_query *stats = bnx2x_sp(bp, fw_stats);
 
        bp->stats_pending = 0;
        bp->executer_idx = 0;
@@ -1361,7 +1348,7 @@ void bnx2x_stats_init(struct bnx2x *bp)
        /* port and func stats for management */
        if (!BP_NOMCP(bp)) {
                bp->port.port_stx = SHMEM_RD(bp, port_mb[port].port_stx);
-               bp->func_stx = SHMEM_RD(bp, func_mb[func].fw_mb_param);
+               bp->func_stx = SHMEM_RD(bp, func_mb[mb_idx].fw_mb_param);
 
        } else {
                bp->port.port_stx = 0;
@@ -1394,6 +1381,18 @@ void bnx2x_stats_init(struct bnx2x *bp)
                memset(&fp->eth_q_stats, 0, sizeof(struct bnx2x_eth_q_stats));
        }
 
+       for_each_queue(bp, i) {
+               /* Set initial stats counter in the stats ramrod data to -1 */
+               int cl_id = bp->fp[i].cl_id;
+
+               stats->xstorm_common.client_statistics[cl_id].
+                       stats_counter = 0xffff;
+               stats->ustorm_common.client_statistics[cl_id].
+                       stats_counter = 0xffff;
+               stats->tstorm_common.client_statistics[cl_id].
+                       stats_counter = 0xffff;
+       }
+
        memset(&bp->dev->stats, 0, sizeof(struct net_device_stats));
        memset(&bp->eth_stats, 0, sizeof(struct bnx2x_eth_stats));