netxen: fix context deletion sequence
authorDhananjay Phadke <dhananjay@netxen.com>
Fri, 17 Jul 2009 15:27:06 +0000 (15:27 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 20 Jul 2009 15:23:28 +0000 (08:23 -0700)
o Use D3 reset context deletion for NX2031, it cleans up
  more resources in the firmware.
o Release rx buffers after hardware context has been reset.
o Delete tx context after rx context, some firmware control
  commands are sent on tx context, so it should be the last
  to go.

Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/netxen/netxen_nic.h
drivers/net/netxen/netxen_nic_ctx.c
drivers/net/netxen/netxen_nic_main.c

index e1cdba752e09daa397c331b9c5708da267d8a7d9..9fa71faf4ceb123ccef7e1e7ca0e7eef9e5147d8 100644 (file)
 #define NETXEN_CTX_SIGNATURE   0xdee0
 #define NETXEN_CTX_SIGNATURE_V2        0x0002dee0
 #define NETXEN_CTX_RESET       0xbad0
+#define NETXEN_CTX_D3_RESET    0xacc0
 #define NETXEN_RCV_PRODUCER(ringid)    (ringid)
 
 #define PHAN_PEG_RCV_INITIALIZED       0xff01
index 4754f5cffad078ce53436b26330b6a0623ee4749..9f8ae4719e2fb4a9d91d4893db5baf675ccd7616 100644 (file)
@@ -684,10 +684,8 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
                        goto err_out_free;
        } else {
                err = netxen_init_old_ctx(adapter);
-               if (err) {
-                       netxen_free_hw_resources(adapter);
-                       return err;
-               }
+               if (err)
+                       goto err_out_free;
        }
 
        return 0;
@@ -708,15 +706,18 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter)
        int port = adapter->portnum;
 
        if (adapter->fw_major >= 4) {
-               nx_fw_cmd_destroy_tx_ctx(adapter);
                nx_fw_cmd_destroy_rx_ctx(adapter);
+               nx_fw_cmd_destroy_tx_ctx(adapter);
        } else {
                netxen_api_lock(adapter);
                NXWR32(adapter, CRB_CTX_SIGNATURE_REG(port),
-                               NETXEN_CTX_RESET | port);
+                               NETXEN_CTX_D3_RESET | port);
                netxen_api_unlock(adapter);
        }
 
+       /* Allow dma queues to drain after context reset */
+       msleep(20);
+
        recv_ctx = &adapter->recv_ctx;
 
        if (recv_ctx->hwctx != NULL) {
index 27539ddf94c4f9304c8310e652c1ee7f120f78af..9a7c4c8029de3c37f5c1635085d48bdd1ec8f377 100644 (file)
@@ -943,8 +943,8 @@ err_out_free_sw:
 static void
 netxen_nic_detach(struct netxen_adapter *adapter)
 {
-       netxen_release_rx_buffers(adapter);
        netxen_free_hw_resources(adapter);
+       netxen_release_rx_buffers(adapter);
        netxen_nic_free_irq(adapter);
        netxen_free_sw_resources(adapter);