|
@@ -838,6 +838,7 @@ void wmi_recv_cmd(struct wil6210_priv *wil)
|
|
struct wil6210_mbox_hdr_wmi *wmi = &evt->event.wmi;
|
|
struct wil6210_mbox_hdr_wmi *wmi = &evt->event.wmi;
|
|
u16 id = le16_to_cpu(wmi->id);
|
|
u16 id = le16_to_cpu(wmi->id);
|
|
u32 tstamp = le32_to_cpu(wmi->timestamp);
|
|
u32 tstamp = le32_to_cpu(wmi->timestamp);
|
|
|
|
+ spin_lock_irqsave(&wil->wmi_ev_lock, flags);
|
|
if (wil->reply_id && wil->reply_id == id) {
|
|
if (wil->reply_id && wil->reply_id == id) {
|
|
if (wil->reply_buf) {
|
|
if (wil->reply_buf) {
|
|
memcpy(wil->reply_buf, wmi,
|
|
memcpy(wil->reply_buf, wmi,
|
|
@@ -845,6 +846,7 @@ void wmi_recv_cmd(struct wil6210_priv *wil)
|
|
immed_reply = true;
|
|
immed_reply = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ spin_unlock_irqrestore(&wil->wmi_ev_lock, flags);
|
|
|
|
|
|
wil_dbg_wmi(wil, "WMI event 0x%04x MID %d @%d msec\n",
|
|
wil_dbg_wmi(wil, "WMI event 0x%04x MID %d @%d msec\n",
|
|
id, wmi->mid, tstamp);
|
|
id, wmi->mid, tstamp);
|
|
@@ -888,13 +890,16 @@ int wmi_call(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len,
|
|
|
|
|
|
mutex_lock(&wil->wmi_mutex);
|
|
mutex_lock(&wil->wmi_mutex);
|
|
|
|
|
|
|
|
+ spin_lock(&wil->wmi_ev_lock);
|
|
|
|
+ wil->reply_id = reply_id;
|
|
|
|
+ wil->reply_buf = reply;
|
|
|
|
+ wil->reply_size = reply_size;
|
|
|
|
+ spin_unlock(&wil->wmi_ev_lock);
|
|
|
|
+
|
|
rc = __wmi_send(wil, cmdid, buf, len);
|
|
rc = __wmi_send(wil, cmdid, buf, len);
|
|
if (rc)
|
|
if (rc)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- wil->reply_id = reply_id;
|
|
|
|
- wil->reply_buf = reply;
|
|
|
|
- wil->reply_size = reply_size;
|
|
|
|
remain = wait_for_completion_timeout(&wil->wmi_call,
|
|
remain = wait_for_completion_timeout(&wil->wmi_call,
|
|
msecs_to_jiffies(to_msec));
|
|
msecs_to_jiffies(to_msec));
|
|
if (0 == remain) {
|
|
if (0 == remain) {
|
|
@@ -907,10 +912,14 @@ int wmi_call(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len,
|
|
cmdid, reply_id,
|
|
cmdid, reply_id,
|
|
to_msec - jiffies_to_msecs(remain));
|
|
to_msec - jiffies_to_msecs(remain));
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+out:
|
|
|
|
+ spin_lock(&wil->wmi_ev_lock);
|
|
wil->reply_id = 0;
|
|
wil->reply_id = 0;
|
|
wil->reply_buf = NULL;
|
|
wil->reply_buf = NULL;
|
|
wil->reply_size = 0;
|
|
wil->reply_size = 0;
|
|
- out:
|
|
|
|
|
|
+ spin_unlock(&wil->wmi_ev_lock);
|
|
|
|
+
|
|
mutex_unlock(&wil->wmi_mutex);
|
|
mutex_unlock(&wil->wmi_mutex);
|
|
|
|
|
|
return rc;
|
|
return rc;
|