From 416c500d1e26d928b4ce3f6c6deb5963a1c73a57 Mon Sep 17 00:00:00 2001 From: "Sanaboina Suresh (IFINS CSS ICW ENG SW WFSW 1)" Date: Thu, 4 Aug 2022 06:23:36 +0000 Subject: [PATCH 106/296] brcmfmac: send BCNLOST_MSG event on beacon loss for supplicant roaming --- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index aeb3db636409..a78544ff0240 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -7563,6 +7563,40 @@ brcmf_notify_rssi_change_ind(struct brcmf_if *ifp, return 0; } +static s32 +brcmf_notify_beacon_loss(struct brcmf_if *ifp, + const struct brcmf_event_msg *e, void *data) +{ + struct brcmf_cfg80211_info *cfg = ifp->drvr->config; + struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; + struct cfg80211_bss *bss; + + brcmf_dbg(INFO, "Enter: event %s (%d), status=%d\n", + brcmf_fweh_event_name(e->event_code), e->event_code, + e->status); + + if (!ifp->drvr->settings->roamoff) + return 0; + + /* On beacon loss event, Supplicant triggers new scan request + * with NL80211_SCAN_FLAG_FLUSH Flag set, but lost AP bss entry + * still remained as it is held by cfg as associated. Unlinking this + * current BSS from cfg cached bss list on beacon loss event here, + * would allow supplicant to receive new scanned entries + * without current bss and select new bss to trigger roam. + */ + bss = cfg80211_get_bss(cfg->wiphy, NULL, profile->bssid, 0, 0, + IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY); + if (bss) { + cfg80211_unlink_bss(cfg->wiphy, bss); + cfg80211_put_bss(cfg->wiphy, bss); + } + + cfg80211_cqm_beacon_loss_notify(cfg_to_ndev(cfg), GFP_KERNEL); + + return 0; +} + static void brcmf_init_conf(struct brcmf_cfg80211_conf *conf) { conf->frag_threshold = (u32)-1; @@ -7619,6 +7653,8 @@ static void brcmf_register_event_handlers(struct brcmf_cfg80211_info *cfg) brcmf_notify_mgmt_tx_status); brcmf_fweh_register(cfg->pub, BRCMF_E_RSSI, brcmf_notify_rssi_change_ind); + brcmf_fweh_register(cfg->pub, BRCMF_E_BCNLOST_MSG, + brcmf_notify_beacon_loss); } static void brcmf_deinit_priv_mem(struct brcmf_cfg80211_info *cfg) -- 2.25.1