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

Commit d282134e authored by Dedy Lansky's avatar Dedy Lansky Committed by Ian Maund
Browse files

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.

Change-Id: I2f896de72c2cee9e44f975b921c3ef503e5cf267
Signed-off-by: default avatarDedy Lansky <qca_dlansky@qca.qualcomm.com>
Signed-off-by: default avatarVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
Git-commit: 595026472eb74e4b57f5389af8b7c588659df243
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git


[hkadmany@codeaurora.org: trivial backport to kernel 3.10]
Signed-off-by: default avatarHamad Kadmany <hkadmany@codeaurora.org>
parent 77775b77
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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;
	INIT_COMPLETION(wil->wmi_ready);
	INIT_COMPLETION(wil->wmi_call);

	wil6210_enable_irq(wil);

+1 −0
Original line number Diff line number Diff line
@@ -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;
+4 −4
Original line number Diff line number Diff line
@@ -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,7 +764,7 @@ 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,
	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",
@@ -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 */