qcacld-2.0: Skip 2GHz off channels when TDLS base channel is in 5GHz

In antenna sharing platform, if TDLS operates in the 5G band base
channel with NSS 2x2, it cannot accommodate 2G off channels in
TDLS operation. So in that scenario, 2G channels should be
skipped from TDLS off channels list.
Update driver to remove 2G band channels from supported off
channel list, when TDLS operates in 5G band base channel
with NSS 2x2.

Change-Id: I04aa00e1cecfae86570aa89d1743b54d55b2dc84
CRs-Fixed: 968206
This commit is contained in:
Kabilan Kannan 2016-01-27 20:20:50 -08:00 committed by syphyr
parent c95b83a100
commit e4b1f200c6
3 changed files with 58 additions and 7 deletions

View File

@ -2627,6 +2627,9 @@ void PopulateDot11fTdlsOffchannelParams(tpAniSirGlobal pMac,
tANI_U8 chanOffset;
tANI_U8 op_class;
tANI_U8 numClasses;
uint32_t band;
uint8_t nss_2g;
uint8_t nss_5g;
tANI_U8 classes[SIR_MAC_MAX_SUPP_OPER_CLASSES];
if (wlan_cfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
validChan, &numChans) != eSIR_SUCCESS)
@ -2639,14 +2642,28 @@ void PopulateDot11fTdlsOffchannelParams(tpAniSirGlobal pMac,
return;
}
/* validating the channel list for DFS channels */
for (i = 0U; i < numChans; i++)
{
if (NV_CHANNEL_DFS == vos_nv_getChannelEnabledState(validChan[i]))
{
if (IS_5G_CH(psessionEntry->currentOperChannel))
band = eCSR_BAND_5G;
else
band = eCSR_BAND_24;
nss_5g = VOS_MIN(pMac->vdev_type_nss_5g.tdls, pMac->user_configured_nss);
nss_2g = VOS_MIN(pMac->vdev_type_nss_2g.tdls, pMac->user_configured_nss);
/* validating the channel list for DFS and 2G channels */
for (i = 0U; i < numChans; i++) {
if (band == eCSR_BAND_24) {
if (NV_CHANNEL_DFS == vos_nv_getChannelEnabledState(validChan[i])) {
limLog(pMac, LOG1,
FL("skipping DFS channel %d from the valid channel list"),
validChan[i]);
continue;
}
} else if ((NSS_2x2_MODE == nss_5g) && (NSS_1x1_MODE == nss_2g) &&
(true == vos_nv_skip_dfs_and_2g(validChan[i]))){
limLog(pMac, LOG1,
FL("skipping DFS channel %d from the valid channel list"),
validChan[i]);
FL("skipping channel %d, nss_5g: %d, nss_2g: %d"),
validChan[i], nss_5g, nss_2g);
continue;
}

View File

@ -255,6 +255,7 @@ VOS_STATUS vos_nv_setRegDomain(void * clientCtxt, v_REGDOMAIN_t regId,
-------------------------------------------------------------------------*/
eNVChannelEnabledType vos_nv_getChannelEnabledState(v_U32_t rfChannel);
uint8_t vos_nv_skip_dfs_and_2g(uint32_t rf_channel);
VOS_STATUS vos_nv_get_dfs_region(uint8_t *dfs_region);
VOS_STATUS vos_nv_set_dfs_region(uint8_t dfs_region);

View File

@ -904,6 +904,39 @@ VOS_STATUS vos_nv_readDefaultCountryTable( uNvTables *tableData )
return status;
}
/**
* vos_nv_skip_dfs_and_2g() - skip dfs and 2g band channels
* @rf_channel: input channel enum to know, whether to skip or add the channel
*
* Return: true or false
*/
uint8_t vos_nv_skip_dfs_and_2g(uint32_t rf_channel)
{
uint32_t channel_loop;
eRfChannels channel_enum = INVALID_RF_CHANNEL;
uint8_t ret = false;
for (channel_loop = RF_CHAN_36;
channel_loop <= RF_CHAN_184; channel_loop++) {
if (rfChannels[channel_loop].channelNum == rf_channel) {
channel_enum = (eRfChannels)channel_loop;
break;
}
}
if (INVALID_RF_CHANNEL == channel_enum) {
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
FL("Invalid channel %d"), rf_channel);
ret = true;
goto exit_ok;
}
if (NV_CHANNEL_DFS == regChannels[channel_enum].enabled)
ret = true;
exit_ok:
return ret;
}
/**------------------------------------------------------------------------
\brief vos_nv_getChannelEnabledState -
\param rfChannel - input channel enum to know evabled state