wlan: 3rd set of Runtime Config items
Support for runtime configuration of
1. GET/SET CCXMODE
2. GET/SET FASTROAM
3. GET/SET OKCMODE
4. GET/SET FASTTRANSITION
5. GET/SET ROAMSCANCHANNELMINTIME
6. GET/SET SCANCHANNELTIME (MAX DWELL TIME)
7. GET/SET SCANHOMETIME
8. GET/SET ROAMINTRABAND
Change-Id: I363bac16486dd9b37d26c06ebf368269f206273b
CRs-Fixed: 466216
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index f9f25ca..8dfe915 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -363,6 +363,11 @@
#define CFG_ROAM_PREFER_5GHZ_MIN ( 0 )
#define CFG_ROAM_PREFER_5GHZ_MAX ( 1 )
#define CFG_ROAM_PREFER_5GHZ_DEFAULT ( 1 )
+
+#define CFG_ROAM_INTRA_BAND "gRoamIntraBand"
+#define CFG_ROAM_INTRA_BAND_MIN ( 0 )
+#define CFG_ROAM_INTRA_BAND_MAX ( 1 )
+#define CFG_ROAM_INTRA_BAND_DEFAULT ( 0 )
#endif
#define CFG_STAT_TIMER_INTERVAL_NAME "gStatTimerInterval"
@@ -790,8 +795,16 @@
#define CFG_IMMEDIATE_ROAM_RSSI_DIFF_MIN (0)
#define CFG_IMMEDIATE_ROAM_RSSI_DIFF_MAX (125)
#define CFG_IMMEDIATE_ROAM_RSSI_DIFF_DEFAULT (3)
+
#endif /* (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR) */
+#ifdef FEATURE_WLAN_OKC
+#define CFG_OKC_FEATURE_ENABLED_NAME "OkcEnabled"
+#define CFG_OKC_FEATURE_ENABLED_MIN (0)
+#define CFG_OKC_FEATURE_ENABLED_MAX (1)
+#define CFG_OKC_FEATURE_ENABLED_DEFAULT (1)
+#endif
+
#define CFG_QOS_WMM_PKT_CLASSIFY_BASIS_NAME "PktClassificationBasis" // DSCP or 802.1Q
#define CFG_QOS_WMM_PKT_CLASSIFY_BASIS_MIN (0)
#define CFG_QOS_WMM_PKT_CLASSIFY_BASIS_MAX (1)
@@ -1846,7 +1859,9 @@
v_U8_t RoamRssiDiff;
v_U8_t nImmediateRoamRssiDiff;
#endif
-
+#ifdef FEATURE_WLAN_OKC
+ v_BOOL_t isOkcIniFeatureEnabled;
+#endif
hdd_wmm_classification_t PktClassificationBasis; // DSCP or 802.1Q
v_BOOL_t bImplicitQosEnabled;
@@ -1949,6 +1964,7 @@
v_S31_t linkSpeedRssiHigh;
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
v_BOOL_t nRoamPrefer5GHz;
+ v_BOOL_t nRoamIntraBand;
#endif
v_S31_t linkSpeedRssiMid;
v_S31_t linkSpeedRssiLow;
@@ -2011,6 +2027,7 @@
VOS_STATUS hdd_cfg_get_config(hdd_context_t *pHddCtx, char *pBuf, int buflen);
eCsrPhyMode hdd_cfg_xlate_to_csr_phy_mode( eHddDot11Mode dot11Mode );
VOS_STATUS hdd_execute_config_command(hdd_context_t *pHddCtx, char *command);
+tANI_BOOLEAN hdd_is_okc_mode_enabled(hdd_context_t *pHddCtx);
#define FIELD_OFFSET(__type, __field) ((unsigned int)(&((__type *)0)->__field))
#define VAR_OFFSET( _Struct, _Var ) ( (unsigned int) FIELD_OFFSET(_Struct, _Var ) )
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index eaa78af..0bb14e0 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -96,6 +96,18 @@
{
sme_UpdateFastTransitionEnabled((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->isFastTransitionEnabled);
}
+
+static void cbNotifySetRoamIntraBand(hdd_context_t *pHddCtx, unsigned long NotifyId)
+{
+ sme_setRoamIntraBand((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->nRoamIntraBand);
+}
+#endif
+
+#ifdef FEATURE_WLAN_OKC
+static void cbNotifySetOkcFeatureEnabled(hdd_context_t *pHddCtx, unsigned long NotifyId)
+{
+ // at the point this routine is called, the value in the cfg_ini table has already been updated
+}
#endif
#ifdef FEATURE_WLAN_LFR
@@ -127,6 +139,12 @@
sme_setNeighborLookupRssiThreshold((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->nNeighborLookupRssiThreshold );
}
+static void cbNotifySetNeighborScanPeriod(hdd_context_t *pHddCtx, unsigned long NotifyId)
+{
+ // at the point this routine is called, the value in the cfg_ini table has already been updated
+ sme_setNeighborScanPeriod((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->nNeighborScanPeriod );
+}
+
static void cbNotifySetNeighborResultsRefreshPeriod(hdd_context_t *pHddCtx, unsigned long NotifyId)
{
// at the point this routine is called, the value in the cfg_ini table has already been updated
@@ -138,6 +156,18 @@
// at the point this routine is called, the value in the cfg_ini table has already been updated
sme_UpdateEmptyScanRefreshPeriod((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->nEmptyScanRefreshPeriod);
}
+
+static void cbNotifySetNeighborScanMinChanTime(hdd_context_t *pHddCtx, unsigned long NotifyId)
+{
+ // at the point this routine is called, the value in the cfg_ini table has already been updated
+ sme_setNeighborScanMinChanTime((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->nNeighborScanMinChanTime);
+}
+
+static void cbNotifySetNeighborScanMaxChanTime(hdd_context_t *pHddCtx, unsigned long NotifyId)
+{
+ // at the point this routine is called, the value in the cfg_ini table has already been updated
+ sme_setNeighborScanMaxChanTime((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->nNeighborScanMaxChanTime);
+}
#endif
REG_TABLE_ENTRY g_registry_table[] =
@@ -1004,6 +1034,15 @@
CFG_IMMEDIATE_ROAM_RSSI_DIFF_MAX,
cbNotifySetImmediateRoamRssiDiff, 0),
#endif
+#ifdef FEATURE_WLAN_OKC
+ REG_DYNAMIC_VARIABLE( CFG_OKC_FEATURE_ENABLED_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, isOkcIniFeatureEnabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OKC_FEATURE_ENABLED_DEFAULT,
+ CFG_OKC_FEATURE_ENABLED_MIN,
+ CFG_OKC_FEATURE_ENABLED_MAX,
+ cbNotifySetOkcFeatureEnabled, 0 ),
+#endif
REG_VARIABLE( CFG_QOS_WMM_PKT_CLASSIFY_BASIS_NAME , WLAN_PARAM_Integer,
hdd_config_t, PktClassificationBasis,
@@ -1379,12 +1418,13 @@
#endif
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
- REG_VARIABLE( CFG_NEIGHBOR_SCAN_TIMER_PERIOD_NAME, WLAN_PARAM_Integer,
+ REG_DYNAMIC_VARIABLE( CFG_NEIGHBOR_SCAN_TIMER_PERIOD_NAME, WLAN_PARAM_Integer,
hdd_config_t, nNeighborScanPeriod,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_NEIGHBOR_SCAN_TIMER_PERIOD_DEFAULT,
CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MIN,
- CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MAX ),
+ CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MAX,
+ cbNotifySetNeighborScanPeriod, 0 ),
REG_VARIABLE( CFG_NEIGHBOR_REASSOC_RSSI_THRESHOLD_NAME, WLAN_PARAM_Integer,
hdd_config_t, nNeighborReassocRssiThreshold,
@@ -1406,19 +1446,21 @@
VAR_FLAGS_OPTIONAL,
(void *)CFG_NEIGHBOR_SCAN_CHAN_LIST_DEFAULT ),
- REG_VARIABLE( CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_NAME, WLAN_PARAM_Integer,
+ REG_DYNAMIC_VARIABLE( CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_NAME, WLAN_PARAM_Integer,
hdd_config_t, nNeighborScanMinChanTime,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_DEFAULT,
CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MIN,
- CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MAX ),
+ CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MAX,
+ cbNotifySetNeighborScanMinChanTime, 0 ),
- REG_VARIABLE( CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_NAME, WLAN_PARAM_Integer,
+ REG_DYNAMIC_VARIABLE( CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_NAME, WLAN_PARAM_Integer,
hdd_config_t, nNeighborScanMaxChanTime,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_DEFAULT,
CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MIN,
- CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MAX ),
+ CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MAX,
+ cbNotifySetNeighborScanMaxChanTime, 0 ),
REG_VARIABLE( CFG_11R_NEIGHBOR_REQ_MAX_TRIES_NAME, WLAN_PARAM_Integer,
hdd_config_t, nMaxNeighborReqTries,
@@ -1789,6 +1831,15 @@
CFG_ROAM_PREFER_5GHZ_MIN,
CFG_ROAM_PREFER_5GHZ_MAX,
cbNotifySetRoamPrefer5GHz, 0 ),
+
+ REG_DYNAMIC_VARIABLE( CFG_ROAM_INTRA_BAND, WLAN_PARAM_Integer,
+ hdd_config_t, nRoamIntraBand,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ROAM_INTRA_BAND_DEFAULT,
+ CFG_ROAM_INTRA_BAND_MIN,
+ CFG_ROAM_INTRA_BAND_MAX,
+ cbNotifySetRoamIntraBand, 0 ),
+
#endif
REG_VARIABLE( CFG_P2P_DEVICE_ADDRESS_ADMINISTRATED_NAME, WLAN_PARAM_Integer,
@@ -2373,6 +2424,9 @@
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [RoamRssiDiff] Value = [%lu] ",pHddCtx->cfg_ini->RoamRssiDiff);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [ImmediateRoamRssiDiff] Value = [%lu] ",pHddCtx->cfg_ini->nImmediateRoamRssiDiff);
#endif
+#ifdef FEATURE_WLAN_OKC
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [OkcEnabled] Value = [%lu] ",pHddCtx->cfg_ini->isOkcIniFeatureEnabled);
+#endif
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [InfraDirAcVo] Value = [%u] ",pHddCtx->cfg_ini->InfraDirAcVo);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [InfraNomMsduSizeAcVo] Value = [0x%x] ",pHddCtx->cfg_ini->InfraNomMsduSizeAcVo);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [InfraMeanDataRateAcVo] Value = [0x%lx] ",pHddCtx->cfg_ini->InfraMeanDataRateAcVo);
@@ -3646,6 +3700,7 @@
smeConfig.csrConfig.fIgnore_chan165 = pConfig->ignore_chan165;
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
smeConfig.csrConfig.nRoamPrefer5GHz = pConfig->nRoamPrefer5GHz;
+ smeConfig.csrConfig.nRoamIntraBand = pConfig->nRoamIntraBand;
#endif
smeConfig.csrConfig.fFirstScanOnly2GChnl = pConfig->enableFirstScan2GOnly;
@@ -3975,3 +4030,30 @@
kfree(clone);
return vstatus;
}
+
+/**---------------------------------------------------------------------------
+
+ \brief hdd_is_okc_mode_enabled() -
+
+ This function returns whether OKC mode is enabled or not
+
+ \param - pHddCtx - Pointer to the HDD Adapter.
+
+ \return - 1 for enabled, zero for disabled
+
+ --------------------------------------------------------------------------*/
+
+tANI_BOOLEAN hdd_is_okc_mode_enabled(hdd_context_t *pHddCtx)
+{
+ if (NULL == pHddCtx)
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL, "%s: pHddCtx is NULL", __func__);
+ return -EINVAL;
+ }
+
+#ifdef FEATURE_WLAN_OKC
+ return pHddCtx->cfg_ini->isOkcIniFeatureEnabled;
+#else
+ return eANI_BOOLEAN_FALSE;
+#endif
+}
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index a6a8494..f69d53b 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -4138,6 +4138,7 @@
{
#ifdef FEATURE_WLAN_OKC
struct net_device *dev = pAdapter->dev;
+ hdd_context_t *pHddCtx = (hdd_context_t*)pAdapter->pHddCtx;
ENTER();
hddLog(VOS_TRACE_LEVEL_INFO, "%s is going to notify supplicant of:", __func__);
@@ -4148,9 +4149,12 @@
return -EINVAL;
}
- dump_bssid(pRoamInfo->bssid);
- cfg80211_pmksa_candidate_notify(dev, index,
+ if (eANI_BOOLEAN_TRUE == hdd_is_okc_mode_enabled(pHddCtx))
+ {
+ dump_bssid(pRoamInfo->bssid);
+ cfg80211_pmksa_candidate_notify(dev, index,
pRoamInfo->bssid, preauth, GFP_KERNEL);
+ }
#endif /* FEATURE_WLAN_OKC */
return 0;
}
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index d001fa6..0bdbcf3 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -626,12 +626,12 @@
else if (strncmp(command, "SETROAMSCANPERIOD", 17) == 0)
{
tANI_U8 *value = command;
- tANI_U16 emptyScanRefreshPeriod = CFG_EMPTY_SCAN_REFRESH_PERIOD_DEFAULT;
+ tANI_U16 neighborEmptyScanRefreshPeriod = CFG_EMPTY_SCAN_REFRESH_PERIOD_DEFAULT;
/* input refresh period is in terms of seconds */
/* Move pointer to ahead of SETROAMSCANPERIOD<delimiter> */
value = value + 18;
/* Convert the value from ascii to integer */
- ret = kstrtou16(value, 10, &emptyScanRefreshPeriod);
+ ret = kstrtou16(value, 10, &neighborEmptyScanRefreshPeriod);
if (ret < 0)
{
/* If the input value is greater than max value of datatype, then also
@@ -646,13 +646,13 @@
goto exit;
}
- emptyScanRefreshPeriod = emptyScanRefreshPeriod * 1000;
- if ((emptyScanRefreshPeriod < CFG_EMPTY_SCAN_REFRESH_PERIOD_MIN) ||
- (emptyScanRefreshPeriod > CFG_EMPTY_SCAN_REFRESH_PERIOD_MAX))
+ neighborEmptyScanRefreshPeriod = neighborEmptyScanRefreshPeriod * 1000;
+ if ((neighborEmptyScanRefreshPeriod < CFG_EMPTY_SCAN_REFRESH_PERIOD_MIN) ||
+ (neighborEmptyScanRefreshPeriod > CFG_EMPTY_SCAN_REFRESH_PERIOD_MAX))
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "Empty scan refresh period value %d is out of range"
- " (Min: %d Max: %d)", emptyScanRefreshPeriod/1000,
+ "Neighbor empty scan results refresh period value %d is out of range"
+ " (Min: %d Max: %d)", neighborEmptyScanRefreshPeriod/1000,
(CFG_EMPTY_SCAN_REFRESH_PERIOD_MIN/1000),
(CFG_EMPTY_SCAN_REFRESH_PERIOD_MAX/1000));
ret = -EINVAL;
@@ -661,10 +661,10 @@
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: Received Command to Set roam scan period"
- " (Empty Scan refresh period) = %d", __func__, emptyScanRefreshPeriod/1000);
+ " (Empty Scan refresh period) = %d", __func__, neighborEmptyScanRefreshPeriod/1000);
- pHddCtx->cfg_ini->nEmptyScanRefreshPeriod = emptyScanRefreshPeriod;
- sme_UpdateEmptyScanRefreshPeriod((tHalHandle)(pHddCtx->hHal), emptyScanRefreshPeriod);
+ pHddCtx->cfg_ini->nEmptyScanRefreshPeriod = neighborEmptyScanRefreshPeriod;
+ sme_UpdateEmptyScanRefreshPeriod((tHalHandle)(pHddCtx->hHal), neighborEmptyScanRefreshPeriod);
}
else if (strncmp(command, "GETROAMSCANPERIOD", 17) == 0)
{
@@ -682,6 +682,65 @@
goto exit;
}
}
+ else if (strncmp(command, "SETROAMSCANREFRESHPERIOD", 24) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U16 neighborScanRefreshPeriod = CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_DEFAULT;
+ /* input refresh period is in terms of seconds */
+ /* Move pointer to ahead of SETROAMSCANREFRESHPERIOD<delimiter> */
+ value = value + 25;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou16(value, 10, &neighborScanRefreshPeriod);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou16 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou16 failed ",
+ "Input value may be out of range[%d - %d]",
+ __func__,
+ (CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MIN/1000),
+ (CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MAX/1000));
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ neighborScanRefreshPeriod = neighborScanRefreshPeriod * 1000;
+ if ((neighborScanRefreshPeriod < CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MIN) ||
+ (neighborScanRefreshPeriod > CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "Neighbor scan results refresh period value %d is out of range"
+ " (Min: %d Max: %d)", neighborScanRefreshPeriod/1000,
+ (CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MIN/1000),
+ (CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MAX/1000));
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to Set roam scan refresh period"
+ " (Scan refresh period) = %d", __func__, neighborScanRefreshPeriod/1000);
+
+ pHddCtx->cfg_ini->nNeighborResultsRefreshPeriod = neighborScanRefreshPeriod;
+ sme_setNeighborScanRefreshPeriod((tHalHandle)(pHddCtx->hHal), neighborScanRefreshPeriod);
+ }
+ else if (strncmp(command, "GETROAMSCANREFRESHPERIOD", 24) == 0)
+ {
+ tANI_U16 value = sme_getNeighborScanRefreshPeriod((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = snprintf(extra, sizeof(extra), "%s %d", "GETROAMSCANREFRESHPERIOD", (value/1000));
+ /* Returned value is in units of seconds */
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
else if (strncmp(command, "SETROAMDELTA", 12) == 0)
@@ -855,6 +914,450 @@
goto exit;
}
}
+ else if (strncmp(command, "GETCCXMODE", 10) == 0)
+ {
+ tANI_BOOLEAN ccxMode = sme_getIsCcxFeatureEnabled((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = snprintf(extra, sizeof(extra), "%s %d", "GETCCXMODE", ccxMode);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "GETOKCMODE", 10) == 0)
+ {
+ tANI_BOOLEAN okcMode = hdd_is_okc_mode_enabled(pHddCtx);
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = snprintf(extra, sizeof(extra), "%s %d", "GETOKCMODE", okcMode);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "GETFASTROAM", 10) == 0)
+ {
+ tANI_BOOLEAN lfrMode = sme_getIsLfrFeatureEnabled((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = snprintf(extra, sizeof(extra), "%s %d", "GETFASTROAM", lfrMode);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "GETFASTTRANSITION", 17) == 0)
+ {
+ tANI_BOOLEAN ft = sme_getIsFtFeatureEnabled((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = snprintf(extra, sizeof(extra), "%s %d", "GETFASTTRANSITION", ft);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "SETROAMSCANCHANNELMINTIME", 25) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 minTime = CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_DEFAULT;
+
+ /* Move pointer to ahead of SETROAMSCANCHANNELMINTIME<delimiter> */
+ value = value + 26;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &minTime);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed range [%d - %d]", __func__,
+ CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MIN,
+ CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((minTime < CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MIN) ||
+ (minTime > CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "scan min channel time value %d is out of range"
+ " (Min: %d Max: %d)", minTime,
+ CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MIN,
+ CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to change channel min time = %d", __func__, minTime);
+
+ pHddCtx->cfg_ini->nNeighborScanMinChanTime = minTime;
+ sme_setNeighborScanMinChanTime((tHalHandle)(pHddCtx->hHal), minTime);
+ }
+ else if (strncmp(command, "GETROAMSCANCHANNELMINTIME", 25) == 0)
+ {
+ tANI_U16 val = sme_getNeighborScanMinChanTime((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ /* value is interms of msec */
+ len = snprintf(extra, sizeof(extra), "%s %d", "GETROAMSCANCHANNELMINTIME", val);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "SETSCANCHANNELTIME", 18) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 maxTime = CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_DEFAULT;
+
+ /* Move pointer to ahead of SETSCANCHANNELTIME<delimiter> */
+ value = value + 19;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &maxTime);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed range [%d - %d]", __func__,
+ CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MIN,
+ CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((maxTime < CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MIN) ||
+ (maxTime > CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "lfr mode value %d is out of range"
+ " (Min: %d Max: %d)", maxTime,
+ CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MIN,
+ CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to change channel max time = %d", __func__, maxTime);
+
+ pHddCtx->cfg_ini->nNeighborScanMaxChanTime = maxTime;
+ sme_setNeighborScanMaxChanTime((tHalHandle)(pHddCtx->hHal), maxTime);
+ }
+ else if (strncmp(command, "GETSCANCHANNELTIME", 18) == 0)
+ {
+ tANI_U16 val = sme_getNeighborScanMaxChanTime((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ /* value is interms of msec */
+ len = snprintf(extra, sizeof(extra), "%s %d", "GETSCANCHANNELTIME", val);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "SETSCANHOMETIME", 15) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U16 val = CFG_NEIGHBOR_SCAN_TIMER_PERIOD_DEFAULT;
+
+ /* Move pointer to ahead of SETSCANHOMETIME<delimiter> */
+ value = value + 16;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou16(value, 10, &val);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou16 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou16 failed range [%d - %d]", __func__,
+ CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MIN,
+ CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((val < CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MIN) ||
+ (val > CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "scan home time value %d is out of range"
+ " (Min: %d Max: %d)", val,
+ CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MIN,
+ CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to change scan home time = %d", __func__, val);
+
+ pHddCtx->cfg_ini->nNeighborScanPeriod = val;
+ sme_setNeighborScanPeriod((tHalHandle)(pHddCtx->hHal), val);
+ }
+ else if (strncmp(command, "GETSCANHOMETIME", 15) == 0)
+ {
+ tANI_U16 val = sme_getNeighborScanPeriod((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ /* value is interms of msec */
+ len = snprintf(extra, sizeof(extra), "%s %d", "GETSCANHOMETIME", val);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "SETROAMINTRABAND", 16) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 val = CFG_ROAM_INTRA_BAND_DEFAULT;
+
+ /* Move pointer to ahead of SETROAMINTRABAND<delimiter> */
+ value = value + 17;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &val);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed range [%d - %d]", __func__,
+ CFG_ROAM_INTRA_BAND_MIN,
+ CFG_ROAM_INTRA_BAND_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((val < CFG_ROAM_INTRA_BAND_MIN) ||
+ (val > CFG_ROAM_INTRA_BAND_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "intra band mode value %d is out of range"
+ " (Min: %d Max: %d)", val,
+ CFG_ROAM_INTRA_BAND_MIN,
+ CFG_ROAM_INTRA_BAND_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to change intra band = %d", __func__, val);
+
+ pHddCtx->cfg_ini->nRoamIntraBand = val;
+ sme_setRoamIntraBand((tHalHandle)(pHddCtx->hHal), val);
+ }
+ else if (strncmp(command, "GETROAMINTRABAND", 16) == 0)
+ {
+ tANI_U16 val = sme_getRoamIntraBand((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ /* value is interms of msec */
+ len = snprintf(extra, sizeof(extra), "%s %d", "GETROAMINTRABAND", val);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+
+#endif
+#ifdef FEATURE_WLAN_LFR
+ else if (strncmp(command, "SETFASTROAM", 11) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 lfrMode = CFG_LFR_FEATURE_ENABLED_DEFAULT;
+
+ /* Move pointer to ahead of SETFASTROAM<delimiter> */
+ value = value + 12;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &lfrMode);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed range [%d - %d]", __func__,
+ CFG_LFR_FEATURE_ENABLED_MIN,
+ CFG_LFR_FEATURE_ENABLED_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((lfrMode < CFG_LFR_FEATURE_ENABLED_MIN) ||
+ (lfrMode > CFG_LFR_FEATURE_ENABLED_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "lfr mode value %d is out of range"
+ " (Min: %d Max: %d)", lfrMode,
+ CFG_LFR_FEATURE_ENABLED_MIN,
+ CFG_LFR_FEATURE_ENABLED_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to change lfr mode = %d", __func__, lfrMode);
+
+ pHddCtx->cfg_ini->isFastRoamIniFeatureEnabled = lfrMode;
+ sme_UpdateIsFastRoamIniFeatureEnabled((tHalHandle)(pHddCtx->hHal), lfrMode);
+ }
+#endif
+#ifdef WLAN_FEATURE_VOWIFI_11R
+ else if (strncmp(command, "SETFASTTRANSITION", 17) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 ft = CFG_FAST_TRANSITION_ENABLED_NAME_DEFAULT;
+
+ /* Move pointer to ahead of SETFASTROAM<delimiter> */
+ value = value + 18;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &ft);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed range [%d - %d]", __func__,
+ CFG_FAST_TRANSITION_ENABLED_NAME_MIN,
+ CFG_FAST_TRANSITION_ENABLED_NAME_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((ft < CFG_FAST_TRANSITION_ENABLED_NAME_MIN) ||
+ (ft > CFG_FAST_TRANSITION_ENABLED_NAME_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "ft mode value %d is out of range"
+ " (Min: %d Max: %d)", ft,
+ CFG_FAST_TRANSITION_ENABLED_NAME_MIN,
+ CFG_FAST_TRANSITION_ENABLED_NAME_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to change ft mode = %d", __func__, ft);
+
+ pHddCtx->cfg_ini->isFastTransitionEnabled = ft;
+ sme_UpdateFastTransitionEnabled((tHalHandle)(pHddCtx->hHal), ft);
+ }
+#endif
+#ifdef FEATURE_WLAN_CCX
+ else if (strncmp(command, "SETCCXMODE", 10) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 ccxMode = CFG_CCX_FEATURE_ENABLED_DEFAULT;
+
+ /* Move pointer to ahead of SETCCXMODE<delimiter> */
+ value = value + 11;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &ccxMode);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed range [%d - %d]", __func__,
+ CFG_CCX_FEATURE_ENABLED_MIN,
+ CFG_CCX_FEATURE_ENABLED_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((ccxMode < CFG_CCX_FEATURE_ENABLED_MIN) ||
+ (ccxMode > CFG_CCX_FEATURE_ENABLED_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "Ccx mode value %d is out of range"
+ " (Min: %d Max: %d)", ccxMode,
+ CFG_CCX_FEATURE_ENABLED_MIN,
+ CFG_CCX_FEATURE_ENABLED_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to change ccx mode = %d", __func__, ccxMode);
+
+ pHddCtx->cfg_ini->isCcxIniFeatureEnabled = ccxMode;
+ sme_UpdateIsCcxFeatureEnabled((tHalHandle)(pHddCtx->hHal), ccxMode);
+ }
+#endif
+#ifdef FEATURE_WLAN_OKC
+ else if (strncmp(command, "SETOKCMODE", 10) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 okcMode = CFG_OKC_FEATURE_ENABLED_DEFAULT;
+
+ /* Move pointer to ahead of SETOKCMODE<delimiter> */
+ value = value + 11;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &okcMode);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed range [%d - %d]", __func__,
+ CFG_OKC_FEATURE_ENABLED_MIN,
+ CFG_OKC_FEATURE_ENABLED_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((okcMode < CFG_OKC_FEATURE_ENABLED_MIN) ||
+ (okcMode > CFG_OKC_FEATURE_ENABLED_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "Okc mode value %d is out of range"
+ " (Min: %d Max: %d)", okcMode,
+ CFG_OKC_FEATURE_ENABLED_MIN,
+ CFG_OKC_FEATURE_ENABLED_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to change okc mode = %d", __func__, okcMode);
+
+ pHddCtx->cfg_ini->isOkcIniFeatureEnabled = okcMode;
+ }
#endif
else {
hddLog( VOS_TRACE_LEVEL_WARN, "%s: Unsupported GUI command %s",
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 901217b..ae3e622 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1086,6 +1086,7 @@
tANI_BOOLEAN fIgnore_chan165;
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
tANI_BOOLEAN nRoamPrefer5GHz;
+ tANI_BOOLEAN nRoamIntraBand;
#endif
tANI_U8 scanCfgAgingTime;
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index 7f524b9..d4c1a14 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -99,6 +99,10 @@
( \
(((pMac)->roam.configParam.nRoamPrefer5GHz)?eANI_BOOLEAN_TRUE:eANI_BOOLEAN_FALSE) \
)
+#define CSR_IS_ROAM_INTRA_BAND_ENABLED( pMac ) \
+( \
+ (((pMac)->roam.configParam.nRoamIntraBand)?eANI_BOOLEAN_TRUE:eANI_BOOLEAN_FALSE) \
+)
#endif
//Support for "Fast roaming" (i.e., CCX, LFR, or 802.11r.)
@@ -596,6 +600,7 @@
tANI_U8 RoamRssiDiff;
tANI_U8 nImmediateRoamRssiDiff;
tANI_BOOLEAN nRoamPrefer5GHz;
+ tANI_BOOLEAN nRoamIntraBand;
#endif
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index 54a3a39..dab7fa7 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -236,6 +236,16 @@
tANI_BOOLEAN csrNeighborRoamScanRspPending(tHalHandle hHal);
tANI_BOOLEAN csrNeighborMiddleOfRoaming(tHalHandle hHal);
VOS_STATUS csrNeighborRoamSetLookupRssiThreshold(tpAniSirGlobal pMac, v_U8_t neighborLookupRssiThreshold);
+VOS_STATUS csrNeighborRoamUpdateFastRoamingEnabled(tpAniSirGlobal pMac, const v_BOOL_t fastRoamEnabled);
+VOS_STATUS csrNeighborRoamUpdateCcxModeEnabled(tpAniSirGlobal pMac, const v_BOOL_t ccxMode);
+VOS_STATUS csrNeighborRoamChannelsFilterByCurrentBand(
+ tpAniSirGlobal pMac,
+ tANI_U8* pInputChannelList,
+ int inputNumOfChannels,
+ tANI_U8* pOutputChannelList,
+ int* pMergedOutputNumOfChannels
+ );
+
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
diff --git a/CORE/SME/inc/p2p_Api.h b/CORE/SME/inc/p2p_Api.h
index 9146476..c0b7554 100644
--- a/CORE/SME/inc/p2p_Api.h
+++ b/CORE/SME/inc/p2p_Api.h
@@ -520,6 +520,7 @@
tANI_U16 wait, tANI_BOOLEAN noack);
eHalStatus p2pCancelRemainOnChannel( tHalHandle hHal, tANI_U8 sessionId );
eHalStatus p2pSetPs( tHalHandle hHal, tP2pPsConfig *pNoA );
+tSirRFBand GetRFBand(tANI_U8 channel);
#ifdef WLAN_FEATURE_P2P_INTERNAL
eHalStatus p2pRemainOnChannelCallback(tHalHandle halHandle, void *pContext, eHalStatus scan_status);
eHalStatus P2P_DiscoverRequest(tHalHandle hHal, tANI_U8 SessionID, tP2PDiscoverRequest *pDiscoverRequest,
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 7681791..3233c8d 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2247,10 +2247,28 @@
\param nRoamPrefer5GHz Enable/Disable Roam prefer 5G runtime option
\- return Success or failure
-------------------------------------------------------------------------*/
-
eHalStatus sme_UpdateRoamPrefer5GHz(tHalHandle hHal, v_BOOL_t nRoamPrefer5GHz);
/* ---------------------------------------------------------------------------
+ \fn sme_setRoamIntraBand
+ \brief enable/disable Intra band roaming
+ This function is called through dynamic setConfig callback function
+ to configure the intra band roaming
+ \param hHal - HAL handle for device
+ \param nRoamIntraBand Enable/Disable Intra band roaming
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_setRoamIntraBand(tHalHandle hHal, const v_BOOL_t nRoamIntraBand);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_getRoamIntraBand
+ \brief get Intra band roaming
+ \param hHal - HAL handle for device
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+v_BOOL_t sme_getRoamIntraBand(tHalHandle hHal);
+
+/* ---------------------------------------------------------------------------
\fn sme_UpdateImmediateRoamRssiDiff
\brief Update nImmediateRoamRssiDiff
This function is called through dynamic setConfig callback function
@@ -2306,7 +2324,7 @@
--------------------------------------------------------------------------*/
eHalStatus sme_UpdateIsFastRoamIniFeatureEnabled(tHalHandle hHal,
- v_BOOL_t isFastRoamIniFeatureEnabled);
+ const v_BOOL_t isFastRoamIniFeatureEnabled);
#endif /* FEATURE_WLAN_LFR */
#ifdef FEATURE_WLAN_CCX
@@ -2322,7 +2340,7 @@
--------------------------------------------------------------------------*/
eHalStatus sme_UpdateIsCcxFeatureEnabled(tHalHandle hHal,
- v_BOOL_t isCcxIniFeatureEnabled);
+ const v_BOOL_t isCcxIniFeatureEnabled);
#endif /* FEATURE_WLAN_CCX */
@@ -2340,6 +2358,7 @@
eHalStatus sme_UpdateConfigFwRssiMonitoring(tHalHandle hHal,
v_BOOL_t fEnableFwRssiMonitoring);
+#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
/*--------------------------------------------------------------------------
\brief sme_setNeighborLookupRssiThreshold() - update neighbor lookup rssi threshold
This is a synchronuous call
@@ -2403,6 +2422,79 @@
--------------------------------------------------------------------------*/
v_U16_t sme_getEmptyScanRefreshPeriod(tHalHandle hHal);
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateEmptyScanRefreshPeriod
+ \brief Update nEmptyScanRefreshPeriod
+ This function is called through dynamic setConfig callback function
+ to configure nEmptyScanRefreshPeriod
+ Usage: adb shell iwpriv wlan0 setConfig nEmptyScanRefreshPeriod=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nEmptyScanRefreshPeriod - scan period following empty scan results.
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_UpdateEmptyScanRefreshPeriod(tHalHandle hHal, v_U16_t nEmptyScanRefreshPeriod);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_setNeighborScanMinChanTime
+ \brief Update nNeighborScanMinChanTime
+ This function is called through dynamic setConfig callback function
+ to configure gNeighborScanChannelMinTime
+ Usage: adb shell iwpriv wlan0 setConfig gNeighborScanChannelMinTime=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nNeighborScanMinChanTime - Channel minimum dwell time
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborScanMinChanTime(tHalHandle hHal, const v_U16_t nNeighborScanMinChanTime);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_setNeighborScanMaxChanTime
+ \brief Update nNeighborScanMaxChanTime
+ This function is called through dynamic setConfig callback function
+ to configure gNeighborScanChannelMaxTime
+ Usage: adb shell iwpriv wlan0 setConfig gNeighborScanChannelMaxTime=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nNeighborScanMinChanTime - Channel maximum dwell time
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborScanMaxChanTime(tHalHandle hHal, const v_U16_t nNeighborScanMaxChanTime);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_getNeighborScanMinChanTime
+ \brief get neighbor scan min channel time
+ \param hHal - The handle returned by macOpen.
+ \return v_U16_t - channel min time value
+ -------------------------------------------------------------------------*/
+v_U16_t sme_getNeighborScanMinChanTime(tHalHandle hHal);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_getNeighborScanMaxChanTime
+ \brief get neighbor scan max channel time
+ \param hHal - The handle returned by macOpen.
+ \return v_U16_t - channel max time value
+ -------------------------------------------------------------------------*/
+v_U16_t sme_getNeighborScanMaxChanTime(tHalHandle hHal);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_setNeighborScanPeriod
+ \brief Update nNeighborScanPeriod
+ This function is called through dynamic setConfig callback function
+ to configure nNeighborScanPeriod
+ Usage: adb shell iwpriv wlan0 setConfig nNeighborScanPeriod=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nNeighborScanPeriod - neighbor scan period
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborScanPeriod(tHalHandle hHal, const v_U16_t nNeighborScanPeriod);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_getNeighborScanPeriod
+ \brief get neighbor scan period
+ \param hHal - The handle returned by macOpen.
+ \return v_U16_t - neighbor scan period
+ -------------------------------------------------------------------------*/
+v_U16_t sme_getNeighborScanPeriod(tHalHandle hHal);
+
+#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
/*--------------------------------------------------------------------------
@@ -2471,22 +2563,39 @@
--------------------------------------------------------------------------*/
eHalStatus sme_GetCountryRevision(tHalHandle hHal, tANI_U8 *pRevision);
+/*--------------------------------------------------------------------------
+ \brief sme_getIsCcxFeatureEnabled() - get CCX feature enabled or not
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return TRUE (1) - if the CCX feature is enabled
+ FALSE (0) - if feature is disabled (compile or runtime)
+ \sa
+ --------------------------------------------------------------------------*/
+tANI_BOOLEAN sme_getIsCcxFeatureEnabled(tHalHandle hHal);
+
+/*--------------------------------------------------------------------------
+ \brief sme_getIsLfrFeatureEnabled() - get LFR feature enabled or not
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return TRUE (1) - if the feature is enabled
+ FALSE (0) - if feature is disabled (compile or runtime)
+ \sa
+ --------------------------------------------------------------------------*/
+tANI_BOOLEAN sme_getIsLfrFeatureEnabled(tHalHandle hHal);
+
+/*--------------------------------------------------------------------------
+ \brief sme_getIsFtFeatureEnabled() - get FT feature enabled or not
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return TRUE (1) - if the feature is enabled
+ FALSE (0) - if feature is disabled (compile or runtime)
+ \sa
+ --------------------------------------------------------------------------*/
+tANI_BOOLEAN sme_getIsFtFeatureEnabled(tHalHandle hHal);
+
#endif
/* ---------------------------------------------------------------------------
- \fn sme_UpdateEmptyScanRefreshPeriod
- \brief Update nnEmptyScanRefreshPeriod
- This function is called through dynamic setConfig callback function
- to configure nnEmptyScanRefreshPeriod
- Usage: adb shell iwpriv wlan0 setConfig nEmptyScanRefreshPeriod=[0 .. 60]
- \param hHal - HAL handle for device
- \param nEmptyScanRefreshPeriod - scan period following empty scan results.
- \- return Success or failure
- -------------------------------------------------------------------------*/
-
-eHalStatus sme_UpdateEmptyScanRefreshPeriod(tHalHandle hHal, v_U16_t nEmptyScanRefreshPeriod);
-
-/* ---------------------------------------------------------------------------
\fn sme_IsFeatureSupportedByFW
\brief Check if an feature is enabled by FW
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index bfe6476..d19657f 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -1526,6 +1526,7 @@
smsLog( pMac, LOG1, "nImmediateRoamRssiDiff = %d",
pMac->roam.configParam.nImmediateRoamRssiDiff );
pMac->roam.configParam.nRoamPrefer5GHz = pParam->nRoamPrefer5GHz;
+ pMac->roam.configParam.nRoamIntraBand = pParam->nRoamIntraBand;
#endif
#ifdef FEATURE_WLAN_LFR
pMac->roam.configParam.isFastRoamIniFeatureEnabled = pParam->isFastRoamIniFeatureEnabled;
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index 3a1b758..5810b84 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -328,6 +328,94 @@
}
}
+VOS_STATUS csrNeighborRoamUpdateFastRoamingEnabled(tpAniSirGlobal pMac, const v_BOOL_t fastRoamEnabled)
+{
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+
+ if (eCSR_NEIGHBOR_ROAM_STATE_CONNECTED == pNeighborRoamInfo->neighborRoamState)
+ {
+ if (VOS_TRUE == fastRoamEnabled)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Registering neighbor lookup DOWN event with TL, RSSI = %d"),
+ pNeighborRoamInfo->currentNeighborLookupThreshold);
+ /* Register Neighbor Lookup threshold callback with TL for DOWN event only */
+ vosStatus = WLANTL_RegRSSIIndicationCB(pMac->roam.gVosContext, (v_S7_t)pNeighborRoamInfo->currentNeighborLookupThreshold * (-1),
+ WLANTL_HO_THRESHOLD_DOWN,
+ csrNeighborRoamNeighborLookupDOWNCallback,
+ VOS_MODULE_ID_SME, pMac);
+ if (!VOS_IS_STATUS_SUCCESS(vosStatus))
+ {
+ //err msg
+ smsLog(pMac, LOGW, FL(" Couldn't register csrNeighborRoamNeighborLookupDOWNCallback with TL: Status = %d"), vosStatus);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ }
+ else if (VOS_FALSE == fastRoamEnabled)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Currently in CONNECTED state, so deregister all events"));
+ /* De-register existing lookup UP/DOWN, Rssi indications */
+ csrNeighborRoamDeregAllRssiIndication(pMac);
+ }
+ }
+ else if (eCSR_NEIGHBOR_ROAM_STATE_INIT == pNeighborRoamInfo->neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Currently in INIT state, Nothing to do"));
+ }
+ else
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOGE, FL("Unexpected state %d, returning failure"), pNeighborRoamInfo->neighborRoamState);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ return vosStatus;
+}
+
+#ifdef FEATURE_WLAN_CCX
+VOS_STATUS csrNeighborRoamUpdateCcxModeEnabled(tpAniSirGlobal pMac, const v_BOOL_t ccxMode)
+{
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+
+ if (eCSR_NEIGHBOR_ROAM_STATE_CONNECTED == pNeighborRoamInfo->neighborRoamState)
+ {
+ if (VOS_TRUE == ccxMode)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Registering neighbor lookup DOWN event with TL, RSSI = %d"),
+ pNeighborRoamInfo->currentNeighborLookupThreshold);
+ /* Register Neighbor Lookup threshold callback with TL for DOWN event only */
+ vosStatus = WLANTL_RegRSSIIndicationCB(pMac->roam.gVosContext, (v_S7_t)pNeighborRoamInfo->currentNeighborLookupThreshold * (-1),
+ WLANTL_HO_THRESHOLD_DOWN,
+ csrNeighborRoamNeighborLookupDOWNCallback,
+ VOS_MODULE_ID_SME, pMac);
+ if (!VOS_IS_STATUS_SUCCESS(vosStatus))
+ {
+ //err msg
+ smsLog(pMac, LOGW, FL(" Couldn't register csrNeighborRoamNeighborLookupDOWNCallback with TL: Status = %d"), vosStatus);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ }
+ else if (VOS_FALSE == ccxMode)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Currently in CONNECTED state, so deregister all events"));
+ /* De-register existing lookup UP/DOWN, Rssi indications */
+ csrNeighborRoamDeregAllRssiIndication(pMac);
+ }
+ }
+ else if (eCSR_NEIGHBOR_ROAM_STATE_INIT == pNeighborRoamInfo->neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Currently in INIT state, Nothing to do"));
+ }
+ else
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOGE, FL("Unexpected state %d, returning failure"), pNeighborRoamInfo->neighborRoamState);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ return vosStatus;
+}
+
+#endif
+
+
VOS_STATUS csrNeighborRoamSetLookupRssiThreshold(tpAniSirGlobal pMac, v_U8_t neighborLookupRssiThreshold)
{
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
@@ -2064,6 +2152,7 @@
int numOfChannels = 0, i = 0;
tANI_U8 *channelList = NULL;
tANI_U8 *pInChannelList = NULL;
+ tANI_U8 tmpChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN];
palZeroMemory(pMac->hHdd, &bgScanParams, sizeof(tCsrBGScanRequest));
@@ -2089,6 +2178,18 @@
}
pInChannelList = pMac->roam.validChannelList;
}
+
+ if (CSR_IS_ROAM_INTRA_BAND_ENABLED(pMac))
+ {
+ csrNeighborRoamChannelsFilterByCurrentBand(
+ pMac,
+ pInChannelList,
+ numOfChannels,
+ tmpChannelList,
+ &numOfChannels);
+ pInChannelList = tmpChannelList;
+ }
+
channelList = vos_mem_malloc( numOfChannels );
if( NULL == channelList )
{
@@ -2316,6 +2417,56 @@
/* ---------------------------------------------------------------------------
+ \fn csrNeighborRoamChannelsFilterByCurrentBand
+
+ \brief This function is used to filter out the channels
+ based on the currently associated AP channel
+
+ \param pMac - The handle returned by macOpen.
+ \param pInputChannelList - The input channel list
+ \param inputNumOfChannels - The number of channels in input channel list
+ \param pOutputChannelList - The output channel list
+ \param outputNumOfChannels - The number of channels in output channel list
+ \param pMergedOutputNumOfChannels - The final number of channels in the output channel list.
+
+ \return VOS_STATUS_SUCCESS on success, corresponding error code otherwise
+
+---------------------------------------------------------------------------*/
+
+VOS_STATUS csrNeighborRoamChannelsFilterByCurrentBand(
+ tpAniSirGlobal pMac,
+ tANI_U8* pInputChannelList,
+ int inputNumOfChannels,
+ tANI_U8* pOutputChannelList,
+ int* pMergedOutputNumOfChannels
+ )
+{
+ int i = 0;
+ int numChannels = 0;
+ tANI_U8 currAPoperationChannel = pMac->roam.neighborRoamInfo.currAPoperationChannel;
+ // Check for NULL pointer
+ if (!pInputChannelList) return eHAL_STATUS_E_NULL_VALUE;
+
+ // Check for NULL pointer
+ if (!pOutputChannelList) return eHAL_STATUS_E_NULL_VALUE;
+
+ for (i = 0; i < inputNumOfChannels; i++)
+ {
+ if (GetRFBand(currAPoperationChannel) == GetRFBand(pInputChannelList[i]))
+ {
+ pOutputChannelList[numChannels] = pInputChannelList[i];
+ numChannels++;
+ }
+ }
+
+ // Return final number of channels
+ *pMergedOutputNumOfChannels = numChannels;
+
+ return eHAL_STATUS_SUCCESS;
+}
+
+/* ---------------------------------------------------------------------------
+
\fn csrNeighborRoamMergeChannelLists
\brief This function is used to merge two channel list.
@@ -2434,11 +2585,27 @@
{
if (pNeighborBssDesc->pNeighborBssDescription->channel)
{
- VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
- "%s: [INFOLOG] Adding %d to Neighbor channel list", __func__,
- pNeighborBssDesc->pNeighborBssDescription->channel);
+ if (CSR_IS_ROAM_INTRA_BAND_ENABLED(pMac))
+ {
+ // Make sure to add only if its the same band
+ if (GetRFBand(pNeighborRoamInfo->currAPoperationChannel) ==
+ GetRFBand(pNeighborBssDesc->pNeighborBssDescription->channel))
+ {
+ VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: [INFOLOG] Adding %d to Neighbor channel list (Same band)\n", __func__,
+ pNeighborBssDesc->pNeighborBssDescription->channel);
channelList[numChannels] = pNeighborBssDesc->pNeighborBssDescription->channel;
numChannels++;
+ }
+ }
+ else
+ {
+ VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: [INFOLOG] Adding %d to Neighbor channel list\n", __func__,
+ pNeighborBssDesc->pNeighborBssDescription->channel);
+ channelList[numChannels] = pNeighborBssDesc->pNeighborBssDescription->channel;
+ numChannels++;
+ }
}
}
@@ -2831,15 +2998,25 @@
0, //NB: If 0, simply copy the input channel list to the output list.
&numOfChannels );
- currChannelListInfo->ChannelList =
- vos_mem_malloc(numOfChannels*sizeof(tANI_U8));
- if (NULL == currChannelListInfo->ChannelList)
- {
- smsLog(pMac, LOGE, FL("Memory allocation for Channel list failed"));
- return VOS_STATUS_E_RESOURCES;
- }
+ if (CSR_IS_ROAM_INTRA_BAND_ENABLED(pMac))
+ {
+ csrNeighborRoamChannelsFilterByCurrentBand(
+ pMac,
+ pNeighborRoamInfo->cfgParams.channelInfo.ChannelList,
+ pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels,
+ channelList,
+ &numOfChannels);
+ }
- vos_mem_copy(currChannelListInfo->ChannelList,
+ currChannelListInfo->ChannelList =
+ vos_mem_malloc(numOfChannels*sizeof(tANI_U8));
+ if (NULL == currChannelListInfo->ChannelList)
+ {
+ smsLog(pMac, LOGE, FL("Memory allocation for Channel list failed"));
+ return VOS_STATUS_E_RESOURCES;
+ }
+
+ vos_mem_copy(currChannelListInfo->ChannelList,
channelList, numOfChannels * sizeof(tANI_U8));
}
#ifdef FEATURE_WLAN_LFR
@@ -2896,8 +3073,24 @@
pNeighborRoamInfo->uEmptyScanCount
#endif
);
+ if (CSR_IS_ROAM_INTRA_BAND_ENABLED(pMac))
+ {
+ csrNeighborRoamChannelsFilterByCurrentBand(
+ pMac,
+ pMac->scan.occupiedChannels.channelList,
+ numOfChannels,
+ channelList,
+ &numOfChannels);
+ }
+ else
+ {
+ vos_mem_copy(channelList,
+ pMac->scan.occupiedChannels.channelList,
+ numOfChannels * sizeof(tANI_U8));
+ }
+
VOS_ASSERT(currChannelListInfo->ChannelList == NULL);
- currChannelListInfo->ChannelList = vos_mem_malloc(numOfChannels);
+ currChannelListInfo->ChannelList = vos_mem_malloc(numOfChannels * sizeof(tANI_U8));
if (NULL == currChannelListInfo->ChannelList)
{
@@ -2905,7 +3098,7 @@
return VOS_STATUS_E_RESOURCES;
}
vos_mem_copy(currChannelListInfo->ChannelList,
- pMac->scan.occupiedChannels.channelList,
+ channelList,
numOfChannels * sizeof(tANI_U8));
}
else
@@ -2946,6 +3139,17 @@
smsLog(pMac, LOGE, FL("Could not get valid channel list"));
return VOS_STATUS_E_FAILURE;
}
+
+ if (CSR_IS_ROAM_INTRA_BAND_ENABLED(pMac))
+ {
+ csrNeighborRoamChannelsFilterByCurrentBand(
+ pMac,
+ (tANI_U8 *)pMac->roam.validChannelList,
+ numOfChannels,
+ channelList,
+ &numOfChannels);
+ }
+
currChannelListInfo->ChannelList =
vos_mem_malloc(numOfChannels*sizeof(tANI_U8));
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 98bc4ce..43656a7 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -6913,6 +6913,47 @@
}
/* ---------------------------------------------------------------------------
+ \fn sme_setRoamIntraBand
+ \brief enable/disable Intra band roaming
+ This function is called through dynamic setConfig callback function
+ to configure the intra band roaming
+ \param hHal - HAL handle for device
+ \param nRoamIntraBand Enable/Disable Intra band roaming
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_setRoamIntraBand(tHalHandle hHal, const v_BOOL_t nRoamIntraBand)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: gRoamIntraBand is changed from %d to %d", __func__,
+ pMac->roam.configParam.nRoamIntraBand,
+ nRoamIntraBand);
+ pMac->roam.configParam.nRoamIntraBand = nRoamIntraBand;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_getRoamIntraBand
+ \brief get Intra band roaming
+ \param hHal - HAL handle for device
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+v_BOOL_t sme_getRoamIntraBand(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.nRoamIntraBand;
+}
+
+
+/* ---------------------------------------------------------------------------
\fn sme_UpdateImmediateRoamRssiDiff
\brief Update nImmediateRoamRssiDiff
This function is called through dynamic setConfig callback function
@@ -7019,15 +7060,25 @@
\sa
--------------------------------------------------------------------------*/
eHalStatus sme_UpdateIsFastRoamIniFeatureEnabled(tHalHandle hHal,
- v_BOOL_t isFastRoamIniFeatureEnabled)
+ const v_BOOL_t isFastRoamIniFeatureEnabled)
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ if (pMac->roam.configParam.isFastRoamIniFeatureEnabled == isFastRoamIniFeatureEnabled)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)", __func__,
+ pMac->roam.configParam.isFastRoamIniFeatureEnabled,
+ isFastRoamIniFeatureEnabled);
+ return eHAL_STATUS_SUCCESS;
+ }
+
VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
"%s: FastRoamEnabled is changed from %d to %d", __func__,
pMac->roam.configParam.isFastRoamIniFeatureEnabled,
isFastRoamIniFeatureEnabled);
pMac->roam.configParam.isFastRoamIniFeatureEnabled = isFastRoamIniFeatureEnabled;
+ csrNeighborRoamUpdateFastRoamingEnabled(pMac, isFastRoamIniFeatureEnabled);
if(TRUE == isFastRoamIniFeatureEnabled)
{
@@ -7064,15 +7115,25 @@
--------------------------------------------------------------------------*/
eHalStatus sme_UpdateIsCcxFeatureEnabled(tHalHandle hHal,
- v_BOOL_t isCcxIniFeatureEnabled)
+ const v_BOOL_t isCcxIniFeatureEnabled)
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ if (pMac->roam.configParam.isCcxIniFeatureEnabled == isCcxIniFeatureEnabled)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: CCX Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)", __func__,
+ pMac->roam.configParam.isCcxIniFeatureEnabled,
+ isCcxIniFeatureEnabled);
+ return eHAL_STATUS_SUCCESS;
+ }
+
VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
"%s: CcxEnabled is changed from %d to %d", __func__,
pMac->roam.configParam.isCcxIniFeatureEnabled,
isCcxIniFeatureEnabled);
pMac->roam.configParam.isCcxIniFeatureEnabled = isCcxIniFeatureEnabled;
+ csrNeighborRoamUpdateCcxModeEnabled(pMac, isCcxIniFeatureEnabled);
if(TRUE == isCcxIniFeatureEnabled)
{
@@ -7124,6 +7185,7 @@
return (halStatus);
}
+#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
/*--------------------------------------------------------------------------
\brief sme_setNeighborLookupRssiThreshold() - update neighbor lookup rssi threshold
This is a synchronous call
@@ -7265,7 +7327,171 @@
return pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod;
}
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateEmptyScanRefreshPeriod
+ \brief Update nEmptyScanRefreshPeriod
+ This function is called through dynamic setConfig callback function
+ to configure nEmptyScanRefreshPeriod
+ Usage: adb shell iwpriv wlan0 setConfig nEmptyScanRefreshPeriod=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nEmptyScanRefreshPeriod - scan period following empty scan results.
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_UpdateEmptyScanRefreshPeriod(tHalHandle hHal, v_U16_t nEmptyScanRefreshPeriod)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set roam scan period to %d - old value is %d - roam state is %d",
+ nEmptyScanRefreshPeriod,
+ pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod = nEmptyScanRefreshPeriod;
+ pMac->roam.neighborRoamInfo.cfgParams.emptyScanRefreshPeriod = nEmptyScanRefreshPeriod;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_setNeighborScanMinChanTime
+ \brief Update nNeighborScanMinChanTime
+ This function is called through dynamic setConfig callback function
+ to configure gNeighborScanChannelMinTime
+ Usage: adb shell iwpriv wlan0 setConfig gNeighborScanChannelMinTime=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nNeighborScanMinChanTime - Channel minimum dwell time
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborScanMinChanTime(tHalHandle hHal, const v_U16_t nNeighborScanMinChanTime)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %d",
+ nNeighborScanMinChanTime,
+ pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime = nNeighborScanMinChanTime;
+ pMac->roam.neighborRoamInfo.cfgParams.minChannelScanTime = nNeighborScanMinChanTime;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_setNeighborScanMaxChanTime
+ \brief Update nNeighborScanMaxChanTime
+ This function is called through dynamic setConfig callback function
+ to configure gNeighborScanChannelMaxTime
+ Usage: adb shell iwpriv wlan0 setConfig gNeighborScanChannelMaxTime=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nNeighborScanMinChanTime - Channel maximum dwell time
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborScanMaxChanTime(tHalHandle hHal, const v_U16_t nNeighborScanMaxChanTime)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %d",
+ nNeighborScanMaxChanTime,
+ pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime = nNeighborScanMaxChanTime;
+ pMac->roam.neighborRoamInfo.cfgParams.maxChannelScanTime = nNeighborScanMaxChanTime;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_getNeighborScanMinChanTime
+ \brief get neighbor scan min channel time
+ \param hHal - The handle returned by macOpen.
+ \return v_U16_t - channel min time value
+ -------------------------------------------------------------------------*/
+v_U16_t sme_getNeighborScanMinChanTime(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.neighborRoamInfo.cfgParams.minChannelScanTime;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_getNeighborScanMaxChanTime
+ \brief get neighbor scan max channel time
+ \param hHal - The handle returned by macOpen.
+ \return v_U16_t - channel max time value
+ -------------------------------------------------------------------------*/
+v_U16_t sme_getNeighborScanMaxChanTime(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.neighborRoamInfo.cfgParams.maxChannelScanTime;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_setNeighborScanPeriod
+ \brief Update nNeighborScanPeriod
+ This function is called through dynamic setConfig callback function
+ to configure nNeighborScanPeriod
+ Usage: adb shell iwpriv wlan0 setConfig nNeighborScanPeriod=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nNeighborScanPeriod - neighbor scan period
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborScanPeriod(tHalHandle hHal, const v_U16_t nNeighborScanPeriod)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set neighbor scan period to %d - old value is %d - roam state is %d",
+ nNeighborScanPeriod,
+ pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod = nNeighborScanPeriod;
+ pMac->roam.neighborRoamInfo.cfgParams.neighborScanPeriod = nNeighborScanPeriod;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_getNeighborScanPeriod
+ \brief get neighbor scan period
+ \param hHal - The handle returned by macOpen.
+ \return v_U16_t - neighbor scan period
+ -------------------------------------------------------------------------*/
+v_U16_t sme_getNeighborScanPeriod(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.neighborRoamInfo.cfgParams.neighborScanPeriod;
+}
+
+#endif
+
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+
/*--------------------------------------------------------------------------
\brief sme_getRoamRssiDiff() - get Roam rssi diff
This is a synchronous call
@@ -7438,42 +7664,61 @@
return status;
}
-#endif
-
-/* ---------------------------------------------------------------------------
- \fn sme_UpdateEmptyScanRefreshPeriod
- \brief Update nEmptyScanRefreshPeriod
- This function is called through dynamic setConfig callback function
- to configure nEmptyScanRefreshPeriod
- Usage: adb shell iwpriv wlan0 setConfig nEmptyScanRefreshPeriod=[0 .. 60]
- \param hHal - HAL handle for device
- \param nEmptyScanRefreshPeriod - scan period following empty scan results.
- \- return Success or failure
- -------------------------------------------------------------------------*/
-
-eHalStatus sme_UpdateEmptyScanRefreshPeriod(tHalHandle hHal, v_U16_t nEmptyScanRefreshPeriod)
+/*--------------------------------------------------------------------------
+ \brief sme_getIsCcxFeatureEnabled() - get CCX feature enabled or not
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return TRUE (1) - if the CCX feature is enabled
+ FALSE (0) - if feature is disabled (compile or runtime)
+ \sa
+ --------------------------------------------------------------------------*/
+tANI_BOOLEAN sme_getIsCcxFeatureEnabled(tHalHandle hHal)
{
+#ifdef FEATURE_WLAN_CCX
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
- eHalStatus status = eHAL_STATUS_SUCCESS;
-
- status = sme_AcquireGlobalLock( &pMac->sme );
- if ( HAL_STATUS_SUCCESS( status ) )
- {
- VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
- "LFR runtime successfully set roam scan period to %d - old value is %d - roam state is %d",
- nEmptyScanRefreshPeriod,
- pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod,
- pMac->roam.neighborRoamInfo.neighborRoamState);
- pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod = nEmptyScanRefreshPeriod;
- pMac->roam.neighborRoamInfo.cfgParams.emptyScanRefreshPeriod = nEmptyScanRefreshPeriod;
- sme_ReleaseGlobalLock( &pMac->sme );
- }
-
- return status ;
-
+ return pMac->roam.configParam.isCcxIniFeatureEnabled;
+#else
+ return eANI_BOOLEAN_FALSE;
+#endif
}
+/*--------------------------------------------------------------------------
+ \brief sme_getIsLfrFeatureEnabled() - get LFR feature enabled or not
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return TRUE (1) - if the feature is enabled
+ FALSE (0) - if feature is disabled (compile or runtime)
+ \sa
+ --------------------------------------------------------------------------*/
+tANI_BOOLEAN sme_getIsLfrFeatureEnabled(tHalHandle hHal)
+{
+#ifdef FEATURE_WLAN_LFR
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
+#else
+ return eANI_BOOLEAN_FALSE;
+#endif
+}
+/*--------------------------------------------------------------------------
+ \brief sme_getIsFtFeatureEnabled() - get FT feature enabled or not
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return TRUE (1) - if the feature is enabled
+ FALSE (0) - if feature is disabled (compile or runtime)
+ \sa
+ --------------------------------------------------------------------------*/
+tANI_BOOLEAN sme_getIsFtFeatureEnabled(tHalHandle hHal)
+{
+#ifdef WLAN_FEATURE_VOWIFI_11R
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.isFastTransitionEnabled;
+#else
+ return eANI_BOOLEAN_FALSE;
+#endif
+}
+
+#endif
/* ---------------------------------------------------------------------------
\fn sme_IsFeatureSupportedByFW