[NET]: Nuke SET_MODULE_OWNER macro.
[linux-2.6-block.git] / drivers / net / tsi108_eth.c
index 0bfc2c9c1c083223820102cad66f1e747c3b3e05..fe3225df0d32449139ce2aaa9848f06363e35274 100644 (file)
@@ -47,7 +47,6 @@
 #include <linux/rtnetlink.h>
 #include <linux/timer.h>
 #include <linux/platform_device.h>
-#include <linux/etherdevice.h>
 
 #include <asm/system.h>
 #include <asm/io.h>
@@ -79,9 +78,13 @@ struct tsi108_prv_data {
        void  __iomem *regs;    /* Base of normal regs */
        void  __iomem *phyregs; /* Base of register bank used for PHY access */
 
+       struct net_device *dev;
+       struct napi_struct napi;
+
        unsigned int phy;               /* Index of PHY for this interface */
        unsigned int irq_num;
        unsigned int id;
+       unsigned int phy_type;
 
        struct timer_list timer;/* Timer that triggers the check phy function */
        unsigned int rxtail;    /* Next entry in rxring to read */
@@ -836,13 +839,13 @@ static int tsi108_refill_rx(struct net_device *dev, int budget)
        return done;
 }
 
-static int tsi108_poll(struct net_device *dev, int *budget)
+static int tsi108_poll(struct napi_struct *napi, int budget)
 {
-       struct tsi108_prv_data *data = netdev_priv(dev);
+       struct tsi108_prv_data *data = container_of(napi, struct tsi108_prv_data, napi);
+       struct net_device *dev = data->dev;
        u32 estat = TSI_READ(TSI108_EC_RXESTAT);
        u32 intstat = TSI_READ(TSI108_EC_INTSTAT);
-       int total_budget = min(*budget, dev->quota);
-       int num_received = 0, num_filled = 0, budget_used;
+       int num_received = 0, num_filled = 0;
 
        intstat &= TSI108_INT_RXQUEUE0 | TSI108_INT_RXTHRESH |
            TSI108_INT_RXOVERRUN | TSI108_INT_RXERROR | TSI108_INT_RXWAIT;
@@ -851,7 +854,7 @@ static int tsi108_poll(struct net_device *dev, int *budget)
        TSI_WRITE(TSI108_EC_INTSTAT, intstat);
 
        if (data->rxpending || (estat & TSI108_EC_RXESTAT_Q0_DESCINT))
-               num_received = tsi108_complete_rx(dev, total_budget);
+               num_received = tsi108_complete_rx(dev, budget);
 
        /* This should normally fill no more slots than the number of
         * packets received in tsi108_complete_rx().  The exception
@@ -866,7 +869,7 @@ static int tsi108_poll(struct net_device *dev, int *budget)
         */
 
        if (data->rxfree < TSI108_RXRING_LEN)
-               num_filled = tsi108_refill_rx(dev, total_budget * 2);
+               num_filled = tsi108_refill_rx(dev, budget * 2);
 
        if (intstat & TSI108_INT_RXERROR) {
                u32 err = TSI_READ(TSI108_EC_RXERR);
@@ -889,14 +892,9 @@ static int tsi108_poll(struct net_device *dev, int *budget)
                spin_unlock_irq(&data->misclock);
        }
 
-       budget_used = max(num_received, num_filled / 2);
-
-       *budget -= budget_used;
-       dev->quota -= budget_used;
-
-       if (budget_used != total_budget) {
+       if (num_received < budget) {
                data->rxpending = 0;
-               netif_rx_complete(dev);
+               netif_rx_complete(dev, napi);
 
                TSI_WRITE(TSI108_EC_INTMASK,
                                     TSI_READ(TSI108_EC_INTMASK)
@@ -905,14 +903,11 @@ static int tsi108_poll(struct net_device *dev, int *budget)
                                         TSI108_INT_RXOVERRUN |
                                         TSI108_INT_RXERROR |
                                         TSI108_INT_RXWAIT));
-
-               /* IRQs are level-triggered, so no need to re-check */
-               return 0;
        } else {
                data->rxpending = 1;
        }
 
-       return 1;
+       return num_received;
 }
 
 static void tsi108_rx_int(struct net_device *dev)
