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: Xinming Hu <huxm@marvell.com> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
a505e58252
commit
5bf15e3fb8
|
@ -657,10 +657,9 @@ void mwifiex_free_priv(struct mwifiex_private *priv)
|
|||
* - Free the adapter
|
||||
* - Notify completion
|
||||
*/
|
||||
int
|
||||
void
|
||||
mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)
|
||||
{
|
||||
int ret = -EINPROGRESS;
|
||||
struct mwifiex_private *priv;
|
||||
s32 i;
|
||||
unsigned long flags;
|
||||
|
@ -668,15 +667,7 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)
|
|||
|
||||
/* mwifiex already shutdown */
|
||||
if (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY)
|
||||
return 0;
|
||||
|
||||
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;
|
||||
}
|
||||
return;
|
||||
|
||||
/* cancel current command */
|
||||
if (adapter->curr_cmd) {
|
||||
|
@ -727,11 +718,7 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)
|
|||
mwifiex_adapter_cleanup(adapter);
|
||||
|
||||
spin_unlock(&adapter->mwifiex_lock);
|
||||
|
||||
/* Notify completion */
|
||||
ret = mwifiex_shutdown_fw_complete(adapter);
|
||||
|
||||
return ret;
|
||||
adapter->hw_status = MWIFIEX_HW_STATUS_NOT_READY;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -248,15 +248,14 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
|
|||
if (adapter->mwifiex_processing || adapter->main_locked) {
|
||||
adapter->more_task_flag = true;
|
||||
spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
|
||||
goto exit_main_proc;
|
||||
return 0;
|
||||
} else {
|
||||
adapter->mwifiex_processing = true;
|
||||
spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
|
||||
}
|
||||
process_start:
|
||||
do {
|
||||
if ((adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) ||
|
||||
(adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY))
|
||||
if (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY)
|
||||
break;
|
||||
|
||||
/* For non-USB interfaces, If we process interrupts first, it
|
||||
|
@ -464,9 +463,6 @@ process_start:
|
|||
adapter->mwifiex_processing = false;
|
||||
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;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mwifiex_main_process);
|
||||
|
@ -645,16 +641,14 @@ err_dnld_fw:
|
|||
if (adapter->if_ops.unregister_dev)
|
||||
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);
|
||||
}
|
||||
adapter->surprise_removed = true;
|
||||
mwifiex_terminate_workqueue(adapter);
|
||||
|
||||
if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) {
|
||||
pr_debug("info: %s: shutdown mwifiex\n", __func__);
|
||||
mwifiex_shutdown_drv(adapter);
|
||||
}
|
||||
|
||||
init_failed = true;
|
||||
done:
|
||||
if (adapter->cal_data) {
|
||||
|
@ -1399,11 +1393,8 @@ mwifiex_shutdown_sw(struct mwifiex_adapter *adapter)
|
|||
}
|
||||
|
||||
mwifiex_dbg(adapter, CMD, "cmd: calling mwifiex_shutdown_drv...\n");
|
||||
adapter->init_wait_q_woken = false;
|
||||
|
||||
if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
|
||||
wait_event_interruptible(adapter->init_wait_q,
|
||||
adapter->init_wait_q_woken);
|
||||
mwifiex_shutdown_drv(adapter);
|
||||
if (adapter->if_ops.down_dev)
|
||||
adapter->if_ops.down_dev(adapter);
|
||||
|
||||
|
@ -1509,19 +1500,16 @@ err_init_fw:
|
|||
mwifiex_dbg(adapter, ERROR, "info: %s: unregister device\n", __func__);
|
||||
if (adapter->if_ops.unregister_dev)
|
||||
adapter->if_ops.unregister_dev(adapter);
|
||||
|
||||
err_kmalloc:
|
||||
adapter->surprise_removed = true;
|
||||
mwifiex_terminate_workqueue(adapter);
|
||||
if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
"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);
|
||||
mwifiex_shutdown_drv(adapter);
|
||||
}
|
||||
|
||||
err_kmalloc:
|
||||
mwifiex_terminate_workqueue(adapter);
|
||||
adapter->surprise_removed = true;
|
||||
complete_all(adapter->fw_done);
|
||||
mwifiex_dbg(adapter, INFO, "%s, error\n", __func__);
|
||||
|
||||
|
@ -1681,17 +1669,13 @@ err_init_fw:
|
|||
pr_debug("info: %s: unregister device\n", __func__);
|
||||
if (adapter->if_ops.unregister_dev)
|
||||
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:
|
||||
adapter->surprise_removed = true;
|
||||
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:
|
||||
mwifiex_free_adapter(adapter);
|
||||
|
||||
|
@ -1741,11 +1725,8 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter)
|
|||
|
||||
mwifiex_dbg(adapter, CMD,
|
||||
"cmd: calling mwifiex_shutdown_drv...\n");
|
||||
adapter->init_wait_q_woken = false;
|
||||
|
||||
if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
|
||||
wait_event_interruptible(adapter->init_wait_q,
|
||||
adapter->init_wait_q_woken);
|
||||
mwifiex_shutdown_drv(adapter);
|
||||
mwifiex_dbg(adapter, CMD,
|
||||
"cmd: mwifiex_shutdown_drv done\n");
|
||||
if (atomic_read(&adapter->rx_pending) ||
|
||||
|
|
|
@ -248,7 +248,6 @@ enum MWIFIEX_HARDWARE_STATUS {
|
|||
MWIFIEX_HW_STATUS_INITIALIZING,
|
||||
MWIFIEX_HW_STATUS_INIT_DONE,
|
||||
MWIFIEX_HW_STATUS_RESET,
|
||||
MWIFIEX_HW_STATUS_CLOSING,
|
||||
MWIFIEX_HW_STATUS_NOT_READY
|
||||
};
|
||||
|
||||
|
@ -1041,9 +1040,7 @@ int mwifiex_init_fw(struct mwifiex_adapter *adapter);
|
|||
|
||||
int mwifiex_init_fw_complete(struct mwifiex_adapter *adapter);
|
||||
|
||||
int mwifiex_shutdown_drv(struct mwifiex_adapter *adapter);
|
||||
|
||||
int mwifiex_shutdown_fw_complete(struct mwifiex_adapter *adapter);
|
||||
void mwifiex_shutdown_drv(struct mwifiex_adapter *adapter);
|
||||
|
||||
int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *);
|
||||
|
||||
|
|
|
@ -145,21 +145,6 @@ int mwifiex_init_fw_complete(struct mwifiex_adapter *adapter)
|
|||
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
|
||||
* to firmware.
|
||||
|
|
Loading…
Reference in New Issue