From 48e5ecae691cfb50aa39036ba9fc193f5c24dbb3 Mon Sep 17 00:00:00 2001 From: Chris Friesen Date: Tue, 28 Oct 2008 15:50:54 -0700 Subject: amd8111e: Fix rx return code The amd8111e rx poll routine currently mishandles the case when we process exactly the number of packets specified in the budget. This patch is basically as suggested by David Miller. Signed-off-by: Chris Friesen Signed-off-by: David S. Miller --- drivers/net/amd8111e.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'drivers/net/amd8111e.c') diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c index c54967f7942..ba1be0b3a8c 100644 --- a/drivers/net/amd8111e.c +++ b/drivers/net/amd8111e.c @@ -833,12 +833,14 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget) } while(intr0 & RINT0); - /* Receive descriptor is empty now */ - spin_lock_irqsave(&lp->lock, flags); - __netif_rx_complete(dev, napi); - writel(VAL0|RINTEN0, mmio + INTEN0); - writel(VAL2 | RDMD0, mmio + CMD0); - spin_unlock_irqrestore(&lp->lock, flags); + if (rx_pkt_limit > 0) { + /* Receive descriptor is empty now */ + spin_lock_irqsave(&lp->lock, flags); + __netif_rx_complete(dev, napi); + writel(VAL0|RINTEN0, mmio + INTEN0); + writel(VAL2 | RDMD0, mmio + CMD0); + spin_unlock_irqrestore(&lp->lock, flags); + } rx_not_empty: return num_rx_pkt; -- cgit v1.2.3-18-g5258 From e83603fd4ace0bc8e2585cf9d450bb1dc80db448 Mon Sep 17 00:00:00 2001 From: Chunbo Luo Date: Tue, 28 Oct 2008 09:51:46 +0800 Subject: amd8111e: fix dma_free_coherent context Acoording commit aa24886e379d2b641c5117e178b15ce1d5d366ba, dma_free_coherent() need irqs enabled. This patch fix following warning messages: WARNING: at linux/arch/x86/kernel/pci-dma.c:376 dma_free_coherent+0xaa/0xb0() Call Trace: [] warn_on_slowpath+0x5f/0x90 [] ? __kfree_skb+0x3a/0xa0 [] ? discard_slab+0x23/0x40 [] dma_free_coherent+0xaa/0xb0 [] amd8111e_close+0x10f/0x1b0 [] dev_close+0x5e/0xb0 [] dev_change_flags+0xa1/0x1e0 [] ic_close_devs+0x36/0x4e [] ip_auto_config+0x581/0x10f3 [] ? kobject_add+0x69/0x90 [] ? kobject_get+0x1a/0x30 [] ? kobject_uevent+0xb/0x10 [] ? kset_register+0x52/0x60 [] ? kset_create_and_add+0x6b/0xa0 [] ? tcp_ca_find+0x24/0x50 [] ? ip_auto_config+0x0/0x10f3 [] _stext+0x3c/0x150 [] ? register_irq_proc+0xd3/0xf0 [] ? mb_cache_create+0x80/0x1f0 [] kernel_init+0x141/0x1b8 [] ? kernel_init+0x0/0x1b8 [] child_rip+0xa/0x11 [] ? kernel_init+0x0/0x1b8 [] ? kernel_init+0x0/0x1b8 [] ? child_rip+0x0/0x11 Signed-off-by: Chunbo Luo Signed-off-by: Jeff Garzik --- drivers/net/amd8111e.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'drivers/net/amd8111e.c') diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c index ba1be0b3a8c..07a6697e363 100644 --- a/drivers/net/amd8111e.c +++ b/drivers/net/amd8111e.c @@ -644,10 +644,6 @@ This function frees the transmiter and receiver descriptor rings. */ static void amd8111e_free_ring(struct amd8111e_priv* lp) { - - /* Free transmit and receive skbs */ - amd8111e_free_skbs(lp->amd8111e_net_dev); - /* Free transmit and receive descriptor rings */ if(lp->rx_ring){ pci_free_consistent(lp->pci_dev, @@ -1233,7 +1229,9 @@ static int amd8111e_close(struct net_device * dev) amd8111e_disable_interrupt(lp); amd8111e_stop_chip(lp); - amd8111e_free_ring(lp); + + /* Free transmit and receive skbs */ + amd8111e_free_skbs(lp->amd8111e_net_dev); netif_carrier_off(lp->amd8111e_net_dev); @@ -1243,6 +1241,7 @@ static int amd8111e_close(struct net_device * dev) spin_unlock_irq(&lp->lock); free_irq(dev->irq, dev); + amd8111e_free_ring(lp); /* Update the statistics before closing */ amd8111e_get_stats(dev); -- cgit v1.2.3-18-g5258