[NET]: Make NAPI polling independent of struct net_device objects.
[linux-3.10.git] / drivers / net / skge.c
index e3d8520..0bf46ed 100644 (file)
@@ -2528,7 +2528,7 @@ static int skge_up(struct net_device *dev)
        skge_write32(hw, B0_IMSK, hw->intr_mask);
        spin_unlock_irq(&hw->hw_lock);
 
-       netif_poll_enable(dev);
+       napi_enable(&skge->napi);
        return 0;
 
  free_rx_ring:
@@ -2558,7 +2558,7 @@ static int skge_down(struct net_device *dev)
        if (hw->chip_id == CHIP_ID_GENESIS && hw->phy_type == SK_PHY_XMAC)
                del_timer_sync(&skge->link_timer);
 
-       netif_poll_disable(dev);
+       napi_disable(&skge->napi);
        netif_carrier_off(dev);
 
        spin_lock_irq(&hw->hw_lock);
@@ -3044,14 +3044,13 @@ static void skge_tx_done(struct net_device *dev)
        }
 }
 
-static int skge_poll(struct net_device *dev, int *budget)
+static int skge_poll(struct napi_struct *napi, int to_do)
 {
-       struct skge_port *skge = netdev_priv(dev);
+       struct skge_port *skge = container_of(napi, struct skge_port, napi);
+       struct net_device *dev = skge->netdev;
        struct skge_hw *hw = skge->hw;
        struct skge_ring *ring = &skge->rx_ring;
        struct skge_element *e;
-       unsigned long flags;
-       int to_do = min(dev->quota, *budget);
        int work_done = 0;
 
        skge_tx_done(dev);
@@ -3082,20 +3081,16 @@ static int skge_poll(struct net_device *dev, int *budget)
        wmb();
        skge_write8(hw, Q_ADDR(rxqaddr[skge->port], Q_CSR), CSR_START);
 
-       *budget -= work_done;
-       dev->quota -= work_done;
-
-       if (work_done >=  to_do)
-               return 1; /* not done */
-
-       spin_lock_irqsave(&hw->hw_lock, flags);
-       __netif_rx_complete(dev);
-       hw->intr_mask |= napimask[skge->port];
-       skge_write32(hw, B0_IMSK, hw->intr_mask);
-       skge_read32(hw, B0_IMSK);
-       spin_unlock_irqrestore(&hw->hw_lock, flags);
+       if (work_done < to_do) {
+               spin_lock_irq(&hw->hw_lock);
+               __netif_rx_complete(dev, napi);
+               hw->intr_mask |= napimask[skge->port];
+               skge_write32(hw, B0_IMSK, hw->intr_mask);
+               skge_read32(hw, B0_IMSK);
+               spin_unlock_irq(&hw->hw_lock);
+       }
 
-       return 0;
+       return work_done;
 }
 
 /* Parity errors seem to happen when Genesis is connected to a switch
@@ -3252,8 +3247,9 @@ static irqreturn_t skge_intr(int irq, void *dev_id)
        }
 
        if (status & (IS_XA1_F|IS_R1_F)) {
+               struct skge_port *skge = netdev_priv(hw->dev[0]);
                hw->intr_mask &= ~(IS_XA1_F|IS_R1_F);
-               netif_rx_schedule(hw->dev[0]);
+               netif_rx_schedule(hw->dev[0], &skge->napi);
        }
 
        if (status & IS_PA_TO_TX1)
@@ -3271,13 +3267,14 @@ static irqreturn_t skge_intr(int irq, void *dev_id)
                skge_mac_intr(hw, 0);
 
        if (hw->dev[1]) {
+               struct skge_port *skge = netdev_priv(hw->dev[1]);
+
                if (status & (IS_XA2_F|IS_R2_F)) {
                        hw->intr_mask &= ~(IS_XA2_F|IS_R2_F);
-                       netif_rx_schedule(hw->dev[1]);
+                       netif_rx_schedule(hw->dev[1], &skge->napi);
                }
 
                if (status & IS_PA_TO_RX2) {
-                       struct skge_port *skge = netdev_priv(hw->dev[1]);
                        ++skge->net_stats.rx_over_errors;
                        skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_RX2);
                }
@@ -3569,8 +3566,6 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port,
        SET_ETHTOOL_OPS(dev, &skge_ethtool_ops);
        dev->tx_timeout = skge_tx_timeout;
        dev->watchdog_timeo = TX_WATCHDOG;
-       dev->poll = skge_poll;
-       dev->weight = NAPI_WEIGHT;
 #ifdef CONFIG_NET_POLL_CONTROLLER
        dev->poll_controller = skge_netpoll;
 #endif
@@ -3580,6 +3575,7 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port,
                dev->features |= NETIF_F_HIGHDMA;
 
        skge = netdev_priv(dev);
+       netif_napi_add(dev, &skge->napi, skge_poll, NAPI_WEIGHT);
        skge->netdev = dev;
        skge->hw = hw;
        skge->msg_enable = netif_msg_init(debug, default_msg);