wlan: SAPHT40 2.4GHz: Add new message type for setting HT20/40 mode
To update the SAP/P2P GO from HT20 to HT40 or viceversa,
a new message type for setting HT20/40 mode of SAP/P2P GO
is added. When SAP/P2P GO HT20/40 mode is changed, a message
is sent to Lim in order to change the beacon content accordingly.
Change-Id: Ic8a85ec17beb21cbc158818b43d498eedc1f440c
CRs-Fixed: 756593
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 97c96c8..28e34d3 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -3422,6 +3422,17 @@
tANI_U8 sessionId; // Session ID
} tSirChangeBIParams, *tpSirChangeBIParams;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+typedef struct sSirSetHT2040Mode
+{
+ tANI_U16 messageType;
+ tANI_U16 length;
+ tANI_U8 cbMode;
+ tSirMacAddr bssId;
+ tANI_U8 sessionId; // Session ID
+} tSirSetHT2040Mode, *tpSirSetHT2040Mode;
+#endif
+
typedef struct sSirOBSSHT40Param
{
tANI_U16 OBSSScanPassiveDwellTime;
diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h
index d90c8a9..6d95108 100644
--- a/CORE/MAC/inc/wniApi.h
+++ b/CORE/MAC/inc/wniApi.h
@@ -383,6 +383,9 @@
#endif /* FEATURE_WLAN_CH_AVOID */
eWNI_SME_HT40_OBSS_SCAN_IND, /* START and UPDATE OBSS SCAN Indication*/
eWNI_SME_HT40_STOP_OBSS_SCAN_IND, /* STOP OBSS SCAN indication */
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ eWNI_SME_SET_HT_2040_MODE, /* HT 20/40 indication in SAP case for 2.4GHz*/
+#endif
eWNI_SME_MAC_SPOOF_ADDR_IND,
eWNI_SME_MSG_TYPES_END
};
diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
index a6eb74c..21d1e1f 100644
--- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
+++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
@@ -2235,6 +2235,14 @@
"OBSS Scan Stop not started ");
}
break;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ case eWNI_SME_SET_HT_2040_MODE:
+ limProcessSmeReqMessages(pMac, limMsg);
+ vos_mem_free((v_VOID_t*)limMsg->bodyptr);
+ limMsg->bodyptr = NULL;
+ break;
+#endif
+
#ifdef FEATURE_WLAN_TDLS
case WDA_SET_TDLS_LINK_ESTABLISH_REQ_RSP:
{
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index e5c8413..47590aa 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -4590,7 +4590,118 @@
return;
} /*** end __limProcessSmeChangeBI(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf) ***/
+/** -------------------------------------------------------------
+\fn
+\brief handles indication message from HDD to update HT mode
+\param tpAniSirGlobal pMac
+\param tANI_U32 pMsgBuf
+\return None
+-------------------------------------------------------------*/
+#ifdef WLAN_FEATURE_AP_HT40_24G
+static void __limProcessSmeSetHT2040Mode(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
+{
+ tpSirSetHT2040Mode pSetHT2040Mode;
+ tpPESession psessionEntry;
+ tANI_U8 sessionId = 0;
+ tUpdateVHTOpMode *pHtOpMode = NULL;
+ vos_msg_t msg;
+ PELOG1(limLog(pMac, LOGRW,
+ FL("received Set HT 20/40 mode message")););
+
+ if(pMsgBuf == NULL)
+ {
+ limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));
+ return;
+ }
+
+ pSetHT2040Mode = (tpSirSetHT2040Mode)pMsgBuf;
+
+ if((psessionEntry = peFindSessionByBssid(pMac, pSetHT2040Mode->bssId,
+ &sessionId)) == NULL)
+ {
+ limLog(pMac, LOGE, FL("Session does not exist for given BSSID "));
+ limPrintMacAddr(pMac, pSetHT2040Mode->bssId, LOGE);
+ return;
+ }
+
+ limLog(pMac, LOGW, FL("Update session entry for cbMod=%d"),
+ pSetHT2040Mode->cbMode);
+
+ /*Update sessionEntry HT related fields*/
+ switch(pSetHT2040Mode->cbMode)
+ {
+ case PHY_SINGLE_CHANNEL_CENTERED:
+ psessionEntry->htSecondaryChannelOffset = PHY_SINGLE_CHANNEL_CENTERED;
+ psessionEntry->htRecommendedTxWidthSet = 0;
+ break;
+ case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
+ psessionEntry->htSecondaryChannelOffset =
+ PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
+ psessionEntry->htRecommendedTxWidthSet = 1;
+ break;
+ case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
+ psessionEntry->htSecondaryChannelOffset =
+ PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+ psessionEntry->htRecommendedTxWidthSet = 1;
+ break;
+ default:
+ limLog(pMac, LOGE,FL("Invalid cbMode"));
+ return;
+ }
+
+ limLog(pMac, LOGW, FL("Channel Bonding mode : %d"
+ " htSecondaryChannelOffset: %d"
+ " htRecommendedTxWidthSet :%d"),
+ pSetHT2040Mode->cbMode,
+ psessionEntry->htSecondaryChannelOffset,
+ psessionEntry->htRecommendedTxWidthSet);
+
+ limLog(pMac, LOGW, FL("Update Beacon IEs"));
+
+ /* Update beacon */
+ schSetFixedBeaconFields(pMac, psessionEntry);
+ limSendBeaconInd(pMac, psessionEntry);
+
+ /* Update OP Mode */
+ pHtOpMode = vos_mem_malloc(sizeof(tUpdateVHTOpMode));
+ if ( NULL == pHtOpMode )
+ {
+ limLog(pMac, LOGE,
+ FL("Not able to allocate memory for setting OP mode"));
+ return;
+ }
+
+ pHtOpMode->opMode = (psessionEntry->htSecondaryChannelOffset ==
+ PHY_SINGLE_CHANNEL_CENTERED)?
+ eHT_CHANNEL_WIDTH_20MHZ:eHT_CHANNEL_WIDTH_40MHZ;
+
+ /* Pass Self STA ID to FW. Based on Self STA ID FW will update the
+ * operating mode for all connected STA.
+ */
+
+ pHtOpMode->staId = psessionEntry->staId;
+
+ msg.type = WDA_UPDATE_OP_MODE;
+ msg.reserved = 0;
+ msg.bodyptr = pHtOpMode;
+
+ if (!VOS_IS_STATUS_SUCCESS(
+ vos_mq_post_message(VOS_MODULE_ID_WDA, &msg)))
+ {
+ limLog(pMac, LOGE,
+ FL("Not able to post WDA_UPDATE_OP_MODE message to WDA"));
+ vos_mem_free(pHtOpMode);
+ return;
+ }
+
+ limLog(pMac, LOGW,
+ FL("Notifed FW about OP mode: %d for staId=%d"),
+ pHtOpMode->opMode, pHtOpMode->staId);
+
+ return;
+}
+#endif
/** -------------------------------------------------------------
\fn limProcessSmeDelBaPeerInd
@@ -5776,6 +5887,12 @@
//Update the beaconInterval
__limProcessSmeChangeBI(pMac, pMsgBuf );
break;
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+ case eWNI_SME_SET_HT_2040_MODE:
+ __limProcessSmeSetHT2040Mode(pMac, pMsgBuf);
+ break;
+#endif
#if defined WLAN_FEATURE_VOWIFI
case eWNI_SME_NEIGHBOR_REPORT_REQ_IND: