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.c77
1 files changed, 51 insertions, 26 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 2919a2d12bf4..3cd8cfcf627b 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -215,13 +215,13 @@ netxen_napi_disable(struct netxen_adapter *adapter)
215 215
216 for (ring = 0; ring < adapter->max_sds_rings; ring++) { 216 for (ring = 0; ring < adapter->max_sds_rings; ring++) {
217 sds_ring = &recv_ctx->sds_rings[ring]; 217 sds_ring = &recv_ctx->sds_rings[ring];
218 napi_disable(&sds_ring->napi);
219 netxen_nic_disable_int(sds_ring); 218 netxen_nic_disable_int(sds_ring);
220 synchronize_irq(sds_ring->irq); 219 napi_synchronize(&sds_ring->napi);
220 napi_disable(&sds_ring->napi);
221 } 221 }
222} 222}
223 223
224static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) 224static int nx_set_dma_mask(struct netxen_adapter *adapter)
225{ 225{
226 struct pci_dev *pdev = adapter->pdev; 226 struct pci_dev *pdev = adapter->pdev;
227 uint64_t mask, cmask; 227 uint64_t mask, cmask;
@@ -229,19 +229,17 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
229 adapter->pci_using_dac = 0; 229 adapter->pci_using_dac = 0;
230 230
231 mask = DMA_BIT_MASK(32); 231 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); 232 cmask = DMA_BIT_MASK(32);
238 233
234 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
239#ifndef CONFIG_IA64 235#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); 236 mask = DMA_BIT_MASK(35);
244#endif 237#endif
238 } else {
239 mask = DMA_BIT_MASK(39);
240 cmask = mask;
241 }
242
245 if (pci_set_dma_mask(pdev, mask) == 0 && 243 if (pci_set_dma_mask(pdev, mask) == 0 &&
246 pci_set_consistent_dma_mask(pdev, cmask) == 0) { 244 pci_set_consistent_dma_mask(pdev, cmask) == 0) {
247 adapter->pci_using_dac = 1; 245 adapter->pci_using_dac = 1;
@@ -256,7 +254,7 @@ static int
256nx_update_dma_mask(struct netxen_adapter *adapter) 254nx_update_dma_mask(struct netxen_adapter *adapter)
257{ 255{
258 int change, shift, err; 256 int change, shift, err;
259 uint64_t mask, old_mask; 257 uint64_t mask, old_mask, old_cmask;
260 struct pci_dev *pdev = adapter->pdev; 258 struct pci_dev *pdev = adapter->pdev;
261 259
262 change = 0; 260 change = 0;
@@ -272,14 +270,29 @@ nx_update_dma_mask(struct netxen_adapter *adapter)
272 270
273 if (change) { 271 if (change) {
274 old_mask = pdev->dma_mask; 272 old_mask = pdev->dma_mask;
273 old_cmask = pdev->dev.coherent_dma_mask;
274
275 mask = (1ULL<<(32+shift)) - 1; 275 mask = (1ULL<<(32+shift)) - 1;
276 276
277 err = pci_set_dma_mask(pdev, mask); 277 err = pci_set_dma_mask(pdev, mask);
278 if (err) 278 if (err)
279 return pci_set_dma_mask(pdev, old_mask); 279 goto err_out;
280
281 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
282
283 err = pci_set_consistent_dma_mask(pdev, mask);
284 if (err)
285 goto err_out;
286 }
287 dev_info(&pdev->dev, "using %d-bit dma mask\n", 32+shift);
280 } 288 }
281 289
282 return 0; 290 return 0;
291
292err_out:
293 pci_set_dma_mask(pdev, old_mask);
294 pci_set_consistent_dma_mask(pdev, old_cmask);
295 return err;
283} 296}
284 297
285static void netxen_check_options(struct netxen_adapter *adapter) 298static void netxen_check_options(struct netxen_adapter *adapter)
@@ -718,6 +731,10 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw)
718 if (request_fw) 731 if (request_fw)
719 netxen_request_firmware(adapter); 732 netxen_request_firmware(adapter);
720 733
734 err = netxen_need_fw_reset(adapter);
735 if (err <= 0)
736 return err;
737
721 if (first_boot != 0x55555555) { 738 if (first_boot != 0x55555555) {
722 NXWR32(adapter, CRB_CMDPEG_STATE, 0); 739 NXWR32(adapter, CRB_CMDPEG_STATE, 0);
723 netxen_pinit_from_rom(adapter, 0); 740 netxen_pinit_from_rom(adapter, 0);
@@ -829,11 +846,11 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
829 846
830 adapter->ahw.linkup = 0; 847 adapter->ahw.linkup = 0;
831 848
832 netxen_napi_enable(adapter);
833
834 if (adapter->max_sds_rings > 1) 849 if (adapter->max_sds_rings > 1)
835 netxen_config_rss(adapter, 1); 850 netxen_config_rss(adapter, 1);
836 851
852 netxen_napi_enable(adapter);
853
837 if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION) 854 if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION)
838 netxen_linkevent_request(adapter, 1); 855 netxen_linkevent_request(adapter, 1);
839 else 856 else
@@ -847,8 +864,9 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
847static void 864static void
848netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) 865netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
849{ 866{
867 spin_lock(&adapter->tx_clean_lock);
850 netif_carrier_off(netdev); 868 netif_carrier_off(netdev);
851 netif_stop_queue(netdev); 869 netif_tx_disable(netdev);
852 870
853 if (adapter->stop_port) 871 if (adapter->stop_port)
854 adapter->stop_port(adapter); 872 adapter->stop_port(adapter);
@@ -859,9 +877,10 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
859 netxen_napi_disable(adapter); 877 netxen_napi_disable(adapter);
860 878
861 netxen_release_tx_buffers(adapter); 879 netxen_release_tx_buffers(adapter);
880 spin_unlock(&adapter->tx_clean_lock);
862 881
863 FLUSH_SCHEDULED_WORK();
864 del_timer_sync(&adapter->watchdog_timer); 882 del_timer_sync(&adapter->watchdog_timer);
883 FLUSH_SCHEDULED_WORK();
865} 884}
866 885
867 886
@@ -939,8 +958,8 @@ err_out_free_sw:
939static void 958static void
940netxen_nic_detach(struct netxen_adapter *adapter) 959netxen_nic_detach(struct netxen_adapter *adapter)
941{ 960{
942 netxen_release_rx_buffers(adapter);
943 netxen_free_hw_resources(adapter); 961 netxen_free_hw_resources(adapter);
962 netxen_release_rx_buffers(adapter);
944 netxen_nic_free_irq(adapter); 963 netxen_nic_free_irq(adapter);
945 netxen_free_sw_resources(adapter); 964 netxen_free_sw_resources(adapter);
946 965
@@ -1000,7 +1019,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1000 revision_id = pdev->revision; 1019 revision_id = pdev->revision;
1001 adapter->ahw.revision_id = revision_id; 1020 adapter->ahw.revision_id = revision_id;
1002 1021
1003 err = nx_set_dma_mask(adapter, revision_id); 1022 err = nx_set_dma_mask(adapter);
1004 if (err) 1023 if (err)
1005 goto err_out_free_netdev; 1024 goto err_out_free_netdev;
1006 1025
@@ -1529,10 +1548,12 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
1529 printk(KERN_ALERT 1548 printk(KERN_ALERT
1530 "%s: Device temperature %d degrees C exceeds" 1549 "%s: Device temperature %d degrees C exceeds"
1531 " maximum allowed. Hardware has been shut down.\n", 1550 " maximum allowed. Hardware has been shut down.\n",
1532 netxen_nic_driver_name, temp_val); 1551 netdev->name, temp_val);
1552
1553 netif_device_detach(netdev);
1554 netxen_nic_down(adapter, netdev);
1555 netxen_nic_detach(adapter);
1533 1556
1534 netif_carrier_off(netdev);
1535 netif_stop_queue(netdev);
1536 rv = 1; 1557 rv = 1;
1537 } else if (temp_state == NX_TEMP_WARN) { 1558 } else if (temp_state == NX_TEMP_WARN) {
1538 if (adapter->temp == NX_TEMP_NORMAL) { 1559 if (adapter->temp == NX_TEMP_NORMAL) {
@@ -1540,13 +1561,13 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
1540 "%s: Device temperature %d degrees C " 1561 "%s: Device temperature %d degrees C "
1541 "exceeds operating range." 1562 "exceeds operating range."
1542 " Immediate action needed.\n", 1563 " Immediate action needed.\n",
1543 netxen_nic_driver_name, temp_val); 1564 netdev->name, temp_val);
1544 } 1565 }
1545 } else { 1566 } else {
1546 if (adapter->temp == NX_TEMP_WARN) { 1567 if (adapter->temp == NX_TEMP_WARN) {
1547 printk(KERN_INFO 1568 printk(KERN_INFO
1548 "%s: Device temperature is now %d degrees C" 1569 "%s: Device temperature is now %d degrees C"
1549 " in normal range.\n", netxen_nic_driver_name, 1570 " in normal range.\n", netdev->name,
1550 temp_val); 1571 temp_val);
1551 } 1572 }
1552 } 1573 }
@@ -1619,7 +1640,7 @@ void netxen_watchdog_task(struct work_struct *work)
1619 struct netxen_adapter *adapter = 1640 struct netxen_adapter *adapter =
1620 container_of(work, struct netxen_adapter, watchdog_task); 1641 container_of(work, struct netxen_adapter, watchdog_task);
1621 1642
1622 if ((adapter->portnum == 0) && netxen_nic_check_temp(adapter)) 1643 if (netxen_nic_check_temp(adapter))
1623 return; 1644 return;
1624 1645
1625 if (!adapter->has_link_events) 1646 if (!adapter->has_link_events)
@@ -1641,6 +1662,9 @@ static void netxen_tx_timeout_task(struct work_struct *work)
1641 struct netxen_adapter *adapter = 1662 struct netxen_adapter *adapter =
1642 container_of(work, struct netxen_adapter, tx_timeout_task); 1663 container_of(work, struct netxen_adapter, tx_timeout_task);
1643 1664
1665 if (!netif_running(adapter->netdev))
1666 return;
1667
1644 printk(KERN_ERR "%s %s: transmit timeout, resetting.\n", 1668 printk(KERN_ERR "%s %s: transmit timeout, resetting.\n",
1645 netxen_nic_driver_name, adapter->netdev->name); 1669 netxen_nic_driver_name, adapter->netdev->name);
1646 1670
@@ -1753,7 +1777,8 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget)
1753 1777
1754 if ((work_done < budget) && tx_complete) { 1778 if ((work_done < budget) && tx_complete) {
1755 napi_complete(&sds_ring->napi); 1779 napi_complete(&sds_ring->napi);
1756 netxen_nic_enable_int(sds_ring); 1780 if (netif_running(adapter->netdev))
1781 netxen_nic_enable_int(sds_ring);
1757 } 1782 }
1758 1783
1759 return work_done; 1784 return work_done;