From 393ca2c562b0c7692b78ffff1b4b4e4438a518b8 Mon Sep 17 00:00:00 2001 From: JasonHuang Date: Thu, 23 Jan 2025 03:50:26 -0600 Subject: [PATCH 04/13] brcmfmac: fix set roamtrigger CMD error It's compatibility issue. The all band macro define of tri-band is difference than dual-band in the firmware. To enhance compatibility we need to get n bands from FW and set roam properties separately insted of using BRCM_BAND_ALL directly. Signed-off-by: JasonHuang --- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index 3888152..6286c76 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -8764,6 +8764,9 @@ static s32 brcmf_dongle_roam(struct brcmf_if *ifp) u32 bcn_timeout; __le32 roamtrigger[2]; __le32 roam_delta[2]; + __le32 bandlist[4]; + u32 n_bands; + int i; /* Configure beacon timeout value based upon roaming setting */ if (ifp->drvr->settings->roamoff < BRCMF_ROAMOFF_DISABLE || @@ -8796,19 +8799,33 @@ static s32 brcmf_dongle_roam(struct brcmf_if *ifp) goto roam_setup_done; } - roamtrigger[0] = cpu_to_le32(WL_ROAM_TRIGGER_LEVEL); - roamtrigger[1] = cpu_to_le32(BRCM_BAND_ALL); - err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_TRIGGER, - (void *)roamtrigger, sizeof(roamtrigger)); - if (err) - bphy_err(drvr, "WLC_SET_ROAM_TRIGGER error (%d)\n", err); + err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BANDLIST, &bandlist, + sizeof(bandlist)); + if (err) { + bphy_err(drvr, "could not obtain band info: err=%d\n", err); + goto roam_setup_done; + } + /* To enhance compatibility set each band's roam properties instead of + * using all band. BAND_5G is 1, BAND_2G is 2 and BAND_6G is 3. + */ + n_bands = le32_to_cpu(bandlist[0]); + for (i = 1; i <= n_bands; i++) { + roamtrigger[0] = cpu_to_le32(WL_ROAM_TRIGGER_LEVEL); + roamtrigger[1] = cpu_to_le32(bandlist[i]); + err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_TRIGGER, + (void *)roamtrigger, sizeof(roamtrigger)); + if (err) + bphy_err(drvr, "WLC_SET_ROAM_TRIGGER error (%d), band %d\n", + err, bandlist[i]); - roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA); - roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL); - err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA, - (void *)roam_delta, sizeof(roam_delta)); - if (err) - bphy_err(drvr, "WLC_SET_ROAM_DELTA error (%d)\n", err); + roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA); + roam_delta[1] = cpu_to_le32(bandlist[i]); + err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA, + (void *)roam_delta, sizeof(roam_delta)); + if (err) + bphy_err(drvr, "WLC_SET_ROAM_DELTA error (%d), band %d\n", + err, bandlist[i]); + } return 0; -- 2.25.1