提交 0d36d71d 编写于 作者: S Sujith 提交者: John W. Linville

ath9k_htc: Fix WMI command race

My patch "ath9k_htc: Handle WMI timeouts properly" introduced
a race condition in WMI command processing. The last issued command
should be stored _before_ issuing a WMI command. Not doing this
would result in the WMI event IRQ dropping correct command responses
as invalid.

Fix this race by storing the command id correctly.
Signed-off-by: NSujith <Sujith.Manoharan@atheros.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 ba443701
...@@ -305,14 +305,14 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, ...@@ -305,14 +305,14 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
wmi->cmd_rsp_buf = rsp_buf; wmi->cmd_rsp_buf = rsp_buf;
wmi->cmd_rsp_len = rsp_len; wmi->cmd_rsp_len = rsp_len;
ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len);
if (ret)
goto out;
spin_lock_irqsave(&wmi->wmi_lock, flags); spin_lock_irqsave(&wmi->wmi_lock, flags);
wmi->last_cmd_id = cmd_id; wmi->last_cmd_id = cmd_id;
spin_unlock_irqrestore(&wmi->wmi_lock, flags); spin_unlock_irqrestore(&wmi->wmi_lock, flags);
ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len);
if (ret)
goto out;
time_left = wait_for_completion_timeout(&wmi->cmd_wait, timeout); time_left = wait_for_completion_timeout(&wmi->cmd_wait, timeout);
if (!time_left) { if (!time_left) {
ath_print(common, ATH_DBG_WMI, ath_print(common, ATH_DBG_WMI,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册