Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c969d8c authored by Bing Zhao's avatar Bing Zhao Committed by John W. Linville
Browse files

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: default avatarBing Zhao <bzhao@marvell.com>
Signed-off-by: default avatarAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent a910c9ca
Loading
Loading
Loading
Loading
+10 −11
Original line number Original line Diff line number Diff line
@@ -56,7 +56,6 @@ int mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist,
 */
 */
int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
{
{
	bool cancel_flag = false;
	int status;
	int status;
	struct cmd_ctrl_node *cmd_queued;
	struct cmd_ctrl_node *cmd_queued;


@@ -70,14 +69,11 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
	atomic_inc(&adapter->cmd_pending);
	atomic_inc(&adapter->cmd_pending);


	/* Wait for completion */
	/* Wait for completion */
	wait_event_interruptible(adapter->cmd_wait_q.wait,
	status = wait_event_interruptible(adapter->cmd_wait_q.wait,
					  *(cmd_queued->condition));
					  *(cmd_queued->condition));
	if (!*(cmd_queued->condition))
	if (status) {
		cancel_flag = true;
		dev_err(adapter->dev, "cmd_wait_q terminated: %d\n", status);

		return status;
	if (cancel_flag) {
		mwifiex_cancel_pending_ioctl(adapter);
		dev_dbg(adapter->dev, "cmd cancel\n");
	}
	}


	status = adapter->cmd_wait_q.status;
	status = adapter->cmd_wait_q.status;
@@ -496,8 +492,11 @@ int mwifiex_enable_hs(struct mwifiex_adapter *adapter)
		return false;
		return false;
	}
	}


	wait_event_interruptible(adapter->hs_activate_wait_q,
	if (wait_event_interruptible(adapter->hs_activate_wait_q,
				 adapter->hs_activate_wait_q_woken);
				     adapter->hs_activate_wait_q_woken)) {
		dev_err(adapter->dev, "hs_activate_wait_q terminated\n");
		return false;
	}


	return true;
	return true;
}
}