diff options
| -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; } |
