aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_ctx.c
diff options
context:
space:
mode:
authorDhananjay Phadke <dhananjay@netxen.com>2009-09-05 13:43:08 -0400
committerDavid S. Miller <davem@davemloft.net>2009-09-07 04:53:06 -0400
commit6a581e93981e8838c85e407303186faf937830d3 (patch)
tree3e2f083971fc33d4a3e88e7cc37e346f775d7168 /drivers/net/netxen/netxen_nic_ctx.c
parentdb4cfd8a6149e778befb2ff6e6f91cdc6394cbe6 (diff)
netxen: firmware hang detection
Implement state machine to detect firmware hung state and recover. Since firmware will be shared by all PCI functions that have different class drivers (NIC or FCOE or iSCSI), explicit hardware based serialization is required for initializing firmware. o Used global scratchpad register to maintain device reference count. Every probed pci function adds to ref count. o Implement timer (delayed work) for each pci func that checks firmware heartbit every 5 sec and detaches itself if firmware is dead. Last detaching function reloads firmware. Other functions wait for firmware init, and re-attach themselves. Heartbit is not supported by NX2031 firmware. Signed-off-by: Amit Kumar Salecha <amit@netxen.com> Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netxen/netxen_nic_ctx.c')
-rw-r--r--drivers/net/netxen/netxen_nic_ctx.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/netxen/netxen_nic_ctx.c b/drivers/net/netxen/netxen_nic_ctx.c
index 0f42ab998368..8ab5773e47d6 100644
--- a/drivers/net/netxen/netxen_nic_ctx.c
+++ b/drivers/net/netxen/netxen_nic_ctx.c
@@ -678,6 +678,9 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
678 678
679 679
680 if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) { 680 if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
681 if (test_and_set_bit(__NX_FW_ATTACHED, &adapter->state))
682 goto done;
683
681 err = nx_fw_cmd_create_rx_ctx(adapter); 684 err = nx_fw_cmd_create_rx_ctx(adapter);
682 if (err) 685 if (err)
683 goto err_out_free; 686 goto err_out_free;
@@ -690,6 +693,7 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
690 goto err_out_free; 693 goto err_out_free;
691 } 694 }
692 695
696done:
693 return 0; 697 return 0;
694 698
695err_out_free: 699err_out_free:
@@ -708,6 +712,9 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter)
708 int port = adapter->portnum; 712 int port = adapter->portnum;
709 713
710 if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) { 714 if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
715 if (!test_and_clear_bit(__NX_FW_ATTACHED, &adapter->state))
716 goto done;
717
711 nx_fw_cmd_destroy_rx_ctx(adapter); 718 nx_fw_cmd_destroy_rx_ctx(adapter);
712 nx_fw_cmd_destroy_tx_ctx(adapter); 719 nx_fw_cmd_destroy_tx_ctx(adapter);
713 } else { 720 } else {
@@ -720,6 +727,7 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter)
720 /* Allow dma queues to drain after context reset */ 727 /* Allow dma queues to drain after context reset */
721 msleep(20); 728 msleep(20);
722 729
730done:
723 recv_ctx = &adapter->recv_ctx; 731 recv_ctx = &adapter->recv_ctx;
724 732
725 if (recv_ctx->hwctx != NULL) { 733 if (recv_ctx->hwctx != NULL) {