linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/19] staging: wfx: simplify start/shutdown of RF
@ 2020-04-10 13:32 Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 01/19] staging: wfx: fix race between configure_filter and remove_interface Jerome Pouiller
                   ` (18 more replies)
  0 siblings, 19 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Hello,

This series mainly simplify the processes to join/leave/create networks.

Notice it intended to be applied on top of the Pull-Request named
"staging: wfx: clean up HIF API".


Jérôme Pouiller (19):
  staging: wfx: fix race between configure_filter and remove_interface
  staging: wfx: reduce hold duration of cfg80211_bss
  staging: wfx: call wfx_do_unjoin() synchronously
  staging: wfx: implement start_ap/stop_ap
  staging: wfx: set all parameters before starting AP
  staging: wfx: change the way the station associate to an AP
  staging: wfx: remove useless call to wfx_tx_flush()
  staging: wfx: fix support for BSS_CHANGED_KEEP_ALIVE
  staging: wfx: disabling keep alive during unjoin is useless
  staging: wfx: drop unnecessary condition checks in
    wfx_upload_ap_templates()
  staging: wfx: request to send beacons in IBSS mode
  staging: wfx: remove unnecessary conditions in wfx_bss_info_changed()
  staging: wfx: avoid duplicate updating of beacon template
  staging: wfx: allow to join IBSS networks
  staging: wfx: introduce wfx_join_ibss() and wfx_leave_ibss()
  staging: wfx: re-enable BA after reset
  staging: wfx: check value of beacon_int
  staging: wfx: drop unused attribute 'beacon_int'
  staging: wfx: drop useless update of macaddr

 drivers/staging/wfx/hif_tx.c |   2 +
 drivers/staging/wfx/main.c   |   4 +
 drivers/staging/wfx/scan.c   |   4 +-
 drivers/staging/wfx/sta.c    | 241 ++++++++++++-----------------------
 drivers/staging/wfx/sta.h    |   4 +
 drivers/staging/wfx/wfx.h    |   2 -
 6 files changed, 92 insertions(+), 165 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 01/19] staging: wfx: fix race between configure_filter and remove_interface
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 02/19] staging: wfx: reduce hold duration of cfg80211_bss Jerome Pouiller
                   ` (17 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

wfx_remove_interface() and wfx_configure_filter() can be run
concurrently. Therefore, this patch protect access to the list of
interfaces from wfx_configure_filter().

Notice that wfx_configure_filter() now lock "conf_lock" and "scan_lock".
Beside that, wfx_hw_scan_work() also access to the same locks. So we
have to lock them in same order to avoid any deadlock.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/scan.c | 4 ++--
 drivers/staging/wfx/sta.c  | 2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/wfx/scan.c b/drivers/staging/wfx/scan.c
index 6e1e50048651..0c7f4eef045c 100644
--- a/drivers/staging/wfx/scan.c
+++ b/drivers/staging/wfx/scan.c
@@ -86,8 +86,8 @@ void wfx_hw_scan_work(struct work_struct *work)
 	struct ieee80211_scan_request *hw_req = wvif->scan_req;
 	int chan_cur, ret;
 
-	mutex_lock(&wvif->scan_lock);
 	mutex_lock(&wvif->wdev->conf_mutex);
+	mutex_lock(&wvif->scan_lock);
 	update_probe_tmpl(wvif, &hw_req->req);
 	wfx_fwd_probe_req(wvif, true);
 	chan_cur = 0;
@@ -96,8 +96,8 @@ void wfx_hw_scan_work(struct work_struct *work)
 		if (ret > 0)
 			chan_cur += ret;
 	} while (ret > 0 && chan_cur < hw_req->req.n_channels);
-	mutex_unlock(&wvif->wdev->conf_mutex);
 	mutex_unlock(&wvif->scan_lock);
+	mutex_unlock(&wvif->wdev->conf_mutex);
 	__ieee80211_scan_completed_compat(wvif->wdev->hw, ret < 0);
 }
 
diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 4d5dbfc24f52..380e5319472a 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -242,6 +242,7 @@ void wfx_configure_filter(struct ieee80211_hw *hw,
 
 	*total_flags &= FIF_OTHER_BSS | FIF_FCSFAIL | FIF_PROBE_REQ;
 
+	mutex_lock(&wdev->conf_mutex);
 	while ((wvif = wvif_iterate(wdev, wvif)) != NULL) {
 		mutex_lock(&wvif->scan_lock);
 		wvif->filter_bssid = (*total_flags &
@@ -251,6 +252,7 @@ void wfx_configure_filter(struct ieee80211_hw *hw,
 		wfx_update_filtering(wvif);
 		mutex_unlock(&wvif->scan_lock);
 	}
+	mutex_unlock(&wdev->conf_mutex);
 }
 
 static int wfx_update_pm(struct wfx_vif *wvif)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 02/19] staging: wfx: reduce hold duration of cfg80211_bss
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 01/19] staging: wfx: fix race between configure_filter and remove_interface Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 03/19] staging: wfx: call wfx_do_unjoin() synchronously Jerome Pouiller
                   ` (16 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Pointer to cfg80211_bss is held during all duration of wfx_do_join. But,
it is not necessary, We can release it far earlier.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 380e5319472a..c65d464a7a9b 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -509,6 +509,7 @@ static void wfx_do_join(struct wfx_vif *wvif)
 		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
 
 	wfx_set_mfp(wvif, bss);
+	cfg80211_put_bss(wvif->wdev->hw->wiphy, bss);
 
 	ret = hif_join(wvif, conf, wvif->channel, ssid, ssidlen);
 	if (ret) {
@@ -538,8 +539,6 @@ static void wfx_do_join(struct wfx_vif *wvif)
 	wfx_update_filtering(wvif);
 
 	mutex_unlock(&wvif->wdev->conf_mutex);
-	if (bss)
-		cfg80211_put_bss(wvif->wdev->hw->wiphy, bss);
 }
 
 static void wfx_unjoin_work(struct work_struct *work)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 03/19] staging: wfx: call wfx_do_unjoin() synchronously
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 01/19] staging: wfx: fix race between configure_filter and remove_interface Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 02/19] staging: wfx: reduce hold duration of cfg80211_bss Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 04/19] staging: wfx: implement start_ap/stop_ap Jerome Pouiller
                   ` (15 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Currently, wfx_do_unjoin() are called by the mean of work queues.
However, the contexts from where they are called are not atomic. So
there is no reason to not call it synchronously.

This change will simplify the code. Notice two main changes:
   - There no more reason to lock tx queue before to run
     wfx_do_unjoin(). We can lock the tx queue directly from
     wfx_do_unjoin().
   - Most of the time, wfx_do_unjoin_work() was called with conf_mutex
     held. This patch remove lock of conf_mutex in wfx_do_unjoin_work()
     and ensure that conf_mutex is always held whatever the context.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 48 ++++++++++-----------------------------
 drivers/staging/wfx/wfx.h |  1 -
 2 files changed, 12 insertions(+), 37 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index c65d464a7a9b..36e55e32da2b 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -354,14 +354,12 @@ static void wfx_event_handler_work(struct work_struct *work)
 	list_for_each_entry(event, &list, link) {
 		switch (event->evt.event_id) {
 		case HIF_EVENT_IND_BSSLOST:
-			cancel_work_sync(&wvif->unjoin_work);
 			mutex_lock(&wvif->scan_lock);
 			wfx_cqm_bssloss_sm(wvif, 1, 0, 0);
 			mutex_unlock(&wvif->scan_lock);
 			break;
 		case HIF_EVENT_IND_BSSREGAINED:
 			wfx_cqm_bssloss_sm(wvif, 0, 0, 0);
-			cancel_work_sync(&wvif->unjoin_work);
 			break;
 		case HIF_EVENT_IND_RCPI_RSSI:
 			wfx_event_report_rssi(wvif,
@@ -401,21 +399,20 @@ static void wfx_bss_params_work(struct work_struct *work)
 	mutex_unlock(&wvif->wdev->conf_mutex);
 }
 
+// Call it with wdev->conf_mutex locked
 static void wfx_do_unjoin(struct wfx_vif *wvif)
 {
-	mutex_lock(&wvif->wdev->conf_mutex);
-
 	if (!wvif->state)
-		goto done;
+		return;
 
 	if (wvif->state == WFX_STATE_AP)
-		goto done;
+		return;
 
 	cancel_work_sync(&wvif->update_filtering_work);
 	wvif->state = WFX_STATE_PASSIVE;
 
 	/* Unjoin is a reset. */
-	wfx_tx_flush(wvif->wdev);
+	wfx_tx_lock_flush(wvif->wdev);
 	hif_keep_alive_period(wvif, 0);
 	hif_reset(wvif, false);
 	wfx_tx_policy_init(wvif);
@@ -430,9 +427,7 @@ static void wfx_do_unjoin(struct wfx_vif *wvif)
 	wvif->disable_beacon_filter = false;
 	wfx_update_filtering(wvif);
 	memset(&wvif->bss_params, 0, sizeof(wvif->bss_params));
-
-done:
-	mutex_unlock(&wvif->wdev->conf_mutex);
+	wfx_tx_unlock(wvif->wdev);
 }
 
 static void wfx_set_mfp(struct wfx_vif *wvif,
@@ -476,6 +471,7 @@ static void wfx_do_join(struct wfx_vif *wvif)
 	int ssidlen = 0;
 
 	wfx_tx_lock_flush(wvif->wdev);
+	mutex_lock(&wvif->wdev->conf_mutex);
 
 	if (wvif->state)
 		wfx_do_unjoin(wvif);
@@ -484,12 +480,11 @@ static void wfx_do_join(struct wfx_vif *wvif)
 			       conf->bssid, NULL, 0,
 			       IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
 	if (!bss && !conf->ibss_joined) {
+		mutex_unlock(&wvif->wdev->conf_mutex);
 		wfx_tx_unlock(wvif->wdev);
 		return;
 	}
 
-	mutex_lock(&wvif->wdev->conf_mutex);
-
 	/* Sanity check beacon interval */
 	if (!wvif->beacon_int)
 		wvif->beacon_int = 1;
@@ -515,16 +510,13 @@ static void wfx_do_join(struct wfx_vif *wvif)
 	if (ret) {
 		ieee80211_connection_loss(wvif->vif);
 		wvif->join_complete_status = -1;
-		/* Tx lock still held, unjoin will clear it. */
-		if (!schedule_work(&wvif->unjoin_work))
-			wfx_tx_unlock(wvif->wdev);
+		wfx_do_unjoin(wvif);
 	} else {
 		wvif->join_complete_status = 0;
 		if (wvif->vif->type == NL80211_IFTYPE_ADHOC)
 			wvif->state = WFX_STATE_IBSS;
 		else
 			wvif->state = WFX_STATE_PRE_STA;
-		wfx_tx_unlock(wvif->wdev);
 
 		/* Upload keys */
 		wfx_upload_keys(wvif);
@@ -535,18 +527,10 @@ static void wfx_do_join(struct wfx_vif *wvif)
 		 * receives at least one
 		 */
 		wvif->disable_beacon_filter = true;
+		wfx_update_filtering(wvif);
 	}
-	wfx_update_filtering(wvif);
-
-	mutex_unlock(&wvif->wdev->conf_mutex);
-}
-
-static void wfx_unjoin_work(struct work_struct *work)
-{
-	struct wfx_vif *wvif = container_of(work, struct wfx_vif, unjoin_work);
-
-	wfx_do_unjoin(wvif);
 	wfx_tx_unlock(wvif->wdev);
+	mutex_unlock(&wvif->wdev->conf_mutex);
 }
 
 int wfx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
@@ -672,7 +656,6 @@ static void wfx_join_finalize(struct wfx_vif *wvif,
 		hif_dual_cts_protection(wvif, false);
 
 	wfx_cqm_bssloss_sm(wvif, 0, 0, 0);
-	cancel_work_sync(&wvif->unjoin_work);
 
 	wvif->bss_params.beacon_lost_count = 20;
 	wvif->bss_params.aid = info->aid;
@@ -754,10 +737,7 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 
 	if (changed & BSS_CHANGED_ASSOC && !info->assoc &&
 	    (wvif->state == WFX_STATE_STA || wvif->state == WFX_STATE_IBSS)) {
-		/* Shedule unjoin work */
-		wfx_tx_lock(wdev);
-		if (!schedule_work(&wvif->unjoin_work))
-			wfx_tx_unlock(wdev);
+		wfx_do_unjoin(wvif);
 	} else {
 		if (changed & BSS_CHANGED_BEACON_INT) {
 			if (info->ibss_joined)
@@ -999,7 +979,6 @@ int wfx_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 	complete(&wvif->set_pm_mode_complete);
 	INIT_WORK(&wvif->update_filtering_work, wfx_update_filtering_work);
 	INIT_WORK(&wvif->bss_params_work, wfx_bss_params_work);
-	INIT_WORK(&wvif->unjoin_work, wfx_unjoin_work);
 	INIT_WORK(&wvif->tx_policy_upload_work, wfx_tx_policy_upload_work);
 
 	mutex_init(&wvif->scan_lock);
@@ -1039,9 +1018,7 @@ void wfx_remove_interface(struct ieee80211_hw *hw,
 	case WFX_STATE_PRE_STA:
 	case WFX_STATE_STA:
 	case WFX_STATE_IBSS:
-		wfx_tx_lock_flush(wdev);
-		if (!schedule_work(&wvif->unjoin_work))
-			wfx_tx_unlock(wdev);
+		wfx_do_unjoin(wvif);
 		break;
 	case WFX_STATE_AP:
 		/* reset.link_id = 0; */
@@ -1057,7 +1034,6 @@ void wfx_remove_interface(struct ieee80211_hw *hw,
 	hif_set_macaddr(wvif, NULL);
 
 	wfx_cqm_bssloss_sm(wvif, 0, 0, 0);
-	cancel_work_sync(&wvif->unjoin_work);
 	wfx_free_event_queue(wvif);
 
 	wdev->vif[wvif->id] = NULL;
diff --git a/drivers/staging/wfx/wfx.h b/drivers/staging/wfx/wfx.h
index af4c93af81be..619e6f5c1345 100644
--- a/drivers/staging/wfx/wfx.h
+++ b/drivers/staging/wfx/wfx.h
@@ -99,7 +99,6 @@ struct wfx_vif {
 	struct work_struct	bss_params_work;
 
 	int			join_complete_status;
-	struct work_struct	unjoin_work;
 
 	/* avoid some operations in parallel with scan */
 	struct mutex		scan_lock;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 04/19] staging: wfx: implement start_ap/stop_ap
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (2 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 03/19] staging: wfx: call wfx_do_unjoin() synchronously Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 05/19] staging: wfx: set all parameters before starting AP Jerome Pouiller
                   ` (14 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Currently, wfx_bss_info_changed() check interface status changes and
guess when the pattern match with an AP start and AP stop (through
wfx_update_beaconing()). It is far easier to rely on start_ap and
stop_ap callbacks provided by mac80211.

wfx_bss_info_changed() keeps only the responsibility of updating the
frame templates.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/main.c |  2 ++
 drivers/staging/wfx/sta.c  | 71 ++++++++++++++------------------------
 drivers/staging/wfx/sta.h  |  2 ++
 3 files changed, 30 insertions(+), 45 deletions(-)

diff --git a/drivers/staging/wfx/main.c b/drivers/staging/wfx/main.c
index 1e9f6da75024..b459fac928fd 100644
--- a/drivers/staging/wfx/main.c
+++ b/drivers/staging/wfx/main.c
@@ -136,6 +136,8 @@ static const struct ieee80211_ops wfx_ops = {
 	.conf_tx		= wfx_conf_tx,
 	.hw_scan		= wfx_hw_scan,
 	.cancel_hw_scan		= wfx_cancel_hw_scan,
+	.start_ap		= wfx_start_ap,
+	.stop_ap		= wfx_stop_ap,
 	.sta_add		= wfx_sta_add,
 	.sta_remove		= wfx_sta_remove,
 	.set_tim		= wfx_set_tim,
diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 36e55e32da2b..92bf317b57bb 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -575,40 +575,6 @@ int wfx_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 	return 0;
 }
 
-static int wfx_start_ap(struct wfx_vif *wvif)
-{
-	int ret;
-
-	wvif->beacon_int = wvif->vif->bss_conf.beacon_int;
-	ret = hif_start(wvif, &wvif->vif->bss_conf, wvif->channel);
-	if (ret)
-		return ret;
-	ret = wfx_upload_keys(wvif);
-	if (ret)
-		return ret;
-	if (wvif_count(wvif->wdev) <= 1)
-		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
-	wvif->state = WFX_STATE_AP;
-	wfx_update_filtering(wvif);
-	return 0;
-}
-
-static int wfx_update_beaconing(struct wfx_vif *wvif)
-{
-	if (wvif->vif->type != NL80211_IFTYPE_AP)
-		return 0;
-	if (wvif->state == WFX_STATE_AP &&
-	    wvif->beacon_int == wvif->vif->bss_conf.beacon_int)
-		return 0;
-	wfx_tx_lock_flush(wvif->wdev);
-	hif_reset(wvif, false);
-	wfx_tx_policy_init(wvif);
-	wvif->state = WFX_STATE_PASSIVE;
-	wfx_start_ap(wvif);
-	wfx_tx_unlock(wvif->wdev);
-	return 0;
-}
-
 static int wfx_upload_ap_templates(struct wfx_vif *wvif)
 {
 	struct sk_buff *skb;
@@ -634,6 +600,30 @@ static int wfx_upload_ap_templates(struct wfx_vif *wvif)
 	return 0;
 }
 
+int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+{
+	struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
+
+	hif_start(wvif, &vif->bss_conf, wvif->channel);
+	wfx_upload_keys(wvif);
+	if (wvif_count(wvif->wdev) <= 1)
+		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
+	wvif->state = WFX_STATE_AP;
+	wfx_update_filtering(wvif);
+	wfx_upload_ap_templates(wvif);
+	wfx_fwd_probe_req(wvif, false);
+	return 0;
+}
+
+void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+{
+	struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
+
+	hif_reset(wvif, false);
+	wfx_tx_policy_init(wvif);
+	wvif->state = WFX_STATE_PASSIVE;
+}
+
 static void wfx_join_finalize(struct wfx_vif *wvif,
 			      struct ieee80211_bss_conf *info)
 {
@@ -709,16 +699,9 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 		}
 	}
 
-	if (changed & BSS_CHANGED_BEACON ||
-	    changed & BSS_CHANGED_AP_PROBE_RESP ||
-	    changed & BSS_CHANGED_BSSID ||
-	    changed & BSS_CHANGED_SSID ||
-	    changed & BSS_CHANGED_IBSS) {
-		wvif->beacon_int = info->beacon_int;
-		wfx_update_beaconing(wvif);
+	if (changed & BSS_CHANGED_AP_PROBE_RESP ||
+	    changed & BSS_CHANGED_BEACON)
 		wfx_upload_ap_templates(wvif);
-		wfx_fwd_probe_req(wvif, false);
-	}
 
 	if (changed & BSS_CHANGED_BEACON_ENABLED &&
 	    wvif->state != WFX_STATE_IBSS)
@@ -742,8 +725,6 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 		if (changed & BSS_CHANGED_BEACON_INT) {
 			if (info->ibss_joined)
 				do_join = true;
-			else if (wvif->state == WFX_STATE_AP)
-				wfx_update_beaconing(wvif);
 		}
 
 		if (changed & BSS_CHANGED_BSSID)
diff --git a/drivers/staging/wfx/sta.h b/drivers/staging/wfx/sta.h
index a0c5153e5272..6a4b91a47f5b 100644
--- a/drivers/staging/wfx/sta.h
+++ b/drivers/staging/wfx/sta.h
@@ -54,6 +54,8 @@ void wfx_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
 
 int wfx_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 void wfx_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
+int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
+void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 int wfx_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 		u16 queue, const struct ieee80211_tx_queue_params *params);
 void wfx_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 05/19] staging: wfx: set all parameters before starting AP
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (3 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 04/19] staging: wfx: implement start_ap/stop_ap Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 06/19] staging: wfx: change the way the station associate to an AP Jerome Pouiller
                   ` (13 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Current code start AP and then configure the different parameters. Since
all the configuration is sent quickly after AP started, it works.
However, it is not very nice. In add, last firmware releases start to
disallow incorrect settings.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 92bf317b57bb..1e7ff2ba33d8 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -604,7 +604,6 @@ int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 {
 	struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
 
-	hif_start(wvif, &vif->bss_conf, wvif->channel);
 	wfx_upload_keys(wvif);
 	if (wvif_count(wvif->wdev) <= 1)
 		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
@@ -612,6 +611,7 @@ int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 	wfx_update_filtering(wvif);
 	wfx_upload_ap_templates(wvif);
 	wfx_fwd_probe_req(wvif, false);
+	hif_start(wvif, &vif->bss_conf, wvif->channel);
 	return 0;
 }
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 06/19] staging: wfx: change the way the station associate to an AP
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (4 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 05/19] staging: wfx: set all parameters before starting AP Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 07/19] staging: wfx: remove useless call to wfx_tx_flush() Jerome Pouiller
                   ` (12 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Chipset need two steps to associate with an AP:
   1. it start receiving beacon from the AP (done with wfx_do_join())
   2. it sent the association request (done with wfx_join_finalize())

The join request (see hif_join()) contains basic rates, beacon interval
and bssid to connect, so we trig on these events for the first step.

The second step is obviously associated to the event BSS_CHANGED_ASSOC.

Note that conf_mutex is now easier to manage. It is held by
wfx_bss_info_changed() and inner functions does not need to lock it.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 62 +++++++++++----------------------------
 1 file changed, 17 insertions(+), 45 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 1e7ff2ba33d8..acbbc3a44733 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -471,16 +471,11 @@ static void wfx_do_join(struct wfx_vif *wvif)
 	int ssidlen = 0;
 
 	wfx_tx_lock_flush(wvif->wdev);
-	mutex_lock(&wvif->wdev->conf_mutex);
-
-	if (wvif->state)
-		wfx_do_unjoin(wvif);
 
 	bss = cfg80211_get_bss(wvif->wdev->hw->wiphy, wvif->channel,
 			       conf->bssid, NULL, 0,
 			       IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
 	if (!bss && !conf->ibss_joined) {
-		mutex_unlock(&wvif->wdev->conf_mutex);
 		wfx_tx_unlock(wvif->wdev);
 		return;
 	}
@@ -530,7 +525,6 @@ static void wfx_do_join(struct wfx_vif *wvif)
 		wfx_update_filtering(wvif);
 	}
 	wfx_tx_unlock(wvif->wdev);
-	mutex_unlock(&wvif->wdev->conf_mutex);
 }
 
 int wfx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
@@ -653,6 +647,7 @@ static void wfx_join_finalize(struct wfx_vif *wvif,
 	hif_set_association_mode(wvif, info);
 
 	if (!info->ibss_joined) {
+		wvif->state = WFX_STATE_STA;
 		hif_keep_alive_period(wvif, 30 /* sec */);
 		hif_set_bss_params(wvif, &wvif->bss_params);
 		hif_set_beacon_wakeup_period(wvif, info->dtim_period,
@@ -681,7 +676,6 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 {
 	struct wfx_dev *wdev = hw->priv;
 	struct wfx_vif *wvif = (struct wfx_vif *) vif->drv_priv;
-	bool do_join = false;
 	int i;
 
 	mutex_lock(&wdev->conf_mutex);
@@ -699,6 +693,14 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 		}
 	}
 
+	if (changed & BSS_CHANGED_BASIC_RATES ||
+	    changed & BSS_CHANGED_BEACON_INT ||
+	    changed & BSS_CHANGED_BSSID) {
+		if (vif->type == NL80211_IFTYPE_STATION ||
+		    vif->type == NL80211_IFTYPE_ADHOC)
+			wfx_do_join(wvif);
+	}
+
 	if (changed & BSS_CHANGED_AP_PROBE_RESP ||
 	    changed & BSS_CHANGED_BEACON)
 		wfx_upload_ap_templates(wvif);
@@ -718,41 +720,14 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 		wfx_tx_unlock(wdev);
 	}
 
-	if (changed & BSS_CHANGED_ASSOC && !info->assoc &&
-	    (wvif->state == WFX_STATE_STA || wvif->state == WFX_STATE_IBSS)) {
-		wfx_do_unjoin(wvif);
-	} else {
-		if (changed & BSS_CHANGED_BEACON_INT) {
-			if (info->ibss_joined)
-				do_join = true;
-		}
-
-		if (changed & BSS_CHANGED_BSSID)
-			do_join = true;
-
-		if (changed & BSS_CHANGED_ASSOC ||
-		    changed & BSS_CHANGED_BSSID ||
-		    changed & BSS_CHANGED_IBSS ||
-		    changed & BSS_CHANGED_BASIC_RATES ||
-		    changed & BSS_CHANGED_HT) {
-			if (info->assoc) {
-				if (wvif->state < WFX_STATE_PRE_STA) {
-					ieee80211_connection_loss(vif);
-					mutex_unlock(&wdev->conf_mutex);
-					return;
-				} else if (wvif->state == WFX_STATE_PRE_STA) {
-					wvif->state = WFX_STATE_STA;
-				}
-			} else {
-				do_join = true;
-			}
-
-			if (info->assoc || info->ibss_joined)
-				wfx_join_finalize(wvif, info);
-			else
-				memset(&wvif->bss_params, 0,
-				       sizeof(wvif->bss_params));
-		}
+	if (changed & BSS_CHANGED_ASSOC) {
+		if (info->assoc || info->ibss_joined)
+			wfx_join_finalize(wvif, info);
+		else if (!info->assoc && vif->type == NL80211_IFTYPE_STATION)
+			wfx_do_unjoin(wvif);
+		else
+			dev_warn(wdev->dev, "%s: misunderstood change: ASSOC\n",
+				 __func__);
 	}
 
 	if (changed & BSS_CHANGED_ASSOC ||
@@ -783,9 +758,6 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 		wfx_update_pm(wvif);
 
 	mutex_unlock(&wdev->conf_mutex);
-
-	if (do_join)
-		wfx_do_join(wvif);
 }
 
 static int wfx_update_tim(struct wfx_vif *wvif)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 07/19] staging: wfx: remove useless call to wfx_tx_flush()
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (5 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 06/19] staging: wfx: change the way the station associate to an AP Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 08/19] staging: wfx: fix support for BSS_CHANGED_KEEP_ALIVE Jerome Pouiller
                   ` (11 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

wfx_do_join() calls wfx_tx_lock_flush() ate beginning of the function.
Therefore, the subsequent call to wfx_tx_flush() is useless.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index acbbc3a44733..7693ce22f300 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -493,8 +493,6 @@ static void wfx_do_join(struct wfx_vif *wvif)
 	}
 	rcu_read_unlock();
 
-	wfx_tx_flush(wvif->wdev);
-
 	if (wvif_count(wvif->wdev) <= 1)
 		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 08/19] staging: wfx: fix support for BSS_CHANGED_KEEP_ALIVE
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (6 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 07/19] staging: wfx: remove useless call to wfx_tx_flush() Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 09/19] staging: wfx: disabling keep alive during unjoin is useless Jerome Pouiller
                   ` (10 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Chip firmware is able to send periodic null frames to keep the
association with the AP.

The driver arbitrary set this period to 30sec. We prefer to rely on
BSS_CHANGED_KEEP_ALIVE that provide a true value.

Note that if BSS_CHANGED_KEEP_ALIVE is not received, we just disable
keep_alive feature. It is not very disturbing since AP will probably
ping the station before to disconnect it.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 7693ce22f300..67e16c435848 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -646,7 +646,7 @@ static void wfx_join_finalize(struct wfx_vif *wvif,
 
 	if (!info->ibss_joined) {
 		wvif->state = WFX_STATE_STA;
-		hif_keep_alive_period(wvif, 30 /* sec */);
+		hif_keep_alive_period(wvif, 0);
 		hif_set_bss_params(wvif, &wvif->bss_params);
 		hif_set_beacon_wakeup_period(wvif, info->dtim_period,
 					     info->dtim_period);
@@ -728,6 +728,10 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 				 __func__);
 	}
 
+	if (changed & BSS_CHANGED_KEEP_ALIVE)
+		hif_keep_alive_period(wvif, info->max_idle_period *
+					    USEC_PER_TU / USEC_PER_MSEC);
+
 	if (changed & BSS_CHANGED_ASSOC ||
 	    changed & BSS_CHANGED_ERP_CTS_PROT ||
 	    changed & BSS_CHANGED_ERP_PREAMBLE) {
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 09/19] staging: wfx: disabling keep alive during unjoin is useless
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (7 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 08/19] staging: wfx: fix support for BSS_CHANGED_KEEP_ALIVE Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 10/19] staging: wfx: drop unnecessary condition checks in wfx_upload_ap_templates() Jerome Pouiller
                   ` (9 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

After a call to hif_reset(), the parameters associated with BSS are
reset. So, it useless to explicitly reset the keep alive period.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 67e16c435848..b0557dab91fd 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -413,7 +413,6 @@ static void wfx_do_unjoin(struct wfx_vif *wvif)
 
 	/* Unjoin is a reset. */
 	wfx_tx_lock_flush(wvif->wdev);
-	hif_keep_alive_period(wvif, 0);
 	hif_reset(wvif, false);
 	wfx_tx_policy_init(wvif);
 	hif_set_macaddr(wvif, wvif->vif->addr);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 10/19] staging: wfx: drop unnecessary condition checks in wfx_upload_ap_templates()
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (8 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 09/19] staging: wfx: disabling keep alive during unjoin is useless Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 11/19] staging: wfx: request to send beacons in IBSS mode Jerome Pouiller
                   ` (8 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

In former code, wfx_upload_ap_templates() was called in more cases
than necessary. Therefore, it tried to not update the frame templates
if it was not necessary.

Now, wfx_upload_ap_templates() is called only if mac80211 asked to
update the templates. In add, it does not hurt to upload template if
they are not used. So, remove unnecessary conditions at beginning of
wfx_upload_ap_templates()

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index b0557dab91fd..7af7bfa4ac99 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -570,11 +570,6 @@ static int wfx_upload_ap_templates(struct wfx_vif *wvif)
 {
 	struct sk_buff *skb;
 
-	if (wvif->vif->type == NL80211_IFTYPE_STATION ||
-	    wvif->vif->type == NL80211_IFTYPE_MONITOR ||
-	    wvif->vif->type == NL80211_IFTYPE_UNSPECIFIED)
-		return 0;
-
 	skb = ieee80211_beacon_get(wvif->wdev->hw, wvif->vif);
 	if (!skb)
 		return -ENOMEM;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 11/19] staging: wfx: request to send beacons in IBSS mode
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (9 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 10/19] staging: wfx: drop unnecessary condition checks in wfx_upload_ap_templates() Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 12/19] staging: wfx: remove unnecessary conditions in wfx_bss_info_changed() Jerome Pouiller
                   ` (7 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Currently, firmware take in charge of start/stop sending beacons while
in IBSS mode. However, this behavior may change in the further releases.

Currently, asking to firmware to send beacon while in IBSS mode return
an error but is harmless.

Therefore, send this request unconditionally.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 7af7bfa4ac99..3512e59f0968 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -697,8 +697,7 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 	    changed & BSS_CHANGED_BEACON)
 		wfx_upload_ap_templates(wvif);
 
-	if (changed & BSS_CHANGED_BEACON_ENABLED &&
-	    wvif->state != WFX_STATE_IBSS)
+	if (changed & BSS_CHANGED_BEACON_ENABLED)
 		wfx_enable_beacon(wvif, info->enable_beacon);
 
 	if (changed & BSS_CHANGED_BEACON_INFO)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 12/19] staging: wfx: remove unnecessary conditions in wfx_bss_info_changed()
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (10 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 11/19] staging: wfx: request to send beacons in IBSS mode Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 13/19] staging: wfx: avoid duplicate updating of beacon template Jerome Pouiller
                   ` (6 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

wfx_bss_info_changed() update ERP and CQM related stuff. Thus, it check
the flags BSS_CHANGED_ERP_* and BSS_CHANGED_CQM.

It also update ERP and CQM on join and leave by checking the flag
BSS_CHANGED_ASSOC. This check is useless. Mac80211 already do that job
and set necessary flags as expected.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 3512e59f0968..11d62de531e7 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -725,8 +725,7 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 		hif_keep_alive_period(wvif, info->max_idle_period *
 					    USEC_PER_TU / USEC_PER_MSEC);
 
-	if (changed & BSS_CHANGED_ASSOC ||
-	    changed & BSS_CHANGED_ERP_CTS_PROT ||
+	if (changed & BSS_CHANGED_ERP_CTS_PROT ||
 	    changed & BSS_CHANGED_ERP_PREAMBLE) {
 		u8 erp_ie[3] = { WLAN_EID_ERP_INFO, 1, 0 };
 
@@ -739,10 +738,10 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 			hif_update_ie_beacon(wvif, erp_ie, sizeof(erp_ie));
 	}
 
-	if (changed & BSS_CHANGED_ASSOC || changed & BSS_CHANGED_ERP_SLOT)
+	if (changed & BSS_CHANGED_ERP_SLOT)
 		hif_slot_time(wvif, info->use_short_slot ? 9 : 20);
 
-	if (changed & BSS_CHANGED_ASSOC || changed & BSS_CHANGED_CQM)
+	if (changed & BSS_CHANGED_CQM)
 		hif_set_rcpi_rssi_threshold(wvif, info->cqm_rssi_thold,
 					    info->cqm_rssi_hyst);
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 13/19] staging: wfx: avoid duplicate updating of beacon template
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (11 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 12/19] staging: wfx: remove unnecessary conditions in wfx_bss_info_changed() Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 14/19] staging: wfx: allow to join IBSS networks Jerome Pouiller
                   ` (5 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

When ERP changes, mac80211 call wfx_bss_info_changed() with
BSS_CHANGED_ERP_* and with BSS_CHANGED_BEACON.

The driver already update beacon template because of
BSS_CHANGED_BEACON. It is not necessary to also update beacon template
because of BSS_CHANGED_ERP_*.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 11d62de531e7..75f1c515751b 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -725,18 +725,8 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 		hif_keep_alive_period(wvif, info->max_idle_period *
 					    USEC_PER_TU / USEC_PER_MSEC);
 
-	if (changed & BSS_CHANGED_ERP_CTS_PROT ||
-	    changed & BSS_CHANGED_ERP_PREAMBLE) {
-		u8 erp_ie[3] = { WLAN_EID_ERP_INFO, 1, 0 };
-
+	if (changed & BSS_CHANGED_ERP_CTS_PROT)
 		hif_erp_use_protection(wvif, info->use_cts_prot);
-		if (info->use_cts_prot)
-			erp_ie[2] |= WLAN_ERP_USE_PROTECTION;
-		if (info->use_short_preamble)
-			erp_ie[2] |= WLAN_ERP_BARKER_PREAMBLE;
-		if (wvif->vif->type != NL80211_IFTYPE_STATION)
-			hif_update_ie_beacon(wvif, erp_ie, sizeof(erp_ie));
-	}
 
 	if (changed & BSS_CHANGED_ERP_SLOT)
 		hif_slot_time(wvif, info->use_short_slot ? 9 : 20);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 14/19] staging: wfx: allow to join IBSS networks
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (12 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 13/19] staging: wfx: avoid duplicate updating of beacon template Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 15/19] staging: wfx: introduce wfx_join_ibss() and wfx_leave_ibss() Jerome Pouiller
                   ` (4 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Current code does not permit to join an already existing IBSS network.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 75f1c515751b..8aa373f5deae 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -484,7 +484,7 @@ static void wfx_do_join(struct wfx_vif *wvif)
 		wvif->beacon_int = 1;
 
 	rcu_read_lock(); // protect ssidie
-	if (!conf->ibss_joined)
+	if (bss)
 		ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
 	if (ssidie) {
 		ssidlen = ssidie[1];
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 15/19] staging: wfx: introduce wfx_join_ibss() and wfx_leave_ibss()
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (13 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 14/19] staging: wfx: allow to join IBSS networks Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 16/19] staging: wfx: re-enable BA after reset Jerome Pouiller
                   ` (3 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Currently, IBSS networks are started by the mean of
wfx_bss_info_changed(). It easier to use use callbacks provided by
mac80211.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/main.c |  2 ++
 drivers/staging/wfx/sta.c  | 19 +++++++++++++++++--
 drivers/staging/wfx/sta.h  |  2 ++
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/wfx/main.c b/drivers/staging/wfx/main.c
index b459fac928fd..b8a01ba0d381 100644
--- a/drivers/staging/wfx/main.c
+++ b/drivers/staging/wfx/main.c
@@ -133,6 +133,8 @@ static const struct ieee80211_ops wfx_ops = {
 	.remove_interface	= wfx_remove_interface,
 	.config                 = wfx_config,
 	.tx			= wfx_tx,
+	.join_ibss		= wfx_join_ibss,
+	.leave_ibss		= wfx_leave_ibss,
 	.conf_tx		= wfx_conf_tx,
 	.hw_scan		= wfx_hw_scan,
 	.cancel_hw_scan		= wfx_cancel_hw_scan,
diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 8aa373f5deae..21eceafc9a95 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -648,6 +648,22 @@ static void wfx_join_finalize(struct wfx_vif *wvif,
 	}
 }
 
+int wfx_join_ibss(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+{
+	struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
+
+	wfx_upload_ap_templates(wvif);
+	wfx_do_join(wvif);
+	return 0;
+}
+
+void wfx_leave_ibss(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+{
+	struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
+
+	wfx_do_unjoin(wvif);
+}
+
 void wfx_enable_beacon(struct wfx_vif *wvif, bool enable)
 {
 	// Driver has Content After DTIM Beacon in queue. Driver is waiting for
@@ -688,8 +704,7 @@ void wfx_bss_info_changed(struct ieee80211_hw *hw,
 	if (changed & BSS_CHANGED_BASIC_RATES ||
 	    changed & BSS_CHANGED_BEACON_INT ||
 	    changed & BSS_CHANGED_BSSID) {
-		if (vif->type == NL80211_IFTYPE_STATION ||
-		    vif->type == NL80211_IFTYPE_ADHOC)
+		if (vif->type == NL80211_IFTYPE_STATION)
 			wfx_do_join(wvif);
 	}
 
diff --git a/drivers/staging/wfx/sta.h b/drivers/staging/wfx/sta.h
index 6a4b91a47f5b..3002d89dc871 100644
--- a/drivers/staging/wfx/sta.h
+++ b/drivers/staging/wfx/sta.h
@@ -56,6 +56,8 @@ int wfx_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 void wfx_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
+int wfx_join_ibss(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
+void wfx_leave_ibss(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 int wfx_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 		u16 queue, const struct ieee80211_tx_queue_params *params);
 void wfx_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 16/19] staging: wfx: re-enable BA after reset
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (14 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 15/19] staging: wfx: introduce wfx_join_ibss() and wfx_leave_ibss() Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 17/19] staging: wfx: check value of beacon_int Jerome Pouiller
                   ` (2 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Firmware does not support Block Acks when multiple vif are running.
Thus, wfx_add_interface() and wfx_remove_interface() enable and disable
Block Acks as necessary.

Block Ack policy is also reset after hif_reset(). Driver have to
re-enable it after each call to hif_reset().

This patch reflects this behavior.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 21eceafc9a95..91b4ce945598 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -416,13 +416,12 @@ static void wfx_do_unjoin(struct wfx_vif *wvif)
 	hif_reset(wvif, false);
 	wfx_tx_policy_init(wvif);
 	hif_set_macaddr(wvif, wvif->vif->addr);
+	if (wvif_count(wvif->wdev) <= 1)
+		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
 	wfx_free_event_queue(wvif);
 	cancel_work_sync(&wvif->event_handler_work);
 	wfx_cqm_bssloss_sm(wvif, 0, 0, 0);
 
-	/* Disable Block ACKs */
-	hif_set_block_ack_policy(wvif, 0, 0);
-
 	wvif->disable_beacon_filter = false;
 	wfx_update_filtering(wvif);
 	memset(&wvif->bss_params, 0, sizeof(wvif->bss_params));
@@ -492,9 +491,6 @@ static void wfx_do_join(struct wfx_vif *wvif)
 	}
 	rcu_read_unlock();
 
-	if (wvif_count(wvif->wdev) <= 1)
-		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
-
 	wfx_set_mfp(wvif, bss);
 	cfg80211_put_bss(wvif->wdev->hw->wiphy, bss);
 
@@ -591,8 +587,6 @@ int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 	struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
 
 	wfx_upload_keys(wvif);
-	if (wvif_count(wvif->wdev) <= 1)
-		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
 	wvif->state = WFX_STATE_AP;
 	wfx_update_filtering(wvif);
 	wfx_upload_ap_templates(wvif);
@@ -607,6 +601,8 @@ void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 
 	hif_reset(wvif, false);
 	wfx_tx_policy_init(wvif);
+	if (wvif_count(wvif->wdev) <= 1)
+		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
 	wvif->state = WFX_STATE_PASSIVE;
 }
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 17/19] staging: wfx: check value of beacon_int
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (15 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 16/19] staging: wfx: re-enable BA after reset Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 18/19] staging: wfx: drop unused attribute 'beacon_int' Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 19/19] staging: wfx: drop useless update of macaddr Jerome Pouiller
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Firmware dislike when beacon_int value is 0. This patch add some
warnings in case it would happen.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/hif_tx.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/staging/wfx/hif_tx.c b/drivers/staging/wfx/hif_tx.c
index d44e5cacbbce..f49ab67e1a6d 100644
--- a/drivers/staging/wfx/hif_tx.c
+++ b/drivers/staging/wfx/hif_tx.c
@@ -296,6 +296,7 @@ int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
 	struct hif_msg *hif;
 	struct hif_req_join *body = wfx_alloc_hif(sizeof(*body), &hif);
 
+	WARN_ON(!conf->beacon_int);
 	WARN_ON(!conf->basic_rates);
 	WARN_ON(sizeof(body->ssid) < ssidlen);
 	WARN(!conf->ibss_joined && !ssidlen, "joining an unknown BSS");
@@ -430,6 +431,7 @@ int hif_start(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
 	struct hif_msg *hif;
 	struct hif_req_start *body = wfx_alloc_hif(sizeof(*body), &hif);
 
+	WARN_ON(!conf->beacon_int);
 	body->dtim_period = conf->dtim_period;
 	body->short_preamble = conf->use_short_preamble;
 	body->channel_number = cpu_to_le16(channel->hw_value);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 18/19] staging: wfx: drop unused attribute 'beacon_int'
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (16 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 17/19] staging: wfx: check value of beacon_int Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  2020-04-10 13:32 ` [PATCH 19/19] staging: wfx: drop useless update of macaddr Jerome Pouiller
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

The field beacon_int is never read. Drop it.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 5 -----
 drivers/staging/wfx/wfx.h | 1 -
 2 files changed, 6 deletions(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 91b4ce945598..53ab9648184a 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -478,10 +478,6 @@ static void wfx_do_join(struct wfx_vif *wvif)
 		return;
 	}
 
-	/* Sanity check beacon interval */
-	if (!wvif->beacon_int)
-		wvif->beacon_int = 1;
-
 	rcu_read_lock(); // protect ssidie
 	if (bss)
 		ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
@@ -611,7 +607,6 @@ static void wfx_join_finalize(struct wfx_vif *wvif,
 {
 	struct ieee80211_sta *sta = NULL;
 
-	wvif->beacon_int = info->beacon_int;
 	rcu_read_lock(); // protect sta
 	if (info->bssid && !info->ibss_joined)
 		sta = ieee80211_find_sta(wvif->vif, info->bssid);
diff --git a/drivers/staging/wfx/wfx.h b/drivers/staging/wfx/wfx.h
index 619e6f5c1345..41d67dc091a6 100644
--- a/drivers/staging/wfx/wfx.h
+++ b/drivers/staging/wfx/wfx.h
@@ -88,7 +88,6 @@ struct wfx_vif {
 
 	struct work_struct	update_tim_work;
 
-	int			beacon_int;
 	bool			filter_bssid;
 	bool			fwd_probe_req;
 	bool			disable_beacon_filter;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 19/19] staging: wfx: drop useless update of macaddr
  2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
                   ` (17 preceding siblings ...)
  2020-04-10 13:32 ` [PATCH 18/19] staging: wfx: drop unused attribute 'beacon_int' Jerome Pouiller
@ 2020-04-10 13:32 ` Jerome Pouiller
  18 siblings, 0 replies; 20+ messages in thread
From: Jerome Pouiller @ 2020-04-10 13:32 UTC (permalink / raw)
  To: devel, linux-wireless
  Cc: netdev, linux-kernel, Greg Kroah-Hartman, Kalle Valo,
	David S . Miller, Jérôme Pouiller

From: Jérôme Pouiller <jerome.pouiller@silabs.com>

Mac address is set in wfx_add_interface() and removed in
wfx_remove_interface().

Currently, there is also an additional update of mac address in
wfx_do_unjoin(). It has no rationale. Mac address is already present
and nothing has changed it. Therefore, we can drop it.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/staging/wfx/sta.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
index 53ab9648184a..f1df7717d5f4 100644
--- a/drivers/staging/wfx/sta.c
+++ b/drivers/staging/wfx/sta.c
@@ -415,7 +415,6 @@ static void wfx_do_unjoin(struct wfx_vif *wvif)
 	wfx_tx_lock_flush(wvif->wdev);
 	hif_reset(wvif, false);
 	wfx_tx_policy_init(wvif);
-	hif_set_macaddr(wvif, wvif->vif->addr);
 	if (wvif_count(wvif->wdev) <= 1)
 		hif_set_block_ack_policy(wvif, 0xFF, 0xFF);
 	wfx_free_event_queue(wvif);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2020-04-10 13:35 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-10 13:32 [PATCH 00/19] staging: wfx: simplify start/shutdown of RF Jerome Pouiller
2020-04-10 13:32 ` [PATCH 01/19] staging: wfx: fix race between configure_filter and remove_interface Jerome Pouiller
2020-04-10 13:32 ` [PATCH 02/19] staging: wfx: reduce hold duration of cfg80211_bss Jerome Pouiller
2020-04-10 13:32 ` [PATCH 03/19] staging: wfx: call wfx_do_unjoin() synchronously Jerome Pouiller
2020-04-10 13:32 ` [PATCH 04/19] staging: wfx: implement start_ap/stop_ap Jerome Pouiller
2020-04-10 13:32 ` [PATCH 05/19] staging: wfx: set all parameters before starting AP Jerome Pouiller
2020-04-10 13:32 ` [PATCH 06/19] staging: wfx: change the way the station associate to an AP Jerome Pouiller
2020-04-10 13:32 ` [PATCH 07/19] staging: wfx: remove useless call to wfx_tx_flush() Jerome Pouiller
2020-04-10 13:32 ` [PATCH 08/19] staging: wfx: fix support for BSS_CHANGED_KEEP_ALIVE Jerome Pouiller
2020-04-10 13:32 ` [PATCH 09/19] staging: wfx: disabling keep alive during unjoin is useless Jerome Pouiller
2020-04-10 13:32 ` [PATCH 10/19] staging: wfx: drop unnecessary condition checks in wfx_upload_ap_templates() Jerome Pouiller
2020-04-10 13:32 ` [PATCH 11/19] staging: wfx: request to send beacons in IBSS mode Jerome Pouiller
2020-04-10 13:32 ` [PATCH 12/19] staging: wfx: remove unnecessary conditions in wfx_bss_info_changed() Jerome Pouiller
2020-04-10 13:32 ` [PATCH 13/19] staging: wfx: avoid duplicate updating of beacon template Jerome Pouiller
2020-04-10 13:32 ` [PATCH 14/19] staging: wfx: allow to join IBSS networks Jerome Pouiller
2020-04-10 13:32 ` [PATCH 15/19] staging: wfx: introduce wfx_join_ibss() and wfx_leave_ibss() Jerome Pouiller
2020-04-10 13:32 ` [PATCH 16/19] staging: wfx: re-enable BA after reset Jerome Pouiller
2020-04-10 13:32 ` [PATCH 17/19] staging: wfx: check value of beacon_int Jerome Pouiller
2020-04-10 13:32 ` [PATCH 18/19] staging: wfx: drop unused attribute 'beacon_int' Jerome Pouiller
2020-04-10 13:32 ` [PATCH 19/19] staging: wfx: drop useless update of macaddr Jerome Pouiller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).