summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Zhang <paulz@codeaurora.org>2016-08-09 16:39:34 +0800
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-08-24 17:21:46 +0530
commita7d98a19ff6374ae224ab2e2ee5bb873cc9ab6af (patch)
treea7af71f07a0060f7efe5558fdaf26905fa9d44e0
parent6945b78f3c491d41a6942c084ca76b752ebb398c (diff)
qcacld-2.0: Ensure phymod and chanwidth are consistent
After connecting to a candidate AP, the STA checks the beacon's IE whether it needs to update channel width in function __schBeaconProcessForSession. Currently, it uses WMI_PEER_CHWIDTH to update the firmware parameter directly and ignores Phymoe. Firmware can only handle downgrade of channel width and not upgrade. If Phymode is initially set to VHT20 and later if channel width is to be changed to VHT80. This has to be sent to firmware explicity via PHYMODE WMI command otherwise firmware will ASSERT. Fix is to send phymode along with channel width. Change-Id: Id7405ab1c80bca8d7647b562af28f84b7501fd79 CRs-Fixed: 1052131
-rw-r--r--CORE/MAC/src/pe/lim/limProcessActionFrame.c2
-rw-r--r--CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c7
-rw-r--r--CORE/MAC/src/pe/lim/limUtils.c4
-rw-r--r--CORE/MAC/src/pe/lim/limUtils.h2
-rw-r--r--CORE/MAC/src/pe/sch/schBeaconProcess.c20
-rw-r--r--CORE/SERVICES/WMA/wma.c31
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c1
-rw-r--r--CORE/WDA/inc/legacy/halMsgApi.h3
8 files changed, 59 insertions, 11 deletions
diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
index d9edc9c7b22a..210e38b7fe16 100644
--- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
@@ -618,7 +618,7 @@ __limProcessOperatingModeActionFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo
ch_bw = eHT_CHANNEL_WIDTH_20MHZ;
}
limCheckVHTOpModeChange(pMac, psessionEntry,
- ch_bw,
+ ch_bw, MODE_MAX,
pSta->staIndex, pHdr->sa);
}
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 8e9abca3c75a..866f7b648c6b 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -60,7 +60,7 @@
#include "regdomain_common.h"
#include "rrmApi.h"
#include "nan_datapath.h"
-
+#include "wma.h"
#include "sapApi.h"
#if defined(FEATURE_WLAN_ESE) && !defined(FEATURE_WLAN_ESE_UPLOAD)
@@ -5223,6 +5223,11 @@ static void __limProcessSmeSetHT2040Mode(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
vos_mem_copy(pHtOpMode->peer_mac, &pStaDs->staAddr,
sizeof(tSirMacAddr));
pHtOpMode->smesessionId = sessionId;
+ pHtOpMode->chanMode = wma_chan_to_mode(
+ psessionEntry->currentOperChannel,
+ psessionEntry->htSecondaryChannelOffset,
+ psessionEntry->vhtCapability,
+ psessionEntry->dot11mode);
msg.type = WDA_UPDATE_OP_MODE;
msg.reserved = 0;
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index cac705450caa..626ab4bc02bc 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -7361,11 +7361,13 @@ void limPmfSaQueryTimerHandler(void *pMacGlobal, tANI_U32 param)
#ifdef WLAN_FEATURE_11AC
tANI_BOOLEAN limCheckVHTOpModeChange( tpAniSirGlobal pMac, tpPESession psessionEntry,
- tANI_U8 chanWidth, tANI_U8 staId, tANI_U8 *peerMac)
+ tANI_U8 chanWidth, tANI_U8 chanMode,
+ tANI_U8 staId, tANI_U8 *peerMac)
{
tUpdateVHTOpMode tempParam;
tempParam.opMode = chanWidth;
+ tempParam.chanMode = chanMode;
tempParam.staId = staId;
tempParam.smesessionId = psessionEntry->smeSessionId;
vos_mem_copy(tempParam.peer_mac, peerMac,
diff --git a/CORE/MAC/src/pe/lim/limUtils.h b/CORE/MAC/src/pe/lim/limUtils.h
index 7c9635653462..9b59b41e50f6 100644
--- a/CORE/MAC/src/pe/lim/limUtils.h
+++ b/CORE/MAC/src/pe/lim/limUtils.h
@@ -454,7 +454,7 @@ uint32_t lim_get_max_rate_flags(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds);
#ifdef WLAN_FEATURE_11AC
tANI_BOOLEAN limCheckVHTOpModeChange( tpAniSirGlobal pMac, tpPESession psessionEntry,
- tANI_U8 chanWidth, tANI_U8 staId, tANI_U8 *peerMac);
+ tANI_U8 chanWidth, tANI_U8 chanMode, tANI_U8 staId, tANI_U8 *peerMac);
tANI_BOOLEAN limSetNssChange( tpAniSirGlobal pMac, tpPESession psessionEntry,
tANI_U8 rxNss, tANI_U8 staId, tANI_U8 *peerMac);
tANI_BOOLEAN limCheckMembershipUserPosition( tpAniSirGlobal pMac, tpPESession psessionEntry,
diff --git a/CORE/MAC/src/pe/sch/schBeaconProcess.c b/CORE/MAC/src/pe/sch/schBeaconProcess.c
index 4ed8aeaa202a..c6419cc25197 100644
--- a/CORE/MAC/src/pe/sch/schBeaconProcess.c
+++ b/CORE/MAC/src/pe/sch/schBeaconProcess.c
@@ -348,6 +348,8 @@ static void __schBeaconProcessForSession( tpAniSirGlobal pMac,
tANI_U8 operMode;
tANI_U8 chWidth = 0;
tANI_U8 skip_opmode_update = false;
+ WLAN_PHY_MODE chanMode;
+ ePhyChanBondState chanOffset;
#endif
#if defined FEATURE_WLAN_ESE || defined WLAN_FEATURE_VOWIFI
tPowerdBm regMax = 0,maxTxPower = 0;
@@ -501,6 +503,20 @@ static void __schBeaconProcessForSession( tpAniSirGlobal pMac,
if (NULL != pStaDs && (HAL_STA_INVALID_IDX != pStaDs->staIndex ) &&
(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != cbMode))
{
+ if (pBeacon->HTInfo.present && pBeacon->VHTOperation.present) {
+ chanOffset = limGet11ACPhyCBState(pMac,
+ pBeacon->channelNumber,
+ pBeacon->HTInfo.secondaryChannelOffset,
+ pBeacon->VHTOperation.chanCenterFreqSeg1,
+ psessionEntry);
+ chanMode = wma_chan_to_mode(pBeacon->channelNumber,
+ chanOffset,
+ psessionEntry->vhtCapability,
+ psessionEntry->dot11mode);
+ } else {
+ chanMode = MODE_MAX;
+ }
+
if (psessionEntry->vhtCapability && pBeacon->OperatingMode.present )
{
operMode = pStaDs->vhtSupportedChannelWidthSet ?
@@ -565,7 +581,7 @@ static void __schBeaconProcessForSession( tpAniSirGlobal pMac,
chWidth = eHT_CHANNEL_WIDTH_20MHZ;
}
limCheckVHTOpModeChange(pMac, psessionEntry,
- chWidth,
+ chWidth, chanMode,
pStaDs->staIndex, pMh->sa);
}
/* Update Nss setting */
@@ -640,7 +656,7 @@ static void __schBeaconProcessForSession( tpAniSirGlobal pMac,
}
}
limCheckVHTOpModeChange(pMac, psessionEntry,
- chWidth, pStaDs->staIndex, pMh->sa);
+ chWidth, chanMode, pStaDs->staIndex, pMh->sa);
}
}
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 4055836994bc..98090a2b7210 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -23853,11 +23853,34 @@ static void wma_finish_scan_req(tp_wma_handle wma_handle,
static void wma_process_update_opmode(tp_wma_handle wma_handle,
tUpdateVHTOpMode *update_vht_opmode)
{
- WMA_LOGD("%s: opMode = %d", __func__, update_vht_opmode->opMode);
+ struct wma_txrx_node *iface;
+ WLAN_PHY_MODE chanMode;
+ wmi_channel_width chanwidth;
+
+ iface = &wma_handle->interfaces[update_vht_opmode->smesessionId];
+ if (update_vht_opmode->chanMode == MODE_MAX)
+ chanMode = iface->chanmode;
+ else
+ chanMode = update_vht_opmode->chanMode;
+
+ WMA_LOGD("%s: opMode = %d, chanMode = %d",
+ __func__, update_vht_opmode->opMode, chanMode);
- wma_set_peer_param(wma_handle, update_vht_opmode->peer_mac,
- WMI_PEER_CHWIDTH, update_vht_opmode->opMode,
- update_vht_opmode->smesessionId);
+ chanwidth = chanmode_to_chanwidth(chanMode);
+ if (chanwidth < update_vht_opmode->opMode) {
+ WMA_LOGE("%s: stop changing chanwidth from %d to %d,",
+ __func__,
+ chanwidth, update_vht_opmode->opMode);
+ } else {
+ iface->chanmode = chanMode;
+ wma_set_peer_param(wma_handle, update_vht_opmode->peer_mac,
+ WMI_PEER_PHYMODE, chanMode,
+ update_vht_opmode->smesessionId);
+
+ wma_set_peer_param(wma_handle, update_vht_opmode->peer_mac,
+ WMI_PEER_CHWIDTH, update_vht_opmode->opMode,
+ update_vht_opmode->smesessionId);
+ }
}
static void wma_process_update_rx_nss(tp_wma_handle wma_handle,
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 94a0943d824c..20abd2184049 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -14176,6 +14176,7 @@ VOS_STATUS sme_notify_ht2040_mode(tHalHandle hHal, tANI_U16 staId,
vos_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
sizeof(tSirMacAddr));
pHtOpMode->smesessionId = sessionId;
+ pHtOpMode->chanMode = MODE_MAX;
msg.type = WDA_UPDATE_OP_MODE;
msg.reserved = 0;
diff --git a/CORE/WDA/inc/legacy/halMsgApi.h b/CORE/WDA/inc/legacy/halMsgApi.h
index 618c0316ffe5..baaf24e199d2 100644
--- a/CORE/WDA/inc/legacy/halMsgApi.h
+++ b/CORE/WDA/inc/legacy/halMsgApi.h
@@ -925,7 +925,8 @@ typedef struct
#ifdef WLAN_FEATURE_11AC
typedef struct
{
- tANI_U16 opMode;
+ tANI_U16 opMode;
+ tANI_U16 chanMode;
tANI_U16 staId;
tANI_U16 smesessionId;
tSirMacAddr peer_mac;