summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/MAC/src/include/sirParams.h2
-rw-r--r--CORE/SAP/src/sapApiLinkCntl.c10
-rw-r--r--CORE/SAP/src/sapChSelect.c15
-rw-r--r--CORE/SAP/src/sapFsm.c345
-rw-r--r--CORE/SAP/src/sapInternal.h6
-rw-r--r--CORE/SAP/src/sapModule.c25
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;
}