aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r--drivers/net/netxen/netxen_nic_main.c170
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
95MODULE_DEVICE_TABLE(pci, netxen_pci_tbl); 95MODULE_DEVICE_TABLE(pci, netxen_pci_tbl);
96 96
97static 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
101static void netxen_watchdog(unsigned long); 97static void netxen_watchdog(unsigned long);
102 98
103static uint32_t crb_cmd_producer[4] = { 99static 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
176static int 174static int
@@ -193,6 +191,21 @@ netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev)
193} 191}
194 192
195static void 193static void
194netxen_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
208static void
196netxen_napi_enable(struct netxen_adapter *adapter) 209netxen_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
224static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) 237static 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
256nx_update_dma_mask(struct netxen_adapter *adapter) 267nx_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
305err_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
285static void netxen_check_options(struct netxen_adapter *adapter) 311static 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)
847static void 877static void
848netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) 878netxen_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:
939static void 972static void
940netxen_nic_detach(struct netxen_adapter *adapter) 973netxen_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
1638static 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
1610static void netxen_watchdog(unsigned long v) 1647static 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
1666do_sched:
1667 schedule_work(&adapter->watchdog_task);
1615} 1668}
1616 1669
1617void netxen_watchdog_task(struct work_struct *work) 1670void 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
1632static void netxen_tx_timeout(struct net_device *netdev) 1687static 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
1639static void netxen_tx_timeout_task(struct work_struct *work) 1693static 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);
1797static void __exit netxen_exit_module(void) 1852static 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
1803module_exit(netxen_exit_module); 1857module_exit(netxen_exit_module);