@@ -930,7 +925,7 @@ static void tsi108_rx_int(struct net_device *dev)
         * from tsi108_check_rxring().
         */
 
-       if (netif_rx_schedule_prep(dev)) {
+       if (netif_rx_schedule_prep(dev, &data->napi)) {
                /* Mask, rather than ack, the receive interrupts.  The ack
                 * will happen in tsi108_poll().
                 */
@@ -941,7 +936,7 @@ static void tsi108_rx_int(struct net_device *dev)
                                     | TSI108_INT_RXTHRESH |
                                     TSI108_INT_RXOVERRUN | TSI108_INT_RXERROR |
                                     TSI108_INT_RXWAIT);
-               __netif_rx_schedule(dev);
+               __netif_rx_schedule(dev, &data->napi);
        } else {
                if (!netif_running(dev)) {
                        /* This can happen if an interrupt occurs while the
@@ -1256,11 +1251,11 @@ static void tsi108_init_phy(struct net_device *dev)
        if (i == 0)
                printk(KERN_ERR "%s function time out \n", __FUNCTION__);
 
-#if (TSI108_PHY_TYPE == PHY_BCM54XX)   /* Broadcom BCM54xx PHY */
-       tsi108_write_mii(data, 0x09, 0x0300);
-       tsi108_write_mii(data, 0x10, 0x1020);
-       tsi108_write_mii(data, 0x1c, 0x8c00);
-#endif
+       if (data->phy_type == TSI108_PHY_BCM54XX) {
+               tsi108_write_mii(data, 0x09, 0x0300);
+               tsi108_write_mii(data, 0x10, 0x1020);
+               tsi108_write_mii(data, 0x1c, 0x8c00);
+       }
 
        tsi108_write_mii(data,
                         MII_BMCR,
@@ -1400,6 +1395,8 @@ static int tsi108_open(struct net_device *dev)
        TSI_WRITE(TSI108_EC_TXQ_PTRLOW, data->txdma);
        tsi108_init_phy(dev);
 
+       napi_enable(&data->napi);
+
        setup_timer(&data->timer, tsi108_timed_checker, (unsigned long)dev);
        mod_timer(&data->timer, jiffies + 1);
 
@@ -1424,6 +1421,7 @@ static int tsi108_close(struct net_device *dev)
        struct tsi108_prv_data *data = netdev_priv(dev);
 
        netif_stop_queue(dev);
+       napi_disable(&data->napi);
 
        del_timer_sync(&data->timer);
 
@@ -1561,6 +1559,7 @@ tsi108_init_one(struct platform_device *pdev)
 
        printk("tsi108_eth%d: probe...\n", pdev->id);
        data = netdev_priv(dev);
+       data->dev = dev;
 
        pr_debug("tsi108_eth%d:regs:phyresgs:phy:irq_num=0x%x:0x%x:0x%x:0x%x\n",
                        pdev->id, einfo->regs, einfo->phyregs,
@@ -1587,6 +1586,7 @@ tsi108_init_one(struct platform_device *pdev)
        data->mii_if.supports_gmii = mii_check_gmii_support(&data->mii_if);
 
        data->phy = einfo->phy;
+       data->phy_type = einfo->phy_type;
        data->irq_num = einfo->irq_num;
        data->id = pdev->id;
        dev->open = tsi108_open;
@@ -1595,9 +1595,8 @@ tsi108_init_one(struct platform_device *pdev)
        dev->set_mac_address = tsi108_set_mac;
        dev->set_multicast_list = tsi108_set_rx_mode;
        dev->get_stats = tsi108_get_stats;
-       dev->poll = tsi108_poll;
+       netif_napi_add(dev, &data->napi, tsi108_poll, 64);
        dev->do_ioctl = tsi108_do_ioctl;
-       dev->weight = 64;  /* 64 is more suitable for GigE interface - klai */
 
        /* Apparently, the Linux networking code won't use scatter-gather
         * if the hardware doesn't do checksums.  However, it's faster
@@ -1608,7 +1607,6 @@ tsi108_init_one(struct platform_device *pdev)
         */
 
        dev->features = NETIF_F_HIGHDMA;
-       SET_MODULE_OWNER(dev);
 
        spin_lock_init(&data->txlock);
        spin_lock_init(&data->misclock);