wlan: Use user provided BW for 2.4Ghz HT connection
Add support to use user provided BW for 2.4Ghz HT connection.
If HT capability in connect req indicate connection in HT20, force
the connection in 2.4Ghz to HT20 only even if AP support HT40.
Added ini override_ht20_40_24g to enable/disable this feature.
Change-Id: Ia03b67b9d6487e3e27f1cf8875afe95af1300b4f
CRs-Fixed: 2084929
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 6c2a140..d08c9fc 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -366,6 +366,11 @@
#define CFG_CHANNEL_BONDING_MODE_MAX WNI_CFG_CHANNEL_BONDING_MODE_STAMAX
#define CFG_CHANNEL_BONDING_MODE_DEFAULT WNI_CFG_CHANNEL_BONDING_MODE_STADEF
+#define CFG_OVERRIDE_HT40_20_24GHZ_NAME "override_ht20_40_24g"
+#define CFG_OVERRIDE_HT40_20_24GHZ_MIN 0
+#define CFG_OVERRIDE_HT40_20_24GHZ_MAX 1
+#define CFG_OVERRIDE_HT40_20_24GHZ_DEFAULT 0
+
#define CFG_CHANNEL_BONDING_MODE_5GHZ_NAME "gChannelBondingMode5GHz"
#define CFG_CHANNEL_BONDING_MODE_MIN WNI_CFG_CHANNEL_BONDING_MODE_STAMIN
#define CFG_CHANNEL_BONDING_MODE_MAX WNI_CFG_CHANNEL_BONDING_MODE_STAMAX
@@ -3163,6 +3168,7 @@
v_U32_t nAutoBmpsTimerValue;
eHddDot11Mode dot11Mode;
v_U32_t nChannelBondingMode24GHz;
+ bool override_ht20_40_24g;
v_U32_t nChannelBondingMode5GHz;
v_U32_t MaxRxAmpduFactor;
v_U32_t nBAAgingTimerInterval;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 314d380..7272ed0 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -487,6 +487,13 @@
CFG_CHANNEL_BONDING_MODE_MIN,
CFG_CHANNEL_BONDING_MODE_MAX),
+ REG_VARIABLE(CFG_OVERRIDE_HT40_20_24GHZ_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, override_ht20_40_24g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OVERRIDE_HT40_20_24GHZ_DEFAULT,
+ CFG_OVERRIDE_HT40_20_24GHZ_MIN,
+ CFG_OVERRIDE_HT40_20_24GHZ_MAX),
+
REG_VARIABLE( CFG_CHANNEL_BONDING_MODE_5GHZ_NAME, WLAN_PARAM_Integer,
hdd_config_t, nChannelBondingMode5GHz,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK,
@@ -4190,6 +4197,8 @@
VOS_TRACE (VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gApAutoChannelSelection] value = [%u]",pHddCtx->cfg_ini->apAutoChannelSelection);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [ChannelBondingMode] Value = [%u]",pHddCtx->cfg_ini->nChannelBondingMode24GHz);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [%s] Value = [%u] ",
+ CFG_OVERRIDE_HT40_20_24GHZ_NAME, pHddCtx->cfg_ini->override_ht20_40_24g);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [ChannelBondingMode] Value = [%u]",pHddCtx->cfg_ini->nChannelBondingMode5GHz);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [dot11Mode] Value = [%u]",pHddCtx->cfg_ini->dot11Mode);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [WmmMode] Value = [%u] ",pHddCtx->cfg_ini->WmmMode);
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 398a8e9..2d61329 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -15583,6 +15583,51 @@
}
#endif
+/**
+ * wlan_hdd_check_ht20_ht40_ind() - check if Supplicant has indicated to
+ * connect in HT20 mode
+ * @hdd_ctx: hdd context
+ * @adapter: Pointer to the HDD adapter
+ * @req: Pointer to the structure cfg_connect_params receieved from user space
+ *
+ * This function will check if supplicant has indicated to to connect in HT20
+ * mode. this is currently applicable only for 2.4Ghz mode only.
+ * if feature is enabled and supplicant indicate HT20 set
+ * force_24ghz_in_ht20 to true to force 2.4Ghz in HT20 else set it to false.
+ *
+ * Return: void
+ */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)
+static void wlan_hdd_check_ht20_ht40_ind(hdd_context_t *hdd_ctx,
+ hdd_adapter_t *adapter,
+ struct cfg80211_connect_params *req)
+{
+ hdd_wext_state_t *wext_state = WLAN_HDD_GET_WEXT_STATE_PTR(adapter);
+ tCsrRoamProfile *roam_profile;
+
+ roam_profile = &wext_state->roamProfile;
+ roam_profile->force_24ghz_in_ht20 = false;
+ if (hdd_ctx->cfg_ini->override_ht20_40_24g &&
+ !(req->ht_capa.cap_info &
+ IEEE80211_HT_CAP_SUP_WIDTH_20_40))
+ roam_profile->force_24ghz_in_ht20 = true;
+
+ hddLog(LOG1, FL("req->ht_capa.cap_info %x override_ht20_40_24g %d"),
+ req->ht_capa.cap_info, hdd_ctx->cfg_ini->override_ht20_40_24g);
+}
+#else
+static inline void wlan_hdd_check_ht20_ht40_ind(hdd_context_t *hdd_ctx,
+ hdd_adapter_t *adapter,
+ struct cfg80211_connect_params *req)
+{
+ hdd_wext_state_t *wext_state = WLAN_HDD_GET_WEXT_STATE_PTR(adapter);
+ tCsrRoamProfile *roam_profile;
+
+ roam_profile = &wext_state->roamProfile;
+ roam_profile->force_24ghz_in_ht20 = false;
+}
+#endif
+
/*
* FUNCTION: __wlan_hdd_cfg80211_connect
* This function is used to start the association process
@@ -15699,6 +15744,8 @@
if (0 != status)
hddLog(VOS_TRACE_LEVEL_ERROR, FL("scan abort failed"));
+ wlan_hdd_check_ht20_ht40_ind(pHddCtx, pAdapter, req);
+
status = wlan_hdd_cfg80211_connect_start(pAdapter, req->ssid,
req->ssid_len, req->bssid,
bssid_hint, channel);