forked from Minki/linux
mwifiex: check wait_event_interruptible return value
wait_event_interruptible function returns -ERESTARTSYS if it's interrupted by a signal. Driver should check the return value and handle this case properly. In mwifiex_wait_queue_complete() routine, as we are now checking wait_event_interruptible return value, the condition check is not required. Also, we have removed mwifiex_cancel_pending_ioctl() call to avoid a chance of sending second command to FW by other path as soon as we clear current command node. FW can not handle two commands simultaneously. Cc: "3.6+" <stable@vger.kernel.org> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
a910c9cab6
commit
9c969d8ccb
@ -56,7 +56,6 @@ int mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist,
|
||||
*/
|
||||
int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
|
||||
{
|
||||
bool cancel_flag = false;
|
||||
int status;
|
||||
struct cmd_ctrl_node *cmd_queued;
|
||||
|
||||
@ -70,14 +69,11 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
|
||||
atomic_inc(&adapter->cmd_pending);
|
||||
|
||||
/* Wait for completion */
|
||||
wait_event_interruptible(adapter->cmd_wait_q.wait,
|
||||
*(cmd_queued->condition));
|
||||
if (!*(cmd_queued->condition))
|
||||
cancel_flag = true;
|
||||
|
||||
if (cancel_flag) {
|
||||
mwifiex_cancel_pending_ioctl(adapter);
|
||||
dev_dbg(adapter->dev, "cmd cancel\n");
|
||||
status = wait_event_interruptible(adapter->cmd_wait_q.wait,
|
||||
*(cmd_queued->condition));
|
||||
if (status) {
|
||||
dev_err(adapter->dev, "cmd_wait_q terminated: %d\n", status);
|
||||
return status;
|
||||
}
|
||||
|
||||
status = adapter->cmd_wait_q.status;
|
||||
@ -496,8 +492,11 @@ int mwifiex_enable_hs(struct mwifiex_adapter *adapter)
|
||||
return false;
|
||||
}
|
||||
|
||||
wait_event_interruptible(adapter->hs_activate_wait_q,
|
||||
adapter->hs_activate_wait_q_woken);
|
||||
if (wait_event_interruptible(adapter->hs_activate_wait_q,
|
||||
adapter->hs_activate_wait_q_woken)) {
|
||||
dev_err(adapter->dev, "hs_activate_wait_q terminated\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user