Commit 5bf15e3f authored by Xinming Hu's avatar Xinming Hu Committed by Kalle Valo

mwifiex: don't wait for main_process in shutdown_drv

main_process is not expected to be running when shutdown_drv function
is called. currently we wait for main_process completion in the
function.

Actually the caller has already made sure main_process is completed by
performing below actions.
(1) disable interrupts in if_ops->disable_int.
(2) set adapter->surprise_removed = true, main_process wont be queued.
(3) mwifiex_terminate_workqueue(adapter), wait for workqueue to be
completed.

This patch removes redundant wait code and takes care of related
cleanup.
Signed-off-by: default avatarXinming Hu <huxm@marvell.com>
Signed-off-by: default avatarAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent a505e582
...@@ -657,10 +657,9 @@ void mwifiex_free_priv(struct mwifiex_private *priv) ...@@ -657,10 +657,9 @@ void mwifiex_free_priv(struct mwifiex_private *priv)
* - Free the adapter * - Free the adapter
* - Notify completion * - Notify completion
*/ */
int void
mwifiex_shutdown_drv(struct mwifiex_adapter *adapter) mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)
{ {
int ret = -EINPROGRESS;
struct mwifiex_private *priv; struct mwifiex_private *priv;
s32 i; s32 i;
unsigned long flags; unsigned long flags;
...@@ -668,15 +667,7 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter) ...@@ -668,15 +667,7 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)
/* mwifiex already shutdown */ /* mwifiex already shutdown */
if (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY) if (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY)
return 0; return;
adapter->hw_status = MWIFIEX_HW_STATUS_CLOSING;
/* wait for mwifiex_process to complete */
if (adapter->mwifiex_processing) {
mwifiex_dbg(adapter, WARN,
"main process is still running\n");
return ret;
}
/* cancel current command */ /* cancel current command */
if (adapter->curr_cmd) { if (adapter->curr_cmd) {
...@@ -727,11 +718,7 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter) ...@@ -727,11 +718,7 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)
mwifiex_adapter_cleanup(adapter); mwifiex_adapter_cleanup(adapter);
spin_unlock(&adapter->mwifiex_lock); spin_unlock(&adapter->mwifiex_lock);
adapter->hw_status = MWIFIEX_HW_STATUS_NOT_READY;
/* Notify completion */
ret = mwifiex_shutdown_fw_complete(adapter);
return ret;
} }
/* /*
......
...@@ -248,15 +248,14 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter) ...@@ -248,15 +248,14 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
if (adapter->mwifiex_processing || adapter->main_locked) { if (adapter->mwifiex_processing || adapter->main_locked) {
adapter->more_task_flag = true; adapter->more_task_flag = true;
spin_unlock_irqrestore(&adapter->main_proc_lock, flags); spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
goto exit_main_proc; return 0;
} else { } else {
adapter->mwifiex_processing = true; adapter->mwifiex_processing = true;
spin_unlock_irqrestore(&adapter->main_proc_lock, flags); spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
} }
process_start: process_start:
do { do {
if ((adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) || if (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY)
(adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY))
break; break;
/* For non-USB interfaces, If we process interrupts first, it /* For non-USB interfaces, If we process interrupts first, it
...@@ -464,9 +463,6 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter) ...@@ -464,9 +463,6 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
adapter->mwifiex_processing = false; adapter->mwifiex_processing = false;
spin_unlock_irqrestore(&adapter->main_proc_lock, flags); spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
exit_main_proc:
if (adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING)
mwifiex_shutdown_drv(adapter);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(mwifiex_main_process); EXPORT_SYMBOL_GPL(mwifiex_main_process);
...@@ -645,16 +641,14 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context) ...@@ -645,16 +641,14 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
if (adapter->if_ops.unregister_dev) if (adapter->if_ops.unregister_dev)
adapter->if_ops.unregister_dev(adapter); adapter->if_ops.unregister_dev(adapter);
adapter->surprise_removed = true;
mwifiex_terminate_workqueue(adapter);
if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) { if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) {
pr_debug("info: %s: shutdown mwifiex\n", __func__); pr_debug("info: %s: shutdown mwifiex\n", __func__);
adapter->init_wait_q_woken = false; mwifiex_shutdown_drv(adapter);
if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
wait_event_interruptible(adapter->init_wait_q,
adapter->init_wait_q_woken);
} }
adapter->surprise_removed = true;
mwifiex_terminate_workqueue(adapter);
init_failed = true; init_failed = true;
done: done:
if (adapter->cal_data) { if (adapter->cal_data) {
...@@ -1399,11 +1393,8 @@ mwifiex_shutdown_sw(struct mwifiex_adapter *adapter) ...@@ -1399,11 +1393,8 @@ mwifiex_shutdown_sw(struct mwifiex_adapter *adapter)
} }
mwifiex_dbg(adapter, CMD, "cmd: calling mwifiex_shutdown_drv...\n"); mwifiex_dbg(adapter, CMD, "cmd: calling mwifiex_shutdown_drv...\n");
adapter->init_wait_q_woken = false;
if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS) mwifiex_shutdown_drv(adapter);
wait_event_interruptible(adapter->init_wait_q,
adapter->init_wait_q_woken);
if (adapter->if_ops.down_dev) if (adapter->if_ops.down_dev)
adapter->if_ops.down_dev(adapter); adapter->if_ops.down_dev(adapter);
...@@ -1509,19 +1500,16 @@ mwifiex_reinit_sw(struct mwifiex_adapter *adapter, struct completion *fw_done, ...@@ -1509,19 +1500,16 @@ mwifiex_reinit_sw(struct mwifiex_adapter *adapter, struct completion *fw_done,
mwifiex_dbg(adapter, ERROR, "info: %s: unregister device\n", __func__); mwifiex_dbg(adapter, ERROR, "info: %s: unregister device\n", __func__);
if (adapter->if_ops.unregister_dev) if (adapter->if_ops.unregister_dev)
adapter->if_ops.unregister_dev(adapter); adapter->if_ops.unregister_dev(adapter);
err_kmalloc:
adapter->surprise_removed = true;
mwifiex_terminate_workqueue(adapter);
if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) { if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) {
mwifiex_dbg(adapter, ERROR, mwifiex_dbg(adapter, ERROR,
"info: %s: shutdown mwifiex\n", __func__); "info: %s: shutdown mwifiex\n", __func__);
adapter->init_wait_q_woken = false; mwifiex_shutdown_drv(adapter);
if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
wait_event_interruptible(adapter->init_wait_q,
adapter->init_wait_q_woken);
} }
err_kmalloc:
mwifiex_terminate_workqueue(adapter);
adapter->surprise_removed = true;
complete_all(adapter->fw_done); complete_all(adapter->fw_done);
mwifiex_dbg(adapter, INFO, "%s, error\n", __func__); mwifiex_dbg(adapter, INFO, "%s, error\n", __func__);
...@@ -1681,17 +1669,13 @@ mwifiex_add_card(void *card, struct completion *fw_done, ...@@ -1681,17 +1669,13 @@ mwifiex_add_card(void *card, struct completion *fw_done,
pr_debug("info: %s: unregister device\n", __func__); pr_debug("info: %s: unregister device\n", __func__);
if (adapter->if_ops.unregister_dev) if (adapter->if_ops.unregister_dev)
adapter->if_ops.unregister_dev(adapter); adapter->if_ops.unregister_dev(adapter);
if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) {
pr_debug("info: %s: shutdown mwifiex\n", __func__);
adapter->init_wait_q_woken = false;
if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
wait_event_interruptible(adapter->init_wait_q,
adapter->init_wait_q_woken);
}
err_registerdev: err_registerdev:
adapter->surprise_removed = true; adapter->surprise_removed = true;
mwifiex_terminate_workqueue(adapter); mwifiex_terminate_workqueue(adapter);
if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) {
pr_debug("info: %s: shutdown mwifiex\n", __func__);
mwifiex_shutdown_drv(adapter);
}
err_kmalloc: err_kmalloc:
mwifiex_free_adapter(adapter); mwifiex_free_adapter(adapter);
...@@ -1741,11 +1725,8 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter) ...@@ -1741,11 +1725,8 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter)
mwifiex_dbg(adapter, CMD, mwifiex_dbg(adapter, CMD,
"cmd: calling mwifiex_shutdown_drv...\n"); "cmd: calling mwifiex_shutdown_drv...\n");
adapter->init_wait_q_woken = false;
if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS) mwifiex_shutdown_drv(adapter);
wait_event_interruptible(adapter->init_wait_q,
adapter->init_wait_q_woken);
mwifiex_dbg(adapter, CMD, mwifiex_dbg(adapter, CMD,
"cmd: mwifiex_shutdown_drv done\n"); "cmd: mwifiex_shutdown_drv done\n");
if (atomic_read(&adapter->rx_pending) || if (atomic_read(&adapter->rx_pending) ||
......
...@@ -248,7 +248,6 @@ enum MWIFIEX_HARDWARE_STATUS { ...@@ -248,7 +248,6 @@ enum MWIFIEX_HARDWARE_STATUS {
MWIFIEX_HW_STATUS_INITIALIZING, MWIFIEX_HW_STATUS_INITIALIZING,
MWIFIEX_HW_STATUS_INIT_DONE, MWIFIEX_HW_STATUS_INIT_DONE,
MWIFIEX_HW_STATUS_RESET, MWIFIEX_HW_STATUS_RESET,
MWIFIEX_HW_STATUS_CLOSING,
MWIFIEX_HW_STATUS_NOT_READY MWIFIEX_HW_STATUS_NOT_READY
}; };
...@@ -1041,9 +1040,7 @@ int mwifiex_init_fw(struct mwifiex_adapter *adapter); ...@@ -1041,9 +1040,7 @@ int mwifiex_init_fw(struct mwifiex_adapter *adapter);
int mwifiex_init_fw_complete(struct mwifiex_adapter *adapter); int mwifiex_init_fw_complete(struct mwifiex_adapter *adapter);
int mwifiex_shutdown_drv(struct mwifiex_adapter *adapter); void mwifiex_shutdown_drv(struct mwifiex_adapter *adapter);
int mwifiex_shutdown_fw_complete(struct mwifiex_adapter *adapter);
int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *); int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *);
......
...@@ -145,21 +145,6 @@ int mwifiex_init_fw_complete(struct mwifiex_adapter *adapter) ...@@ -145,21 +145,6 @@ int mwifiex_init_fw_complete(struct mwifiex_adapter *adapter)
return 0; return 0;
} }
/*
* Firmware shutdown complete callback handler.
*
* This function sets the hardware status to not ready and wakes up
* the function waiting on the init wait queue for the firmware
* shutdown to complete.
*/
int mwifiex_shutdown_fw_complete(struct mwifiex_adapter *adapter)
{
adapter->hw_status = MWIFIEX_HW_STATUS_NOT_READY;
adapter->init_wait_q_woken = true;
wake_up_interruptible(&adapter->init_wait_q);
return 0;
}
/* /*
* This function sends init/shutdown command * This function sends init/shutdown command
* to firmware. * to firmware.
......
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