aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/via-rhine.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/via-rhine.c')
-rw-r--r--drivers/net/via-rhine.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c
index b56dff26772d..7a5899059c44 100644
--- a/drivers/net/via-rhine.c
+++ b/drivers/net/via-rhine.c
@@ -389,6 +389,8 @@ struct rhine_private {
389 389
390 struct pci_dev *pdev; 390 struct pci_dev *pdev;
391 long pioaddr; 391 long pioaddr;
392 struct net_device *dev;
393 struct napi_struct napi;
392 struct net_device_stats stats; 394 struct net_device_stats stats;
393 spinlock_t lock; 395 spinlock_t lock;
394 396
@@ -582,28 +584,25 @@ static void rhine_poll(struct net_device *dev)
582#endif 584#endif
583 585
584#ifdef CONFIG_VIA_RHINE_NAPI 586#ifdef CONFIG_VIA_RHINE_NAPI
585static int rhine_napipoll(struct net_device *dev, int *budget) 587static int rhine_napipoll(struct napi_struct *napi, int budget)
586{ 588{
587 struct rhine_private *rp = netdev_priv(dev); 589 struct rhine_private *rp = container_of(napi, struct rhine_private, napi);
590 struct net_device *dev = rp->dev;
588 void __iomem *ioaddr = rp->base; 591 void __iomem *ioaddr = rp->base;
589 int done, limit = min(dev->quota, *budget); 592 int work_done;
590 593
591 done = rhine_rx(dev, limit); 594 work_done = rhine_rx(dev, budget);
592 *budget -= done;
593 dev->quota -= done;
594 595
595 if (done < limit) { 596 if (work_done < budget) {
596 netif_rx_complete(dev); 597 netif_rx_complete(dev, napi);
597 598
598 iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | 599 iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow |
599 IntrRxDropped | IntrRxNoBuf | IntrTxAborted | 600 IntrRxDropped | IntrRxNoBuf | IntrTxAborted |
600 IntrTxDone | IntrTxError | IntrTxUnderrun | 601 IntrTxDone | IntrTxError | IntrTxUnderrun |
601 IntrPCIErr | IntrStatsMax | IntrLinkChange, 602 IntrPCIErr | IntrStatsMax | IntrLinkChange,
602 ioaddr + IntrEnable); 603 ioaddr + IntrEnable);
603 return 0;
604 } 604 }
605 else 605 return work_done;
606 return 1;
607} 606}
608#endif 607#endif
609 608
@@ -707,6 +706,7 @@ static int __devinit rhine_init_one(struct pci_dev *pdev,
707 SET_NETDEV_DEV(dev, &pdev->dev); 706 SET_NETDEV_DEV(dev, &pdev->dev);
708 707
709 rp = netdev_priv(dev); 708 rp = netdev_priv(dev);
709 rp->dev = dev;
710 rp->quirks = quirks; 710 rp->quirks = quirks;
711 rp->pioaddr = pioaddr; 711 rp->pioaddr = pioaddr;
712 rp->pdev = pdev; 712 rp->pdev = pdev;
@@ -785,8 +785,7 @@ static int __devinit rhine_init_one(struct pci_dev *pdev,
785 dev->poll_controller = rhine_poll; 785 dev->poll_controller = rhine_poll;
786#endif 786#endif
787#ifdef CONFIG_VIA_RHINE_NAPI 787#ifdef CONFIG_VIA_RHINE_NAPI
788 dev->poll = rhine_napipoll; 788 netif_napi_add(dev, &rp->napi, rhine_napipoll, 64);
789 dev->weight = 64;
790#endif 789#endif
791 if (rp->quirks & rqRhineI) 790 if (rp->quirks & rqRhineI)
792 dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM; 791 dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM;
@@ -1061,7 +1060,9 @@ static void init_registers(struct net_device *dev)
1061 1060
1062 rhine_set_rx_mode(dev); 1061 rhine_set_rx_mode(dev);
1063 1062
1064 netif_poll_enable(dev); 1063#ifdef CONFIG_VIA_RHINE_NAPI
1064 napi_enable(&rp->napi);
1065#endif
1065 1066
1066 /* Enable interrupts by setting the interrupt mask. */ 1067 /* Enable interrupts by setting the interrupt mask. */
1067 iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | 1068 iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow |
@@ -1196,6 +1197,10 @@ static void rhine_tx_timeout(struct net_device *dev)
1196 /* protect against concurrent rx interrupts */ 1197 /* protect against concurrent rx interrupts */
1197 disable_irq(rp->pdev->irq); 1198 disable_irq(rp->pdev->irq);
1198 1199
1200#ifdef CONFIG_VIA_RHINE_NAPI
1201 napi_disable(&rp->napi);
1202#endif
1203
1199 spin_lock(&rp->lock); 1204 spin_lock(&rp->lock);
1200 1205
1201 /* clear all descriptors */ 1206 /* clear all descriptors */
@@ -1324,7 +1329,7 @@ static irqreturn_t rhine_interrupt(int irq, void *dev_instance)
1324 IntrPCIErr | IntrStatsMax | IntrLinkChange, 1329 IntrPCIErr | IntrStatsMax | IntrLinkChange,
1325 ioaddr + IntrEnable); 1330 ioaddr + IntrEnable);
1326 1331
1327 netif_rx_schedule(dev); 1332 netif_rx_schedule(dev, &rp->napi);
1328#else 1333#else
1329 rhine_rx(dev, RX_RING_SIZE); 1334 rhine_rx(dev, RX_RING_SIZE);
1330#endif 1335#endif
@@ -1837,7 +1842,9 @@ static int rhine_close(struct net_device *dev)
1837 spin_lock_irq(&rp->lock); 1842 spin_lock_irq(&rp->lock);
1838 1843
1839 netif_stop_queue(dev); 1844 netif_stop_queue(dev);
1840 netif_poll_disable(dev); 1845#ifdef CONFIG_VIA_RHINE_NAPI
1846 napi_disable(&rp->napi);
1847#endif
1841 1848
1842 if (debug > 1) 1849 if (debug > 1)
1843 printk(KERN_DEBUG "%s: Shutting down ethercard, " 1850 printk(KERN_DEBUG "%s: Shutting down ethercard, "
@@ -1936,6 +1943,9 @@ static int rhine_suspend(struct pci_dev *pdev, pm_message_t state)
1936 if (!netif_running(dev)) 1943 if (!netif_running(dev))
1937 return 0; 1944 return 0;
1938 1945
1946#ifdef CONFIG_VIA_RHINE_NAPI
1947 napi_disable(&rp->napi);
1948#endif
1939 netif_device_detach(dev); 1949 netif_device_detach(dev);
1940 pci_save_state(pdev); 1950 pci_save_state(pdev);
1941 1951