diff options
| author | Ryan Hsu <ryanhsu@qca.qualcomm.com> | 2014-07-17 20:02:53 -0700 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-07-22 22:01:34 -0700 |
| commit | e975841fa034511657eaeb1229d1efb082072687 (patch) | |
| tree | 1e98fe03b4e5aef3a8fa4fabc3dde16932da5af7 /CORE | |
| parent | 7174c1c1475264b0613a603da7082911bca86f8b (diff) | |
qcacld: sap: dfs nol and channel bonding
While starting BSS, if the primary channel is NOL, set all secondary
channels to NOL and randomly pick the new channel candidate.
Also fix the incorrect radar_found_timestamp, which is now using
vos_get_monotonic_boottime() and it is in the unit of microseconds.
Change-Id: Ic9a1e6d3a6f0b4f22f1158bd0f5474aa22e6faab
CRs-fixed: 695429
Diffstat (limited to 'CORE')
| -rw-r--r-- | CORE/MAC/src/include/sirParams.h | 2 | ||||
| -rw-r--r-- | CORE/SAP/src/sapApiLinkCntl.c | 10 | ||||
| -rw-r--r-- | CORE/SAP/src/sapChSelect.c | 15 | ||||
| -rw-r--r-- | CORE/SAP/src/sapFsm.c | 345 | ||||
| -rw-r--r-- | CORE/SAP/src/sapInternal.h | 6 | ||||
| -rw-r--r-- | CORE/SAP/src/sapModule.c | 25 |
6 files changed, 297 insertions, 106 deletions
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h index c25da409a03d..058ec3a5effc 100644 --- a/CORE/MAC/src/include/sirParams.h +++ b/CORE/MAC/src/include/sirParams.h @@ -69,6 +69,8 @@ typedef enum PHY_CHANNEL_BONDING_STATE_MAX = 11 }ePhyChanBondState; +#define MAX_BONDED_CHANNELS 4 + #define SIR_MIN(a,b) (((a) < (b)) ? (a) : (b)) #define SIR_MAX(a,b) (((a) > (b)) ? (a) : (b)) diff --git a/CORE/SAP/src/sapApiLinkCntl.c b/CORE/SAP/src/sapApiLinkCntl.c index f5c986c3fe6c..315c1cc3932b 100644 --- a/CORE/SAP/src/sapApiLinkCntl.c +++ b/CORE/SAP/src/sapApiLinkCntl.c @@ -429,7 +429,7 @@ WLANSAP_RoamCallback case eCSR_ROAM_DFS_RADAR_IND: VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, - "In %s, Received Radar Indication", __func__); + FL("Received Radar Indication")); /* sync to latest DFS-NOL */ sapSignalHDDevent(sapContext, NULL, eSAP_DFS_NOL_GET, @@ -437,11 +437,15 @@ WLANSAP_RoamCallback pMac->sap.SapDfsInfo.target_channel = sapIndicateRadar(sapContext, &pCsrRoamInfo->dfs_event); + + /* if there is an assigned next channel hopping */ if (0 < pMac->sap.SapDfsInfo.user_provided_target_channel) { - pMac->sap.SapDfsInfo.target_channel = - pMac->sap.SapDfsInfo.user_provided_target_channel; + pMac->sap.SapDfsInfo.target_channel = + pMac->sap.SapDfsInfo.user_provided_target_channel; + pMac->sap.SapDfsInfo.user_provided_target_channel = 0; } + pMac->sap.SapDfsInfo.cac_state = eSAP_DFS_DO_NOT_SKIP_CAC; sap_CacResetNotify(hHal); diff --git a/CORE/SAP/src/sapChSelect.c b/CORE/SAP/src/sapChSelect.c index 5a0691352b94..113b813e5703 100644 --- a/CORE/SAP/src/sapChSelect.c +++ b/CORE/SAP/src/sapChSelect.c @@ -618,7 +618,8 @@ v_BOOL_t sapChanSelInit(tHalHandle halHandle, pSpectCh = (tSapSpectChInfo *)vos_mem_malloc((pSpectInfoParams->numSpectChans) * sizeof(*pSpectCh)); if(pSpectCh == NULL) { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, VOS_MALLOC_ERR", __func__); + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + "In %s, VOS_MALLOC_ERR", __func__); return eSAP_FALSE; } @@ -630,11 +631,14 @@ v_BOOL_t sapChanSelInit(tHalHandle halHandle, pChans = pMac->scan.base20MHzChannels.channelList; // Fill the channel number in the spectrum in the operating freq band - for (channelnum = 0; channelnum < pSpectInfoParams->numSpectChans; channelnum++, pChans++) { + for (channelnum = 0; + channelnum < pSpectInfoParams->numSpectChans; + channelnum++, pChans++) { chSafe = VOS_TRUE; /* check if the channel is in NOL blacklist */ - if((sapDfsIsChannelInNolList(pSapCtx, *pChans))) + if(sapDfsIsChannelInNolList(pSapCtx, *pChans, + PHY_SINGLE_CHANNEL_CENTERED)) { VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Ch %d is in NOL list", __func__, *pChans); @@ -647,7 +651,7 @@ v_BOOL_t sapChanSelInit(tHalHandle halHandle, if (VOS_IS_DFS_CH(*pChans)) { chSafe = VOS_FALSE; VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, - "In %s, DFS Ch %d not considered for ACS", __func__, + "In %s, DFS Ch %d not considered for ACS", __func__, *pChans); continue; } @@ -658,7 +662,8 @@ v_BOOL_t sapChanSelInit(tHalHandle halHandle, if((safeChannels[i].channelNumber == *pChans) && (VOS_FALSE == safeChannels[i].isSafe)) { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Ch %d is not safe", + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, + "In %s, Ch %d is not safe", __func__, *pChans); chSafe = VOS_FALSE; break; diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c index a373898fd859..253bcce65bc8 100644 --- a/CORE/SAP/src/sapFsm.c +++ b/CORE/SAP/src/sapFsm.c @@ -869,7 +869,8 @@ static v_U8_t sapRandomChannelSel(ptSapContext sapContext) NV_CHANNEL_DFS) { isChannelNol = sapDfsIsChannelInNolList(sapContext, - sapContext->SapAllChnlList.channelList[i]); + sapContext->SapAllChnlList.channelList[i], + PHY_SINGLE_CHANNEL_CENTERED); if (VOS_TRUE == isChannelNol) { /* @@ -969,16 +970,176 @@ sapAcsChannelCheck(ptSapContext sapContext, v_U8_t channelNumber) } /* - * This Function Checks if a given channel is AVAILABLE or USABLE + * Mark the channels in NOL with time and eSAP_DFS_CHANNEL_UNAVAILABLE + */ +void sapMarkDfsChannels(ptSapContext sapContext, v_U8_t* channels, + v_U8_t numChannels, v_U64_t time) +{ + int i, j; + tSapDfsNolInfo *psapDfsChannelNolList = NULL; + v_U8_t nRegDomainDfsChannels; + tHalHandle hHal; + tpAniSirGlobal pMac; + + hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); + + if (NULL == channels) + return; + + if (NULL == hHal) { + VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + FL("invalid hHal")); + return; + } + + pMac = PMAC_STRUCT(hHal); + if (NULL == pMac) { + VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + FL("invalid pMac")); + return; + } + + /* + * Mark the current channel on which Radar is found + * in the NOL list as eSAP_DFS_CHANNEL_UNAVAILABLE. + */ + + psapDfsChannelNolList = pMac->sap.SapDfsInfo.sapDfsChannelNolList; + nRegDomainDfsChannels = pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels; + + for (i = 0; i < numChannels; i++) { + for (j = 0; j <= nRegDomainDfsChannels; j++) + { + if (psapDfsChannelNolList[j].dfs_channel_number == + channels[i]) + { + /* If channel is already in NOL, don't update it again. + * This is useful when marking bonding channels which are + * already unavailable. + */ + if( psapDfsChannelNolList[j].radar_status_flag == + eSAP_DFS_CHANNEL_UNAVAILABLE) + { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, + FL("Channel=%d already in NOL"), + channels[i]); + } + else + { + /* + * Capture the Radar Found timestamp on the Current + * Channel in ms. + */ + psapDfsChannelNolList[j].radar_found_timestamp = time; + /* Mark the Channel to be UNAVAILABLE for next 30 mins */ + psapDfsChannelNolList[j].radar_status_flag = + eSAP_DFS_CHANNEL_UNAVAILABLE; + + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, + FL("Channel=%d Added to NOL LIST"), + channels[i]); + } + } + } + } +} + + +/* + * This Function is to get bonding channels from primary channel. + * + */ +v_U8_t sapGetBondingChannels(ptSapContext sapContext, v_U8_t channel, + v_U8_t* channels, v_U8_t size, ePhyChanBondState chanBondState) +{ + tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); + tpAniSirGlobal pMac; + v_U8_t numChannel; + + if(channels == NULL) + return 0; + + if(size < MAX_BONDED_CHANNELS) return 0; + + if (NULL != hHal) + { + pMac = PMAC_STRUCT( hHal ); + } + else + return 0; + + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, + FL("cbmode: %d, channel: %d"), + chanBondState, channel); + + switch (chanBondState) { + case PHY_SINGLE_CHANNEL_CENTERED: + numChannel = 1; + channels[0] = channel; + break; + case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY: + numChannel = 2; + channels[0] = channel - 4; + channels[1] = channel; + break; + case PHY_DOUBLE_CHANNEL_LOW_PRIMARY: + numChannel = 2; + channels[0] = channel; + channels[1] = channel + 4; + break; +#ifdef WLAN_FEATURE_11AC + case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW: + numChannel = 4; + channels[0] = channel; + channels[1] = channel + 4; + channels[2] = channel + 8; + channels[3] = channel + 12; + break; + case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW: + numChannel = 4; + channels[0] = channel - 4; + channels[1] = channel; + channels[2] = channel + 4; + channels[3] = channel + 8; + break; + case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH: + numChannel = 4; + channels[0] = channel - 8; + channels[1] = channel - 4; + channels[2] = channel; + channels[3] = channel + 4; + break; + case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH: + numChannel = 4; + channels[0] = channel - 12; + channels[1] = channel - 8; + channels[2] = channel - 4; + channels[3] = channel; + break; +#endif + default: + numChannel = 1; + channels[0] = channel; + break; + } + + return numChannel; +} + +/* + * This Function Checks if a given bonded channel is AVAILABLE or USABLE * for DFS operation. */ v_BOOL_t -sapDfsIsChannelInNolList(ptSapContext sapContext, v_U8_t channelNumber) +sapDfsIsChannelInNolList(ptSapContext sapContext, v_U8_t channelNumber, + ePhyChanBondState chanBondState) { - int i; - unsigned long timeElapsedSinceLastRadar,timeWhenRadarFound,currentTime = 0; + int i, j; + v_U64_t timeElapsedSinceLastRadar,timeWhenRadarFound,currentTime = 0; tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); tpAniSirGlobal pMac; + v_U8_t channels[MAX_BONDED_CHANNELS]; + v_U8_t numChannels; if (NULL == hHal) { @@ -1002,17 +1163,24 @@ sapDfsIsChannelInNolList(ptSapContext sapContext, v_U8_t channelNumber) return VOS_FALSE; } - for (i =0 ; i< pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels; i++) + /* get the bonded channels */ + numChannels = sapGetBondingChannels(sapContext, channelNumber, channels, + MAX_BONDED_CHANNELS, chanBondState ); + + /* check for NOL, first on will break the loop */ + for (j=0; j < numChannels; j++) { - if(pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] - .dfs_channel_number == channelNumber) - { - if ( (pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] - .radar_status_flag == eSAP_DFS_CHANNEL_USABLE) - || - (pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] - .radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE) ) - { + for (i =0 ; i< pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels; i++) + { + if(pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .dfs_channel_number == channels[j]) + { + if ( (pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .radar_status_flag == eSAP_DFS_CHANNEL_USABLE) + || + (pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE) ) + { /* * Allow SAP operation on this channel * either the DFS channel has not been used @@ -1021,16 +1189,13 @@ sapDfsIsChannelInNolList(ptSapContext sapContext, v_U8_t channelNumber) * so, return FALSE. */ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, - "%s[%d]: Channel = %d" - "Not in NOL LIST, CHANNEL AVAILABLE", - __func__, __LINE__, pMac->sap.SapDfsInfo - .sapDfsChannelNolList[i] - .dfs_channel_number); - return VOS_FALSE; - } - else if (pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] - .radar_status_flag == eSAP_DFS_CHANNEL_UNAVAILABLE) - { + FL("Channel = %d not in NOL, CHANNEL AVAILABLE"), + pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .dfs_channel_number); + } + else if (pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .radar_status_flag == eSAP_DFS_CHANNEL_UNAVAILABLE) + { /* * If a DFS Channel is UNAVAILABLE then * check to see if it is past Non-occupancy-period @@ -1039,44 +1204,67 @@ sapDfsIsChannelInNolList(ptSapContext sapContext, v_U8_t channelNumber) * as the channel is not anymore in NON-Occupancy-Period. */ timeWhenRadarFound = pMac->sap.SapDfsInfo - .sapDfsChannelNolList[i] - .radar_found_timestamp; - currentTime = vos_timer_get_system_time(); + .sapDfsChannelNolList[i] + .radar_found_timestamp; + currentTime = vos_get_monotonic_boottime(); timeElapsedSinceLastRadar = currentTime - timeWhenRadarFound; - if (timeElapsedSinceLastRadar >= SAP_DFS_NON_OCCUPANCY_PERIOD) + if (timeElapsedSinceLastRadar >= SAP_DFS_NON_OCCUPANCY_PERIOD) { - pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] - .radar_status_flag = eSAP_DFS_CHANNEL_AVAILABLE; - - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, - "%s[%d]:Channel=%d" - "Not in NOL LIST,CHANNEL AVAILABLE", - __func__, __LINE__, pMac->sap.SapDfsInfo - .sapDfsChannelNolList[i] - .dfs_channel_number); - return VOS_FALSE; + pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .radar_status_flag = eSAP_DFS_CHANNEL_AVAILABLE; + pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .radar_found_timestamp = 0; + + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, + FL("Channel=%d not in NOL, CHANNEL AVAILABLE"), + pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .dfs_channel_number); } else { - /* - * Channel is not still available for SAP operation - * so return TRUE; As the Channel is still - * in Non-occupancy-Period. - */ - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, - "%s[%d]:Channel=%d" - "still in NOL LIST,CHANNEL UNAVAILABLE", - __func__, __LINE__, pMac->sap.SapDfsInfo - .sapDfsChannelNolList[i] - .dfs_channel_number); - return VOS_TRUE; + /* + * Channel is not still available for SAP operation + * so return TRUE; As the Channel is still + * in Non-occupancy-Period. + */ + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, + FL("Channel=%d still in NOL, CHANNEL UNAVAILABLE"), + pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .dfs_channel_number); + break; } - } - } + } + } /* if */ + } /* loop for dfs channels */ + + if (i < pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels) + break; + + } /* loop for bonded channels */ + + /* if any of the channel is not available, mark all available channels as + * unavailable with same time stamp. + */ + if (j < numChannels && + i < pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels) + { + sapMarkDfsChannels(sapContext, + channels, + numChannels, + pMac->sap.SapDfsInfo.sapDfsChannelNolList[i] + .radar_found_timestamp); + + /* set DFS-NOL back to keep it update-to-date in CNSS */ + sapSignalHDDevent(sapContext, NULL, eSAP_DFS_NOL_SET, + (v_PVOID_t) eSAP_STATUS_SUCCESS); + + return VOS_TRUE; } + return VOS_FALSE; } + /*========================================================================== FUNCTION sapGotoChannelSel @@ -2151,6 +2339,7 @@ sapFsm VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE; tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); tpAniSirGlobal pMac; + v_U32_t cbMode; if (NULL == hHal) { @@ -2309,16 +2498,24 @@ sapFsm } } #endif + + /* get the bonding mode */ + if (sapContext->channel <= 14) + cbMode = sme_GetChannelBondingMode24G(hHal); + else + cbMode = sme_GetChannelBondingMode5G(hHal); + /* check if channel is in DFS_NOL */ - if (sapDfsIsChannelInNolList(sapContext, sapContext->channel)) + if (sapDfsIsChannelInNolList(sapContext, sapContext->channel, + cbMode)) { v_U8_t ch; /* find a new available channel */ ch = sapRandomChannelSel(sapContext); VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, - "%s: channel %d is in DFS_NOL, StartBss on new channel %d", - __func__, sapContext->channel, ch); + FL("channel %d is in NOL, StartBss on new channel %d"), + sapContext->channel, ch); sapContext->channel = ch; sme_SelectCBMode(hHal, @@ -3358,9 +3555,6 @@ static VOS_STATUS sapGet5GHzChannelList(ptSapContext sapContext) v_U8_t sapIndicateRadar(ptSapContext sapContext, tSirSmeDfsEventInd *dfs_event) { v_U8_t target_channel = 0; - int i, j; - tSapDfsNolInfo *psapDfsChannelNolList = NULL; - v_U8_t nRegDomainDfsChannels; tHalHandle hHal; tpAniSirGlobal pMac; @@ -3401,35 +3595,8 @@ v_U8_t sapIndicateRadar(ptSapContext sapContext, tSirSmeDfsEventInd *dfs_event) sapGet5GHzChannelList(sapContext); - /* - * Mark the current channel on which Radar is found - * in the NOL list as eSAP_DFS_CHANNEL_UNAVAILABLE. - */ - - psapDfsChannelNolList = pMac->sap.SapDfsInfo.sapDfsChannelNolList; - nRegDomainDfsChannels = pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels; - for (i = 0; i < dfs_event->chan_list.nchannels; i++) { - for (j = 0; j <= nRegDomainDfsChannels; j++) - { - if (psapDfsChannelNolList[j].dfs_channel_number == - dfs_event->chan_list.channels[i]) - { - /* - * Capture the Radar Found timestamp on the Current Channel in - * ms. - */ - psapDfsChannelNolList[j].radar_found_timestamp = - vos_timer_get_system_time(); - /* Mark the Channel to be UNAVAILABLE for next 30 mins */ - psapDfsChannelNolList[j].radar_status_flag = - eSAP_DFS_CHANNEL_UNAVAILABLE; - - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, - FL("Channel = %d Added to NOL LIST"), - dfs_event->chan_list.channels[i]); - } - } - } + sapMarkDfsChannels(sapContext, dfs_event->chan_list.channels, + dfs_event->chan_list.nchannels, vos_get_monotonic_boottime()); /* * (1) skip static turbo channel as it will require STA to be in @@ -3513,7 +3680,7 @@ static int sapStopDfsCacTimer(ptSapContext sapContext) "In %s invalid hHal", __func__); return 0; } - pMac = PMAC_STRUCT( hHal ); + pMac = PMAC_STRUCT(hHal); if (VOS_TIMER_STATE_RUNNING != vos_timer_getCurrentState( diff --git a/CORE/SAP/src/sapInternal.h b/CORE/SAP/src/sapInternal.h index 46f1f77ecc79..6056e9507637 100644 --- a/CORE/SAP/src/sapInternal.h +++ b/CORE/SAP/src/sapInternal.h @@ -89,8 +89,8 @@ when who what, where, why /*---------------------------------------------------------------------------- * Defines * -------------------------------------------------------------------------*/ -//DFS Non Occupancy Period =30 minutes, in milliseconds -#define SAP_DFS_NON_OCCUPANCY_PERIOD (30 * 60 * 1000 ) +//DFS Non Occupancy Period =30 minutes, in microseconds +#define SAP_DFS_NON_OCCUPANCY_PERIOD (30 * 60 * 1000 * 1000) #define SAP_DEBUG // Used to enable or disable security on the BT-AMP link @@ -830,7 +830,7 @@ sapInitDfsChannelNolList(ptSapContext sapContext); * for DFS operation. */ v_BOOL_t sapDfsIsChannelInNolList(ptSapContext sapContext, - v_U8_t channelNumber); + v_U8_t channelNumber, ePhyChanBondState chanBondState); /*--------------------------------------------------------------------------- FUNCTION sapDfsCacTimerCallback diff --git a/CORE/SAP/src/sapModule.c b/CORE/SAP/src/sapModule.c index 1333f11918b1..14af1d03c609 100644 --- a/CORE/SAP/src/sapModule.c +++ b/CORE/SAP/src/sapModule.c @@ -3245,8 +3245,10 @@ WLANSAP_Get_DfsNol(v_PVOID_t pSapCtx) ptSapContext sapContext = (ptSapContext)pSapCtx; v_PVOID_t hHal = NULL; tpAniSirGlobal pMac = NULL; - unsigned long current_time, elapsed_time, found_time, left_time; + v_U64_t current_time, found_time, elapsed_time; + unsigned long left_time; tSapDfsNolInfo *dfs_nol = NULL; + v_BOOL_t bAvailable = FALSE; if (NULL == sapContext) { @@ -3282,13 +3284,20 @@ WLANSAP_Get_DfsNol(v_PVOID_t pSapCtx) if (!dfs_nol[i].dfs_channel_number) continue; - current_time = vos_timer_get_system_time(); + current_time = vos_get_monotonic_boottime(); found_time = dfs_nol[i].radar_found_timestamp; elapsed_time = abs(current_time - found_time); - /* check if it is out of non occupancy period */ - if (elapsed_time >= SAP_DFS_NON_OCCUPANCY_PERIOD) + /* check if channel is available + * if either channel is usable or available, or timer expired 30mins + */ + bAvailable = + ((dfs_nol[i].radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE) || + (dfs_nol[i].radar_status_flag == eSAP_DFS_CHANNEL_USABLE) || + (elapsed_time >= SAP_DFS_NON_OCCUPANCY_PERIOD)); + + if (bAvailable) { dfs_nol[i].radar_status_flag = eSAP_DFS_CHANNEL_AVAILABLE; dfs_nol[i].radar_found_timestamp = 0; @@ -3301,10 +3310,10 @@ WLANSAP_Get_DfsNol(v_PVOID_t pSapCtx) /* the time left in min */ left_time = SAP_DFS_NON_OCCUPANCY_PERIOD - elapsed_time; - left_time = left_time / (60 * 1000); + left_time = left_time / (60 * 1000 * 1000); VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "%s: Channel[%d] is UNAVAILABLE [%ld min left]", + "%s: Channel[%d] is UNAVAILABLE [%lu min left]", __func__, dfs_nol[i].dfs_channel_number, left_time); @@ -3429,5 +3438,9 @@ WLANSAP_Set_DfsNol(v_PVOID_t pSapCtx, eSapDfsNolType conf) __func__, conf); } + /* set DFS-NOL back to keep it update-to-date in CNSS */ + sapSignalHDDevent(sapContext, NULL, eSAP_DFS_NOL_SET, + (v_PVOID_t) eSAP_STATUS_SUCCESS); + return VOS_STATUS_SUCCESS; } |
