diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-08-24 06:25:44 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-08-24 06:25:54 -0400 |
commit | 5f9ece02401116b29eb04396b99ea092acb75dd8 (patch) | |
tree | e10386e2dc63c275646b4eb0bed857da7bf86c6a /drivers/net/netxen/netxen_nic_main.c | |
parent | 9f51e24ee8b5a1595b6a5ac0c2be278a16488e75 (diff) | |
parent | 422bef879e84104fee6dc68ded0e371dbeb5f88e (diff) |
Merge commit 'v2.6.31-rc7' into x86/cleanups
Merge reason: we were on -rc1 before - go up to -rc7
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 170 |
1 files changed, 112 insertions, 58 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 2919a2d12bf4..28f270f5ac78 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -94,10 +94,6 @@ static struct pci_device_id netxen_pci_tbl[] __devinitdata = { | |||
94 | 94 | ||
95 | MODULE_DEVICE_TABLE(pci, netxen_pci_tbl); | 95 | MODULE_DEVICE_TABLE(pci, netxen_pci_tbl); |
96 | 96 | ||
97 | static struct workqueue_struct *netxen_workq; | ||
98 | #define SCHEDULE_WORK(tp) queue_work(netxen_workq, tp) | ||
99 | #define FLUSH_SCHEDULED_WORK() flush_workqueue(netxen_workq) | ||
100 | |||
101 | static void netxen_watchdog(unsigned long); | 97 | static void netxen_watchdog(unsigned long); |
102 | 98 | ||
103 | static uint32_t crb_cmd_producer[4] = { | 99 | static uint32_t crb_cmd_producer[4] = { |
@@ -171,6 +167,8 @@ netxen_free_sds_rings(struct netxen_recv_context *recv_ctx) | |||
171 | { | 167 | { |
172 | if (recv_ctx->sds_rings != NULL) | 168 | if (recv_ctx->sds_rings != NULL) |
173 | kfree(recv_ctx->sds_rings); | 169 | kfree(recv_ctx->sds_rings); |
170 | |||
171 | recv_ctx->sds_rings = NULL; | ||
174 | } | 172 | } |
175 | 173 | ||
176 | static int | 174 | static int |
@@ -193,6 +191,21 @@ netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev) | |||
193 | } | 191 | } |
194 | 192 | ||
195 | static void | 193 | static void |
194 | netxen_napi_del(struct netxen_adapter *adapter) | ||
195 | { | ||
196 | int ring; | ||
197 | struct nx_host_sds_ring *sds_ring; | ||
198 | struct netxen_recv_context *recv_ctx = &adapter->recv_ctx; | ||
199 | |||
200 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | ||
201 | sds_ring = &recv_ctx->sds_rings[ring]; | ||
202 | netif_napi_del(&sds_ring->napi); | ||
203 | } | ||
204 | |||
205 | netxen_free_sds_rings(&adapter->recv_ctx); | ||
206 | } | ||
207 | |||
208 | static void | ||
196 | netxen_napi_enable(struct netxen_adapter *adapter) | 209 | netxen_napi_enable(struct netxen_adapter *adapter) |
197 | { | 210 | { |
198 | int ring; | 211 | int ring; |
@@ -215,13 +228,13 @@ netxen_napi_disable(struct netxen_adapter *adapter) | |||
215 | 228 | ||
216 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 229 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { |
217 | sds_ring = &recv_ctx->sds_rings[ring]; | 230 | sds_ring = &recv_ctx->sds_rings[ring]; |
218 | napi_disable(&sds_ring->napi); | ||
219 | netxen_nic_disable_int(sds_ring); | 231 | netxen_nic_disable_int(sds_ring); |
220 | synchronize_irq(sds_ring->irq); | 232 | napi_synchronize(&sds_ring->napi); |
233 | napi_disable(&sds_ring->napi); | ||
221 | } | 234 | } |
222 | } | 235 | } |
223 | 236 | ||
224 | static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) | 237 | static int nx_set_dma_mask(struct netxen_adapter *adapter) |
225 | { | 238 | { |
226 | struct pci_dev *pdev = adapter->pdev; | 239 | struct pci_dev *pdev = adapter->pdev; |
227 | uint64_t mask, cmask; | 240 | uint64_t mask, cmask; |
@@ -229,19 +242,17 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) | |||
229 | adapter->pci_using_dac = 0; | 242 | adapter->pci_using_dac = 0; |
230 | 243 | ||
231 | mask = DMA_BIT_MASK(32); | 244 | mask = DMA_BIT_MASK(32); |
232 | /* | ||
233 | * Consistent DMA mask is set to 32 bit because it cannot be set to | ||
234 | * 35 bits. For P3 also leave it at 32 bits for now. Only the rings | ||
235 | * come off this pool. | ||
236 | */ | ||
237 | cmask = DMA_BIT_MASK(32); | 245 | cmask = DMA_BIT_MASK(32); |
238 | 246 | ||
247 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | ||
239 | #ifndef CONFIG_IA64 | 248 | #ifndef CONFIG_IA64 |
240 | if (revision_id >= NX_P3_B0) | ||
241 | mask = DMA_BIT_MASK(39); | ||
242 | else if (revision_id == NX_P2_C1) | ||
243 | mask = DMA_BIT_MASK(35); | 249 | mask = DMA_BIT_MASK(35); |
244 | #endif | 250 | #endif |
251 | } else { | ||
252 | mask = DMA_BIT_MASK(39); | ||
253 | cmask = mask; | ||
254 | } | ||
255 | |||
245 | if (pci_set_dma_mask(pdev, mask) == 0 && | 256 | if (pci_set_dma_mask(pdev, mask) == 0 && |
246 | pci_set_consistent_dma_mask(pdev, cmask) == 0) { | 257 | pci_set_consistent_dma_mask(pdev, cmask) == 0) { |
247 | adapter->pci_using_dac = 1; | 258 | adapter->pci_using_dac = 1; |
@@ -256,13 +267,13 @@ static int | |||
256 | nx_update_dma_mask(struct netxen_adapter *adapter) | 267 | nx_update_dma_mask(struct netxen_adapter *adapter) |
257 | { | 268 | { |
258 | int change, shift, err; | 269 | int change, shift, err; |
259 | uint64_t mask, old_mask; | 270 | uint64_t mask, old_mask, old_cmask; |
260 | struct pci_dev *pdev = adapter->pdev; | 271 | struct pci_dev *pdev = adapter->pdev; |
261 | 272 | ||
262 | change = 0; | 273 | change = 0; |
263 | 274 | ||
264 | shift = NXRD32(adapter, CRB_DMA_SHIFT); | 275 | shift = NXRD32(adapter, CRB_DMA_SHIFT); |
265 | if (shift >= 32) | 276 | if (shift > 32) |
266 | return 0; | 277 | return 0; |
267 | 278 | ||
268 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id) && (shift > 9)) | 279 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id) && (shift > 9)) |
@@ -272,14 +283,29 @@ nx_update_dma_mask(struct netxen_adapter *adapter) | |||
272 | 283 | ||
273 | if (change) { | 284 | if (change) { |
274 | old_mask = pdev->dma_mask; | 285 | old_mask = pdev->dma_mask; |
275 | mask = (1ULL<<(32+shift)) - 1; | 286 | old_cmask = pdev->dev.coherent_dma_mask; |
287 | |||
288 | mask = DMA_BIT_MASK(32+shift); | ||
276 | 289 | ||
277 | err = pci_set_dma_mask(pdev, mask); | 290 | err = pci_set_dma_mask(pdev, mask); |
278 | if (err) | 291 | if (err) |
279 | return pci_set_dma_mask(pdev, old_mask); | 292 | goto err_out; |
293 | |||
294 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
295 | |||
296 | err = pci_set_consistent_dma_mask(pdev, mask); | ||
297 | if (err) | ||
298 | goto err_out; | ||
299 | } | ||
300 | dev_info(&pdev->dev, "using %d-bit dma mask\n", 32+shift); | ||
280 | } | 301 | } |
281 | 302 | ||
282 | return 0; | 303 | return 0; |
304 | |||
305 | err_out: | ||
306 | pci_set_dma_mask(pdev, old_mask); | ||
307 | pci_set_consistent_dma_mask(pdev, old_cmask); | ||
308 | return err; | ||
283 | } | 309 | } |
284 | 310 | ||
285 | static void netxen_check_options(struct netxen_adapter *adapter) | 311 | static void netxen_check_options(struct netxen_adapter *adapter) |
@@ -718,6 +744,10 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) | |||
718 | if (request_fw) | 744 | if (request_fw) |
719 | netxen_request_firmware(adapter); | 745 | netxen_request_firmware(adapter); |
720 | 746 | ||
747 | err = netxen_need_fw_reset(adapter); | ||
748 | if (err <= 0) | ||
749 | return err; | ||
750 | |||
721 | if (first_boot != 0x55555555) { | 751 | if (first_boot != 0x55555555) { |
722 | NXWR32(adapter, CRB_CMDPEG_STATE, 0); | 752 | NXWR32(adapter, CRB_CMDPEG_STATE, 0); |
723 | netxen_pinit_from_rom(adapter, 0); | 753 | netxen_pinit_from_rom(adapter, 0); |
@@ -829,11 +859,11 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) | |||
829 | 859 | ||
830 | adapter->ahw.linkup = 0; | 860 | adapter->ahw.linkup = 0; |
831 | 861 | ||
832 | netxen_napi_enable(adapter); | ||
833 | |||
834 | if (adapter->max_sds_rings > 1) | 862 | if (adapter->max_sds_rings > 1) |
835 | netxen_config_rss(adapter, 1); | 863 | netxen_config_rss(adapter, 1); |
836 | 864 | ||
865 | netxen_napi_enable(adapter); | ||
866 | |||
837 | if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION) | 867 | if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION) |
838 | netxen_linkevent_request(adapter, 1); | 868 | netxen_linkevent_request(adapter, 1); |
839 | else | 869 | else |
@@ -847,8 +877,9 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) | |||
847 | static void | 877 | static void |
848 | netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) | 878 | netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) |
849 | { | 879 | { |
880 | spin_lock(&adapter->tx_clean_lock); | ||
850 | netif_carrier_off(netdev); | 881 | netif_carrier_off(netdev); |
851 | netif_stop_queue(netdev); | 882 | netif_tx_disable(netdev); |
852 | 883 | ||
853 | if (adapter->stop_port) | 884 | if (adapter->stop_port) |
854 | adapter->stop_port(adapter); | 885 | adapter->stop_port(adapter); |
@@ -859,8 +890,8 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) | |||
859 | netxen_napi_disable(adapter); | 890 | netxen_napi_disable(adapter); |
860 | 891 | ||
861 | netxen_release_tx_buffers(adapter); | 892 | netxen_release_tx_buffers(adapter); |
893 | spin_unlock(&adapter->tx_clean_lock); | ||
862 | 894 | ||
863 | FLUSH_SCHEDULED_WORK(); | ||
864 | del_timer_sync(&adapter->watchdog_timer); | 895 | del_timer_sync(&adapter->watchdog_timer); |
865 | } | 896 | } |
866 | 897 | ||
@@ -875,10 +906,12 @@ netxen_nic_attach(struct netxen_adapter *adapter) | |||
875 | struct nx_host_tx_ring *tx_ring; | 906 | struct nx_host_tx_ring *tx_ring; |
876 | 907 | ||
877 | err = netxen_init_firmware(adapter); | 908 | err = netxen_init_firmware(adapter); |
878 | if (err != 0) { | 909 | if (err) |
879 | printk(KERN_ERR "Failed to init firmware\n"); | 910 | return err; |
880 | return -EIO; | 911 | |
881 | } | 912 | err = netxen_napi_add(adapter, netdev); |
913 | if (err) | ||
914 | return err; | ||
882 | 915 | ||
883 | if (adapter->fw_major < 4) | 916 | if (adapter->fw_major < 4) |
884 | adapter->max_rds_rings = 3; | 917 | adapter->max_rds_rings = 3; |
@@ -939,9 +972,10 @@ err_out_free_sw: | |||
939 | static void | 972 | static void |
940 | netxen_nic_detach(struct netxen_adapter *adapter) | 973 | netxen_nic_detach(struct netxen_adapter *adapter) |
941 | { | 974 | { |
942 | netxen_release_rx_buffers(adapter); | ||
943 | netxen_free_hw_resources(adapter); | 975 | netxen_free_hw_resources(adapter); |
976 | netxen_release_rx_buffers(adapter); | ||
944 | netxen_nic_free_irq(adapter); | 977 | netxen_nic_free_irq(adapter); |
978 | netxen_napi_del(adapter); | ||
945 | netxen_free_sw_resources(adapter); | 979 | netxen_free_sw_resources(adapter); |
946 | 980 | ||
947 | adapter->is_up = 0; | 981 | adapter->is_up = 0; |
@@ -1000,7 +1034,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1000 | revision_id = pdev->revision; | 1034 | revision_id = pdev->revision; |
1001 | adapter->ahw.revision_id = revision_id; | 1035 | adapter->ahw.revision_id = revision_id; |
1002 | 1036 | ||
1003 | err = nx_set_dma_mask(adapter, revision_id); | 1037 | err = nx_set_dma_mask(adapter); |
1004 | if (err) | 1038 | if (err) |
1005 | goto err_out_free_netdev; | 1039 | goto err_out_free_netdev; |
1006 | 1040 | ||
@@ -1086,9 +1120,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1086 | 1120 | ||
1087 | netdev->irq = adapter->msix_entries[0].vector; | 1121 | netdev->irq = adapter->msix_entries[0].vector; |
1088 | 1122 | ||
1089 | if (netxen_napi_add(adapter, netdev)) | ||
1090 | goto err_out_disable_msi; | ||
1091 | |||
1092 | init_timer(&adapter->watchdog_timer); | 1123 | init_timer(&adapter->watchdog_timer); |
1093 | adapter->watchdog_timer.function = &netxen_watchdog; | 1124 | adapter->watchdog_timer.function = &netxen_watchdog; |
1094 | adapter->watchdog_timer.data = (unsigned long)adapter; | 1125 | adapter->watchdog_timer.data = (unsigned long)adapter; |
@@ -1158,6 +1189,9 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
1158 | 1189 | ||
1159 | unregister_netdev(netdev); | 1190 | unregister_netdev(netdev); |
1160 | 1191 | ||
1192 | cancel_work_sync(&adapter->watchdog_task); | ||
1193 | cancel_work_sync(&adapter->tx_timeout_task); | ||
1194 | |||
1161 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { | 1195 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { |
1162 | netxen_nic_detach(adapter); | 1196 | netxen_nic_detach(adapter); |
1163 | } | 1197 | } |
@@ -1166,7 +1200,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
1166 | netxen_free_adapter_offload(adapter); | 1200 | netxen_free_adapter_offload(adapter); |
1167 | 1201 | ||
1168 | netxen_teardown_intr(adapter); | 1202 | netxen_teardown_intr(adapter); |
1169 | netxen_free_sds_rings(&adapter->recv_ctx); | ||
1170 | 1203 | ||
1171 | netxen_cleanup_pci_map(adapter); | 1204 | netxen_cleanup_pci_map(adapter); |
1172 | 1205 | ||
@@ -1192,6 +1225,9 @@ netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state) | |||
1192 | if (netif_running(netdev)) | 1225 | if (netif_running(netdev)) |
1193 | netxen_nic_down(adapter, netdev); | 1226 | netxen_nic_down(adapter, netdev); |
1194 | 1227 | ||
1228 | cancel_work_sync(&adapter->watchdog_task); | ||
1229 | cancel_work_sync(&adapter->tx_timeout_task); | ||
1230 | |||
1195 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) | 1231 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) |
1196 | netxen_nic_detach(adapter); | 1232 | netxen_nic_detach(adapter); |
1197 | 1233 | ||
@@ -1529,10 +1565,7 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter) | |||
1529 | printk(KERN_ALERT | 1565 | printk(KERN_ALERT |
1530 | "%s: Device temperature %d degrees C exceeds" | 1566 | "%s: Device temperature %d degrees C exceeds" |
1531 | " maximum allowed. Hardware has been shut down.\n", | 1567 | " maximum allowed. Hardware has been shut down.\n", |
1532 | netxen_nic_driver_name, temp_val); | 1568 | netdev->name, temp_val); |
1533 | |||
1534 | netif_carrier_off(netdev); | ||
1535 | netif_stop_queue(netdev); | ||
1536 | rv = 1; | 1569 | rv = 1; |
1537 | } else if (temp_state == NX_TEMP_WARN) { | 1570 | } else if (temp_state == NX_TEMP_WARN) { |
1538 | if (adapter->temp == NX_TEMP_NORMAL) { | 1571 | if (adapter->temp == NX_TEMP_NORMAL) { |
@@ -1540,13 +1573,13 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter) | |||
1540 | "%s: Device temperature %d degrees C " | 1573 | "%s: Device temperature %d degrees C " |
1541 | "exceeds operating range." | 1574 | "exceeds operating range." |
1542 | " Immediate action needed.\n", | 1575 | " Immediate action needed.\n", |
1543 | netxen_nic_driver_name, temp_val); | 1576 | netdev->name, temp_val); |
1544 | } | 1577 | } |
1545 | } else { | 1578 | } else { |
1546 | if (adapter->temp == NX_TEMP_WARN) { | 1579 | if (adapter->temp == NX_TEMP_WARN) { |
1547 | printk(KERN_INFO | 1580 | printk(KERN_INFO |
1548 | "%s: Device temperature is now %d degrees C" | 1581 | "%s: Device temperature is now %d degrees C" |
1549 | " in normal range.\n", netxen_nic_driver_name, | 1582 | " in normal range.\n", netdev->name, |
1550 | temp_val); | 1583 | temp_val); |
1551 | } | 1584 | } |
1552 | } | 1585 | } |
@@ -1566,10 +1599,7 @@ void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup) | |||
1566 | netif_carrier_off(netdev); | 1599 | netif_carrier_off(netdev); |
1567 | netif_stop_queue(netdev); | 1600 | netif_stop_queue(netdev); |
1568 | } | 1601 | } |
1569 | 1602 | adapter->link_changed = !adapter->has_link_events; | |
1570 | if (!adapter->has_link_events) | ||
1571 | netxen_nic_set_link_parameters(adapter); | ||
1572 | |||
1573 | } else if (!adapter->ahw.linkup && linkup) { | 1603 | } else if (!adapter->ahw.linkup && linkup) { |
1574 | printk(KERN_INFO "%s: %s NIC Link is up\n", | 1604 | printk(KERN_INFO "%s: %s NIC Link is up\n", |
1575 | netxen_nic_driver_name, netdev->name); | 1605 | netxen_nic_driver_name, netdev->name); |
@@ -1578,9 +1608,7 @@ void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup) | |||
1578 | netif_carrier_on(netdev); | 1608 | netif_carrier_on(netdev); |
1579 | netif_wake_queue(netdev); | 1609 | netif_wake_queue(netdev); |
1580 | } | 1610 | } |
1581 | 1611 | adapter->link_changed = !adapter->has_link_events; | |
1582 | if (!adapter->has_link_events) | ||
1583 | netxen_nic_set_link_parameters(adapter); | ||
1584 | } | 1612 | } |
1585 | } | 1613 | } |
1586 | 1614 | ||
@@ -1607,11 +1635,36 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter) | |||
1607 | netxen_advert_link_change(adapter, linkup); | 1635 | netxen_advert_link_change(adapter, linkup); |
1608 | } | 1636 | } |
1609 | 1637 | ||
1638 | static void netxen_nic_thermal_shutdown(struct netxen_adapter *adapter) | ||
1639 | { | ||
1640 | struct net_device *netdev = adapter->netdev; | ||
1641 | |||
1642 | netif_device_detach(netdev); | ||
1643 | netxen_nic_down(adapter, netdev); | ||
1644 | netxen_nic_detach(adapter); | ||
1645 | } | ||
1646 | |||
1610 | static void netxen_watchdog(unsigned long v) | 1647 | static void netxen_watchdog(unsigned long v) |
1611 | { | 1648 | { |
1612 | struct netxen_adapter *adapter = (struct netxen_adapter *)v; | 1649 | struct netxen_adapter *adapter = (struct netxen_adapter *)v; |
1613 | 1650 | ||
1614 | SCHEDULE_WORK(&adapter->watchdog_task); | 1651 | if (netxen_nic_check_temp(adapter)) |
1652 | goto do_sched; | ||
1653 | |||
1654 | if (!adapter->has_link_events) { | ||
1655 | netxen_nic_handle_phy_intr(adapter); | ||
1656 | |||
1657 | if (adapter->link_changed) | ||
1658 | goto do_sched; | ||
1659 | } | ||
1660 | |||
1661 | if (netif_running(adapter->netdev)) | ||
1662 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | ||
1663 | |||
1664 | return; | ||
1665 | |||
1666 | do_sched: | ||
1667 | schedule_work(&adapter->watchdog_task); | ||
1615 | } | 1668 | } |
1616 | 1669 | ||
1617 | void netxen_watchdog_task(struct work_struct *work) | 1670 | void netxen_watchdog_task(struct work_struct *work) |
@@ -1619,11 +1672,13 @@ void netxen_watchdog_task(struct work_struct *work) | |||
1619 | struct netxen_adapter *adapter = | 1672 | struct netxen_adapter *adapter = |
1620 | container_of(work, struct netxen_adapter, watchdog_task); | 1673 | container_of(work, struct netxen_adapter, watchdog_task); |
1621 | 1674 | ||
1622 | if ((adapter->portnum == 0) && netxen_nic_check_temp(adapter)) | 1675 | if (adapter->temp == NX_TEMP_PANIC) { |
1676 | netxen_nic_thermal_shutdown(adapter); | ||
1623 | return; | 1677 | return; |
1678 | } | ||
1624 | 1679 | ||
1625 | if (!adapter->has_link_events) | 1680 | if (adapter->link_changed) |
1626 | netxen_nic_handle_phy_intr(adapter); | 1681 | netxen_nic_set_link_parameters(adapter); |
1627 | 1682 | ||
1628 | if (netif_running(adapter->netdev)) | 1683 | if (netif_running(adapter->netdev)) |
1629 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | 1684 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); |
@@ -1631,9 +1686,8 @@ void netxen_watchdog_task(struct work_struct *work) | |||
1631 | 1686 | ||
1632 | static void netxen_tx_timeout(struct net_device *netdev) | 1687 | static void netxen_tx_timeout(struct net_device *netdev) |
1633 | { | 1688 | { |
1634 | struct netxen_adapter *adapter = (struct netxen_adapter *) | 1689 | struct netxen_adapter *adapter = netdev_priv(netdev); |
1635 | netdev_priv(netdev); | 1690 | schedule_work(&adapter->tx_timeout_task); |
1636 | SCHEDULE_WORK(&adapter->tx_timeout_task); | ||
1637 | } | 1691 | } |
1638 | 1692 | ||
1639 | static void netxen_tx_timeout_task(struct work_struct *work) | 1693 | static void netxen_tx_timeout_task(struct work_struct *work) |
@@ -1641,6 +1695,9 @@ static void netxen_tx_timeout_task(struct work_struct *work) | |||
1641 | struct netxen_adapter *adapter = | 1695 | struct netxen_adapter *adapter = |
1642 | container_of(work, struct netxen_adapter, tx_timeout_task); | 1696 | container_of(work, struct netxen_adapter, tx_timeout_task); |
1643 | 1697 | ||
1698 | if (!netif_running(adapter->netdev)) | ||
1699 | return; | ||
1700 | |||
1644 | printk(KERN_ERR "%s %s: transmit timeout, resetting.\n", | 1701 | printk(KERN_ERR "%s %s: transmit timeout, resetting.\n", |
1645 | netxen_nic_driver_name, adapter->netdev->name); | 1702 | netxen_nic_driver_name, adapter->netdev->name); |
1646 | 1703 | ||
@@ -1753,7 +1810,8 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget) | |||
1753 | 1810 | ||
1754 | if ((work_done < budget) && tx_complete) { | 1811 | if ((work_done < budget) && tx_complete) { |
1755 | napi_complete(&sds_ring->napi); | 1812 | napi_complete(&sds_ring->napi); |
1756 | netxen_nic_enable_int(sds_ring); | 1813 | if (netif_running(adapter->netdev)) |
1814 | netxen_nic_enable_int(sds_ring); | ||
1757 | } | 1815 | } |
1758 | 1816 | ||
1759 | return work_done; | 1817 | return work_done; |
@@ -1786,9 +1844,6 @@ static int __init netxen_init_module(void) | |||
1786 | { | 1844 | { |
1787 | printk(KERN_INFO "%s\n", netxen_nic_driver_string); | 1845 | printk(KERN_INFO "%s\n", netxen_nic_driver_string); |
1788 | 1846 | ||
1789 | if ((netxen_workq = create_singlethread_workqueue("netxen")) == NULL) | ||
1790 | return -ENOMEM; | ||
1791 | |||
1792 | return pci_register_driver(&netxen_driver); | 1847 | return pci_register_driver(&netxen_driver); |
1793 | } | 1848 | } |
1794 | 1849 | ||
@@ -1797,7 +1852,6 @@ module_init(netxen_init_module); | |||
1797 | static void __exit netxen_exit_module(void) | 1852 | static void __exit netxen_exit_module(void) |
1798 | { | 1853 | { |
1799 | pci_unregister_driver(&netxen_driver); | 1854 | pci_unregister_driver(&netxen_driver); |
1800 | destroy_workqueue(netxen_workq); | ||
1801 | } | 1855 | } |
1802 | 1856 | ||
1803 | module_exit(netxen_exit_module); | 1857 | module_exit(netxen_exit_module); |