summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/sme/inc/csr_api.h2
-rw-r--r--core/sme/src/csr/csr_api_roam.c30
2 files changed, 18 insertions, 14 deletions
diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h
index f1439dc7f3ad..af07c4bc6871 100644
--- a/core/sme/inc/csr_api.h
+++ b/core/sme/inc/csr_api.h
@@ -779,6 +779,8 @@ typedef enum {
*/
#define CSR_CB_CHANNEL_GAP 4
#define CSR_CB_CENTER_CHANNEL_OFFSET 2
+#define CSR_SEC_CHANNEL_OFFSET 4
+
/* WEP keysize (in bits) */
typedef enum {
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 3888513458a0..c80a4bf1f88f 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -13641,15 +13641,15 @@ bool csr_roam_is_channel_valid(tpAniSirGlobal pMac, uint8_t channel)
/* This function check and validate whether the NIC can do CB (40MHz) */
static ePhyChanBondState csr_get_cb_mode_from_ies(tpAniSirGlobal pMac,
- uint8_t primaryChn,
+ uint8_t chan,
tDot11fBeaconIEs *pIes)
{
ePhyChanBondState eRet = PHY_SINGLE_CHANNEL_CENTERED;
- uint8_t centerChn;
+ uint8_t sec_ch = 0;
uint32_t ChannelBondingMode;
struct ch_params_s ch_params = {0};
- if (CDS_IS_CHANNEL_24GHZ(primaryChn)) {
+ if (CDS_IS_CHANNEL_24GHZ(chan)) {
ChannelBondingMode =
pMac->roam.configParam.channelBondingMode24GHz;
} else {
@@ -13689,7 +13689,7 @@ static ePhyChanBondState csr_get_cb_mode_from_ies(tpAniSirGlobal pMac,
* value of supported channel width and recommended tx width as per
* standard
*/
- sme_debug("scws %u rtws %u sco %u",
+ sme_debug("chan %d scws %u rtws %u sco %u", chan,
pIes->HTCaps.supportedChannelWidthSet,
pIes->HTInfo.recommendedTxWidthSet,
pIes->HTInfo.secondaryChannelOffset);
@@ -13701,26 +13701,28 @@ static ePhyChanBondState csr_get_cb_mode_from_ies(tpAniSirGlobal pMac,
switch (eRet) {
case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
- centerChn = primaryChn + CSR_CB_CENTER_CHANNEL_OFFSET;
+ sec_ch = chan + CSR_SEC_CHANNEL_OFFSET;
break;
case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
- centerChn = primaryChn - CSR_CB_CENTER_CHANNEL_OFFSET;
+ sec_ch = chan - CSR_SEC_CHANNEL_OFFSET;
break;
- case PHY_SINGLE_CHANNEL_CENTERED:
default:
- centerChn = primaryChn;
break;
}
- if (PHY_SINGLE_CHANNEL_CENTERED != eRet) {
- ch_params.ch_width = CH_WIDTH_MAX;
- cds_set_channel_params(primaryChn, 0, &ch_params);
- if (ch_params.ch_width == CH_WIDTH_20MHZ) {
- sme_err("40Mhz not supported for channel %d, continue with 20Mhz",
- primaryChn);
+ if (eRet != PHY_SINGLE_CHANNEL_CENTERED) {
+ ch_params.ch_width = CH_WIDTH_40MHZ;
+ cds_set_channel_params(chan, sec_ch, &ch_params);
+ if (ch_params.ch_width == CH_WIDTH_20MHZ ||
+ ch_params.sec_ch_offset != eRet) {
+ sme_err("chan %d :: Supported HT BW %d and cbmode %d, APs HT BW %d and cbmode %d, so switch to 20Mhz",
+ chan, ch_params.ch_width,
+ ch_params.sec_ch_offset,
+ pIes->HTInfo.recommendedTxWidthSet, eRet);
eRet = PHY_SINGLE_CHANNEL_CENTERED;
}
}
+
return eRet;
}