diff options
author | Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> | 2014-08-06 10:31:52 +0300 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-08-25 16:17:32 -0400 |
commit | bbb2adc7b47cbe841d3cb2fa048f720647f5f4cd (patch) | |
tree | 716b194672288a2478ff8a6c796e509eca6148dc /drivers/net/wireless/ath/wil6210/main.c | |
parent | 02525a7925c9a3c55ceef7e9a30218dc47ced1ad (diff) |
wil6210: check error in wil_target_reset()
When resetting target in wil_target_reset(), error may occur.
Indicate error via error code. In case of error, don't attempt to further
interact with card, specifically don't attempt firmware download or
interrupts enabling.
Move wil_rx_fini() to be always executed to prevent memory leak.
Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/wil6210/main.c')
-rw-r--r-- | drivers/net/wireless/ath/wil6210/main.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/net/wireless/ath/wil6210/main.c b/drivers/net/wireless/ath/wil6210/main.c index dc220537de99..5a9934291dab 100644 --- a/drivers/net/wireless/ath/wil6210/main.c +++ b/drivers/net/wireless/ath/wil6210/main.c @@ -309,7 +309,7 @@ void wil_priv_deinit(struct wil6210_priv *wil) destroy_workqueue(wil->wmi_wq); } -static void wil_target_reset(struct wil6210_priv *wil) +static int wil_target_reset(struct wil6210_priv *wil) { int delay = 0; u32 hw_state; @@ -395,7 +395,7 @@ static void wil_target_reset(struct wil6210_priv *wil) if (delay++ > 100) { wil_err(wil, "Reset not completed, hw_state 0x%08x\n", hw_state); - return; + return -ETIME; } } while (hw_state != HW_MACHINE_BOOT_DONE); @@ -407,6 +407,7 @@ static void wil_target_reset(struct wil6210_priv *wil) wmb(); /* order is important here */ wil_dbg_misc(wil, "Reset completed in %d ms\n", delay); + return 0; #undef R #undef W @@ -471,10 +472,11 @@ int wil_reset(struct wil6210_priv *wil) flush_workqueue(wil->wmi_wq_conn); flush_workqueue(wil->wmi_wq); - /* TODO: put MAC in reset */ - wil_target_reset(wil); - + rc = wil_target_reset(wil); wil_rx_fini(wil); + if (rc) + return rc; + /* init after reset */ wil->pending_connect_cid = -1; |