struct axienet_local *lp = data;
        struct sk_buff *skb;
        u32 *app_metadata;
+       int i;
 
        skbuf_dma = axienet_get_rx_desc(lp, lp->rx_ring_tail++);
        skb = skbuf_dma->skb;
        u64_stats_add(&lp->rx_packets, 1);
        u64_stats_add(&lp->rx_bytes, rx_len);
        u64_stats_update_end(&lp->rx_stat_sync);
-       axienet_rx_submit_desc(lp->ndev);
+
+       for (i = 0; i < CIRC_SPACE(lp->rx_ring_head, lp->rx_ring_tail,
+                                  RX_BUF_NUM_DEFAULT); i++)
+               axienet_rx_submit_desc(lp->ndev);
        dma_async_issue_pending(lp->rx_chan);
 }
 
        if (!skbuf_dma)
                return;
 
-       lp->rx_ring_head++;
        skb = netdev_alloc_skb(ndev, lp->max_frm_size);
        if (!skb)
                return;
        skbuf_dma->desc = dma_rx_desc;
        dma_rx_desc->callback_param = lp;
        dma_rx_desc->callback_result = axienet_dma_rx_cb;
+       lp->rx_ring_head++;
        dmaengine_submit(dma_rx_desc);
 
        return;