Commit cf981ffb authored by Dhananjay Phadke's avatar Dhananjay Phadke Committed by David S. Miller

netxen: fix context deletion sequence

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: default avatarDhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3ba81f3e
...@@ -210,6 +210,7 @@ ...@@ -210,6 +210,7 @@
#define NETXEN_CTX_SIGNATURE 0xdee0 #define NETXEN_CTX_SIGNATURE 0xdee0
#define NETXEN_CTX_SIGNATURE_V2 0x0002dee0 #define NETXEN_CTX_SIGNATURE_V2 0x0002dee0
#define NETXEN_CTX_RESET 0xbad0 #define NETXEN_CTX_RESET 0xbad0
#define NETXEN_CTX_D3_RESET 0xacc0
#define NETXEN_RCV_PRODUCER(ringid) (ringid) #define NETXEN_RCV_PRODUCER(ringid) (ringid)
#define PHAN_PEG_RCV_INITIALIZED 0xff01 #define PHAN_PEG_RCV_INITIALIZED 0xff01
......
...@@ -684,10 +684,8 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter) ...@@ -684,10 +684,8 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
goto err_out_free; goto err_out_free;
} else { } else {
err = netxen_init_old_ctx(adapter); err = netxen_init_old_ctx(adapter);
if (err) { if (err)
netxen_free_hw_resources(adapter); goto err_out_free;
return err;
}
} }
return 0; return 0;
...@@ -708,15 +706,18 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter) ...@@ -708,15 +706,18 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter)
int port = adapter->portnum; int port = adapter->portnum;
if (adapter->fw_major >= 4) { if (adapter->fw_major >= 4) {
nx_fw_cmd_destroy_tx_ctx(adapter);
nx_fw_cmd_destroy_rx_ctx(adapter); nx_fw_cmd_destroy_rx_ctx(adapter);
nx_fw_cmd_destroy_tx_ctx(adapter);
} else { } else {
netxen_api_lock(adapter); netxen_api_lock(adapter);
NXWR32(adapter, CRB_CTX_SIGNATURE_REG(port), NXWR32(adapter, CRB_CTX_SIGNATURE_REG(port),
NETXEN_CTX_RESET | port); NETXEN_CTX_D3_RESET | port);
netxen_api_unlock(adapter); netxen_api_unlock(adapter);
} }
/* Allow dma queues to drain after context reset */
msleep(20);
recv_ctx = &adapter->recv_ctx; recv_ctx = &adapter->recv_ctx;
if (recv_ctx->hwctx != NULL) { if (recv_ctx->hwctx != NULL) {
......
...@@ -943,8 +943,8 @@ netxen_nic_attach(struct netxen_adapter *adapter) ...@@ -943,8 +943,8 @@ netxen_nic_attach(struct netxen_adapter *adapter)
static void static void
netxen_nic_detach(struct netxen_adapter *adapter) netxen_nic_detach(struct netxen_adapter *adapter)
{ {
netxen_release_rx_buffers(adapter);
netxen_free_hw_resources(adapter); netxen_free_hw_resources(adapter);
netxen_release_rx_buffers(adapter);
netxen_nic_free_irq(adapter); netxen_nic_free_irq(adapter);
netxen_free_sw_resources(adapter); netxen_free_sw_resources(adapter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment