From: Koen Vandeputte Date: Thu, 16 Jun 2016 11:48:39 +0000 (+0200) Subject: cns3xxx: fix RX softIRQ loop X-Git-Tag: v17.01.0-rc1~2326 X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=f532191c1cefa9950d4064dbd9dd810b90b169bd;p=openwrt%2Fstaging%2Fxback.git cns3xxx: fix RX softIRQ loop Already reschedule when 1 or more frames came in. Checking for a full queue could produce a re-schedule loop as the checked RX ring location could contain undefined values depending on activity in previous loops. Signed-off-by: Koen Vandeputte --- 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 2f232c1d29..51b01876ef 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 @@ -717,8 +717,8 @@ static int eth_poll(struct napi_struct *napi, int budget) enable_irq(sw->rx_irq); budget = 0; - /* if rx descriptors are full schedule another poll */ - if (rx_ring->desc[(i-1) & (RX_DESCS-1)].cown) + /* If 1 or more frames came in during IRQ enable, re-schedule */ + if (rx_ring->desc[i].cown) eth_schedule_poll(sw); }