staging: wfx: implement start_ap/stop_ap
authorJérôme Pouiller <jerome.pouiller@silabs.com>
Fri, 10 Apr 2020 13:32:24 +0000 (15:32 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 13 Apr 2020 12:42:37 +0000 (14:42 +0200)
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>
Link: https://lore.kernel.org/r/20200410133239.438347-5-Jerome.Pouiller@silabs.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wfx/main.c
drivers/staging/wfx/sta.c
drivers/staging/wfx/sta.h

index 1e9f6da..b459fac 100644 (file)
@@ -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,
index 36e55e3..92bf317 100644 (file)
@@ -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)
index a0c5153..6a4b91a 100644 (file)
@@ -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,