/* RBUF misc statistics */
        STAT_RBUF("rbuf_ovflow_cnt", mib.rbuf_ovflow_cnt, RBUF_OVFL_DISC_CNTR),
        STAT_RBUF("rbuf_err_cnt", mib.rbuf_err_cnt, RBUF_ERR_PKT_CNTR),
+       STAT_MIB_RX("alloc_rx_buff_failed", mib.alloc_rx_buff_failed),
+       STAT_MIB_RX("rx_dma_failed", mib.rx_dma_failed),
+       STAT_MIB_TX("tx_dma_failed", mib.tx_dma_failed),
 };
 
 #define BCM_SYSPORT_STATS_LEN  ARRAY_SIZE(bcm_sysport_gstrings_stats)
                                 RX_BUF_LENGTH, DMA_FROM_DEVICE);
        ret = dma_mapping_error(kdev, mapping);
        if (ret) {
+               priv->mib.rx_dma_failed++;
                bcm_sysport_free_cb(cb);
                netif_err(priv, rx_err, ndev, "DMA mapping failure\n");
                return ret;
        unsigned int p_index;
        u16 len, status;
        struct bcm_rsb *rsb;
+       int ret;
 
        /* Determine how much we should process since last call */
        p_index = rdma_readl(priv, RDMA_PROD_INDEX);
 
                napi_gro_receive(&priv->napi, skb);
 refill:
-               bcm_sysport_rx_refill(priv, cb);
+               ret = bcm_sysport_rx_refill(priv, cb);
+               if (ret)
+                       priv->mib.alloc_rx_buff_failed++;
        }
 
        return processed;
 
        mapping = dma_map_single(kdev, skb->data, skb_len, DMA_TO_DEVICE);
        if (dma_mapping_error(kdev, mapping)) {
+               priv->mib.tx_dma_failed++;
                netif_err(priv, tx_err, dev, "DMA map failed at %p (len=%d)\n",
                          skb->data, skb_len);
                ret = NETDEV_TX_OK;