int len, err;
        unsigned int rxpktprocessed = 0, rxpkttoprocess;
        unsigned int p_index;
+       unsigned int discards;
        unsigned int chksum_ok = 0;
 
        p_index = bcmgenet_rdma_ring_readl(priv, index, RDMA_PROD_INDEX);
+
+       discards = (p_index >> DMA_P_INDEX_DISCARD_CNT_SHIFT) &
+                  DMA_P_INDEX_DISCARD_CNT_MASK;
+       if (discards > ring->old_discards) {
+               discards = discards - ring->old_discards;
+               dev->stats.rx_missed_errors += discards;
+               dev->stats.rx_errors += discards;
+               ring->old_discards += discards;
+
+               /* Clear HW register when we reach 75% of maximum 0xFFFF */
+               if (ring->old_discards >= 0xC000) {
+                       ring->old_discards = 0;
+                       bcmgenet_rdma_ring_writel(priv, index, 0,
+                                                 RDMA_PROD_INDEX);
+               }
+       }
+
        p_index &= DMA_P_INDEX_MASK;
 
        if (likely(p_index >= ring->c_index))
 
        unsigned int    read_ptr;       /* Rx ring read pointer */
        unsigned int    cb_ptr;         /* Rx ring initial CB ptr */
        unsigned int    end_ptr;        /* Rx ring end CB ptr */
+       unsigned int    old_discards;
 };
 
 /* device context */