diff options
-rw-r--r-- | Documentation/networking/e1000.txt | 14 | ||||
-rw-r--r-- | drivers/net/Kconfig | 14 | ||||
-rw-r--r-- | drivers/net/e1000/e1000.h | 10 | ||||
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 151 |
4 files changed, 16 insertions, 173 deletions
diff --git a/Documentation/networking/e1000.txt b/Documentation/networking/e1000.txt index 61b171cf5313..2df71861e578 100644 --- a/Documentation/networking/e1000.txt +++ b/Documentation/networking/e1000.txt | |||
@@ -513,21 +513,11 @@ Additional Configurations | |||
513 | Intel(R) PRO/1000 PT Dual Port Server Connection | 513 | Intel(R) PRO/1000 PT Dual Port Server Connection |
514 | Intel(R) PRO/1000 PT Dual Port Server Adapter | 514 | Intel(R) PRO/1000 PT Dual Port Server Adapter |
515 | Intel(R) PRO/1000 PF Dual Port Server Adapter | 515 | Intel(R) PRO/1000 PF Dual Port Server Adapter |
516 | Intel(R) PRO/1000 PT Quad Port Server Adapter | 516 | Intel(R) PRO/1000 PT Quad Port Server Adapter |
517 | 517 | ||
518 | NAPI | 518 | NAPI |
519 | ---- | 519 | ---- |
520 | NAPI (Rx polling mode) is supported in the e1000 driver. NAPI is enabled | 520 | NAPI (Rx polling mode) is enabled in the e1000 driver. |
521 | or disabled based on the configuration of the kernel. To override | ||
522 | the default, use the following compile-time flags. | ||
523 | |||
524 | To enable NAPI, compile the driver module, passing in a configuration option: | ||
525 | |||
526 | make CFLAGS_EXTRA=-DE1000_NAPI install | ||
527 | |||
528 | To disable NAPI, compile the driver module, passing in a configuration option: | ||
529 | |||
530 | make CFLAGS_EXTRA=-DE1000_NO_NAPI install | ||
531 | 521 | ||
532 | See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI. | 522 | See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI. |
533 | 523 | ||
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 32b89b0975ae..fa533c27052a 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -1926,20 +1926,6 @@ config E1000 | |||
1926 | To compile this driver as a module, choose M here. The module | 1926 | To compile this driver as a module, choose M here. The module |
1927 | will be called e1000. | 1927 | will be called e1000. |
1928 | 1928 | ||
1929 | config E1000_NAPI | ||
1930 | bool "Use Rx Polling (NAPI)" | ||
1931 | depends on E1000 | ||
1932 | help | ||
1933 | NAPI is a new driver API designed to reduce CPU and interrupt load | ||
1934 | when the driver is receiving lots of packets from the card. It is | ||
1935 | still somewhat experimental and thus not yet enabled by default. | ||
1936 | |||
1937 | If your estimated Rx load is 10kpps or more, or if the card will be | ||
1938 | deployed on potentially unfriendly networks (e.g. in a firewall), | ||
1939 | then say Y here. | ||
1940 | |||
1941 | If in doubt, say N. | ||
1942 | |||
1943 | config E1000_DISABLE_PACKET_SPLIT | 1929 | config E1000_DISABLE_PACKET_SPLIT |
1944 | bool "Disable Packet Split for PCI express adapters" | 1930 | bool "Disable Packet Split for PCI express adapters" |
1945 | depends on E1000 | 1931 | depends on E1000 |
diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h index 3aeba9305dfa..583b823f760c 100644 --- a/drivers/net/e1000/e1000.h +++ b/drivers/net/e1000/e1000.h | |||
@@ -253,9 +253,7 @@ struct e1000_adapter { | |||
253 | u16 link_speed; | 253 | u16 link_speed; |
254 | u16 link_duplex; | 254 | u16 link_duplex; |
255 | spinlock_t stats_lock; | 255 | spinlock_t stats_lock; |
256 | #ifdef CONFIG_E1000_NAPI | ||
257 | spinlock_t tx_queue_lock; | 256 | spinlock_t tx_queue_lock; |
258 | #endif | ||
259 | unsigned int total_tx_bytes; | 257 | unsigned int total_tx_bytes; |
260 | unsigned int total_tx_packets; | 258 | unsigned int total_tx_packets; |
261 | unsigned int total_rx_bytes; | 259 | unsigned int total_rx_bytes; |
@@ -293,22 +291,16 @@ struct e1000_adapter { | |||
293 | bool detect_tx_hung; | 291 | bool detect_tx_hung; |
294 | 292 | ||
295 | /* RX */ | 293 | /* RX */ |
296 | #ifdef CONFIG_E1000_NAPI | ||
297 | bool (*clean_rx)(struct e1000_adapter *adapter, | 294 | bool (*clean_rx)(struct e1000_adapter *adapter, |
298 | struct e1000_rx_ring *rx_ring, | 295 | struct e1000_rx_ring *rx_ring, |
299 | int *work_done, int work_to_do); | 296 | int *work_done, int work_to_do); |
300 | #else | ||
301 | bool (*clean_rx)(struct e1000_adapter *adapter, | ||
302 | struct e1000_rx_ring *rx_ring); | ||
303 | #endif | ||
304 | void (*alloc_rx_buf)(struct e1000_adapter *adapter, | 297 | void (*alloc_rx_buf)(struct e1000_adapter *adapter, |
305 | struct e1000_rx_ring *rx_ring, | 298 | struct e1000_rx_ring *rx_ring, |
306 | int cleaned_count); | 299 | int cleaned_count); |
307 | struct e1000_rx_ring *rx_ring; /* One per active queue */ | 300 | struct e1000_rx_ring *rx_ring; /* One per active queue */ |
308 | #ifdef CONFIG_E1000_NAPI | ||
309 | struct napi_struct napi; | 301 | struct napi_struct napi; |
310 | struct net_device *polling_netdev; /* One per active queue */ | 302 | struct net_device *polling_netdev; /* One per active queue */ |
311 | #endif | 303 | |
312 | int num_tx_queues; | 304 | int num_tx_queues; |
313 | int num_rx_queues; | 305 | int num_rx_queues; |
314 | 306 | ||
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index b2c3e4cc0cb4..190352c6216e 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -31,12 +31,7 @@ | |||
31 | 31 | ||
32 | char e1000_driver_name[] = "e1000"; | 32 | char e1000_driver_name[] = "e1000"; |
33 | static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; | 33 | static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; |
34 | #ifndef CONFIG_E1000_NAPI | 34 | #define DRV_VERSION "7.3.20-k3-NAPI" |
35 | #define DRIVERNAPI | ||
36 | #else | ||
37 | #define DRIVERNAPI "-NAPI" | ||
38 | #endif | ||
39 | #define DRV_VERSION "7.3.20-k2"DRIVERNAPI | ||
40 | const char e1000_driver_version[] = DRV_VERSION; | 35 | const char e1000_driver_version[] = DRV_VERSION; |
41 | static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; | 36 | static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; |
42 | 37 | ||
@@ -138,7 +133,6 @@ static irqreturn_t e1000_intr(int irq, void *data); | |||
138 | static irqreturn_t e1000_intr_msi(int irq, void *data); | 133 | static irqreturn_t e1000_intr_msi(int irq, void *data); |
139 | static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, | 134 | static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, |
140 | struct e1000_tx_ring *tx_ring); | 135 | struct e1000_tx_ring *tx_ring); |
141 | #ifdef CONFIG_E1000_NAPI | ||
142 | static int e1000_clean(struct napi_struct *napi, int budget); | 136 | static int e1000_clean(struct napi_struct *napi, int budget); |
143 | static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | 137 | static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, |
144 | struct e1000_rx_ring *rx_ring, | 138 | struct e1000_rx_ring *rx_ring, |
@@ -146,12 +140,6 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
146 | static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | 140 | static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, |
147 | struct e1000_rx_ring *rx_ring, | 141 | struct e1000_rx_ring *rx_ring, |
148 | int *work_done, int work_to_do); | 142 | int *work_done, int work_to_do); |
149 | #else | ||
150 | static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | ||
151 | struct e1000_rx_ring *rx_ring); | ||
152 | static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | ||
153 | struct e1000_rx_ring *rx_ring); | ||
154 | #endif | ||
155 | static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter, | 143 | static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter, |
156 | struct e1000_rx_ring *rx_ring, | 144 | struct e1000_rx_ring *rx_ring, |
157 | int cleaned_count); | 145 | int cleaned_count); |
@@ -512,9 +500,8 @@ int e1000_up(struct e1000_adapter *adapter) | |||
512 | 500 | ||
513 | clear_bit(__E1000_DOWN, &adapter->flags); | 501 | clear_bit(__E1000_DOWN, &adapter->flags); |
514 | 502 | ||
515 | #ifdef CONFIG_E1000_NAPI | ||
516 | napi_enable(&adapter->napi); | 503 | napi_enable(&adapter->napi); |
517 | #endif | 504 | |
518 | e1000_irq_enable(adapter); | 505 | e1000_irq_enable(adapter); |
519 | 506 | ||
520 | /* fire a link change interrupt to start the watchdog */ | 507 | /* fire a link change interrupt to start the watchdog */ |
@@ -602,9 +589,8 @@ void e1000_down(struct e1000_adapter *adapter) | |||
602 | * reschedule our watchdog timer */ | 589 | * reschedule our watchdog timer */ |
603 | set_bit(__E1000_DOWN, &adapter->flags); | 590 | set_bit(__E1000_DOWN, &adapter->flags); |
604 | 591 | ||
605 | #ifdef CONFIG_E1000_NAPI | ||
606 | napi_disable(&adapter->napi); | 592 | napi_disable(&adapter->napi); |
607 | #endif | 593 | |
608 | e1000_irq_disable(adapter); | 594 | e1000_irq_disable(adapter); |
609 | 595 | ||
610 | del_timer_sync(&adapter->tx_fifo_stall_timer); | 596 | del_timer_sync(&adapter->tx_fifo_stall_timer); |
@@ -966,9 +952,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
966 | e1000_set_ethtool_ops(netdev); | 952 | e1000_set_ethtool_ops(netdev); |
967 | netdev->tx_timeout = &e1000_tx_timeout; | 953 | netdev->tx_timeout = &e1000_tx_timeout; |
968 | netdev->watchdog_timeo = 5 * HZ; | 954 | netdev->watchdog_timeo = 5 * HZ; |
969 | #ifdef CONFIG_E1000_NAPI | ||
970 | netif_napi_add(netdev, &adapter->napi, e1000_clean, 64); | 955 | netif_napi_add(netdev, &adapter->napi, e1000_clean, 64); |
971 | #endif | ||
972 | netdev->vlan_rx_register = e1000_vlan_rx_register; | 956 | netdev->vlan_rx_register = e1000_vlan_rx_register; |
973 | netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; | 957 | netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; |
974 | netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid; | 958 | netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid; |
@@ -1207,16 +1191,12 @@ err_eeprom: | |||
1207 | if (hw->flash_address) | 1191 | if (hw->flash_address) |
1208 | iounmap(hw->flash_address); | 1192 | iounmap(hw->flash_address); |
1209 | err_flashmap: | 1193 | err_flashmap: |
1210 | #ifdef CONFIG_E1000_NAPI | ||
1211 | for (i = 0; i < adapter->num_rx_queues; i++) | 1194 | for (i = 0; i < adapter->num_rx_queues; i++) |
1212 | dev_put(&adapter->polling_netdev[i]); | 1195 | dev_put(&adapter->polling_netdev[i]); |
1213 | #endif | ||
1214 | 1196 | ||
1215 | kfree(adapter->tx_ring); | 1197 | kfree(adapter->tx_ring); |
1216 | kfree(adapter->rx_ring); | 1198 | kfree(adapter->rx_ring); |
1217 | #ifdef CONFIG_E1000_NAPI | ||
1218 | kfree(adapter->polling_netdev); | 1199 | kfree(adapter->polling_netdev); |
1219 | #endif | ||
1220 | err_sw_init: | 1200 | err_sw_init: |
1221 | iounmap(hw->hw_addr); | 1201 | iounmap(hw->hw_addr); |
1222 | err_ioremap: | 1202 | err_ioremap: |
@@ -1244,9 +1224,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev) | |||
1244 | struct net_device *netdev = pci_get_drvdata(pdev); | 1224 | struct net_device *netdev = pci_get_drvdata(pdev); |
1245 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1225 | struct e1000_adapter *adapter = netdev_priv(netdev); |
1246 | struct e1000_hw *hw = &adapter->hw; | 1226 | struct e1000_hw *hw = &adapter->hw; |
1247 | #ifdef CONFIG_E1000_NAPI | ||
1248 | int i; | 1227 | int i; |
1249 | #endif | ||
1250 | 1228 | ||
1251 | cancel_work_sync(&adapter->reset_task); | 1229 | cancel_work_sync(&adapter->reset_task); |
1252 | 1230 | ||
@@ -1256,10 +1234,8 @@ static void __devexit e1000_remove(struct pci_dev *pdev) | |||
1256 | * would have already happened in close and is redundant. */ | 1234 | * would have already happened in close and is redundant. */ |
1257 | e1000_release_hw_control(adapter); | 1235 | e1000_release_hw_control(adapter); |
1258 | 1236 | ||
1259 | #ifdef CONFIG_E1000_NAPI | ||
1260 | for (i = 0; i < adapter->num_rx_queues; i++) | 1237 | for (i = 0; i < adapter->num_rx_queues; i++) |
1261 | dev_put(&adapter->polling_netdev[i]); | 1238 | dev_put(&adapter->polling_netdev[i]); |
1262 | #endif | ||
1263 | 1239 | ||
1264 | unregister_netdev(netdev); | 1240 | unregister_netdev(netdev); |
1265 | 1241 | ||
@@ -1268,9 +1244,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev) | |||
1268 | 1244 | ||
1269 | kfree(adapter->tx_ring); | 1245 | kfree(adapter->tx_ring); |
1270 | kfree(adapter->rx_ring); | 1246 | kfree(adapter->rx_ring); |
1271 | #ifdef CONFIG_E1000_NAPI | ||
1272 | kfree(adapter->polling_netdev); | 1247 | kfree(adapter->polling_netdev); |
1273 | #endif | ||
1274 | 1248 | ||
1275 | iounmap(hw->hw_addr); | 1249 | iounmap(hw->hw_addr); |
1276 | if (hw->flash_address) | 1250 | if (hw->flash_address) |
@@ -1296,9 +1270,7 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter) | |||
1296 | struct e1000_hw *hw = &adapter->hw; | 1270 | struct e1000_hw *hw = &adapter->hw; |
1297 | struct net_device *netdev = adapter->netdev; | 1271 | struct net_device *netdev = adapter->netdev; |
1298 | struct pci_dev *pdev = adapter->pdev; | 1272 | struct pci_dev *pdev = adapter->pdev; |
1299 | #ifdef CONFIG_E1000_NAPI | ||
1300 | int i; | 1273 | int i; |
1301 | #endif | ||
1302 | 1274 | ||
1303 | /* PCI config space info */ | 1275 | /* PCI config space info */ |
1304 | 1276 | ||
@@ -1356,14 +1328,12 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter) | |||
1356 | return -ENOMEM; | 1328 | return -ENOMEM; |
1357 | } | 1329 | } |
1358 | 1330 | ||
1359 | #ifdef CONFIG_E1000_NAPI | ||
1360 | for (i = 0; i < adapter->num_rx_queues; i++) { | 1331 | for (i = 0; i < adapter->num_rx_queues; i++) { |
1361 | adapter->polling_netdev[i].priv = adapter; | 1332 | adapter->polling_netdev[i].priv = adapter; |
1362 | dev_hold(&adapter->polling_netdev[i]); | 1333 | dev_hold(&adapter->polling_netdev[i]); |
1363 | set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state); | 1334 | set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state); |
1364 | } | 1335 | } |
1365 | spin_lock_init(&adapter->tx_queue_lock); | 1336 | spin_lock_init(&adapter->tx_queue_lock); |
1366 | #endif | ||
1367 | 1337 | ||
1368 | /* Explicitly disable IRQ since the NIC can be in any state. */ | 1338 | /* Explicitly disable IRQ since the NIC can be in any state. */ |
1369 | e1000_irq_disable(adapter); | 1339 | e1000_irq_disable(adapter); |
@@ -1398,7 +1368,6 @@ static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter) | |||
1398 | return -ENOMEM; | 1368 | return -ENOMEM; |
1399 | } | 1369 | } |
1400 | 1370 | ||
1401 | #ifdef CONFIG_E1000_NAPI | ||
1402 | adapter->polling_netdev = kcalloc(adapter->num_rx_queues, | 1371 | adapter->polling_netdev = kcalloc(adapter->num_rx_queues, |
1403 | sizeof(struct net_device), | 1372 | sizeof(struct net_device), |
1404 | GFP_KERNEL); | 1373 | GFP_KERNEL); |
@@ -1407,7 +1376,6 @@ static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter) | |||
1407 | kfree(adapter->rx_ring); | 1376 | kfree(adapter->rx_ring); |
1408 | return -ENOMEM; | 1377 | return -ENOMEM; |
1409 | } | 1378 | } |
1410 | #endif | ||
1411 | 1379 | ||
1412 | return E1000_SUCCESS; | 1380 | return E1000_SUCCESS; |
1413 | } | 1381 | } |
@@ -1472,9 +1440,7 @@ static int e1000_open(struct net_device *netdev) | |||
1472 | /* From here on the code is the same as e1000_up() */ | 1440 | /* From here on the code is the same as e1000_up() */ |
1473 | clear_bit(__E1000_DOWN, &adapter->flags); | 1441 | clear_bit(__E1000_DOWN, &adapter->flags); |
1474 | 1442 | ||
1475 | #ifdef CONFIG_E1000_NAPI | ||
1476 | napi_enable(&adapter->napi); | 1443 | napi_enable(&adapter->napi); |
1477 | #endif | ||
1478 | 1444 | ||
1479 | e1000_irq_enable(adapter); | 1445 | e1000_irq_enable(adapter); |
1480 | 1446 | ||
@@ -2069,11 +2035,9 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) | |||
2069 | ctrl_ext = er32(CTRL_EXT); | 2035 | ctrl_ext = er32(CTRL_EXT); |
2070 | /* Reset delay timers after every interrupt */ | 2036 | /* Reset delay timers after every interrupt */ |
2071 | ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR; | 2037 | ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR; |
2072 | #ifdef CONFIG_E1000_NAPI | ||
2073 | /* Auto-Mask interrupts upon ICR access */ | 2038 | /* Auto-Mask interrupts upon ICR access */ |
2074 | ctrl_ext |= E1000_CTRL_EXT_IAME; | 2039 | ctrl_ext |= E1000_CTRL_EXT_IAME; |
2075 | ew32(IAM, 0xffffffff); | 2040 | ew32(IAM, 0xffffffff); |
2076 | #endif | ||
2077 | ew32(CTRL_EXT, ctrl_ext); | 2041 | ew32(CTRL_EXT, ctrl_ext); |
2078 | E1000_WRITE_FLUSH(); | 2042 | E1000_WRITE_FLUSH(); |
2079 | } | 2043 | } |
@@ -3777,9 +3741,6 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
3777 | struct net_device *netdev = data; | 3741 | struct net_device *netdev = data; |
3778 | struct e1000_adapter *adapter = netdev_priv(netdev); | 3742 | struct e1000_adapter *adapter = netdev_priv(netdev); |
3779 | struct e1000_hw *hw = &adapter->hw; | 3743 | struct e1000_hw *hw = &adapter->hw; |
3780 | #ifndef CONFIG_E1000_NAPI | ||
3781 | int i; | ||
3782 | #endif | ||
3783 | u32 icr = er32(ICR); | 3744 | u32 icr = er32(ICR); |
3784 | 3745 | ||
3785 | /* in NAPI mode read ICR disables interrupts using IAM */ | 3746 | /* in NAPI mode read ICR disables interrupts using IAM */ |
@@ -3800,7 +3761,6 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
3800 | mod_timer(&adapter->watchdog_timer, jiffies + 1); | 3761 | mod_timer(&adapter->watchdog_timer, jiffies + 1); |
3801 | } | 3762 | } |
3802 | 3763 | ||
3803 | #ifdef CONFIG_E1000_NAPI | ||
3804 | if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) { | 3764 | if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) { |
3805 | adapter->total_tx_bytes = 0; | 3765 | adapter->total_tx_bytes = 0; |
3806 | adapter->total_tx_packets = 0; | 3766 | adapter->total_tx_packets = 0; |
@@ -3809,20 +3769,6 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
3809 | __netif_rx_schedule(netdev, &adapter->napi); | 3769 | __netif_rx_schedule(netdev, &adapter->napi); |
3810 | } else | 3770 | } else |
3811 | e1000_irq_enable(adapter); | 3771 | e1000_irq_enable(adapter); |
3812 | #else | ||
3813 | adapter->total_tx_bytes = 0; | ||
3814 | adapter->total_rx_bytes = 0; | ||
3815 | adapter->total_tx_packets = 0; | ||
3816 | adapter->total_rx_packets = 0; | ||
3817 | |||
3818 | for (i = 0; i < E1000_MAX_INTR; i++) | ||
3819 | if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring) & | ||
3820 | !e1000_clean_tx_irq(adapter, adapter->tx_ring))) | ||
3821 | break; | ||
3822 | |||
3823 | if (likely(adapter->itr_setting & 3)) | ||
3824 | e1000_set_itr(adapter); | ||
3825 | #endif | ||
3826 | 3772 | ||
3827 | return IRQ_HANDLED; | 3773 | return IRQ_HANDLED; |
3828 | } | 3774 | } |
@@ -3839,13 +3785,10 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
3839 | struct e1000_adapter *adapter = netdev_priv(netdev); | 3785 | struct e1000_adapter *adapter = netdev_priv(netdev); |
3840 | struct e1000_hw *hw = &adapter->hw; | 3786 | struct e1000_hw *hw = &adapter->hw; |
3841 | u32 rctl, icr = er32(ICR); | 3787 | u32 rctl, icr = er32(ICR); |
3842 | #ifndef CONFIG_E1000_NAPI | 3788 | |
3843 | int i; | ||
3844 | #endif | ||
3845 | if (unlikely(!icr)) | 3789 | if (unlikely(!icr)) |
3846 | return IRQ_NONE; /* Not our interrupt */ | 3790 | return IRQ_NONE; /* Not our interrupt */ |
3847 | 3791 | ||
3848 | #ifdef CONFIG_E1000_NAPI | ||
3849 | /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is | 3792 | /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is |
3850 | * not set, then the adapter didn't send an interrupt */ | 3793 | * not set, then the adapter didn't send an interrupt */ |
3851 | if (unlikely(hw->mac_type >= e1000_82571 && | 3794 | if (unlikely(hw->mac_type >= e1000_82571 && |
@@ -3854,7 +3797,6 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
3854 | 3797 | ||
3855 | /* Interrupt Auto-Mask...upon reading ICR, interrupts are masked. No | 3798 | /* Interrupt Auto-Mask...upon reading ICR, interrupts are masked. No |
3856 | * need for the IMC write */ | 3799 | * need for the IMC write */ |
3857 | #endif | ||
3858 | 3800 | ||
3859 | if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) { | 3801 | if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) { |
3860 | hw->get_link_status = 1; | 3802 | hw->get_link_status = 1; |
@@ -3874,7 +3816,6 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
3874 | mod_timer(&adapter->watchdog_timer, jiffies + 1); | 3816 | mod_timer(&adapter->watchdog_timer, jiffies + 1); |
3875 | } | 3817 | } |
3876 | 3818 | ||
3877 | #ifdef CONFIG_E1000_NAPI | ||
3878 | if (unlikely(hw->mac_type < e1000_82571)) { | 3819 | if (unlikely(hw->mac_type < e1000_82571)) { |
3879 | /* disable interrupts, without the synchronize_irq bit */ | 3820 | /* disable interrupts, without the synchronize_irq bit */ |
3880 | ew32(IMC, ~0); | 3821 | ew32(IMC, ~0); |
@@ -3890,46 +3831,14 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
3890 | /* this really should not happen! if it does it is basically a | 3831 | /* this really should not happen! if it does it is basically a |
3891 | * bug, but not a hard error, so enable ints and continue */ | 3832 | * bug, but not a hard error, so enable ints and continue */ |
3892 | e1000_irq_enable(adapter); | 3833 | e1000_irq_enable(adapter); |
3893 | #else | ||
3894 | /* Writing IMC and IMS is needed for 82547. | ||
3895 | * Due to Hub Link bus being occupied, an interrupt | ||
3896 | * de-assertion message is not able to be sent. | ||
3897 | * When an interrupt assertion message is generated later, | ||
3898 | * two messages are re-ordered and sent out. | ||
3899 | * That causes APIC to think 82547 is in de-assertion | ||
3900 | * state, while 82547 is in assertion state, resulting | ||
3901 | * in dead lock. Writing IMC forces 82547 into | ||
3902 | * de-assertion state. | ||
3903 | */ | ||
3904 | if (hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2) | ||
3905 | ew32(IMC, ~0); | ||
3906 | |||
3907 | adapter->total_tx_bytes = 0; | ||
3908 | adapter->total_rx_bytes = 0; | ||
3909 | adapter->total_tx_packets = 0; | ||
3910 | adapter->total_rx_packets = 0; | ||
3911 | |||
3912 | for (i = 0; i < E1000_MAX_INTR; i++) | ||
3913 | if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring) & | ||
3914 | !e1000_clean_tx_irq(adapter, adapter->tx_ring))) | ||
3915 | break; | ||
3916 | 3834 | ||
3917 | if (likely(adapter->itr_setting & 3)) | ||
3918 | e1000_set_itr(adapter); | ||
3919 | |||
3920 | if (hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2) | ||
3921 | e1000_irq_enable(adapter); | ||
3922 | |||
3923 | #endif | ||
3924 | return IRQ_HANDLED; | 3835 | return IRQ_HANDLED; |
3925 | } | 3836 | } |
3926 | 3837 | ||
3927 | #ifdef CONFIG_E1000_NAPI | ||
3928 | /** | 3838 | /** |
3929 | * e1000_clean - NAPI Rx polling callback | 3839 | * e1000_clean - NAPI Rx polling callback |
3930 | * @adapter: board private structure | 3840 | * @adapter: board private structure |
3931 | **/ | 3841 | **/ |
3932 | |||
3933 | static int e1000_clean(struct napi_struct *napi, int budget) | 3842 | static int e1000_clean(struct napi_struct *napi, int budget) |
3934 | { | 3843 | { |
3935 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); | 3844 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); |
@@ -3966,12 +3875,10 @@ static int e1000_clean(struct napi_struct *napi, int budget) | |||
3966 | return work_done; | 3875 | return work_done; |
3967 | } | 3876 | } |
3968 | 3877 | ||
3969 | #endif | ||
3970 | /** | 3878 | /** |
3971 | * e1000_clean_tx_irq - Reclaim resources after transmit completes | 3879 | * e1000_clean_tx_irq - Reclaim resources after transmit completes |
3972 | * @adapter: board private structure | 3880 | * @adapter: board private structure |
3973 | **/ | 3881 | **/ |
3974 | |||
3975 | static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, | 3882 | static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, |
3976 | struct e1000_tx_ring *tx_ring) | 3883 | struct e1000_tx_ring *tx_ring) |
3977 | { | 3884 | { |
@@ -3980,9 +3887,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, | |||
3980 | struct e1000_tx_desc *tx_desc, *eop_desc; | 3887 | struct e1000_tx_desc *tx_desc, *eop_desc; |
3981 | struct e1000_buffer *buffer_info; | 3888 | struct e1000_buffer *buffer_info; |
3982 | unsigned int i, eop; | 3889 | unsigned int i, eop; |
3983 | #ifdef CONFIG_E1000_NAPI | ||
3984 | unsigned int count = 0; | 3890 | unsigned int count = 0; |
3985 | #endif | ||
3986 | bool cleaned = false; | 3891 | bool cleaned = false; |
3987 | unsigned int total_tx_bytes=0, total_tx_packets=0; | 3892 | unsigned int total_tx_bytes=0, total_tx_packets=0; |
3988 | 3893 | ||
@@ -4014,11 +3919,10 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, | |||
4014 | 3919 | ||
4015 | eop = tx_ring->buffer_info[i].next_to_watch; | 3920 | eop = tx_ring->buffer_info[i].next_to_watch; |
4016 | eop_desc = E1000_TX_DESC(*tx_ring, eop); | 3921 | eop_desc = E1000_TX_DESC(*tx_ring, eop); |
4017 | #ifdef CONFIG_E1000_NAPI | ||
4018 | #define E1000_TX_WEIGHT 64 | 3922 | #define E1000_TX_WEIGHT 64 |
4019 | /* weight of a sort for tx, to avoid endless transmit cleanup */ | 3923 | /* weight of a sort for tx, to avoid endless transmit cleanup */ |
4020 | if (count++ == E1000_TX_WEIGHT) break; | 3924 | if (count++ == E1000_TX_WEIGHT) |
4021 | #endif | 3925 | break; |
4022 | } | 3926 | } |
4023 | 3927 | ||
4024 | tx_ring->next_to_clean = i; | 3928 | tx_ring->next_to_clean = i; |
@@ -4131,14 +4035,9 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err, | |||
4131 | * e1000_clean_rx_irq - Send received data up the network stack; legacy | 4035 | * e1000_clean_rx_irq - Send received data up the network stack; legacy |
4132 | * @adapter: board private structure | 4036 | * @adapter: board private structure |
4133 | **/ | 4037 | **/ |
4134 | #ifdef CONFIG_E1000_NAPI | ||
4135 | static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | 4038 | static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, |
4136 | struct e1000_rx_ring *rx_ring, | 4039 | struct e1000_rx_ring *rx_ring, |
4137 | int *work_done, int work_to_do) | 4040 | int *work_done, int work_to_do) |
4138 | #else | ||
4139 | static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | ||
4140 | struct e1000_rx_ring *rx_ring) | ||
4141 | #endif | ||
4142 | { | 4041 | { |
4143 | struct e1000_hw *hw = &adapter->hw; | 4042 | struct e1000_hw *hw = &adapter->hw; |
4144 | struct net_device *netdev = adapter->netdev; | 4043 | struct net_device *netdev = adapter->netdev; |
@@ -4161,11 +4060,10 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
4161 | struct sk_buff *skb; | 4060 | struct sk_buff *skb; |
4162 | u8 status; | 4061 | u8 status; |
4163 | 4062 | ||
4164 | #ifdef CONFIG_E1000_NAPI | ||
4165 | if (*work_done >= work_to_do) | 4063 | if (*work_done >= work_to_do) |
4166 | break; | 4064 | break; |
4167 | (*work_done)++; | 4065 | (*work_done)++; |
4168 | #endif | 4066 | |
4169 | status = rx_desc->status; | 4067 | status = rx_desc->status; |
4170 | skb = buffer_info->skb; | 4068 | skb = buffer_info->skb; |
4171 | buffer_info->skb = NULL; | 4069 | buffer_info->skb = NULL; |
@@ -4251,7 +4149,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
4251 | le16_to_cpu(rx_desc->csum), skb); | 4149 | le16_to_cpu(rx_desc->csum), skb); |
4252 | 4150 | ||
4253 | skb->protocol = eth_type_trans(skb, netdev); | 4151 | skb->protocol = eth_type_trans(skb, netdev); |
4254 | #ifdef CONFIG_E1000_NAPI | 4152 | |
4255 | if (unlikely(adapter->vlgrp && | 4153 | if (unlikely(adapter->vlgrp && |
4256 | (status & E1000_RXD_STAT_VP))) { | 4154 | (status & E1000_RXD_STAT_VP))) { |
4257 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, | 4155 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, |
@@ -4259,15 +4157,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
4259 | } else { | 4157 | } else { |
4260 | netif_receive_skb(skb); | 4158 | netif_receive_skb(skb); |
4261 | } | 4159 | } |
4262 | #else /* CONFIG_E1000_NAPI */ | 4160 | |
4263 | if (unlikely(adapter->vlgrp && | ||
4264 | (status & E1000_RXD_STAT_VP))) { | ||
4265 | vlan_hwaccel_rx(skb, adapter->vlgrp, | ||
4266 | le16_to_cpu(rx_desc->special)); | ||
4267 | } else { | ||
4268 | netif_rx(skb); | ||
4269 | } | ||
4270 | #endif /* CONFIG_E1000_NAPI */ | ||
4271 | netdev->last_rx = jiffies; | 4161 | netdev->last_rx = jiffies; |
4272 | 4162 | ||
4273 | next_desc: | 4163 | next_desc: |
@@ -4301,14 +4191,9 @@ next_desc: | |||
4301 | * @adapter: board private structure | 4191 | * @adapter: board private structure |
4302 | **/ | 4192 | **/ |
4303 | 4193 | ||
4304 | #ifdef CONFIG_E1000_NAPI | ||
4305 | static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | 4194 | static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, |
4306 | struct e1000_rx_ring *rx_ring, | 4195 | struct e1000_rx_ring *rx_ring, |
4307 | int *work_done, int work_to_do) | 4196 | int *work_done, int work_to_do) |
4308 | #else | ||
4309 | static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | ||
4310 | struct e1000_rx_ring *rx_ring) | ||
4311 | #endif | ||
4312 | { | 4197 | { |
4313 | union e1000_rx_desc_packet_split *rx_desc, *next_rxd; | 4198 | union e1000_rx_desc_packet_split *rx_desc, *next_rxd; |
4314 | struct net_device *netdev = adapter->netdev; | 4199 | struct net_device *netdev = adapter->netdev; |
@@ -4331,11 +4216,11 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | |||
4331 | while (staterr & E1000_RXD_STAT_DD) { | 4216 | while (staterr & E1000_RXD_STAT_DD) { |
4332 | ps_page = &rx_ring->ps_page[i]; | 4217 | ps_page = &rx_ring->ps_page[i]; |
4333 | ps_page_dma = &rx_ring->ps_page_dma[i]; | 4218 | ps_page_dma = &rx_ring->ps_page_dma[i]; |
4334 | #ifdef CONFIG_E1000_NAPI | 4219 | |
4335 | if (unlikely(*work_done >= work_to_do)) | 4220 | if (unlikely(*work_done >= work_to_do)) |
4336 | break; | 4221 | break; |
4337 | (*work_done)++; | 4222 | (*work_done)++; |
4338 | #endif | 4223 | |
4339 | skb = buffer_info->skb; | 4224 | skb = buffer_info->skb; |
4340 | 4225 | ||
4341 | /* in the packet split case this is header only */ | 4226 | /* in the packet split case this is header only */ |
@@ -4437,21 +4322,14 @@ copydone: | |||
4437 | if (likely(rx_desc->wb.upper.header_status & | 4322 | if (likely(rx_desc->wb.upper.header_status & |
4438 | cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))) | 4323 | cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))) |
4439 | adapter->rx_hdr_split++; | 4324 | adapter->rx_hdr_split++; |
4440 | #ifdef CONFIG_E1000_NAPI | 4325 | |
4441 | if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) { | 4326 | if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) { |
4442 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, | 4327 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, |
4443 | le16_to_cpu(rx_desc->wb.middle.vlan)); | 4328 | le16_to_cpu(rx_desc->wb.middle.vlan)); |
4444 | } else { | 4329 | } else { |
4445 | netif_receive_skb(skb); | 4330 | netif_receive_skb(skb); |
4446 | } | 4331 | } |
4447 | #else /* CONFIG_E1000_NAPI */ | 4332 | |
4448 | if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) { | ||
4449 | vlan_hwaccel_rx(skb, adapter->vlgrp, | ||
4450 | le16_to_cpu(rx_desc->wb.middle.vlan)); | ||
4451 | } else { | ||
4452 | netif_rx(skb); | ||
4453 | } | ||
4454 | #endif /* CONFIG_E1000_NAPI */ | ||
4455 | netdev->last_rx = jiffies; | 4333 | netdev->last_rx = jiffies; |
4456 | 4334 | ||
4457 | next_desc: | 4335 | next_desc: |
@@ -5218,9 +5096,6 @@ static void e1000_netpoll(struct net_device *netdev) | |||
5218 | 5096 | ||
5219 | disable_irq(adapter->pdev->irq); | 5097 | disable_irq(adapter->pdev->irq); |
5220 | e1000_intr(adapter->pdev->irq, netdev); | 5098 | e1000_intr(adapter->pdev->irq, netdev); |
5221 | #ifndef CONFIG_E1000_NAPI | ||
5222 | adapter->clean_rx(adapter, adapter->rx_ring); | ||
5223 | #endif | ||
5224 | enable_irq(adapter->pdev->irq); | 5099 | enable_irq(adapter->pdev->irq); |
5225 | } | 5100 | } |
5226 | #endif | 5101 | #endif |