wil6210: introduce separate completion for WMI
re-use of wmi_ready for both FW ready event and for wmi_call was causing false "FW not ready" indication in case wmi_call() was invoked while reset took place. add wmi_call completion variable instead of re-using wmi_ready. Signed-off-by: Dedy Lansky <qca_dlansky@qca.qualcomm.com> Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
e0106adade
commit
595026472e
@ -286,6 +286,7 @@ int wil_priv_init(struct wil6210_priv *wil)
|
||||
mutex_init(&wil->wmi_mutex);
|
||||
|
||||
init_completion(&wil->wmi_ready);
|
||||
init_completion(&wil->wmi_call);
|
||||
|
||||
wil->pending_connect_cid = -1;
|
||||
setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil);
|
||||
@ -536,6 +537,7 @@ int wil_reset(struct wil6210_priv *wil)
|
||||
/* init after reset */
|
||||
wil->pending_connect_cid = -1;
|
||||
reinit_completion(&wil->wmi_ready);
|
||||
reinit_completion(&wil->wmi_call);
|
||||
|
||||
wil6210_enable_irq(wil);
|
||||
|
||||
|
@ -399,6 +399,7 @@ struct wil6210_priv {
|
||||
struct mutex wmi_mutex;
|
||||
struct wil6210_mbox_ctl mbox_ctl;
|
||||
struct completion wmi_ready;
|
||||
struct completion wmi_call;
|
||||
u16 wmi_seq;
|
||||
u16 reply_id; /**< wait for this WMI event */
|
||||
void *reply_buf;
|
||||
|
@ -300,7 +300,7 @@ static void wmi_evt_fw_ready(struct wil6210_priv *wil, int id, void *d,
|
||||
wil_dbg_wmi(wil, "WMI: got FW ready event\n");
|
||||
|
||||
set_bit(wil_status_fwready, &wil->status);
|
||||
/* reuse wmi_ready for the firmware ready indication */
|
||||
/* let the reset sequence continue */
|
||||
complete(&wil->wmi_ready);
|
||||
}
|
||||
|
||||
@ -764,8 +764,8 @@ int wmi_call(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len,
|
||||
wil->reply_id = reply_id;
|
||||
wil->reply_buf = reply;
|
||||
wil->reply_size = reply_size;
|
||||
remain = wait_for_completion_timeout(&wil->wmi_ready,
|
||||
msecs_to_jiffies(to_msec));
|
||||
remain = wait_for_completion_timeout(&wil->wmi_call,
|
||||
msecs_to_jiffies(to_msec));
|
||||
if (0 == remain) {
|
||||
wil_err(wil, "wmi_call(0x%04x->0x%04x) timeout %d msec\n",
|
||||
cmdid, reply_id, to_msec);
|
||||
@ -1160,7 +1160,7 @@ static void wmi_event_handle(struct wil6210_priv *wil,
|
||||
len - sizeof(*wmi));
|
||||
}
|
||||
wil_dbg_wmi(wil, "Complete WMI 0x%04x\n", id);
|
||||
complete(&wil->wmi_ready);
|
||||
complete(&wil->wmi_call);
|
||||
return;
|
||||
}
|
||||
/* unsolicited event */
|
||||
|
Loading…
Reference in New Issue
Block a user