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 |
