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

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

wil6210: store bss object and use cfg80211_connect_bss()



In a fast disconnect/connect sequence, cfg80211_connect_result() can
fail to find the bss object which the driver is connecting to. Detailed
sequence of events:
* Driver is connected in STA mode
* Disconnect request arrives from user space. Driver disconnects and
  calls cfg80211_disconnected() which adds new event to the
  cfg80211_wq worker thread
* Connect request arrives from user space. cfg80211_connect() stores
  ssid/ssid_len and calls rdev_connect()
* __cfg80211_disconnected() runs in worker thread and zero
  wdev->ssid_len
* Connect succeeds. Driver calls cfg80211_connect_result() which fails
  to find the bss because wdev->ssid_len is zero

To overcome this, upon connect request, store the bss object in the
driver and upon connect completion pass it to kernel using
cfg80211_connect_bss().

Change-Id: I48b7f638e3c69bf2c223ecf65d080fb603fc26f8
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: bcdd49b074d0ea48f54bc6d24a66efab8688b43a
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git


Signed-off-by: default avatarMaya Erez <merez@codeaurora.org>
parent 6e64b0c7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -765,6 +765,7 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
	if (rc == 0) {
		netif_carrier_on(ndev);
		wil6210_bus_request(wil, WIL_MAX_BUS_REQUEST_KBPS);
		wil->bss = bss;
		/* Connect can take lots of time */
		mod_timer(&wil->connect_timer,
			  jiffies + msecs_to_jiffies(2000));
+1 −0
Original line number Diff line number Diff line
@@ -267,6 +267,7 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid,
			cfg80211_connect_result(ndev, bssid, NULL, 0, NULL, 0,
						WLAN_STATUS_UNSPECIFIED_FAILURE,
						GFP_KERNEL);
			wil->bss = NULL;
		}
		clear_bit(wil_status_fwconnecting, wil->status);
		break;
+1 −0
Original line number Diff line number Diff line
@@ -618,6 +618,7 @@ struct wil6210_priv {
	u16 channel; /* relevant in AP mode */
	int sinfo_gen;
	u32 ap_isolate; /* no intra-BSS communication */
	struct cfg80211_bss *bss; /* connected bss, relevant in STA mode */
	/* interrupt moderation */
	u32 tx_max_burst_duration;
	u32 tx_interframe_timeout;
+9 −5
Original line number Diff line number Diff line
@@ -574,12 +574,16 @@ static void wmi_evt_connect(struct wil6210_priv *wil, int id, void *d, int len)
						GFP_KERNEL);
			goto out;
		} else {
			cfg80211_connect_result(ndev, evt->bssid,
			struct wiphy *wiphy = wil_to_wiphy(wil);

			cfg80211_ref_bss(wiphy, wil->bss);
			cfg80211_connect_bss(ndev, evt->bssid, wil->bss,
					     assoc_req_ie, assoc_req_ielen,
					     assoc_resp_ie, assoc_resp_ielen,
						WLAN_STATUS_SUCCESS,
						GFP_KERNEL);
					     WLAN_STATUS_SUCCESS, GFP_KERNEL,
					     NL80211_TIMEOUT_UNSPECIFIED);
		}
		wil->bss = NULL;
	} else if ((wdev->iftype == NL80211_IFTYPE_AP) ||
		   (wdev->iftype == NL80211_IFTYPE_P2P_GO)) {
		if (rc) {