summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMushtaq A Mujale <mmujale@qca.qualcomm.com>2013-09-23 18:28:37 -0700
committerMadan Mohan Koyyalamudi <mkoyyala@qca.qualcomm.com>2013-10-23 20:05:44 -0700
commit51f2db7c1ea52905f0afc3d434b09846677de2ae (patch)
treec162fb1e93e7762a809fdd487ee56ce69d74f3cd
parent242b3e4a4436951e2d549cb20f1c3604687cead9 (diff)
cld: wlan: Add knobs to control 11AC params.
ini params gEnableTXSTBC/gEnableRXLDPC to enable/disable ldpc coding, TxSTBC. By default they are enabled. ini params gVhtMpduLen to set Max MPDU len, default is 11454 octets CRs-Fixed: 553214 Change-Id: Ic9f81e8de6a60d3d59f9f13acf586abd310edbb4
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h18
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c47
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c22
-rw-r--r--CORE/SERVICES/COMMON/wmi_unified.h1
-rw-r--r--CORE/SERVICES/WMA/wma.c37
-rw-r--r--firmware_bin/WCNSS_qcom_cfg.ini11
6 files changed, 128 insertions, 8 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 7eb062ee29f6..f057b32c98b9 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1576,6 +1576,16 @@ typedef enum
#define CFG_ENABLE_RX_STBC_MAX ( 1 )
#define CFG_ENABLE_RX_STBC_DEFAULT ( 1 )
+#define CFG_ENABLE_TX_STBC "gEnableTXSTBC"
+#define CFG_ENABLE_TX_STBC_MIN ( 0 )
+#define CFG_ENABLE_TX_STBC_MAX ( 1 )
+#define CFG_ENABLE_TX_STBC_DEFAULT ( 0 )
+
+#define CFG_ENABLE_RX_LDPC "gEnableRXLDPC"
+#define CFG_ENABLE_RX_LDPC_MIN ( 0 )
+#define CFG_ENABLE_RX_LDPC_MAX ( 1 )
+#define CFG_ENABLE_RX_LDPC_DEFAULT ( 0 )
+
/*
* Enable/Disable vsta based on MAX Assoc limit
* defined in WCNSS_qcom_cfg.ini.
@@ -1791,6 +1801,11 @@ typedef enum
#define CFG_VHT_AMPDU_LEN_EXPONENT_MIN ( 0 )
#define CFG_VHT_AMPDU_LEN_EXPONENT_MAX ( 7 )
#define CFG_VHT_AMPDU_LEN_EXPONENT_DEFAULT ( 3 )
+
+#define CFG_VHT_MPDU_LEN_NAME "gVhtMpduLen"
+#define CFG_VHT_MPDU_LEN_MIN ( 0 )
+#define CFG_VHT_MPDU_LEN_MAX ( 2 )
+#define CFG_VHT_MPDU_LEN_DEFAULT ( 0 )
#endif
/*---------------------------------------------------------------------------
@@ -2138,6 +2153,8 @@ typedef struct
v_U16_t configMccParam;
v_U32_t numBuffAdvert;
v_BOOL_t enableRxSTBC;
+ v_BOOL_t enableTxSTBC;
+ v_BOOL_t enableRxLDPC;
#ifdef FEATURE_WLAN_TDLS
v_BOOL_t fEnableTDLSSupport;
v_BOOL_t fEnableTDLSImplicitTrigger;
@@ -2178,6 +2195,7 @@ typedef struct
v_BOOL_t fP2pListenOffload;
#ifdef WLAN_FEATURE_11AC
v_U8_t fVhtAmpduLenExponent;
+ v_U32_t vhtMpduLen;
#endif
} hdd_config_t;
/*---------------------------------------------------------------------------
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 44f9f4ca192e..8877642f5c2d 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2044,6 +2044,20 @@ REG_VARIABLE( CFG_ENABLE_RX_STBC, WLAN_PARAM_Integer,
CFG_ENABLE_RX_STBC_DEFAULT,
CFG_ENABLE_RX_STBC_MIN,
CFG_ENABLE_RX_STBC_MAX ),
+REG_VARIABLE( CFG_ENABLE_TX_STBC, WLAN_PARAM_Integer,
+ hdd_config_t, enableTxSTBC,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_TX_STBC_DEFAULT,
+ CFG_ENABLE_TX_STBC_MIN,
+ CFG_ENABLE_TX_STBC_MAX ),
+
+REG_VARIABLE( CFG_ENABLE_RX_LDPC, WLAN_PARAM_Integer,
+ hdd_config_t, enableRxLDPC,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_RX_LDPC_DEFAULT,
+ CFG_ENABLE_RX_LDPC_MIN,
+ CFG_ENABLE_RX_LDPC_MAX ),
+
#ifdef FEATURE_WLAN_TDLS
REG_VARIABLE( CFG_TDLS_SUPPORT_ENABLE, WLAN_PARAM_Integer,
hdd_config_t, fEnableTDLSSupport,
@@ -2296,6 +2310,13 @@ REG_VARIABLE( CFG_VHT_AMPDU_LEN_EXPONENT_NAME, WLAN_PARAM_Integer,
CFG_VHT_AMPDU_LEN_EXPONENT_DEFAULT,
CFG_VHT_AMPDU_LEN_EXPONENT_MIN,
CFG_VHT_AMPDU_LEN_EXPONENT_MAX),
+
+REG_VARIABLE( CFG_VHT_MPDU_LEN_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, vhtMpduLen,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK ,
+ CFG_VHT_MPDU_LEN_DEFAULT,
+ CFG_VHT_MPDU_LEN_MIN,
+ CFG_VHT_MPDU_LEN_MAX),
#endif
};
@@ -3794,6 +3815,14 @@ v_BOOL_t hdd_update_config_dat( hdd_context_t *pHddCtx )
}
}
}
+ if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_VHT_MAX_MPDU_LENGTH,
+ pConfig->vhtMpduLen, NULL,
+ eANI_BOOLEAN_FALSE)
+ == eHAL_STATUS_FAILURE)
+ {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_VHT_MAX_MPDU_LENGTH to CCM\n");
+ }
}
}
#endif
@@ -3817,6 +3846,8 @@ v_BOOL_t hdd_update_config_dat( hdd_context_t *pHddCtx )
val16 = (tANI_U16)val;
phtCapInfo = (tSirMacHTCapabilityInfo *)&val16;
phtCapInfo->rxSTBC = pConfig->enableRxSTBC;
+ phtCapInfo->txSTBC = pConfig->enableTxSTBC;
+ phtCapInfo->advCodingCap = pConfig->enableRxLDPC;
if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_HT_CAP_INFO,
*(tANI_U16 *)phtCapInfo, NULL, eANI_BOOLEAN_FALSE)
@@ -3834,6 +3865,22 @@ v_BOOL_t hdd_update_config_dat( hdd_context_t *pHddCtx )
hddLog(LOGE, "Could not pass on WNI_CFG_VHT_RXSTBC to CCM\n");
}
+ if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_VHT_TXSTBC,
+ pConfig->enableTxSTBC, NULL, eANI_BOOLEAN_FALSE)
+ ==eHAL_STATUS_FAILURE)
+ {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_VHT_TXSTBC to CCM\n");
+ }
+
+ if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_VHT_LDPC_CODING_CAP,
+ pConfig->enableRxLDPC, NULL, eANI_BOOLEAN_FALSE)
+ ==eHAL_STATUS_FAILURE)
+ {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_VHT_LDPC_CODING_CAP to CCM\n");
+ }
+
#ifdef WLAN_SOFTAP_VSTA_FEATURE
if(pConfig->fEnableVSTASupport)
{
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 75198dfa9ee6..e6385ca90322 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -2085,6 +2085,17 @@ static void hdd_update_tgt_vht_cap(hdd_context_t *hdd_ctx,
if (pconfig->enableTxBF && !cfg->vht_su_bformee)
pconfig->enableTxBF = cfg->vht_su_bformee;
+ status = ccmCfgSetInt(hdd_ctx->hHal,
+ WNI_CFG_VHT_SU_BEAMFORMEE_CAP,
+ pconfig->enableTxBF, NULL,
+ eANI_BOOLEAN_FALSE);
+
+ if (status == eHAL_STATUS_FAILURE) {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
+ "%s: could not set VHT SU BEAMFORMEE CAP",
+ __func__);
+ }
+
/* Get VHT MU Beamformer cap */
status = ccmCfgGetInt(hdd_ctx->hHal, WNI_CFG_VHT_MU_BEAMFORMER_CAP,
&value);
@@ -2146,8 +2157,15 @@ static void hdd_update_tgt_vht_cap(hdd_context_t *hdd_ctx,
value = 0;
}
- /* set VHT MAX AMPDU Len exp */
- if (value && !cfg->vht_max_ampdu_len_exp) {
+ /*
+ * VHT max AMPDU len exp:
+ * override if user configured value is too high
+ * that the target cannot support.
+ * Even though Rome publish ampdu_len=7, it can
+ * only support 4 because of some h/w bug.
+ */
+
+ if (value > cfg->vht_max_ampdu_len_exp) {
status = ccmCfgSetInt(hdd_ctx->hHal,
WNI_CFG_VHT_AMPDU_LEN_EXPONENT,
cfg->vht_max_ampdu_len_exp, NULL,
diff --git a/CORE/SERVICES/COMMON/wmi_unified.h b/CORE/SERVICES/COMMON/wmi_unified.h
index 041f358c374c..ca4e00735d4e 100644
--- a/CORE/SERVICES/COMMON/wmi_unified.h
+++ b/CORE/SERVICES/COMMON/wmi_unified.h
@@ -3765,6 +3765,7 @@ typedef struct {
#define WMI_RC_HT_FLAG 0x08 /* HT */
#define WMI_RC_RTSCTS_FLAG 0x10 /* RTS-CTS */
#define WMI_RC_TX_STBC_FLAG 0x20 /* TX STBC */
+#define WMI_RC_TX_STBC_FLAG_S 5 /* TX STBC */
#define WMI_RC_RX_STBC_FLAG 0xC0 /* RX STBC ,2 bits */
#define WMI_RC_RX_STBC_FLAG_S 6 /* RX STBC ,2 bits */
#define WMI_RC_WEP_TKIP_FLAG 0x100 /* WEP/TKIP encryption */
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 07e5ab4619bb..051273c4b9ed 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -2780,7 +2780,7 @@ static int32_t wmi_unified_send_peer_assoc(tp_wma_handle wma,
wmi_buf_t buf;
int32_t len;
int32_t ret, max_rates, i;
- u_int8_t rx_stbc;
+ u_int8_t rx_stbc, tx_stbc;
u_int8_t *rate_pos, *buf_ptr;
wmi_rate_set peer_legacy_rates, peer_ht_rates;
wmi_vht_rate_set *mcs;
@@ -2918,6 +2918,13 @@ static int32_t wmi_unified_send_peer_assoc(tp_wma_handle wma,
cmd->peer_rate_caps |= (rx_stbc << WMI_RC_RX_STBC_FLAG_S);
}
+ tx_stbc = (params->ht_caps & IEEE80211_HTCAP_C_TXSTBC) >>
+ IEEE80211_HTCAP_C_TXSTBC_S;
+ if (tx_stbc) {
+ cmd->peer_flags |= WMI_PEER_STBC;
+ cmd->peer_rate_caps |= (tx_stbc << WMI_RC_TX_STBC_FLAG_S);
+ }
+
if (params->htLdpcCapable || params->vhtLdpcCapable)
cmd->peer_flags |= WMI_PEER_LDPC;
@@ -7734,6 +7741,14 @@ static inline void wma_update_target_ht_cap(tp_wma_handle wh,
/* RF chains */
cfg->num_rf_chains = wh->num_rf_chains;
+
+ WMA_LOGD("\n%s: ht_cap_info - %x ht_rx_stbc - %d, ht_tx_stbc - %d\n\
+ mpdu_density - %d ht_rx_ldpc - %d ht_sgi_20 - %d\n\
+ ht_sgi_40 - %d num_rf_chains - %d \n", __func__,
+ wh->ht_cap_info, cfg->ht_rx_stbc, cfg->ht_tx_stbc,
+ cfg->mpdu_density, cfg->ht_rx_ldpc, cfg->ht_sgi_20,
+ cfg->ht_sgi_40, cfg->num_rf_chains);
+
}
#ifdef WLAN_FEATURE_11AC
@@ -7742,11 +7757,11 @@ static inline void wma_update_target_vht_cap(tp_wma_handle wh,
{
/* Max MPDU length */
if (wh->vht_cap_info & IEEE80211_VHTCAP_MAX_MPDU_LEN_3839)
- cfg->vht_max_mpdu = 3839;
+ cfg->vht_max_mpdu = 0;
else if (wh->vht_cap_info & IEEE80211_VHTCAP_MAX_MPDU_LEN_7935)
- cfg->vht_max_mpdu = 7935;
+ cfg->vht_max_mpdu = 1;
else if (wh->vht_cap_info & IEEE80211_VHTCAP_MAX_MPDU_LEN_11454)
- cfg->vht_max_mpdu = 11454;
+ cfg->vht_max_mpdu = 2;
else
cfg->vht_max_mpdu = 0;
@@ -7776,7 +7791,11 @@ static inline void wma_update_target_vht_cap(tp_wma_handle wh,
cfg->vht_tx_stbc = wh->vht_cap_info & IEEE80211_VHTCAP_TX_STBC;
/* RX STBC capability */
- cfg->vht_rx_stbc = wh->vht_cap_info & IEEE80211_VHTCAP_RX_STBC;
+ cfg->vht_rx_stbc = wh->vht_cap_info & IEEE80211_VHTCAP_RX_STBC;
+
+ cfg->vht_max_ampdu_len_exp = (wh->vht_cap_info &
+ IEEE80211_VHTCAP_MAX_AMPDU_LEN_EXP)
+ >> IEEE80211_VHTCAP_MAX_AMPDU_LEN_EXP_S;
/* SU beamformer cap */
cfg->vht_su_bformer = wh->vht_cap_info & IEEE80211_VHTCAP_SU_BFORMER;
@@ -7796,6 +7815,14 @@ static inline void wma_update_target_vht_cap(tp_wma_handle wh,
/* VHT TXOP PS cap */
cfg->vht_txop_ps = wh->vht_cap_info & IEEE80211_VHTCAP_TXOP_PS;
+
+ WMA_LOGD("\n %s: max_mpdu %d supp_chan_width %x rx_ldpc %x\n \
+ short_gi_80 %x tx_stbc %x rx_stbc %x txop_ps %x\n \
+ su_bformee %x mu_bformee %x max_ampdu_len_exp %d\n",
+ __func__, cfg->vht_max_mpdu, cfg->supp_chan_width,
+ cfg->vht_rx_ldpc, cfg->vht_short_gi_80, cfg->vht_tx_stbc,
+ cfg->vht_rx_stbc, cfg->vht_txop_ps, cfg->vht_su_bformee,
+ cfg->vht_mu_bformee, cfg->vht_max_ampdu_len_exp);
}
#endif /* #ifdef WLAN_FEATURE_11AC */
diff --git a/firmware_bin/WCNSS_qcom_cfg.ini b/firmware_bin/WCNSS_qcom_cfg.ini
index 881ef79cf4e2..abefd0d77da8 100644
--- a/firmware_bin/WCNSS_qcom_cfg.ini
+++ b/firmware_bin/WCNSS_qcom_cfg.ini
@@ -379,9 +379,15 @@ gNumChanCombinedConc=1
#If set to 0, MCC is not allowed.
gEnableMCCMode=1
-# 1=enable STBC; 0=disable STBC
+# 1=enable STBC; 0=disable STBC
gEnableRXSTBC=1
+# 1=enable tx STBC; 0=disable
+gEnableTXSTBC=1
+
+# 1=enable rx LDPC; 0=disable
+gEnableRXLDPC=1
+
# Enable Active mode offload
gEnableActiveModeOffload=1
@@ -419,6 +425,9 @@ gEnableP2pListenOffload=1
# Maximum Receive AMPDU size (VHT only. Valid values: 0->8k 1->16k 2->32k 3->64k 4->128k)
gVhtAmpduLenExponent=4
+# Maximum MPDU length (VHT only. Valid values: 0->3895 octets, 1->7991 octets, 2->11454 octets)
+gVhtMpduLen=2
+
END
# Note: Configuration parser would not read anything past the END marker