diff options
Diffstat (limited to 'drivers/net/e1000/e1000_main.c')
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index e7c8951f47fa..723568d6e44a 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -166,7 +166,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data); | |||
166 | static boolean_t e1000_clean_tx_irq(struct e1000_adapter *adapter, | 166 | static boolean_t e1000_clean_tx_irq(struct e1000_adapter *adapter, |
167 | struct e1000_tx_ring *tx_ring); | 167 | struct e1000_tx_ring *tx_ring); |
168 | #ifdef CONFIG_E1000_NAPI | 168 | #ifdef CONFIG_E1000_NAPI |
169 | static int e1000_clean(struct net_device *poll_dev, int *budget); | 169 | static int e1000_clean(struct napi_struct *napi, int budget); |
170 | static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter, | 170 | static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter, |
171 | struct e1000_rx_ring *rx_ring, | 171 | struct e1000_rx_ring *rx_ring, |
172 | int *work_done, int work_to_do); | 172 | int *work_done, int work_to_do); |
@@ -545,7 +545,7 @@ int e1000_up(struct e1000_adapter *adapter) | |||
545 | clear_bit(__E1000_DOWN, &adapter->flags); | 545 | clear_bit(__E1000_DOWN, &adapter->flags); |
546 | 546 | ||
547 | #ifdef CONFIG_E1000_NAPI | 547 | #ifdef CONFIG_E1000_NAPI |
548 | netif_poll_enable(adapter->netdev); | 548 | napi_enable(&adapter->napi); |
549 | #endif | 549 | #endif |
550 | e1000_irq_enable(adapter); | 550 | e1000_irq_enable(adapter); |
551 | 551 | ||
@@ -634,7 +634,7 @@ e1000_down(struct e1000_adapter *adapter) | |||
634 | set_bit(__E1000_DOWN, &adapter->flags); | 634 | set_bit(__E1000_DOWN, &adapter->flags); |
635 | 635 | ||
636 | #ifdef CONFIG_E1000_NAPI | 636 | #ifdef CONFIG_E1000_NAPI |
637 | netif_poll_disable(netdev); | 637 | napi_disable(&adapter->napi); |
638 | #endif | 638 | #endif |
639 | e1000_irq_disable(adapter); | 639 | e1000_irq_disable(adapter); |
640 | 640 | ||
@@ -936,8 +936,7 @@ e1000_probe(struct pci_dev *pdev, | |||
936 | netdev->tx_timeout = &e1000_tx_timeout; | 936 | netdev->tx_timeout = &e1000_tx_timeout; |
937 | netdev->watchdog_timeo = 5 * HZ; | 937 | netdev->watchdog_timeo = 5 * HZ; |
938 | #ifdef CONFIG_E1000_NAPI | 938 | #ifdef CONFIG_E1000_NAPI |
939 | netdev->poll = &e1000_clean; | 939 | netif_napi_add(netdev, &adapter->napi, e1000_clean, 64); |
940 | netdev->weight = 64; | ||
941 | #endif | 940 | #endif |
942 | netdev->vlan_rx_register = e1000_vlan_rx_register; | 941 | netdev->vlan_rx_register = e1000_vlan_rx_register; |
943 | netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; | 942 | netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; |
@@ -1151,9 +1150,6 @@ e1000_probe(struct pci_dev *pdev, | |||
1151 | /* tell the stack to leave us alone until e1000_open() is called */ | 1150 | /* tell the stack to leave us alone until e1000_open() is called */ |
1152 | netif_carrier_off(netdev); | 1151 | netif_carrier_off(netdev); |
1153 | netif_stop_queue(netdev); | 1152 | netif_stop_queue(netdev); |
1154 | #ifdef CONFIG_E1000_NAPI | ||
1155 | netif_poll_disable(netdev); | ||
1156 | #endif | ||
1157 | 1153 | ||
1158 | strcpy(netdev->name, "eth%d"); | 1154 | strcpy(netdev->name, "eth%d"); |
1159 | if ((err = register_netdev(netdev))) | 1155 | if ((err = register_netdev(netdev))) |
@@ -1222,12 +1218,13 @@ e1000_remove(struct pci_dev *pdev) | |||
1222 | * would have already happened in close and is redundant. */ | 1218 | * would have already happened in close and is redundant. */ |
1223 | e1000_release_hw_control(adapter); | 1219 | e1000_release_hw_control(adapter); |
1224 | 1220 | ||
1225 | unregister_netdev(netdev); | ||
1226 | #ifdef CONFIG_E1000_NAPI | 1221 | #ifdef CONFIG_E1000_NAPI |
1227 | for (i = 0; i < adapter->num_rx_queues; i++) | 1222 | for (i = 0; i < adapter->num_rx_queues; i++) |
1228 | dev_put(&adapter->polling_netdev[i]); | 1223 | dev_put(&adapter->polling_netdev[i]); |
1229 | #endif | 1224 | #endif |
1230 | 1225 | ||
1226 | unregister_netdev(netdev); | ||
1227 | |||
1231 | if (!e1000_check_phy_reset_block(&adapter->hw)) | 1228 | if (!e1000_check_phy_reset_block(&adapter->hw)) |
1232 | e1000_phy_hw_reset(&adapter->hw); | 1229 | e1000_phy_hw_reset(&adapter->hw); |
1233 | 1230 | ||
@@ -1325,8 +1322,6 @@ e1000_sw_init(struct e1000_adapter *adapter) | |||
1325 | #ifdef CONFIG_E1000_NAPI | 1322 | #ifdef CONFIG_E1000_NAPI |
1326 | for (i = 0; i < adapter->num_rx_queues; i++) { | 1323 | for (i = 0; i < adapter->num_rx_queues; i++) { |
1327 | adapter->polling_netdev[i].priv = adapter; | 1324 | adapter->polling_netdev[i].priv = adapter; |
1328 | adapter->polling_netdev[i].poll = &e1000_clean; | ||
1329 | adapter->polling_netdev[i].weight = 64; | ||
1330 | dev_hold(&adapter->polling_netdev[i]); | 1325 | dev_hold(&adapter->polling_netdev[i]); |
1331 | set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state); | 1326 | set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state); |
1332 | } | 1327 | } |
@@ -1443,7 +1438,7 @@ e1000_open(struct net_device *netdev) | |||
1443 | clear_bit(__E1000_DOWN, &adapter->flags); | 1438 | clear_bit(__E1000_DOWN, &adapter->flags); |
1444 | 1439 | ||
1445 | #ifdef CONFIG_E1000_NAPI | 1440 | #ifdef CONFIG_E1000_NAPI |
1446 | netif_poll_enable(netdev); | 1441 | napi_enable(&adapter->napi); |
1447 | #endif | 1442 | #endif |
1448 | 1443 | ||
1449 | e1000_irq_enable(adapter); | 1444 | e1000_irq_enable(adapter); |
@@ -3786,12 +3781,12 @@ e1000_intr_msi(int irq, void *data) | |||
3786 | } | 3781 | } |
3787 | 3782 | ||
3788 | #ifdef CONFIG_E1000_NAPI | 3783 | #ifdef CONFIG_E1000_NAPI |
3789 | if (likely(netif_rx_schedule_prep(netdev))) { | 3784 | if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) { |
3790 | adapter->total_tx_bytes = 0; | 3785 | adapter->total_tx_bytes = 0; |
3791 | adapter->total_tx_packets = 0; | 3786 | adapter->total_tx_packets = 0; |
3792 | adapter->total_rx_bytes = 0; | 3787 | adapter->total_rx_bytes = 0; |
3793 | adapter->total_rx_packets = 0; | 3788 | adapter->total_rx_packets = 0; |
3794 | __netif_rx_schedule(netdev); | 3789 | __netif_rx_schedule(netdev, &adapter->napi); |
3795 | } else | 3790 | } else |
3796 | e1000_irq_enable(adapter); | 3791 | e1000_irq_enable(adapter); |
3797 | #else | 3792 | #else |
@@ -3871,12 +3866,12 @@ e1000_intr(int irq, void *data) | |||
3871 | E1000_WRITE_REG(hw, IMC, ~0); | 3866 | E1000_WRITE_REG(hw, IMC, ~0); |
3872 | E1000_WRITE_FLUSH(hw); | 3867 | E1000_WRITE_FLUSH(hw); |
3873 | } | 3868 | } |
3874 | if (likely(netif_rx_schedule_prep(netdev))) { | 3869 | if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) { |
3875 | adapter->total_tx_bytes = 0; | 3870 | adapter->total_tx_bytes = 0; |
3876 | adapter->total_tx_packets = 0; | 3871 | adapter->total_tx_packets = 0; |
3877 | adapter->total_rx_bytes = 0; | 3872 | adapter->total_rx_bytes = 0; |
3878 | adapter->total_rx_packets = 0; | 3873 | adapter->total_rx_packets = 0; |
3879 | __netif_rx_schedule(netdev); | 3874 | __netif_rx_schedule(netdev, &adapter->napi); |
3880 | } else | 3875 | } else |
3881 | /* this really should not happen! if it does it is basically a | 3876 | /* this really should not happen! if it does it is basically a |
3882 | * bug, but not a hard error, so enable ints and continue */ | 3877 | * bug, but not a hard error, so enable ints and continue */ |
@@ -3924,10 +3919,10 @@ e1000_intr(int irq, void *data) | |||
3924 | **/ | 3919 | **/ |
3925 | 3920 | ||
3926 | static int | 3921 | static int |
3927 | e1000_clean(struct net_device *poll_dev, int *budget) | 3922 | e1000_clean(struct napi_struct *napi, int budget) |
3928 | { | 3923 | { |
3929 | struct e1000_adapter *adapter; | 3924 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); |
3930 | int work_to_do = min(*budget, poll_dev->quota); | 3925 | struct net_device *poll_dev = adapter->netdev; |
3931 | int tx_cleaned = 0, work_done = 0; | 3926 | int tx_cleaned = 0, work_done = 0; |
3932 | 3927 | ||
3933 | /* Must NOT use netdev_priv macro here. */ | 3928 | /* Must NOT use netdev_priv macro here. */ |
@@ -3948,23 +3943,19 @@ e1000_clean(struct net_device *poll_dev, int *budget) | |||
3948 | } | 3943 | } |
3949 | 3944 | ||
3950 | adapter->clean_rx(adapter, &adapter->rx_ring[0], | 3945 | adapter->clean_rx(adapter, &adapter->rx_ring[0], |
3951 | &work_done, work_to_do); | 3946 | &work_done, budget); |
3952 | |||
3953 | *budget -= work_done; | ||
3954 | poll_dev->quota -= work_done; | ||
3955 | 3947 | ||
3956 | /* If no Tx and not enough Rx work done, exit the polling mode */ | 3948 | /* If no Tx and not enough Rx work done, exit the polling mode */ |
3957 | if ((!tx_cleaned && (work_done == 0)) || | 3949 | if ((!tx_cleaned && (work_done < budget)) || |
3958 | !netif_running(poll_dev)) { | 3950 | !netif_running(poll_dev)) { |
3959 | quit_polling: | 3951 | quit_polling: |
3960 | if (likely(adapter->itr_setting & 3)) | 3952 | if (likely(adapter->itr_setting & 3)) |
3961 | e1000_set_itr(adapter); | 3953 | e1000_set_itr(adapter); |
3962 | netif_rx_complete(poll_dev); | 3954 | netif_rx_complete(poll_dev, napi); |
3963 | e1000_irq_enable(adapter); | 3955 | e1000_irq_enable(adapter); |
3964 | return 0; | ||
3965 | } | 3956 | } |
3966 | 3957 | ||
3967 | return 1; | 3958 | return work_done; |
3968 | } | 3959 | } |
3969 | 3960 | ||
3970 | #endif | 3961 | #endif |