diff --git a/target/linux/cns3xxx/files/drivers/net/ethernet/cavium/cns3xxx_eth.c b/target/linux/cns3xxx/files/drivers/net/ethernet/cavium/cns3xxx_eth.c index db15a2e2e5..bbbbf5c091 100644 --- a/target/linux/cns3xxx/files/drivers/net/ethernet/cavium/cns3xxx_eth.c +++ b/target/linux/cns3xxx/files/drivers/net/ethernet/cavium/cns3xxx_eth.c @@ -713,9 +713,14 @@ static int eth_poll(struct napi_struct *napi, int budget) } } + rx_ring->cur_index = i; if (!received) { napi_complete(napi); enable_irq(IRQ_CNS3XXX_SW_R0RXC); + + /* if rx descriptors are full schedule another poll */ + if (rx_ring->desc[(i-1) & (RX_DESCS-1)].cown) + eth_schedule_poll(sw); } spin_lock_bh(&tx_lock); @@ -724,8 +729,6 @@ static int eth_poll(struct napi_struct *napi, int budget) cns3xxx_alloc_rx_buf(sw, received); - rx_ring->cur_index = i; - wmb(); enable_rx_dma(sw);