: Fix CONFIG_VIA_RHINE_NAPI usage
Subsystems (2)
PATCH 1/1 : Fix CONFIG_VIA_RHINE_NAPI usage
Hi David,
napi is broken here, with this patch at least I can isolate this
breakage and boot the machine with a non-napi via-rhine driver.
drivers/net/via-rhine.c +6 -3
@@ -390,7 +390,9 @@ struct rhine_private {struct pci_dev *pdev;long pioaddr;struct net_device *dev; +#ifdef CONFIG_VIA_RHINE_NAPI struct napi_struct napi; +#endif struct net_device_stats stats;spinlock_t lock;
@@ -1059,9 +1061,9 @@ static void init_registers(struct net_device *dev)iowrite32 (rp->tx_ring_dma, ioaddr + TxRingPtr);rhine_set_rx_mode (dev); - +#ifdef CONFIG_VIA_RHINE_NAPI napi_enable (&rp->napi); - +#endif /* Enable interrupts by setting the interrupt mask. */ iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | IntrRxDropped | IntrRxNoBuf | IntrTxAborted |
@@ -1836,8 +1838,9 @@ static int rhine_close(struct net_device *dev)spin_lock_irq (&rp->lock);netif_stop_queue (dev); +#ifdef CONFIG_VIA_RHINE_NAPI napi_disable (&rp->napi); - +#endif if (debug >1 ) printk(KERN_DEBUG "%s: Shutting down ethercard, " "status was %4.4x.\n",
David Miller
maintainerFrom: Arnaldo Carvalho de Melo <[email protected]>
Date: Wed, 22 Aug 2007 18:46:59 -0300
Quoted 6 lines
Hi David,
napi is broken here, with this patch at least I can isolate this
breakage and boot the machine with a non-napi via-rhine driver.Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
Thanks for finding this problem.
The core issue seems to be that via-rhine.c tries to perform a napi_enable() when there has not been a previous napi_disable().
So lets make sure that all paths that lead to an init_registers() call makes a preceeding napi_disable().
Please give this patch a try:
drivers/net/via-rhine.c +4 -0
@@ -1167,6 +1167,7 @@ static int rhine_open(struct net_device *dev)free_irq (rp->pdev->irq, dev);return rc; } +napi_disable (&rp->napi);alloc_rbufs (dev);alloc_tbufs (dev);rhine_chip_reset (dev);
@@ -1195,6 +1196,8 @@ static void rhine_tx_timeout(struct net_device *dev)/* protect against concurrent rx interrupts */ disable_irq (rp->pdev->irq); +napi_disable (&rp->napi); +spin_lock (&rp->lock);/* clear all descriptors */
@@ -1935,6 +1938,7 @@ static int rhine_suspend(struct pci_dev *pdev, pm_message_t state)if (!netif_running (dev))return 0 ; +napi_disable (&rp->napi);netif_device_detach (dev);pci_save_state (pdev);
Em Wed, Aug 22, 2007 at 02:58:55PM -0700, David Miller escreveu:
Quoted 11 lines
From: Arnaldo Carvalho de Melo <[email protected]>
Date: Wed, 22 Aug 2007 18:46:59 -0300Quoted 5 lines
Hi David,
napi is broken here, with this patch at least I can isolate this
breakage and boot the machine with a non-napi via-rhine driver.Thanks for finding this problem.
Quoted 7 lines
The core issue seems to be that
via-rhine.ctries to perform anapi_enable()when there has not been a previousnapi_disable().So lets make sure that all paths that lead to an
init_registers()call makes a preceedingnapi_disable().Please give this patch a try:
Tried with and without CONFIG_VIA_RHINE_NAPI, did stress testing with netperf only with NAPI enabled. Works great
Quoted 33 lines
drivers/net/via-rhine.c +4
-1@@ -1167,6 +1167,7 @@ static int rhine_open(struct net_device *dev)free_irq (rp->pdev->irq, dev);return rc; } +napi_disable (&rp->napi);alloc_rbufs (dev);alloc_tbufs (dev);rhine_chip_reset (dev);@@ -1195,6 +1196,8 @@ static void rhine_tx_timeout(struct net_device *dev)/* protect against concurrent rx interrupts */ disable_irq (rp->pdev->irq); +napi_disable (&rp->napi); +spin_lock (&rp->lock);/* clear all descriptors */ @@ -1935,6 +1938,7 @@ static int rhine_suspend(struct pci_dev *pdev, pm_message_t state)if (!netif_running (dev))return 0 ; +napi_disable (&rp->napi);netif_device_detach (dev);pci_save_state (pdev); -To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html