wlan: SAPHT40 2.4GHz:Add OBSS Scan functionality for SAP/P2PGO
Initiate OBSS scan before starting SAP or P2PGO in HT40
mode in case 2.4GHz band.
Change-Id: I3e480249f3f3d74e691850870ea0d5320013412a
CRs-Fixed: 755512
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 6c7db3a..931f498 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -677,6 +677,9 @@
tANI_BOOLEAN pmfRequired;
#endif
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ tANI_BOOLEAN apHT40_24GEnabled;
+#endif
} tSirSmeStartBssReq, *tpSirSmeStartBssReq;
#define GET_IE_LEN_IN_BSS(lenInBss) ( lenInBss + sizeof(lenInBss) - \
diff --git a/CORE/MAC/inc/sirMacProtDef.h b/CORE/MAC/inc/sirMacProtDef.h
index 4d94072..d2d361d 100644
--- a/CORE/MAC/inc/sirMacProtDef.h
+++ b/CORE/MAC/inc/sirMacProtDef.h
@@ -411,6 +411,7 @@
#define SIR_MAC_HT_INFO_EID_MIN 0
#define SIR_MAC_HT_INFO_EID_MAX 255
#define SIR_MAC_OBSS_SCAN_PARAMETERS_EID 74
+#define SIR_MAC_EXTENDED_CAPABILITIES_EID 127
#ifdef WLAN_FEATURE_11AC
#define SIR_MAC_VHT_CAPABILITIES_EID 191
diff --git a/CORE/MAC/src/include/parserApi.h b/CORE/MAC/src/include/parserApi.h
index 53e66e0..46174ec 100644
--- a/CORE/MAC/src/include/parserApi.h
+++ b/CORE/MAC/src/include/parserApi.h
@@ -576,6 +576,13 @@
tDot11fIEHTInfo *pDot11f,
tpPESession psessionEntry);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+tSirRetStatus
+PopulateDot11fOBSSScanParameters(tpAniSirGlobal pMac,
+ tDot11fIEOBSSScanParameters *pDot11f,
+ tpPESession psessionEntry);
+#endif
+
void PopulateDot11fIBSSParams(tpAniSirGlobal pMac,
tDot11fIEIBSSParams *pDot11f, tpPESession psessionEntry);
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 6c34ed2..e5c8413 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -621,6 +621,14 @@
psessionEntry->maxTxPower = cfgGetRegulatoryMaxTransmitPower( pMac,
psessionEntry->currentOperChannel );
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ /*Store Overlapping BSS Scan Parameters IEs to session table */
+ if (pSmeStartBssReq->apHT40_24GEnabled)
+ {
+ limInitOBSSScanParams(pMac, psessionEntry);
+ }
+#endif
/* Store the dot 11 mode in to the session Table*/
psessionEntry->dot11mode = pSmeStartBssReq->dot11mode;
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 15b6194..c4a6fe0 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -735,6 +735,20 @@
PopulateDot11fHTCaps( pMac, psessionEntry, &pFrm->HTCaps );
PopulateDot11fHTInfo( pMac, &pFrm->HTInfo, psessionEntry );
}
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ /* Populate Overlapping BSS Scan Parameters IEs,
+ * when operating in HT40 in 2.4GHz.
+ */
+ if (pMac->roam.configParam.apHT40_24GEnabled)
+ {
+ PopulateDot11fOBSSScanParameters( pMac, &pFrm->OBSSScanParameters,
+ psessionEntry);
+ }
+#endif
+
+ PopulateDot11fExtCap( pMac, &pFrm->ExtCap, psessionEntry);
+
#ifdef WLAN_FEATURE_11AC
if(psessionEntry->vhtCapability)
{
@@ -743,7 +757,6 @@
PopulateDot11fVHTOperation( pMac, &pFrm->VHTOperation );
// we do not support multi users yet
//PopulateDot11fVHTExtBssLoad( pMac, &frm.VHTExtBssLoad );
- PopulateDot11fExtCap( pMac, &pFrm->ExtCap, psessionEntry);
}
#endif
@@ -1470,6 +1483,18 @@
PopulateDot11fHTInfo( pMac, &frm.HTInfo, psessionEntry );
}
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ /* Populate Overlapping BSS Scan Parameters IEs,
+ * when operating in HT40 in 2.4GHz.
+ */
+ if (pMac->roam.configParam.apHT40_24GEnabled)
+ {
+ PopulateDot11fOBSSScanParameters( pMac, &frm.OBSSScanParameters,
+ psessionEntry);
+ }
+#endif
+
+ PopulateDot11fExtCap( pMac, &frm.ExtCap, psessionEntry);
#ifdef WLAN_FEATURE_11AC
if( pSta->mlmStaContext.vhtCapability &&
psessionEntry->vhtCapability )
@@ -1477,7 +1502,6 @@
limLog( pMac, LOG1, FL("Populate VHT IEs in Assoc Response"));
PopulateDot11fVHTCaps( pMac, &frm.VHTCaps, eSIR_TRUE );
PopulateDot11fVHTOperation( pMac, &frm.VHTOperation);
- PopulateDot11fExtCap( pMac, &frm.ExtCap, psessionEntry);
}
#endif
diff --git a/CORE/MAC/src/pe/lim/limSerDesUtils.c b/CORE/MAC/src/pe/lim/limSerDesUtils.c
index 2784ebc..ae24ad1 100644
--- a/CORE/MAC/src/pe/lim/limSerDesUtils.c
+++ b/CORE/MAC/src/pe/lim/limSerDesUtils.c
@@ -739,6 +739,11 @@
len -= pStartBssReq->extendedRateSet.numRates;
}
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ /* extract apHT40_24GEnabled */
+ pStartBssReq->apHT40_24GEnabled = *pBuf++;
+ len--;
+#endif
if (len)
{
limLog(pMac, LOGW, FL("Extra bytes left in SME_START_BSS_REQ, len=%d"), len);
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index 39600cd..7fa744a 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -8181,6 +8181,19 @@
}
psessionEntry->obssHT40ScanParam.OBSSScanPassiveTotalPerChannel =
cfgValue;
+
+ if (wlan_cfgGetInt(pMac,
+ WNI_CFG_OBSS_HT40_WIDTH_CHANNEL_TRANSITION_DELAY_FACTOR, &cfgValue)
+ != eSIR_SUCCESS)
+ {
+ limLog(pMac, LOGE, FL("Fail to retrieve"
+ "WNI_CFG_OBSS_HT40_WIDTH_CHANNEL_TRANSITION_DELAY_FACTOR value"));
+ return ;
+ }
+ psessionEntry->obssHT40ScanParam.BSSWidthChannelTransitionDelayFactor =
+ cfgValue;
+
+
if (wlan_cfgGetInt(pMac, WNI_CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD ,
&cfgValue) != eSIR_SUCCESS)
{
diff --git a/CORE/MAC/src/pe/sch/schBeaconGen.c b/CORE/MAC/src/pe/sch/schBeaconGen.c
index ae3d93e..1dee68f 100644
--- a/CORE/MAC/src/pe/sch/schBeaconGen.c
+++ b/CORE/MAC/src/pe/sch/schBeaconGen.c
@@ -336,6 +336,17 @@
PopulateDot11fHTCaps( pMac,psessionEntry, &pBcn2->HTCaps );
PopulateDot11fHTInfo( pMac, &pBcn2->HTInfo, psessionEntry );
}
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if (pMac->roam.configParam.apHT40_24GEnabled)
+ {
+ PopulateDot11fOBSSScanParameters( pMac, &pBcn2->OBSSScanParameters,
+ psessionEntry);
+ }
+#endif
+
+ PopulateDot11fExtCap( pMac, &pBcn2->ExtCap, psessionEntry);
+
#ifdef WLAN_FEATURE_11AC
if(psessionEntry->vhtCapability)
{
@@ -344,7 +355,6 @@
PopulateDot11fVHTOperation( pMac, &pBcn2->VHTOperation);
// we do not support multi users yet
//PopulateDot11fVHTExtBssLoad( pMac, &bcn2.VHTExtBssLoad);
- PopulateDot11fExtCap( pMac, &pBcn2->ExtCap, psessionEntry);
if(psessionEntry->gLimOperatingMode.present)
PopulateDot11fOperatingMode( pMac, &pBcn2->OperatingMode, psessionEntry );
}
@@ -613,6 +623,31 @@
sizeof(beacon2->HTInfo));
}
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ // Overlapping BSS Scan Parameters IE
+ if (pMac->roam.configParam.apHT40_24GEnabled)
+ {
+ if (beacon2->OBSSScanParameters.present)
+ {
+ SetProbeRspIeBitmap(DefProbeRspIeBitmap,
+ SIR_MAC_OBSS_SCAN_PARAMETERS_EID);
+ vos_mem_copy((void *)&prb_rsp->OBSSScanParameters,
+ (void *)&beacon2->OBSSScanParameters,
+ sizeof(beacon2->OBSSScanParameters));
+ }
+
+ if (beacon2->ExtCap.present)
+ {
+ SetProbeRspIeBitmap(DefProbeRspIeBitmap,
+ SIR_MAC_EXTENDED_CAPABILITIES_EID);
+ vos_mem_copy((void *)&prb_rsp->ExtCap,
+ (void *)&beacon2->ExtCap,
+ sizeof(beacon2->ExtCap));
+
+ }
+ }
+#endif
+
#ifdef WLAN_FEATURE_11AC
if(beacon2->VHTCaps.present)
{
diff --git a/CORE/SAP/src/sapApiLinkCntl.c b/CORE/SAP/src/sapApiLinkCntl.c
index fc56481..04c6538 100644
--- a/CORE/SAP/src/sapApiLinkCntl.c
+++ b/CORE/SAP/src/sapApiLinkCntl.c
@@ -105,95 +105,38 @@
* -------------------------------------------------------------------------*/
/*==========================================================================
- FUNCTION WLANSAP_ScanCallback()
+ FUNCTION sapSetOperatingChannel()
- DESCRIPTION
- Callback for Scan (scan results) Events
+ DESCRIPTION
+ Set SAP Operating Channel
- DEPENDENCIES
- NA.
+ DEPENDENCIES
+ NA.
- PARAMETERS
+ PARAMETERS
IN
- tHalHandle : tHalHandle passed in with the scan request
*pContext : The second context pass in for the caller (sapContext)
- scanID : scanID got after the scan
- status : Status of scan -success, failure or abort
-
- RETURN VALUE
- The eHalStatus code associated with performing the operation
+ operChannel : SAP Operating Channel
- eHAL_STATUS_SUCCESS: Success
-
- SIDE EFFECTS
+ RETURN VALUE
+
+ SIDE EFFECTS
============================================================================*/
-eHalStatus
-WLANSAP_ScanCallback
-(
- tHalHandle halHandle,
- void *pContext, /* Opaque SAP handle */
- v_U32_t scanID,
- eCsrScanStatus scanStatus
-)
+
+void sapSetOperatingChannel(ptSapContext psapContext, v_U8_t operChannel)
{
- tScanResultHandle pResult = NULL;
- eHalStatus scanGetResultStatus = eHAL_STATUS_FAILURE;
- ptSapContext psapContext = (ptSapContext)pContext;
- void *pTempHddCtx;
- tWLAN_SAPEvent sapEvent; /* State machine event */
- v_U8_t operChannel = 0;
v_U8_t i = 0;
- VOS_STATUS sapstatus;
v_U32_t event;
- /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
- pTempHddCtx = vos_get_context( VOS_MODULE_ID_HDD,
- psapContext->pvosGCtx);
- if (NULL == pTempHddCtx)
- {
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
- "HDD context is NULL");
- return eHAL_STATUS_FAILURE;
- }
-
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before switch on scanStatus = %d", __func__, scanStatus);
-
- switch (scanStatus)
- {
- case eCSR_SCAN_SUCCESS:
- // sapScanCompleteCallback with eCSR_SCAN_SUCCESS
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_SUCCESS", scanStatus);
-
- // Get scan results, Run channel selection algorithm, select channel and keep in pSapContext->Channel
- scanGetResultStatus = sme_ScanGetResult(halHandle, 0, NULL, &pResult);
-
- event = eSAP_MAC_SCAN_COMPLETE;
-
- if ((scanGetResultStatus != eHAL_STATUS_SUCCESS)&& (scanGetResultStatus != eHAL_STATUS_E_NULL_VALUE))
- {
- // No scan results
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, Get scan result failed! ret = %d",
- __func__, scanGetResultStatus);
- break;
- }
-
- operChannel = sapSelectChannel(halHandle, psapContext, pResult);
-
- sme_ScanResultPurge(halHandle, pResult);
- break;
-
- default:
- event = eSAP_CHANNEL_SELECTION_FAILED;
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_ABORT/FAILURE", scanStatus);
- }
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("SAP Channel : %d"), psapContext->channel);
if (operChannel == SAP_CHANNEL_NOT_SELECTED)
#ifdef SOFTAP_CHANNEL_RANGE
{
VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
- "%s: No suitable channel selected", __func__);
+ FL("No suitable channel selected"));
if ( eCSR_BAND_ALL == psapContext->scanBandPreference ||
psapContext->allBandScanned == eSAP_TRUE)
@@ -204,7 +147,7 @@
for ( i = 0 ; i < psapContext->numofChannel ; i++)
{
if (NV_CHANNEL_ENABLE ==
- vos_nv_getChannelEnabledState(psapContext->channelList[i]))
+ vos_nv_getChannelEnabledState(psapContext->channelList[i]))
{
psapContext->channel = psapContext->channelList[i];
break;
@@ -213,8 +156,8 @@
}
else
{
- /* if the channel list is empty then there is no valid channel in
- the selected sub-band so select default channel in the
+ /* if the channel list is empty then there is no valid channel
+ in the selected sub-band so select default channel in the
BAND(2.4GHz) as 2.4 channels are available in all the
countries*/
psapContext->channel = SAP_DEFAULT_CHANNEL;
@@ -223,8 +166,7 @@
else
{
VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
- "%s: Has scan band preference",
- __func__);
+ FL("Has scan band preference"));
if (eCSR_BAND_24 == psapContext->currentPreferredBand)
psapContext->currentPreferredBand = eCSR_BAND_5G;
else
@@ -244,9 +186,624 @@
psapContext->channel = operChannel;
}
- sme_SelectCBMode(halHandle,
- sapConvertSapPhyModeToCsrPhyMode(psapContext->csrRoamProfile.phyMode),
- psapContext->channel);
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("SAP Channel : %d"), psapContext->channel);
+}
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+/*==========================================================================
+ FUNCTION sapCheckFor20MhzObss()
+
+ DESCRIPTION
+ Check 20 MHz Overlapping BSS
+
+ DEPENDENCIES
+ NA.
+
+ PARAMETERS
+
+ IN
+ channelNumber : Peer BSS Operating Channel
+ tpSirProbeRespBeacon: Pointer to Beacon Struct
+ ptSapContext: Pointer to SAP Context
+
+ RETURN VALUE
+ v_U8_t : Success - Found OBSS BSS, Fail - zero
+
+ SIDE EFFECTS
+============================================================================*/
+
+eHalStatus sapCheckFor20MhzObss(v_U8_t channelNumber,
+ tpSirProbeRespBeacon pBeaconStruct,
+ ptSapContext psapCtx)
+{
+
+ v_U16_t secondaryChannelOffset;
+ eHalStatus halStatus = eHAL_STATUS_SUCCESS;
+
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("channelNumber: %d BSS: %s"), channelNumber,
+ pBeaconStruct->ssId.ssId);
+
+ if (channelNumber < psapCtx->affected_start
+ || channelNumber > psapCtx->affected_end)
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("channelNumber: %d out of Affetced Channel Range: [%d,%d]"),
+ channelNumber, psapCtx->affected_start,
+ psapCtx->affected_end);
+ return halStatus;
+ }
+
+ if (!pBeaconStruct->HTCaps.present)
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Found overlapping legacy BSS: %s on Channel : %d"),
+ pBeaconStruct->ssId.ssId, channelNumber);
+ halStatus = eHAL_STATUS_FAILURE;
+ return halStatus;
+ }
+
+ if (pBeaconStruct->HTInfo.present)
+ {
+ secondaryChannelOffset = pBeaconStruct->HTInfo.secondaryChannelOffset;
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("BSS: %s secondaryChannelOffset: %d on Channel : %d"),
+ pBeaconStruct->ssId.ssId, secondaryChannelOffset,
+ channelNumber);
+ if (PHY_SINGLE_CHANNEL_CENTERED == secondaryChannelOffset)
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Found overlapping 20 MHz HT BSS: %s on Channel : %d"),
+ pBeaconStruct->ssId.ssId, channelNumber);
+ halStatus = eHAL_STATUS_FAILURE;
+ return halStatus;
+ }
+ }
+ return halStatus;
+}
+
+/*==========================================================================
+ FUNCTION sapGetPrimarySecondaryChannelOfBss()
+
+ DESCRIPTION
+ Get Primary & Seconary Channel of Overlapping BSS
+
+ DEPENDENCIES
+ NA.
+
+ PARAMETERS
+
+ IN
+ tpSirProbeRespBeacon: Pointer to Beacon Struct
+ pri_chan : Primary Operating Channel
+ sec_chan : Seconary Operating Channel
+
+ RETURN VALUE
+
+ SIDE EFFECTS
+============================================================================*/
+
+void sapGetPrimarySecondaryChannelOfBss(tpSirProbeRespBeacon pBeaconStruct,
+ v_U32_t *pri_chan, v_U32_t *sec_chan)
+{
+ v_U16_t secondaryChannelOffset;
+ *pri_chan = 0;
+ *sec_chan = 0;
+
+ if (pBeaconStruct->HTInfo.present)
+ {
+ *pri_chan = pBeaconStruct->HTInfo.primaryChannel;
+ secondaryChannelOffset = pBeaconStruct->HTInfo.secondaryChannelOffset;
+ if (PHY_DOUBLE_CHANNEL_LOW_PRIMARY == secondaryChannelOffset)
+ *sec_chan = *pri_chan + 4;
+ else if (PHY_DOUBLE_CHANNEL_HIGH_PRIMARY == secondaryChannelOffset)
+ *sec_chan = *pri_chan - 4;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("BSS Primary & Secondary Channel : %d %d "),
+ *pri_chan, *sec_chan);
+}
+
+/*==========================================================================
+ FUNCTION sapCheckHT40PairIsAllowed()
+
+ DESCRIPTION
+ Check HT40 Channel Pair is Allowed
+
+ DEPENDENCIES
+ NA.
+
+ PARAMETERS
+
+ IN
+ ptSapContext: Pointer to SAP Context
+
+ RETURN VALUE
+ v_U8_t : Success - HT40 Allowed in Selected Channale Pair
+ Fail - HT40 Not Allowed
+
+ SIDE EFFECTS
+============================================================================*/
+
+eHalStatus sapCheckHT40PairIsAllowed(ptSapContext psapCtx)
+{
+ v_U8_t count;
+ v_U8_t fValidChannel = 0;
+ eHalStatus halStatus = eHAL_STATUS_SUCCESS;
+
+ /* Verify that HT40 secondary channel is an allowed 20 MHz
+ * channel */
+ for (count = RF_CHAN_1; count <= RF_CHAN_14; count++)
+ {
+ if ((regChannels[count].enabled)
+ && (rfChannels[count].channelNum == psapCtx->sap_sec_chan))
+ {
+ fValidChannel = TRUE;
+ break;
+ }
+ }
+
+ if (!fValidChannel)
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("HT40 In Secondary Channel : %d not allowed"),
+ psapCtx->sap_sec_chan);
+
+ halStatus = eHAL_STATUS_FAILURE;
+ return halStatus;
+ }
+
+ return halStatus;
+}
+
+/*==========================================================================
+ FUNCTION sapGet24GOBSSAffectedChannel()
+
+ DESCRIPTION
+ Get OBSS Affected Channel Range
+
+ DEPENDENCIES
+ NA.
+
+ PARAMETERS
+
+ IN
+ tHalHandle : tHalHandle passed in with Affected Channel
+ ptSapContext: Pointer to SAP Context
+
+ RETURN VALUE
+ v_U8_t : Success - Able to get AffectedChannel
+ Fail - Fail to get AffectedChannel
+
+ SIDE EFFECTS
+============================================================================*/
+
+eHalStatus sapGet24GOBSSAffectedChannel(tHalHandle halHandle,
+ ptSapContext psapCtx)
+{
+
+ v_U8_t cbMode;
+ v_U32_t pri_freq, sec_freq;
+ v_U32_t affected_start_freq, affected_end_freq;
+ eSapPhyMode sapPhyMode;
+ eHalStatus halStatus;
+
+ pri_freq = vos_chan_to_freq(psapCtx->channel);
+
+ sapPhyMode =
+ sapConvertSapPhyModeToCsrPhyMode(psapCtx->csrRoamProfile.phyMode);
+
+ sme_SelectCBMode(halHandle, sapPhyMode, psapCtx->channel);
+
+ cbMode = sme_GetChannelBondingMode24G(halHandle);
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Selected Channel bonding : %d"), cbMode);
+
+ if (cbMode == eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY)
+ sec_freq = pri_freq - 20;
+ else if (cbMode == eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY)
+ sec_freq = pri_freq + 20;
+ else
+ sec_freq = eCSR_INI_SINGLE_CHANNEL_CENTERED;
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Primary Freq : %d MHz Secondary Freq : %d MHz"),
+ pri_freq, sec_freq);
+
+ if (sec_freq)
+ {
+ /* As per 802.11 Std, Section 10.15.3.2 */
+ affected_start_freq = (pri_freq + sec_freq) / 2 - 25;
+ affected_end_freq = (pri_freq + sec_freq) / 2 + 25;
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Affected Start Freq: %d MHz Affected End Freq : %d MHz"),
+ affected_start_freq, affected_end_freq);
+
+ psapCtx->affected_start = vos_freq_to_chan(affected_start_freq);
+
+ /* As there is no channel availabe for 2397 & 2402 Frequency
+ * Hence taking valid channel 1 (Freq 2412) here
+ */
+ if (affected_start_freq < 2412)
+ psapCtx->affected_start = 1;
+
+ psapCtx->affected_end = vos_freq_to_chan(affected_end_freq);
+
+ /* As there is no channel availabe for 2477 & 2482 Frequency
+ * Hence taking lower channel 13 (Freq 2472) here.
+ */
+ if ((2477 == (affected_end_freq)) || (2482 == affected_end_freq))
+ {
+ psapCtx->affected_end = 13;
+ }
+ else if (2487 == affected_end_freq)
+ {
+ /* As there is no channel availabe for 2487 Frequency
+ * Hence taking lower channel 14 (Freq 2484) here.
+ */
+ psapCtx->affected_end = 14;
+ }
+
+ psapCtx->sap_sec_chan = vos_freq_to_chan(sec_freq);
+
+ halStatus = eHAL_STATUS_SUCCESS;
+ return halStatus;
+ }
+ else
+ {
+ psapCtx->affected_start = 0;
+ psapCtx->affected_end = 0;
+ psapCtx->sap_sec_chan = 0;
+ halStatus = eHAL_STATUS_FAILURE;
+ return halStatus;
+ }
+}
+
+/*==========================================================================
+ FUNCTION sapCheck40Mhz24G
+
+ DESCRIPTION
+ Check HT40 is possible in 2.4GHz mode
+
+ DEPENDENCIES
+ NA.
+
+ PARAMETERS
+
+ IN
+ halHandle : Pointer to HAL handle
+ ptSapContext : Pointer to SAP Context
+ pResult : Pointer to tScanResultHandle
+
+ RETURN VALUE
+ v_U8_t : Success - HT40 Possible, Fail - zero
+
+ SIDE EFFECTS
+============================================================================*/
+
+eHalStatus sapCheck40Mhz24G(tHalHandle halHandle, ptSapContext psapCtx,
+ tScanResultHandle pResult)
+{
+ v_U32_t pri_chan, sec_chan;
+ v_U32_t ieLen = 0;
+ v_U8_t channelNumber = 0;
+ tSirProbeRespBeacon *pBeaconStruct;
+ tCsrScanResultInfo *pScanResult;
+ tpAniSirGlobal pMac = (tpAniSirGlobal) halHandle;
+ eHalStatus halStatus = eHAL_STATUS_FAILURE;
+
+ if ( (0 == psapCtx->affected_start) && (0 == psapCtx->affected_end)
+ && (0 == psapCtx->sap_sec_chan))
+ {
+ if (eHAL_STATUS_SUCCESS !=
+ sapGet24GOBSSAffectedChannel(halHandle, psapCtx))
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ FL("Failed to get OBSS Affected Channel Range for Channel: %d"),
+ psapCtx->channel);
+ return halStatus;
+ }
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("40 MHz affected channel range: [%d,%d] MHz"),
+ psapCtx->affected_start, psapCtx->affected_end);
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("SAP Primary & Secondary Channel : [%d,%d] MHz"),
+ psapCtx->channel, psapCtx->sap_sec_chan);
+
+ pBeaconStruct = vos_mem_malloc(sizeof(tSirProbeRespBeacon));
+ if ( NULL == pBeaconStruct )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ FL("Unable to allocate memory \n"));
+ return halStatus;
+ }
+
+ /* Check neighboring BSSes from scan result to see whether 40 MHz is
+ * allowed per IEEE Std 802.11-2012, 10.15.3.2 */
+ pScanResult = sme_ScanResultGetFirst(halHandle, pResult);
+
+ while (pScanResult)
+ {
+
+ /* if the Beacon has channel ID, use it other wise we will
+ * rely on the channelIdSelf
+ */
+ if(pScanResult->BssDescriptor.channelId == 0)
+ channelNumber = pScanResult->BssDescriptor.channelIdSelf;
+ else
+ channelNumber = pScanResult->BssDescriptor.channelId;
+
+ if (channelNumber > SIR_11B_CHANNEL_END)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("channelNumber: %d BSS: %s"),
+ channelNumber, pBeaconStruct->ssId.ssId);
+ goto NextResult;
+ }
+
+ if ((pScanResult->BssDescriptor.ieFields != NULL))
+ {
+ ieLen = (pScanResult->BssDescriptor.length + sizeof(tANI_U16));
+ ieLen += (sizeof(tANI_U32) - sizeof(tSirBssDescription));
+ vos_mem_set((tANI_U8 *) pBeaconStruct,
+ sizeof(tSirProbeRespBeacon), 0);
+
+ if ((eSIR_SUCCESS == sirParseBeaconIE(pMac, pBeaconStruct,
+ (tANI_U8 *)( pScanResult->BssDescriptor.ieFields), ieLen)))
+ {
+ /* SAP Operating channel is not same with other BSS Operating
+ * channel then check for Peer BSS is HT20 or Legacy AP
+ */
+ if (psapCtx->channel != channelNumber)
+ {
+ if (eHAL_STATUS_SUCCESS !=
+ sapCheckFor20MhzObss(channelNumber, pBeaconStruct,
+ psapCtx))
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Overlapping 20 MHz BSS is found"));
+ vos_mem_free(pBeaconStruct);
+ return halStatus;
+ }
+ }
+
+ sapGetPrimarySecondaryChannelOfBss(pBeaconStruct,
+ &pri_chan, &sec_chan);
+
+ /* Check peer BSS Operating channel is not within OBSS affected
+ * channel range
+ */
+ if ((pri_chan < psapCtx->affected_start
+ || pri_chan > psapCtx->affected_end)
+ && (sec_chan < psapCtx->affected_start
+ || sec_chan > psapCtx->affected_end))
+ {
+ goto NextResult; /* not within affected channel range */
+ }
+
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Neighboring BSS: %s Primary & Secondary Channel [%d %d]"),
+ pBeaconStruct->ssId.ssId, pri_chan, sec_chan);
+
+ if (sec_chan)
+ {
+ /* Peer BSS is HT40 capable then check peer BSS
+ * primary & secondary channel with SAP
+ * Primary & Secondary channel.
+ */
+ if ((psapCtx->channel != pri_chan)
+ || (psapCtx->sap_sec_chan != sec_chan))
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("40 MHz Pri/Sec channel : [%d %d]"
+ " missmatch with BSS: %s"
+ " Pri/Sec channel : [%d %d]"),
+ psapCtx->channel, psapCtx->sap_sec_chan,
+ pBeaconStruct->ssId.ssId, pri_chan, sec_chan);
+ vos_mem_free(pBeaconStruct);
+ return halStatus;
+ }
+ }
+ else
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Channel: %d Overlapping BSS is found"),
+ pri_chan);
+ vos_mem_free(pBeaconStruct);
+ return halStatus;
+ }
+
+ if (pBeaconStruct->HTCaps.present)
+ {
+ /* Check Peer BSS HT capablity has 40MHz Intolerant bit */
+ if (pBeaconStruct->HTCaps.stbcControlFrame)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Found BSS: %s with 40 MHz"
+ "Intolerant is set on Channel : %d"),
+ pBeaconStruct->ssId.ssId,
+ channelNumber);
+ vos_mem_free(pBeaconStruct);
+ return halStatus;
+ }
+ }
+ }
+ else
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ FL("Failed to Parse the Beacon IEs"));
+ }
+ }
+ else
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ FL("BSS IEs Failed is NULL in Scan"));
+ }
+
+NextResult:
+ pScanResult = sme_ScanResultGetNext(halHandle, pResult);
+ }
+ vos_mem_free(pBeaconStruct);
+
+ if (psapCtx->sap_sec_chan)
+ {
+ if (eHAL_STATUS_SUCCESS == sapCheckHT40PairIsAllowed(psapCtx))
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Start SAP/P2P GO in HT 40MHz "
+ "Primary & Secondary Channel: [%d %d]"),
+ psapCtx->channel, psapCtx->sap_sec_chan);
+ halStatus = eHAL_STATUS_SUCCESS;
+ return halStatus;
+ }
+ }
+
+ return halStatus;
+}
+#endif
+
+/*==========================================================================
+ FUNCTION WLANSAP_ScanCallback()
+
+ DESCRIPTION
+ Callback for Scan (scan results) Events
+
+ DEPENDENCIES
+ NA.
+
+ PARAMETERS
+
+ IN
+ tHalHandle : tHalHandle passed in with the scan request
+ *pContext : The second context pass in for the caller (sapContext)
+ scanID : scanID got after the scan
+ status : Status of scan -success, failure or abort
+
+ RETURN VALUE
+ The eHalStatus code associated with performing the operation
+
+ eHAL_STATUS_SUCCESS: Success
+
+ SIDE EFFECTS
+============================================================================*/
+eHalStatus
+WLANSAP_ScanCallback
+(
+ tHalHandle halHandle,
+ void *pContext, /* Opaque SAP handle */
+ v_U32_t scanID,
+ eCsrScanStatus scanStatus
+)
+{
+ tScanResultHandle pResult = NULL;
+ eHalStatus scanGetResultStatus = eHAL_STATUS_FAILURE;
+ ptSapContext psapContext = (ptSapContext)pContext;
+ void *pTempHddCtx;
+ tWLAN_SAPEvent sapEvent; /* State machine event */
+ v_U8_t operChannel = 0;
+ VOS_STATUS sapstatus;
+ v_U32_t event;
+ eSapPhyMode sapPhyMode;
+
+ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+ pTempHddCtx = vos_get_context( VOS_MODULE_ID_HDD,
+ psapContext->pvosGCtx);
+ if (NULL == pTempHddCtx)
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
+ "HDD context is NULL");
+ return eHAL_STATUS_FAILURE;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+ "In %s, before switch on scanStatus = %d", __func__, scanStatus);
+
+ switch (scanStatus)
+ {
+ case eCSR_SCAN_SUCCESS:
+ // sapScanCompleteCallback with eCSR_SCAN_SUCCESS
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+ "In %s, CSR scanStatus = %s (%d)", __func__,
+ "eCSR_SCAN_SUCCESS", scanStatus);
+
+ /* Get scan results, Run channel selection algorithm,
+ * select channel and keep in pSapContext->Channel
+ */
+ scanGetResultStatus = sme_ScanGetResult(halHandle, 0, NULL,
+ &pResult);
+
+ event = eSAP_MAC_SCAN_COMPLETE;
+
+ if ((scanGetResultStatus != eHAL_STATUS_SUCCESS)
+ && (scanGetResultStatus != eHAL_STATUS_E_NULL_VALUE))
+ {
+ // No scan results
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ "In %s, Get scan result failed! ret = %d",
+ __func__, scanGetResultStatus);
+ sapSetOperatingChannel(psapContext, operChannel);
+ break;
+ }
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if (psapContext->channel == AUTO_CHANNEL_SELECT)
+#endif
+ {
+ operChannel = sapSelectChannel(halHandle, psapContext, pResult);
+ sapSetOperatingChannel(psapContext, operChannel);
+ }
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if ((psapContext->channel <= SIR_11B_CHANNEL_END)
+ && (psapContext->channel > 0))
+ {
+ if (eHAL_STATUS_SUCCESS !=
+ sapCheck40Mhz24G(halHandle, psapContext, pResult))
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ FL("Starting SAP into HT20"));
+ /* Disable Channel Bonding for 2.4GHz */
+ sme_UpdateChannelBondingMode24G(halHandle,
+ PHY_SINGLE_CHANNEL_CENTERED);
+ }
+ }
+#endif
+ sme_ScanResultPurge(halHandle, pResult);
+ break;
+
+ default:
+ event = eSAP_CHANNEL_SELECTION_FAILED;
+ if (psapContext->channel == AUTO_CHANNEL_SELECT)
+ sapSetOperatingChannel(psapContext, operChannel);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ FL("Starting SAP into HT20"));
+ /* Disable Channel Bonding for 2.4GHz */
+ sme_UpdateChannelBondingMode24G(halHandle,
+ PHY_SINGLE_CHANNEL_CENTERED);
+#endif
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("CSR scanStatus = %s (%d)"),
+ "eCSR_SCAN_ABORT/FAILURE", scanStatus);
+ }
+
+
+ sapPhyMode =
+ sapConvertSapPhyModeToCsrPhyMode(psapContext->csrRoamProfile.phyMode);
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if (psapContext->channel > SIR_11B_CHANNEL_END)
+#endif
+ sme_SelectCBMode(halHandle, sapPhyMode, psapContext->channel);
+
#ifdef SOFTAP_CHANNEL_RANGE
if(psapContext->channelList != NULL)
{
@@ -257,7 +814,8 @@
}
#endif
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Channel selected = %d", __func__, psapContext->channel);
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+ "In %s, Channel selected = %d", __func__, psapContext->channel);
/* Fill in the event structure */
sapEvent.event = event;
diff --git a/CORE/SAP/src/sapChSelect.c b/CORE/SAP/src/sapChSelect.c
index 037ccfa..f7111cd 100644
--- a/CORE/SAP/src/sapChSelect.c
+++ b/CORE/SAP/src/sapChSelect.c
@@ -2125,9 +2125,11 @@
v_U32_t cbMode;
eChannelWidthInfo chWidth = CHWIDTH_HT20;
+#ifdef WLAN_FEATURE_AP_HT40_24G
if (eSAP_RF_SUBBAND_2_4_GHZ == operatingBand)
cbMode = sme_GetChannelBondingMode24G(halHandle);
else
+#endif
cbMode = sme_GetChannelBondingMode5G(halHandle);
if (phyMode == eSAP_DOT11_MODE_11n ||
diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c
index 403cc2a..1a14950 100644
--- a/CORE/SAP/src/sapFsm.c
+++ b/CORE/SAP/src/sapFsm.c
@@ -65,6 +65,9 @@
* Include Files
* -------------------------------------------------------------------------*/
#include "sapInternal.h"
+#ifdef WLAN_FEATURE_AP_HT40_24G
+#include "csrInsideApi.h"
+#endif
// Pick up the SME API definitions
#include "sme_Api.h"
// Pick up the PMC API definitions
@@ -100,6 +103,13 @@
static VOS_STATUS sapGetChannelList(ptSapContext sapContext, v_U8_t **channelList,
v_U8_t *numberOfChannels);
#endif
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+static VOS_STATUS sapGetChannelListForObss(tHalHandle halHandle,
+ ptSapContext psapCtx, v_U8_t **channelList,
+ v_U8_t *numberOfChannels);
+#endif
+
/*----------------------------------------------------------------------------
* Externalized Function Definitions
* -------------------------------------------------------------------------*/
@@ -170,6 +180,7 @@
tCsrScanRequest scanRequest;/* To be initialised if scan is required */
v_U32_t scanRequestID = 0;
VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+ eSapPhyMode sapPhyMode;
#ifdef SOFTAP_CHANNEL_RANGE
v_U8_t *channelList = NULL;
@@ -187,6 +198,9 @@
return VOS_STATUS_E_FAULT;
}
+ sapPhyMode =
+ sapConvertSapPhyModeToCsrPhyMode(sapContext->csrRoamProfile.phyMode);
+
/*If STA-AP concurrency is enabled take the concurrent connected channel first. In other cases wpa_supplicant should take care */
if (vos_get_concurrency_mode() == VOS_STA_SAP)
{
@@ -196,9 +210,10 @@
{ /*if a valid channel is returned then use concurrent channel.
Else take whatever comes from configuartion*/
sapContext->channel = channel;
- sme_SelectCBMode(hHal,
- sapConvertSapPhyModeToCsrPhyMode(sapContext->csrRoamProfile.phyMode),
- channel);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if (sapContext->channel > SIR_11B_CHANNEL_END)
+#endif
+ sme_SelectCBMode(hHal, sapPhyMode, sapContext->channel);
}
}
@@ -242,7 +257,8 @@
#endif
/* Set requestType to Full scan */
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, calling sme_ScanRequest", __func__);
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+ FL("Auto Channel Selection Scan"));
halStatus = sme_ScanRequest(hHal,
0,//Not used in csrScanRequest
@@ -252,8 +268,11 @@
sapContext);//void * pContext scanRequestID filled up
if (eHAL_STATUS_SUCCESS != halStatus)
{
- VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "%s:sme_ScanRequest fail %d!!!", __func__, halStatus);
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "SoftAP Configuring for default channel, Ch= %d", sapContext->channel);
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ FL("Auto Channel Selection Scan fail %d!!!"), halStatus);
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+ FL("SoftAP Configuring for default channel, Ch= %d"),
+ sapContext->channel);
/* In case of error, switch to default channel */
sapContext->channel = SAP_DEFAULT_CHANNEL;
@@ -272,24 +291,135 @@
}
else
{
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, return from sme_ScanRequest, scanRequestID=%d, Ch= %d",
- __func__, scanRequestID, sapContext->channel);
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+ FL("Auto Channel Selection Scan Success"
+ " scanRequestID=%d, Ch= %d"),
+ scanRequestID, sapContext->channel);
}
}
else
{
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, for configured channel, Ch= %d", __func__, sapContext->channel);
- /* Fill in the event structure */
- // Eventhough scan was not done, means a user set channel was chosen
- sapEventInit(sapEvent);
- /* Handle event */
- vosStatus = sapFsm(sapContext, sapEvent);
- }
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+ FL("For configured channel, Ch= %d"), sapContext->channel);
- /* If scan failed, get default channel and advance state machine as success with default channel */
- /* Have to wait for the call back to be called to get the channel cannot advance state machine here as said above */
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before exiting sapGotoChannelSel channel=%d", __func__, sapContext->channel);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if (vos_get_concurrency_mode() != VOS_STA_SAP)
+ {
+ if ((sapContext->channel <= SIR_11B_CHANNEL_END)
+ && (sapContext->channel > RF_CHAN_1))
+ {
+ // OBSS Scan for P2P GO/SAP where Auto Channel Selection is Disable
+ vosStatus = sapGetChannelListForObss(hHal, sapContext,
+ &channelList, &numOfChannels);
+ if (VOS_STATUS_SUCCESS == vosStatus && channelList != NULL)
+ {
+ vos_mem_zero(&scanRequest, sizeof(scanRequest));
+
+ /* Set scanType to Passive scan */
+ scanRequest.scanType = eSIR_PASSIVE_SCAN;
+
+ /* Set min and max channel time to zero */
+ scanRequest.minChnTime = CSR_ACTIVE_MIN_CHANNEL_TIME;
+ scanRequest.maxChnTime = CSR_ACTIVE_MAX_CHANNEL_TIME;
+
+ /* Set BSSType to default type */
+ scanRequest.BSSType = eCSR_BSS_TYPE_ANY;
+
+ /*Scan the channels in the list*/
+ scanRequest.ChannelInfo.numOfChannels = numOfChannels;
+ scanRequest.ChannelInfo.ChannelList = channelList;
+ scanRequest.requestType = eCSR_SCAN_SOFTAP_CHANNEL_RANGE;
+ sapContext->channelList = channelList;
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("OBSS Scan for SAP/P2P GO: Ch= %d"),
+ sapContext->channel);
+
+ halStatus = sme_ScanRequest(hHal,
+ 0,//Not used in csrScanRequest
+ &scanRequest,
+ &scanRequestID,//, when ID == 0 11D scan/active scan with callback, min-maxChntime set in csrScanRequest()?
+ &WLANSAP_ScanCallback,//csrScanCompleteCallback callback,
+ sapContext);//void * pContext scanRequestID filled up
+
+ if (eHAL_STATUS_SUCCESS != halStatus)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ FL("OBSS ScanRequest Fail %d!!!"),
+ halStatus);
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("SoftAP Configuring for default channel, Ch= %d"),
+ sapContext->channel);
+
+ if(sapContext->channelList != NULL)
+ {
+ vos_mem_free(sapContext->channelList);
+ sapContext->channelList = NULL;
+ }
+ goto disable24GChannelBonding;
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("OBSS ScanRequest Success, scanRequestID=%d"
+ " Ch= %d"), scanRequestID, sapContext->channel);
+ goto startgo;
+ }
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Failed to Prepare the OBSS Scan channel list"));
+ goto disable24GChannelBonding;
+ }
+disable24GChannelBonding:
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Disable Channel Bonding"));
+ /* Disable Channel Bonding for 2.4GHz */
+ sme_UpdateChannelBondingMode24G(hHal,
+ PHY_SINGLE_CHANNEL_CENTERED);
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("No concurrency & Channel: %d"),
+ sapContext->channel);
+ goto selectChannelBonding;
+ }
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("With concurrency & Channel: %d"),
+ sapContext->channel);
+ goto selectChannelBonding;
+ }
+#endif
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+selectChannelBonding:
+ if (sapContext->channel > SIR_11B_CHANNEL_END)
+#endif
+ sme_SelectCBMode(hHal, sapPhyMode, sapContext->channel);
+
+ /* Fill in the event structure */
+ // Eventhough scan was not done, means a user set channel was chosen
+ sapEventInit(sapEvent);
+ /* Handle event */
+ vosStatus = sapFsm(sapContext, sapEvent);
+ }
+#ifdef WLAN_FEATURE_AP_HT40_24G
+startgo:
+#endif
+ /* If scan failed, get default channel and advance state
+ * machine as success with default channel. Have to wait
+ * for the call back to be called to get the channel cannot
+ * advance state machine here as said above */
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+ FL("Before exiting sapGotoChannelSel channel=%d"),
+ sapContext->channel);
return VOS_STATUS_SUCCESS;
}// sapGotoChannelSel
@@ -874,6 +1004,22 @@
sapContext->sapsMachine = eSAP_DISCONNECTED;
vosStatus = sapSignalHDDevent( sapContext, NULL, eSAP_START_BSS_EVENT, (v_PVOID_t)eSAP_STATUS_FAILURE);
vosStatus = sapGotoDisconnected(sapContext);
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ /* Reset the OBSS Affected Channel Range */
+ if ( (0 != sapContext->affected_start)
+ && (0 != sapContext->affected_end)
+ && (0 != sapContext->sap_sec_chan) )
+ {
+ sapContext->affected_start = 0;
+ sapContext->affected_end = 0;
+ sapContext->sap_sec_chan = 0;
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Reset the OBSS Affected Channel Range [%d %d]"),
+ sapContext->affected_start, sapContext->affected_end);
+
+ }
+#endif
/* Close the SME session*/
if (eSAP_TRUE == sapContext->isSapSessionOpen)
@@ -910,6 +1056,20 @@
__func__, "eSAP_STARTED", "eSAP_DISCONNECTING");
sapContext->sapsMachine = eSAP_DISCONNECTING;
vosStatus = sapGotoDisconnecting(sapContext);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ /* Reset the OBSS Affected Channel Range */
+ if ( (0 != sapContext->affected_start)
+ && (0 != sapContext->affected_end)
+ && (0 != sapContext->sap_sec_chan) )
+ {
+ sapContext->affected_start = 0;
+ sapContext->affected_end = 0;
+ sapContext->sap_sec_chan = 0;
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Reset the OBSS Affected Channel Range [%d %d]"),
+ sapContext->affected_start, sapContext->affected_end);
+ }
+#endif
}
else
{
@@ -1538,3 +1698,73 @@
return VOS_STATUS_SUCCESS;
}
#endif
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+static VOS_STATUS sapGetChannelListForObss(tHalHandle halHandle,
+ ptSapContext psapCtx, v_U8_t **channelList,
+ v_U8_t *numberOfChannels)
+{
+ v_U32_t startChannelNum;
+ v_U32_t endChannelNum;
+ v_U8_t loopCount;
+ v_U8_t channelCount;
+ v_U8_t *list;
+
+ if (eHAL_STATUS_SUCCESS != sapGet24GOBSSAffectedChannel(halHandle, psapCtx))
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ "%s:Not able to Get Affected Channel Range for Channel : %d",
+ __func__, psapCtx->channel);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ "%s: 40 MHz affected channel range: [%d,%d] MHz",
+ __func__, psapCtx->affected_start, psapCtx->affected_end);
+
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ "%s: SAP Primary & Secondary Channel : [%d,%d] MHz",
+ __func__, psapCtx->channel, psapCtx->sap_sec_chan);
+
+ /* Allocate the max number of channel supported */
+ list = (v_U8_t *)vos_mem_malloc(RF_CHAN_14 + 1);
+ if (NULL == list)
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ "%s: Unable to allocate channel list", __func__);
+ *numberOfChannels = 0;
+ *channelList = NULL;
+ return VOS_STATUS_E_RESOURCES;
+ }
+
+ /*Search for the Active channels in the given range */
+ channelCount = 0;
+ startChannelNum = RF_CHAN_1;
+ endChannelNum = RF_CHAN_14;
+ for( loopCount = startChannelNum; loopCount <= endChannelNum; loopCount++ )
+ {
+ if ((rfChannels[loopCount].channelNum >= psapCtx->affected_start)
+ && (rfChannels[loopCount].channelNum <= psapCtx->affected_end))
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ "%s: Channel Number: %d State : %d", __func__,
+ rfChannels[loopCount].channelNum,
+ vos_nv_getChannelEnabledState(rfChannels[loopCount].channelNum));
+ list[channelCount] = rfChannels[loopCount].channelNum;
+ channelCount++;
+ }
+ }
+ /* return the channel list and number of channels to scan*/
+ *numberOfChannels = channelCount;
+ if(channelCount != 0)
+ {
+ *channelList = list;
+ }
+ else
+ {
+ *channelList = NULL;
+ vos_mem_free(list);
+ }
+ return VOS_STATUS_SUCCESS;
+}
+#endif
diff --git a/CORE/SAP/src/sapInternal.h b/CORE/SAP/src/sapInternal.h
index efae8cf..b25c9cb 100644
--- a/CORE/SAP/src/sapInternal.h
+++ b/CORE/SAP/src/sapInternal.h
@@ -260,6 +260,11 @@
tSapAcsChannelInfo acsBestChannelInfo;
spinlock_t staInfo_lock; //To protect access to station Info
hdd_station_info_t aStaInfo[WLAN_MAX_STA_COUNT];
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ v_U8_t affected_start;
+ v_U8_t affected_end;
+ v_U8_t sap_sec_chan;
+#endif
} *ptSapContext;
@@ -283,6 +288,32 @@
/*----------------------------------------------------------------------------
* Function Declarations and Documentation
* -------------------------------------------------------------------------*/
+#ifdef WLAN_FEATURE_AP_HT40_24G
+/*==========================================================================
+
+ FUNCTION sapGet24GOBSSAffectedChannel()
+
+ DESCRIPTION
+ Get OBSS Affected Channel no for SAP
+
+ DEPENDENCIES
+ NA.
+
+ PARAMETERS
+
+ IN
+ tHalHandle: the tHalHandle passed in with the scan request
+ ptSapContext: Pointer to SAP context
+
+ RETURN VALUE
+
+ SIDE EFFECTS
+
+============================================================================*/
+
+eHalStatus sapGet24GOBSSAffectedChannel(tHalHandle halHandle,
+ ptSapContext psapCtx);
+#endif
/*==========================================================================
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 165ad30..728b8a1 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -198,6 +198,23 @@
eCSR_SCAN_ABORT_DUE_TO_BAND_CHANGE, //Scan aborted due to band change
}eCsrAbortReason;
+typedef enum
+{
+ eCSR_INI_SINGLE_CHANNEL_CENTERED = 0,
+ eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY,
+ eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY,
+#ifdef WLAN_FEATURE_11AC
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED,
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED,
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED,
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW,
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW,
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH,
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH,
+#endif
+ eCSR_INI_CHANNEL_BONDING_STATE_MAX
+}eIniChanBondState;
+
#define CSR_SCAN_TIME_DEFAULT 0
#define CSR_VALUE_IGNORED 0xFFFFFFFF
#define CSR_RSN_PMKID_SIZE 16
@@ -1156,6 +1173,10 @@
tANI_BOOLEAN sendDeauthBeforeCon;
eCsrBand scanBandPreference;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ tANI_BOOLEAN apHT40_24GEnabled;
+ tANI_U32 channelBondingAPMode24GHz; // Use for SAP/P2P GO 2.4GHz channel Bonding
+#endif
}tCsrConfigParam;
//Tush
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index cd60bad..c2064d5 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -671,6 +671,10 @@
tANI_U8 allowDFSChannelRoam;
tANI_BOOLEAN initialScanSkipDFSCh;
tANI_BOOLEAN sendDeauthBeforeCon;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ tANI_BOOLEAN apHT40_24GEnabled;
+ tANI_U32 channelBondingAPMode24GHz; // Use for SAP/P2P GO 2.4GHz channel Bonding
+#endif
}tCsrConfig;
typedef struct tagCsrChannelPowerInfo
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 2e2d6b5..9e5e058 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3472,6 +3472,10 @@
tANI_U32 sme_GetChannelBondingMode5G(tHalHandle hHal);
tANI_U32 sme_GetChannelBondingMode24G(tHalHandle hHal);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+void sme_UpdateChannelBondingMode24G(tHalHandle hHal,
+ tANI_U8 cbMode);
+#endif
void sme_disable_dfs_channel(tHalHandle hHal, bool disable_dfs);
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 0381792..839ab2a 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -1518,45 +1518,46 @@
ePhyChanBondState phyCbState;
switch (cbIniValue) {
// secondary none
- case 0:
+ case eCSR_INI_SINGLE_CHANNEL_CENTERED:
phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
break;
// secondary LOW
- case 1:
+ case eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY:
phyCbState = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
break;
// secondary HIGH
- case 2:
+ case eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY:
phyCbState = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
break;
#ifdef WLAN_FEATURE_11AC
- case 3:
- phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
+ phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
break;
- case 4:
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
break;
- case 5:
- phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
- break;
- case 6:
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
+ phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
+ break;
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
break;
- case 7:
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
- break;
- case 8:
+ break;
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
break;
- case 9:
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
- break;
-#endif
+ break;
+#endif
default:
// If an invalid value is passed, disable CHANNEL BONDING
phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
break;
}
+
return phyCbState;
}
@@ -1567,44 +1568,45 @@
switch (phyCbState) {
// secondary none
case PHY_SINGLE_CHANNEL_CENTERED:
- cbIniValue = 0;
+ cbIniValue = eCSR_INI_SINGLE_CHANNEL_CENTERED;
break;
// secondary LOW
case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
- cbIniValue = 1;
+ cbIniValue = eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
break;
// secondary HIGH
case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
- cbIniValue = 2;
+ cbIniValue = eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
break;
#ifdef WLAN_FEATURE_11AC
case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
- cbIniValue = 3;
+ cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
break;
case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
- cbIniValue = 4;
+ cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
break;
case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
- cbIniValue = 5;
+ cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
break;
case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
- cbIniValue = 6;
+ cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
break;
case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
- cbIniValue = 7;
+ cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
break;
case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
- cbIniValue = 8;
+ cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
break;
case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
- cbIniValue = 9;
+ cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
break;
#endif
default:
// return some invalid value
- cbIniValue = 10;
+ cbIniValue = eCSR_INI_CHANNEL_BONDING_STATE_MAX;
break;
}
+
return cbIniValue;
}
@@ -1637,6 +1639,9 @@
{
smsLog( pMac, LOGW, "Invalid CB value from ini in 5GHz band %d, CB DISABLED", pParam->channelBondingMode5GHz);
}
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ pMac->roam.configParam.channelBondingAPMode24GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingAPMode24GHz);
+#endif
pMac->roam.configParam.channelBondingMode5GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode5GHz);
pMac->roam.configParam.RTSThreshold = pParam->RTSThreshold;
pMac->roam.configParam.phyMode = pParam->phyMode;
@@ -1886,6 +1891,10 @@
pParam->isCoalesingInIBSSAllowed;
pMac->roam.configParam.allowDFSChannelRoam = pParam->allowDFSChannelRoam;
pMac->roam.configParam.sendDeauthBeforeCon = pParam->sendDeauthBeforeCon;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ pMac->roam.configParam.apHT40_24GEnabled = pParam->apHT40_24GEnabled;
+#endif
+
}
return status;
@@ -1903,6 +1912,9 @@
pParam->Is11dSupportEnabledOriginal = pMac->roam.configParam.Is11dSupportEnabledOriginal;
pParam->Is11hSupportEnabled = pMac->roam.configParam.Is11hSupportEnabled;
pParam->channelBondingMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode24GHz);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ pParam->channelBondingAPMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingAPMode24GHz);
+#endif
pParam->channelBondingMode5GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode5GHz);
pParam->RTSThreshold = pMac->roam.configParam.RTSThreshold;
pParam->phyMode = pMac->roam.configParam.phyMode;
@@ -2028,6 +2040,9 @@
pMac->roam.configParam.allowDFSChannelRoam;
pParam->sendDeauthBeforeCon = pMac->roam.configParam.sendDeauthBeforeCon;
csrSetChannels(pMac, pParam);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ pParam->apHT40_24GEnabled = pMac->roam.configParam.apHT40_24GEnabled;
+#endif
status = eHAL_STATUS_SUCCESS;
}
@@ -12015,10 +12030,14 @@
{
if(CSR_IS_CHANNEL_24GHZ(Channel) )
{
- /* TODO- SAP: HT40 Support in SAP 2.4Ghz mode is not enabled.
- so channel bonding in 2.4Ghz is configured as 20MHZ
- irrespective of the 'channelBondingMode24GHz' Parameter */
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if (CSR_IS_INFRA_AP(pProfile))
+ cbMode = pMac->roam.configParam.channelBondingAPMode24GHz;
+ else
+ cbMode = PHY_SINGLE_CHANNEL_CENTERED;
+#else
cbMode = PHY_SINGLE_CHANNEL_CENTERED;
+#endif
}
else
{
@@ -14206,6 +14225,9 @@
pParam->extendedRateSet.numRates);
pBuf += pParam->extendedRateSet.numRates;
}
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ *pBuf++ = (tANI_U8)pMac->roam.configParam.apHT40_24GEnabled;
+#endif
msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
pMsg->length = pal_cpu_to_be16(msgLen);
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index ca03f57..33ab1c1 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -2968,6 +2968,7 @@
return smeConfig.csrConfig.channelBondingMode5GHz;
}
+#ifdef WLAN_FEATURE_AP_HT40_24G
/* ---------------------------------------------------------------------------
\fn sme_GetChannelBondingMode24G
\brief get the channel bonding mode for 2.4G band
@@ -2981,9 +2982,35 @@
sme_GetConfigParam(pMac, &smeConfig);
- return smeConfig.csrConfig.channelBondingMode24GHz;
+ return smeConfig.csrConfig.channelBondingAPMode24GHz;
}
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateChannelBondingMode24G
+ \brief update the channel bonding mode for 2.4G band
+ \param hHal - HAL handle
+ \param cbMode - channel bonding mode
+ \return
+ ---------------------------------------------------------------------------*/
+void sme_UpdateChannelBondingMode24G(tHalHandle hHal, tANI_U8 cbMode)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+ tSmeConfigParams smeConfig;
+
+ vos_mem_zero(&smeConfig, sizeof (tSmeConfigParams));
+ sme_GetConfigParam(pMac, &smeConfig);
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("Previous Channel Bonding : = %d"),
+ smeConfig.csrConfig.channelBondingAPMode24GHz);
+
+ smeConfig.csrConfig.channelBondingAPMode24GHz = cbMode;
+ sme_UpdateConfig(hHal, &smeConfig);
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+ FL("New Channel Bonding : = %d"),
+ sme_GetChannelBondingMode24G(hHal));
+ return;
+}
+#endif
/* ---------------------------------------------------------------------------
\fn sme_RoamConnect
@@ -10251,6 +10278,36 @@
}
/*
+ * SME API to stringify bonding mode. (hostapd convention)
+ */
+
+static const char* sme_CBMode2String( tANI_U32 mode)
+{
+ switch (mode)
+ {
+ case eCSR_INI_SINGLE_CHANNEL_CENTERED:
+ return "HT20";
+ case eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY:
+ return "HT40-"; /* lower secondary channel */
+ case eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY:
+ return "HT40+"; /* upper secondary channel */
+#ifdef WLAN_FEATURE_11AC
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+ return "VHT80+40+"; /* upper secondary channels */
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+ return "VHT80+40-"; /* 1 lower and 2 upper secondary channels */
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+ return "VHT80-40+"; /* 2 lower and 1 upper secondary channels */
+ case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+ return "VHT80-40-"; /* lower secondary channels */
+#endif
+ default:
+ VOS_ASSERT(0);
+ return "Unknown";
+ }
+}
+
+/*
* SME API to determine the channel bonding mode
*/
VOS_STATUS sme_SelectCBMode(tHalHandle hHal, eCsrPhyMode eCsrPhyMode, tANI_U8 channel)
@@ -10275,8 +10332,15 @@
return VOS_STATUS_SUCCESS;
}
+ sme_GetConfigParam(pMac, &smeConfig);
+
/* If channel bonding mode is not required */
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if ( !pMac->roam.configParam.channelBondingMode5GHz
+ && !smeConfig.csrConfig.apHT40_24GEnabled ) {
+#else
if ( !pMac->roam.configParam.channelBondingMode5GHz ) {
+#endif
return VOS_STATUS_SUCCESS;
}
@@ -10291,30 +10355,46 @@
channel == 116 || channel == 149 )
{
smeConfig.csrConfig.channelBondingMode5GHz =
- PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW - 1;
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
}
else if ( channel == 40 || channel == 56 || channel == 104 ||
channel == 120 || channel == 153 )
{
smeConfig.csrConfig.channelBondingMode5GHz =
- PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW - 1;
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
}
else if ( channel == 44 || channel == 60 || channel == 108 ||
channel == 124 || channel == 157 )
{
smeConfig.csrConfig.channelBondingMode5GHz =
- PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH -1;
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
}
else if ( channel == 48 || channel == 64 || channel == 112 ||
channel == 128 || channel == 144 || channel == 161 )
{
smeConfig.csrConfig.channelBondingMode5GHz =
- PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH - 1;
+ eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
}
else if ( channel == 165 )
{
- smeConfig.csrConfig.channelBondingMode5GHz = 0;
+ smeConfig.csrConfig.channelBondingMode5GHz =
+ eCSR_INI_SINGLE_CHANNEL_CENTERED;
}
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if (smeConfig.csrConfig.apHT40_24GEnabled)
+ {
+ if (channel >= 1 && channel <= 7)
+ smeConfig.csrConfig.channelBondingAPMode24GHz =
+ eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
+ else if (channel >= 8 && channel <= 13)
+ smeConfig.csrConfig.channelBondingAPMode24GHz =
+ eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
+ else if (channel ==14)
+ smeConfig.csrConfig.channelBondingAPMode24GHz =
+ eCSR_INI_SINGLE_CHANNEL_CENTERED;
+ }
+#endif
}
#endif
@@ -10326,19 +10406,37 @@
channel == 120 || channel == 128 || channel == 136 ||
channel == 144 || channel == 153 || channel == 161 )
{
- smeConfig.csrConfig.channelBondingMode5GHz = 1;
+ smeConfig.csrConfig.channelBondingMode5GHz =
+ eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
}
else if ( channel== 36 || channel == 44 || channel == 52 ||
channel == 60 || channel == 100 || channel == 108 ||
channel == 116 || channel == 124 || channel == 132 ||
channel == 140 || channel == 149 || channel == 157 )
{
- smeConfig.csrConfig.channelBondingMode5GHz = 2;
+ smeConfig.csrConfig.channelBondingMode5GHz =
+ eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
}
else if ( channel == 165 )
{
- smeConfig.csrConfig.channelBondingMode5GHz = 0;
+ smeConfig.csrConfig.channelBondingMode5GHz =
+ eCSR_INI_SINGLE_CHANNEL_CENTERED;
}
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if (smeConfig.csrConfig.apHT40_24GEnabled)
+ {
+ if (channel >= 1 && channel <= 7)
+ smeConfig.csrConfig.channelBondingAPMode24GHz =
+ eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
+ else if (channel >= 8 && channel <= 13)
+ smeConfig.csrConfig.channelBondingAPMode24GHz =
+ eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
+ else if (channel ==14)
+ smeConfig.csrConfig.channelBondingAPMode24GHz =
+ eCSR_INI_SINGLE_CHANNEL_CENTERED;
+ }
+#endif
}
/*
@@ -10352,10 +10450,27 @@
eCSR_DOT11_MODE_abg == eCsrPhyMode)
{
smeConfig.csrConfig.channelBondingMode5GHz = 0;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ } else if ( eCSR_DOT11_MODE_11g_ONLY == eCsrPhyMode)
+ smeConfig.csrConfig.channelBondingAPMode24GHz =
+ eCSR_INI_SINGLE_CHANNEL_CENTERED;
+#else
}
+#endif
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ FL("%s cbmode selected=%d bonding mode:%s"),
+ (channel <= 14) ? "2G" : "5G",
+ (channel <= 14) ? smeConfig.csrConfig.channelBondingAPMode24GHz :
+ smeConfig.csrConfig.channelBondingMode5GHz,
+ (channel <= 14) ?
+ sme_CBMode2String(smeConfig.csrConfig.channelBondingAPMode24GHz) :
+ sme_CBMode2String(smeConfig.csrConfig.channelBondingMode5GHz));
+#else
VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_WARN,
- "cbmode selected=%d", smeConfig.csrConfig.channelBondingMode5GHz);
+ "cbmode selected=%d", smeConfig.csrConfig.channelBondingMode5GHz);
+#endif
sme_UpdateConfig (pMac, &smeConfig);
return VOS_STATUS_SUCCESS;
diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c
index ed5a726..daaabf3 100644
--- a/CORE/SYS/legacy/src/utils/src/parserApi.c
+++ b/CORE/SYS/legacy/src/utils/src/parserApi.c
@@ -961,6 +961,39 @@
return eSIR_SUCCESS;
}
+#ifdef WLAN_FEATURE_AP_HT40_24G
+tSirRetStatus
+PopulateDot11fOBSSScanParameters(tpAniSirGlobal pMac,
+ tDot11fIEOBSSScanParameters *pDot11f,
+ tpPESession psessionEntry)
+{
+ pDot11f->present = 1;
+
+ pDot11f->obssScanPassiveDwell =
+ psessionEntry->obssHT40ScanParam.OBSSScanPassiveDwellTime;
+
+ pDot11f->obssScanActiveDwell =
+ psessionEntry->obssHT40ScanParam.OBSSScanActiveDwellTime;
+
+ pDot11f->bssChannelWidthTriggerScanInterval =
+ psessionEntry->obssHT40ScanParam.BSSChannelWidthTriggerScanInterval;
+
+ pDot11f->obssScanPassiveTotalPerChannel =
+ psessionEntry->obssHT40ScanParam.OBSSScanPassiveTotalPerChannel;
+
+ pDot11f->obssScanActiveTotalPerChannel =
+ psessionEntry->obssHT40ScanParam.OBSSScanActiveTotalPerChannel;
+
+ pDot11f->bssWidthChannelTransitionDelayFactor =
+ psessionEntry->obssHT40ScanParam.BSSWidthChannelTransitionDelayFactor;
+
+ pDot11f->obssScanActivityThreshold =
+ psessionEntry->obssHT40ScanParam.OBSSScanActivityThreshold;
+
+ return eSIR_SUCCESS;
+}
+#endif
+
tSirRetStatus
PopulateDot11fExtCap(tpAniSirGlobal pMac,
tDot11fIEExtCap *pDot11f,
@@ -983,7 +1016,12 @@
eSIR_SUCCESS)
PELOGE(limLog(pMac, LOGE, FL("could not retrieve "
"24G Chan bond Length \n"));)
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ if (TRUE == val || pMac->roam.configParam.apHT40_24GEnabled)
+#else
if (TRUE == val)
+#endif
{
pDot11f->bssCoexistMgmtSupport = 1;
pDot11f->present = 1;