via-rhine: Fix bugs in NAPI support.

1) rhine_tx() should use dev_kfree_skb() not dev_kfree_skb_irq()

2) rhine_slow_event_task's NAPI triggering logic is racey, it
   should just hit the interrupt mask register.  This is the
   same as commit 7dbb491878
   ("r8169: avoid NAPI scheduling delay.") made to fix the same
   problem in the r8169 driver.  From Francois Romieu.

Reported-by: Jamie Gloudon <jamie.gloudon@gmail.com>
Tested-by: Jamie Gloudon <jamie.gloudon@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2013-01-29 22:58:04 -05:00
parent 9165bf273e
commit 559bcac35f

View File

@ -1801,7 +1801,7 @@ static void rhine_tx(struct net_device *dev)
rp->tx_skbuff[entry]->len, rp->tx_skbuff[entry]->len,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
} }
dev_kfree_skb_irq(rp->tx_skbuff[entry]); dev_kfree_skb(rp->tx_skbuff[entry]);
rp->tx_skbuff[entry] = NULL; rp->tx_skbuff[entry] = NULL;
entry = (++rp->dirty_tx) % TX_RING_SIZE; entry = (++rp->dirty_tx) % TX_RING_SIZE;
} }
@ -2010,11 +2010,7 @@ static void rhine_slow_event_task(struct work_struct *work)
if (intr_status & IntrPCIErr) if (intr_status & IntrPCIErr)
netif_warn(rp, hw, dev, "PCI error\n"); netif_warn(rp, hw, dev, "PCI error\n");
napi_disable(&rp->napi); iowrite16(RHINE_EVENT & 0xffff, rp->base + IntrEnable);
rhine_irq_disable(rp);
/* Slow and safe. Consider __napi_schedule as a replacement ? */
napi_enable(&rp->napi);
napi_schedule(&rp->napi);
out_unlock: out_unlock:
mutex_unlock(&rp->task_lock); mutex_unlock(&rp->task_lock);