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

Commit efa8de6b authored by Dedy Lansky's avatar Dedy Lansky Committed by Maya Erez
Browse files

wil6210: use WMI_DISCONNECT_CMDID upon connect timeout



Upon connect timeout driver invokes _wil6210_disconnect() which iterates
over sta array and disconnects each connected sta. In practice, because
the connection is still ongoing and because cid is not yet allocated,
disconnect is not actually happening. This leaves FW in connecting
state while driver is in disconnected state.
To fix this, upon connect timeout, explicitly send WMI_DISCONNECT_CMDID
to FW to make sure it gets disconnected.

Change-Id: I4d6ed85f00901b0e286d8b05d016e9cd5e9dd2fb
Signed-off-by: default avatarDedy Lansky <qca_dlansky@qca.qualcomm.com>
Signed-off-by: default avatarMaya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
Git-commit: 628639b1c976a5f02792dc6595a4d199b7b70d85
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git


Signed-off-by: default avatarMaya Erez <merez@codeaurora.org>
parent fc489713
Loading
Loading
Loading
Loading
+27 −3
Original line number Original line Diff line number Diff line
@@ -303,10 +303,34 @@ static void wil_disconnect_worker(struct work_struct *work)
{
{
	struct wil6210_priv *wil = container_of(work,
	struct wil6210_priv *wil = container_of(work,
			struct wil6210_priv, disconnect_worker);
			struct wil6210_priv, disconnect_worker);
	struct net_device *ndev = wil_to_ndev(wil);
	int rc;
	struct {
		struct wmi_cmd_hdr wmi;
		struct wmi_disconnect_event evt;
	} __packed reply;


	mutex_lock(&wil->mutex);
	if (test_bit(wil_status_fwconnected, wil->status))
	_wil6210_disconnect(wil, NULL, WLAN_REASON_UNSPECIFIED, false);
		/* connect succeeded after all */
	mutex_unlock(&wil->mutex);
		return;

	if (!test_bit(wil_status_fwconnecting, wil->status))
		/* already disconnected */
		return;

	rc = wmi_call(wil, WMI_DISCONNECT_CMDID, NULL, 0,
		      WMI_DISCONNECT_EVENTID, &reply, sizeof(reply),
		      WIL6210_DISCONNECT_TO_MS);
	if (rc) {
		wil_err(wil, "disconnect error %d\n", rc);
		return;
	}

	wil_update_net_queues_bh(wil, NULL, true);
	netif_carrier_off(ndev);
	cfg80211_connect_result(ndev, NULL, NULL, 0, NULL, 0,
				WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL);
	clear_bit(wil_status_fwconnecting, wil->status);
}
}


static void wil_connect_timer_fn(ulong x)
static void wil_connect_timer_fn(ulong x)