wlan:HT40 support on 2.4GHz band
Following changes are made as part of this gerrit
- Enabling HT40 on 2.4GHz
- Switching of HT40 to HT20
- Added new feature flag HT40_OBSS_SCAN
- Beacon offload extended to detect the changes in secondary
channel offset in HT operation IE.
Change-Id: I0fdafde198f44c0d51a85e9beaade2b60c6ac174
CRs-Fixed: 608188
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 849158d..5573d39 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -224,6 +224,7 @@
tANI_U8 sessionId;
tANI_U8 *p2pIe = NULL;
tANI_U32 txFlag = 0;
+ tANI_U32 chanbond24G = 0;
#ifndef GEN4_SCAN
return eSIR_FAILURE;
@@ -311,13 +312,13 @@
}
}
- /* Set channelbonding information as "disabled" when tunned to a 2.4 GHz channel */
- if( nChannelNum <= SIR_11B_CHANNEL_END)
+ /* Get HT40 capability for 2.4GHz band */
+ wlan_cfgGetInt(pMac,WNI_CFG_CHANNEL_BONDING_24G,&chanbond24G);
+ if( (nChannelNum <= SIR_11B_CHANNEL_END) && chanbond24G != TRUE)
{
pr.HTCaps.supportedChannelWidthSet = eHT_CHANNEL_WIDTH_20MHZ;
pr.HTCaps.shortGI40MHz = 0;
}
-
#ifdef WLAN_FEATURE_11AC
if (psessionEntry != NULL ) {
psessionEntry->vhtCapability = IS_DOT11_MODE_VHT(dot11mode);
@@ -636,10 +637,11 @@
PopulateDot11fVHTOperation( pMac, &pFrm->VHTOperation );
// we do not support multi users yet
//PopulateDot11fVHTExtBssLoad( pMac, &frm.VHTExtBssLoad );
- PopulateDot11fExtCap( pMac, &pFrm->ExtCap);
+ PopulateDot11fExtCap( pMac, &pFrm->ExtCap, psessionEntry);
}
#endif
+
if ( psessionEntry->pLimStartBssReq )
{
PopulateDot11fWPA( pMac, &( psessionEntry->pLimStartBssReq->rsnIE ),
@@ -1324,7 +1326,7 @@
limLog( pMac, LOG1, FL("Populate VHT IEs in Assoc Response"));
PopulateDot11fVHTCaps( pMac, &frm.VHTCaps );
PopulateDot11fVHTOperation( pMac, &frm.VHTOperation);
- PopulateDot11fExtCap( pMac, &frm.ExtCap);
+ PopulateDot11fExtCap( pMac, &frm.ExtCap, psessionEntry);
}
#endif
@@ -2153,10 +2155,9 @@
{
limLog( pMac, LOG1, FL("Populate VHT IEs in Assoc Request"));
PopulateDot11fVHTCaps( pMac, &pFrm->VHTCaps );
- PopulateDot11fExtCap( pMac, &pFrm->ExtCap);
}
#endif
-
+ PopulateDot11fExtCap( pMac, &pFrm->ExtCap, psessionEntry);
#if defined WLAN_FEATURE_VOWIFI_11R
if (psessionEntry->pLimJoinReq->is11Rconnection)
@@ -2585,9 +2586,9 @@
{
limLog( pMac, LOG1, FL("Populate VHT IEs in Re-Assoc Request"));
PopulateDot11fVHTCaps( pMac, &frm.VHTCaps );
- PopulateDot11fExtCap( pMac, &frm.ExtCap);
}
#endif
+ PopulateDot11fExtCap( pMac, &frm.ExtCap, psessionEntry);
nStatus = dot11fGetPackedReAssocRequestSize( pMac, &frm, &nPayload );
if ( DOT11F_FAILED( nStatus ) )
@@ -2998,7 +2999,7 @@
{
limLog( pMac, LOG1, FL("Populate VHT IEs in Re-Assoc Request"));
PopulateDot11fVHTCaps( pMac, &frm.VHTCaps );
- PopulateDot11fExtCap( pMac, &frm.ExtCap);
+ PopulateDot11fExtCap( pMac, &frm.ExtCap, psessionEntry);
}
#endif
diff --git a/CORE/MAC/src/pe/lim/limSendMessages.c b/CORE/MAC/src/pe/lim/limSendMessages.c
index 0c5d5d0..678cf3f 100644
--- a/CORE/MAC/src/pe/lim/limSendMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendMessages.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -19,7 +19,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/*
- * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
+ * Copyright (c) 2011-2014 Qualcomm Atheros, Inc.
* All Rights Reserved.
* Qualcomm Atheros Confidential and Proprietary.
*
@@ -56,8 +56,9 @@
{SIR_MAC_EDCA_PARAM_SET_EID, 0, {0, 0, EDCA_FILTER_MASK, 0}},
{SIR_MAC_QOS_CAPABILITY_EID, 0, {0, 0, QOS_FILTER_MASK, 0}},
{SIR_MAC_CHNL_SWITCH_ANN_EID, 1, {0, 0, 0, 0}},
- {SIR_MAC_HT_INFO_EID, 0, {0, 0, HT_BYTE0_FILTER_MASK, 0}},
- {SIR_MAC_HT_INFO_EID, 0, {2, 0, HT_BYTE2_FILTER_MASK, 0}},
+ {SIR_MAC_HT_INFO_EID, 0, {0, 0, HT_BYTE0_FILTER_MASK, 0}}, //primary channel
+ {SIR_MAC_HT_INFO_EID, 0, {1, 0, HT_BYTE1_FILTER_MASK, 0}}, //Secondary Channel
+ {SIR_MAC_HT_INFO_EID, 0, {2, 0, HT_BYTE2_FILTER_MASK, 0}}, //HT protection
{SIR_MAC_HT_INFO_EID, 0, {5, 0, HT_BYTE5_FILTER_MASK, 0}}
#if defined WLAN_FEATURE_VOWIFI
,{SIR_MAC_PWR_CONSTRAINT_EID, 0, {0, 0, 0, 0}}
@@ -704,7 +705,15 @@
return retCode;
}
-#ifdef WLAN_FEATURE_11AC
+/**
+ * \brief Send CB mode update to WDA
+ *
+ * \param pMac Pointer to the global MAC structure
+ *
+ * \param psessionEntry session entry
+ * pTempParam CB mode
+ * \return eSIR_SUCCESS on success, eSIR_FAILURE else
+ */
tSirRetStatus limSendModeUpdate(tpAniSirGlobal pMac,
tUpdateVHTOpMode *pTempParam,
tpPESession psessionEntry )
@@ -745,7 +754,6 @@
return retCode;
}
-#endif
#ifdef FEATURE_WLAN_TDLS_INTERNAL
/** ---------------------------------------------------------
diff --git a/CORE/MAC/src/pe/lim/limSendMessages.h b/CORE/MAC/src/pe/lim/limSendMessages.h
index 37b5b3e..e87df70 100644
--- a/CORE/MAC/src/pe/lim/limSendMessages.h
+++ b/CORE/MAC/src/pe/lim/limSendMessages.h
@@ -63,11 +63,11 @@
tpUpdateBeaconParams pUpdatedBcnParams,
tpPESession psessionEntry );
//tSirRetStatus limSendBeaconParams(tpAniSirGlobal pMac, tpUpdateBeaconParams pUpdatedBcnParams);
-#ifdef WLAN_FEATURE_11AC
tSirRetStatus limSendModeUpdate(tpAniSirGlobal pMac,
tUpdateVHTOpMode *tempParam,
tpPESession psessionEntry );
+#ifdef WLAN_FEATURE_11AC
tANI_U32 limGetCenterChannel(tpAniSirGlobal pMac,
tANI_U8 primarychanNum,
ePhyChanBondState secondaryChanOffset,
@@ -98,6 +98,7 @@
#define EDCA_FILTER_MASK 0xF0
#define QOS_FILTER_MASK 0xF0
#define HT_BYTE0_FILTER_MASK 0x0
+#define HT_BYTE1_FILTER_MASK 0x07
#define HT_BYTE2_FILTER_MASK 0xEB
#define HT_BYTE5_FILTER_MASK 0xFD
#define DS_PARAM_CHANNEL_MASK 0x0
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index 8d285b9..f9cf4c7 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -1280,10 +1280,6 @@
} /****** end limPrintMacAddr() ******/
-
-
-
-
/*
* limResetDeferredMsgQ()
*
@@ -7704,6 +7700,59 @@
}
}
+/**
+ * \brief verify the changes in channel bonding
+ *
+ * \param pMac Pointer to the global MAC structure
+ *
+ * \param psessionEntry session entry
+ * beaconSecChanWidth Secondary channel width
+ * advertized in beacon
+ * currentSecChanWidth Current configured width
+ * staId Station Id
+ * \return eSIR_SUCCESS on success, eSIR_FAILURE else
+ */
+tANI_BOOLEAN limCheckHTChanBondModeChange(tpAniSirGlobal pMac,
+ tpPESession psessionEntry,
+ tANI_U8 beaconSecChanWidth,
+ tANI_U8 currentSecChanWidth,
+ tANI_U8 staId)
+{
+ tUpdateVHTOpMode tempParam;
+ tANI_BOOLEAN fCbMode24G = FALSE;
+ tANI_BOOLEAN status = eANI_BOOLEAN_FALSE;
+
+ /* Moving from HT40 to HT20 operation*/
+ if (((PHY_DOUBLE_CHANNEL_LOW_PRIMARY == currentSecChanWidth) ||
+ (PHY_DOUBLE_CHANNEL_HIGH_PRIMARY == currentSecChanWidth))
+ && (PHY_SINGLE_CHANNEL_CENTERED == beaconSecChanWidth))
+ {
+ tempParam.opMode = eHT_CHANNEL_WIDTH_20MHZ;
+ tempParam.staId = staId;
+ fCbMode24G = TRUE;
+ }
+
+ /* Moving from HT20 to HT40 operation*/
+ if ((( PHY_DOUBLE_CHANNEL_LOW_PRIMARY == beaconSecChanWidth) ||
+ ( PHY_DOUBLE_CHANNEL_HIGH_PRIMARY == beaconSecChanWidth ))
+ && (PHY_SINGLE_CHANNEL_CENTERED == currentSecChanWidth))
+ {
+ tempParam.opMode = eHT_CHANNEL_WIDTH_40MHZ;
+ tempParam.staId = staId;
+ fCbMode24G = TRUE;
+ }
+
+ if (TRUE == fCbMode24G)
+ {
+ VOS_TRACE( VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
+ "Changing CBMODE to = %d staId = %d",
+ tempParam.opMode, tempParam.staId );
+ if( eSIR_SUCCESS == limSendModeUpdate(pMac, &tempParam, psessionEntry))
+ status = eANI_BOOLEAN_TRUE;
+ }
+ return status;
+}
+
#ifdef WLAN_FEATURE_11AC
tANI_BOOLEAN limCheckVHTOpModeChange( tpAniSirGlobal pMac, tpPESession psessionEntry, tANI_U8 chanWidth, tANI_U8 staId)
{
diff --git a/CORE/MAC/src/pe/lim/limUtils.h b/CORE/MAC/src/pe/lim/limUtils.h
index 526d577..32ea68a 100644
--- a/CORE/MAC/src/pe/lim/limUtils.h
+++ b/CORE/MAC/src/pe/lim/limUtils.h
@@ -398,10 +398,14 @@
tANI_U8 limGetCurrentOperatingChannel(tpAniSirGlobal pMac);
#ifdef WLAN_FEATURE_11AC
-tANI_BOOLEAN limCheckVHTOpModeChange( tpAniSirGlobal pMac,
+tANI_BOOLEAN limCheckVHTOpModeChange( tpAniSirGlobal pMac,
tpPESession psessionEntry, tANI_U8 chanWidth, tANI_U8 staId);
#endif
-
+tANI_BOOLEAN limCheckHTChanBondModeChange(tpAniSirGlobal pMac,
+ tpPESession psessionEntry,
+ tANI_U8 beaconSecChanWidth,
+ tANI_U8 currentSecChanWidth,
+ tANI_U8 staId);
#ifdef FEATURE_WLAN_DIAG_SUPPORT
typedef enum