From 75dc9cb8802d2c59c51c588c8045d66afaaac753 Mon Sep 17 00:00:00 2001 From: JasonHuang Date: Mon, 4 Jul 2022 05:49:15 -0500 Subject: [PATCH 099/296] non-upstream: Handle the 6G case in the bw_cap & chanspecs iovar Support send the IOV_BW_CAP ioctl GET req for the 6G band. Also while processing the response for the IOV_CHANSPECS ioctl GET req, handle the case of 6G channels to stop the driver from throwing the "Invalid channel Spec." error for every 6G channel. Signed-off-by: JasonHuang --- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index 03c7c6355527..c75ddd4c5b42 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -7683,8 +7683,7 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, u8 *pbuf; u32 i, j; u32 total; - u32 chaninfo, n_2g = 0, n_5g = 0; - + u32 chaninfo, n_2g = 0, n_5g = 0, n_6g = 0; pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL); if (pbuf == NULL) @@ -7704,6 +7703,10 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, for (i = 0; i < band->n_channels; i++) band->channels[i].flags = IEEE80211_CHAN_DISABLED; band = wiphy->bands[NL80211_BAND_5GHZ]; + if (band) + for (i = 0; i < band->n_channels; i++) + band->channels[i].flags = IEEE80211_CHAN_DISABLED; + band = wiphy->bands[NL80211_BAND_6GHZ]; if (band) for (i = 0; i < band->n_channels; i++) band->channels[i].flags = IEEE80211_CHAN_DISABLED; @@ -7724,6 +7727,8 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, band = wiphy->bands[NL80211_BAND_2GHZ]; } else if (ch.band == BRCMU_CHAN_BAND_5G) { band = wiphy->bands[NL80211_BAND_5GHZ]; + } else if (ch.band == BRCMU_CHAN_BAND_6G) { + band = wiphy->bands[NL80211_BAND_6GHZ]; } else { bphy_err(drvr, "Invalid channel Spec. 0x%x.\n", ch.chspec); @@ -7834,6 +7839,26 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, } wiphy->bands[NL80211_BAND_5GHZ]->n_channels = n_5g; } + band = wiphy->bands[NL80211_BAND_6GHZ]; + if (band) { + n_6g = band->n_channels; + for (i = 0; i < n_6g;) { + cur = &band->channels[i]; + if (cur->flags == IEEE80211_CHAN_DISABLED) { + for (j = i; j < n_6g - 1; j++) { + cur = &band->channels[j]; + next = &band->channels[j + 1]; + memcpy(cur, next, sizeof(*cur)); + } + /* To avoid fw crash while delete all channels */ + if (n_6g == 1) + break; + n_6g--; + } else + i++; + } + wiphy->bands[NL80211_BAND_6GHZ]->n_channels = n_6g; + } fail_pbuf: kfree(pbuf); @@ -7939,7 +7964,13 @@ static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[]) err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &band); if (!err) { bw_cap[NL80211_BAND_5GHZ] = band; - return; + band = WLC_BAND_6G; + err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &band); + if (!err) { + bw_cap[NL80211_BAND_6GHZ] = band; + return; + } + WARN_ON(1); } WARN_ON(1); return; @@ -8105,7 +8136,10 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg) struct wiphy *wiphy = cfg_to_wiphy(cfg); u32 nmode = 0; u32 vhtmode = 0; - u32 bw_cap[2] = { WLC_BW_20MHZ_BIT, WLC_BW_20MHZ_BIT }; + u32 bw_cap[4] = { WLC_BW_20MHZ_BIT, /* 2GHz */ + WLC_BW_20MHZ_BIT, /* 5GHz */ + 0, /* 60GHz */ + WLC_BW_20MHZ_BIT };/* 6GHz */ u32 rxchain; u32 nchain; int err; -- 2.25.1