mwifiex: fix system hang issue in cmd timeout error case
Reported by Tim Shepard: I was seeing sporadic failures (wedgeups), and the majority of those failures I saw printed the printouts in mwifiex_cmd_timeout_func with cmd = 0xe5 which is CMD_802_11_HS_CFG_ENH. When this happens, two minutes later I get notified that the rtcwake thread is blocked, like this: INFO: task rtcwake:3495 blocked for more than 120 seconds. To get the hung thread unblocked we wake up the cmd wait queue and cancel the ioctl. Cc: "3.4+" <stable@vger.kernel.org> Reported-by: Tim Shepard <shep@laptop.org> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
a485e827f0
commit
b1a47aa5e1
1 changed files with 8 additions and 3 deletions
|
@ -890,9 +890,6 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
|
|||
return;
|
||||
}
|
||||
cmd_node = adapter->curr_cmd;
|
||||
if (cmd_node->wait_q_enabled)
|
||||
adapter->cmd_wait_q.status = -ETIMEDOUT;
|
||||
|
||||
if (cmd_node) {
|
||||
adapter->dbg.timeout_cmd_id =
|
||||
adapter->dbg.last_cmd_id[adapter->dbg.last_cmd_index];
|
||||
|
@ -938,6 +935,14 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
|
|||
|
||||
dev_err(adapter->dev, "ps_mode=%d ps_state=%d\n",
|
||||
adapter->ps_mode, adapter->ps_state);
|
||||
|
||||
if (cmd_node->wait_q_enabled) {
|
||||
adapter->cmd_wait_q.status = -ETIMEDOUT;
|
||||
wake_up_interruptible(&adapter->cmd_wait_q.wait);
|
||||
mwifiex_cancel_pending_ioctl(adapter);
|
||||
/* reset cmd_sent flag to unblock new commands */
|
||||
adapter->cmd_sent = false;
|
||||
}
|
||||
}
|
||||
if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING)
|
||||
mwifiex_init_fw_complete(adapter);
|
||||
|
|
Loading…
Reference in a new issue