[NET]: Make NAPI polling independent of struct net_device objects.
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / net / e1000 / e1000_main.c
index e7c8951f47fa94d3e0fae7551f5e6d84ef16676a..723568d6e44a2db17ef88ab01feef5337a2899a4 100644 (file)
@@ -166,7 +166,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data);
 static boolean_t e1000_clean_tx_irq(struct e1000_adapter *adapter,
                                     struct e1000_tx_ring *tx_ring);
 #ifdef CONFIG_E1000_NAPI
-static int e1000_clean(struct net_device *poll_dev, int *budget);
+static int e1000_clean(struct napi_struct *napi, int budget);
 static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter,
                                     struct e1000_rx_ring *rx_ring,
                                     int *work_done, int work_to_do);
@@ -545,7 +545,7 @@ int e1000_up(struct e1000_adapter *adapter)
        clear_bit(__E1000_DOWN, &adapter->flags);
 
 #ifdef CONFIG_E1000_NAPI
-       netif_poll_enable(adapter->netdev);
+       napi_enable(&adapter->napi);
 #endif
        e1000_irq_enable(adapter);
 
@@ -634,7 +634,7 @@ e1000_down(struct e1000_adapter *adapter)
        set_bit(__E1000_DOWN, &adapter->flags);
 
 #ifdef CONFIG_E1000_NAPI
-       netif_poll_disable(netdev);
+       napi_disable(&adapter->napi);
 #endif
        e1000_irq_disable(adapter);
 
@@ -936,8 +936,7 @@ e1000_probe(struct pci_dev *pdev,
        netdev->tx_timeout = &e1000_tx_timeout;
        netdev->watchdog_timeo = 5 * HZ;
 #ifdef CONFIG_E1000_NAPI
-       netdev->poll = &e1000_clean;
-       netdev->weight = 64;
+       netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
 #endif
        netdev->vlan_rx_register = e1000_vlan_rx_register;
        netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid;
@@ -1151,9 +1150,6 @@ e1000_probe(struct pci_dev *pdev,
        /* tell the stack to leave us alone until e1000_open() is called */
        netif_carrier_off(netdev);
        netif_stop_queue(netdev);
-#ifdef CONFIG_E1000_NAPI
-       netif_poll_disable(netdev);
-#endif
 
        strcpy(netdev->name, "eth%d");
        if ((err = register_netdev(netdev)))
@@ -1222,12 +1218,13 @@ e1000_remove(struct pci_dev *pdev)
         * would have already happened in close and is redundant. */
        e1000_release_hw_control(adapter);
 
-       unregister_netdev(netdev);
 #ifdef CONFIG_E1000_NAPI
        for (i = 0; i < adapter->num_rx_queues; i++)
                dev_put(&adapter->polling_netdev[i]);
 #endif
 
+       unregister_netdev(netdev);
+
        if (!e1000_check_phy_reset_block(&adapter->hw))
                e1000_phy_hw_reset(&adapter->hw);
 
@@ -1325,8 +1322,6 @@ e1000_sw_init(struct e1000_adapter *adapter)
 #ifdef CONFIG_E1000_NAPI
        for (i = 0; i < adapter->num_rx_queues; i++) {
                adapter->polling_netdev[i].priv = adapter;
-               adapter->polling_netdev[i].poll = &e1000_clean;
-               adapter->polling_netdev[i].weight = 64;
                dev_hold(&adapter->polling_netdev[i]);
                set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state);
        }
@@ -1443,7 +1438,7 @@ e1000_open(struct net_device *netdev)
        clear_bit(__E1000_DOWN, &adapter->flags);
 
 #ifdef CONFIG_E1000_NAPI
-       netif_poll_enable(netdev);
+       napi_enable(&adapter->napi);
 #endif
 
        e1000_irq_enable(adapter);
@@ -3786,12 +3781,12 @@ e1000_intr_msi(int irq, void *data)
        }
 
 #ifdef CONFIG_E1000_NAPI
-       if (likely(netif_rx_schedule_prep(netdev))) {
+       if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) {
                adapter->total_tx_bytes = 0;
                adapter->total_tx_packets = 0;
                adapter->total_rx_bytes = 0;
                adapter->total_rx_packets = 0;
-               __netif_rx_schedule(netdev);
+               __netif_rx_schedule(netdev, &adapter->napi);
        } else
                e1000_irq_enable(adapter);
 #else
@@ -3871,12 +3866,12 @@ e1000_intr(int irq, void *data)
                E1000_WRITE_REG(hw, IMC, ~0);
                E1000_WRITE_FLUSH(hw);
        }
-       if (likely(netif_rx_schedule_prep(netdev))) {
+       if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) {
                adapter->total_tx_bytes = 0;
                adapter->total_tx_packets = 0;
                adapter->total_rx_bytes = 0;
                adapter->total_rx_packets = 0;
-               __netif_rx_schedule(netdev);
+               __netif_rx_schedule(netdev, &adapter->napi);
        } else
                /* this really should not happen! if it does it is basically a
                 * bug, but not a hard error, so enable ints and continue */
@@ -3924,10 +3919,10 @@ e1000_intr(int irq, void *data)
  **/
 
 static int
-e1000_clean(struct net_device *poll_dev, int *budget)
+e1000_clean(struct napi_struct *napi, int budget)
 {
-       struct e1000_adapter *adapter;
-       int work_to_do = min(*budget, poll_dev->quota);
+       struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
+       struct net_device *poll_dev = adapter->netdev;
        int tx_cleaned = 0, work_done = 0;
 
        /* Must NOT use netdev_priv macro here. */
@@ -3948,23 +3943,19 @@ e1000_clean(struct net_device *poll_dev, int *budget)
        }
 
        adapter->clean_rx(adapter, &adapter->rx_ring[0],
-                         &work_done, work_to_do);
-
-       *budget -= work_done;
-       poll_dev->quota -= work_done;
+                         &work_done, budget);
 
        /* If no Tx and not enough Rx work done, exit the polling mode */
-       if ((!tx_cleaned && (work_done == 0)) ||
+       if ((!tx_cleaned && (work_done < budget)) ||
           !netif_running(poll_dev)) {
 quit_polling:
                if (likely(adapter->itr_setting & 3))
                        e1000_set_itr(adapter);
-               netif_rx_complete(poll_dev);
+               netif_rx_complete(poll_dev, napi);
                e1000_irq_enable(adapter);
-               return 0;
        }
 
-       return 1;
+       return work_done;
 }
 
 #endif