Преглед на файлове

qcacld-3.0: Add additional HT Caps related INI Items to MLME CFG

Add the following HT Caps related INI/CFG items to MLME component.

gShortPreamble, CFG_HT_AMPDU_PARAMS, CFG_EXT_HT_CAP_INFO,
CFG_HT_INFO_FIELD, gEnableAMPDUPS and gMaxAmsduNum.

Change-Id: I019961016a2f0e39c7c62066c04788d3bd3d37e7
CRs-Fixed: 2318579
Vignesh Viswanathan преди 6 години
родител
ревизия
9b449ad2e1

+ 58 - 10
mlme/core/src/wlan_mlme_main.c

@@ -438,21 +438,69 @@ static void mlme_init_ht_cap_in_cfg(struct wlan_objmgr_psoc *psoc,
 {
 {
 	union {
 	union {
 		uint16_t val_16;
 		uint16_t val_16;
-		struct mlme_ht_capabilities_info default_ht_cap_info;
-	} u;
+		struct mlme_ht_capabilities_info ht_cap_info;
+	} u1;
 
 
-	u.val_16 = (uint16_t)cfg_default(CFG_HT_CAP_INFO);
+	union {
+		uint16_t val_16;
+		struct mlme_ht_ext_cap_info ext_cap_info;
+	} u2;
+
+	union {
+		uint8_t val_8;
+		struct mlme_ht_info_field_1 info_field_1;
+	} u3;
 
 
-	u.default_ht_cap_info.adv_coding_cap =
+	union {
+		uint16_t val_16;
+		struct mlme_ht_info_field_2 info_field_2;
+	} u4;
+
+	union {
+		uint16_t val_16;
+		struct mlme_ht_info_field_3 info_field_3;
+	} u5;
+
+	/* HT Capabilities - HT Caps Info Field */
+	u1.val_16 = (uint16_t)cfg_default(CFG_HT_CAP_INFO);
+	u1.ht_cap_info.adv_coding_cap =
 				cfg_get(psoc, CFG_RX_LDPC_ENABLE);
 				cfg_get(psoc, CFG_RX_LDPC_ENABLE);
-	u.default_ht_cap_info.rx_stbc = cfg_get(psoc, CFG_RX_STBC_ENABLE);
-	u.default_ht_cap_info.tx_stbc = cfg_get(psoc, CFG_TX_STBC_ENABLE);
-	u.default_ht_cap_info.short_gi_20_mhz =
+	u1.ht_cap_info.rx_stbc = cfg_get(psoc, CFG_RX_STBC_ENABLE);
+	u1.ht_cap_info.tx_stbc = cfg_get(psoc, CFG_TX_STBC_ENABLE);
+	u1.ht_cap_info.short_gi_20_mhz =
 				cfg_get(psoc, CFG_SHORT_GI_20MHZ);
 				cfg_get(psoc, CFG_SHORT_GI_20MHZ);
-	u.default_ht_cap_info.short_gi_40_mhz =
+	u1.ht_cap_info.short_gi_40_mhz =
 				cfg_get(psoc, CFG_SHORT_GI_40MHZ);
 				cfg_get(psoc, CFG_SHORT_GI_40MHZ);
-
-	ht_caps->ht_cap_info = u.default_ht_cap_info;
+	ht_caps->ht_cap_info = u1.ht_cap_info;
+
+	/* HT Capapabilties - AMPDU Params */
+	ht_caps->ampdu_params.max_rx_ampdu_factor =
+		cfg_get(psoc, CFG_MAX_RX_AMPDU_FACTOR);
+	ht_caps->ampdu_params.mpdu_density =
+		cfg_get(psoc, CFG_MPDU_DENSITY);
+	ht_caps->ampdu_params.reserved = 0;
+
+	/* HT Capabilities - Extended Capabilities field */
+	u2.val_16 = (uint16_t)cfg_default(CFG_EXT_HT_CAP_INFO);
+	ht_caps->ext_cap_info = u2.ext_cap_info;
+
+	/* HT Operation - Information subset 1 of 3 */
+	u3.val_8 = (uint8_t)cfg_default(CFG_HT_INFO_FIELD_1);
+	ht_caps->info_field_1 = u3.info_field_1;
+
+	/* HT Operation - Information subset 2 of 3 */
+	u4.val_16 = (uint16_t)cfg_default(CFG_HT_INFO_FIELD_2);
+	ht_caps->info_field_2 = u4.info_field_2;
+
+	/* HT Operation - Information subset 3 of 3 */
+	u5.val_16 = (uint16_t)cfg_default(CFG_HT_INFO_FIELD_3);
+	ht_caps->info_field_3 = u5.info_field_3;
+
+	ht_caps->short_preamble = cfg_get(psoc, CFG_SHORT_PREAMBLE);
+	ht_caps->enable_ampdu_ps = cfg_get(psoc, CFG_ENABLE_AMPDUPS);
+	ht_caps->enable_smps = cfg_get(psoc, CFG_ENABLE_HT_SMPS);
+	ht_caps->smps = cfg_get(psoc, CFG_HT_SMPS_MODE);
+	ht_caps->max_num_amsdu = cfg_get(psoc, CFG_MAX_AMSDU_NUM);
 }
 }
 
 
 static void mlme_init_qos_cfg(struct wlan_objmgr_psoc *psoc,
 static void mlme_init_qos_cfg(struct wlan_objmgr_psoc *psoc,

+ 209 - 1
mlme/dispatcher/inc/cfg_mlme_ht_caps.h

@@ -173,6 +173,203 @@
 		CFG_VALUE_OR_DEFAULT, \
 		CFG_VALUE_OR_DEFAULT, \
 		"HT cap info")
 		"HT cap info")
 
 
+/*
+ * <ini>
+ * gShortPreamble - Set Short Preamble
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * This ini is used to set default short Preamble
+ *
+ * Related: None
+ *
+ * Supported Feature: STA
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_SHORT_PREAMBLE CFG_INI_BOOL( \
+		"gShortPreamble", \
+		1, \
+		"Short Preamble")
+
+#define CFG_HT_AMPDU_PARAMS CFG_UINT( \
+		"ht_ampdu_params", \
+		0, \
+		255, \
+		0, \
+		CFG_VALUE_OR_DEFAULT, \
+		"HT AMPDU Params")
+
+#define CFG_EXT_HT_CAP_INFO CFG_UINT( \
+		"ext_ht_cap_info", \
+		0, \
+		65535, \
+		1024, \
+		CFG_VALUE_OR_DEFAULT, \
+		"HT Ext Cap Info")
+
+#define CFG_HT_INFO_FIELD_1 CFG_UINT( \
+		"ht_info_field_1", \
+		0, \
+		255, \
+		15, \
+		CFG_VALUE_OR_DEFAULT, \
+		"HT Info Field 1")
+
+#define CFG_HT_INFO_FIELD_2 CFG_UINT( \
+		"ht_info_field_2", \
+		0, \
+		65535, \
+		0, \
+		CFG_VALUE_OR_DEFAULT, \
+		"HT Info Field 2")
+
+#define CFG_HT_INFO_FIELD_3 CFG_UINT( \
+		"ht_info_field_3", \
+		0, \
+		65535, \
+		0, \
+		CFG_VALUE_OR_DEFAULT, \
+		"HT Info Field 3")
+
+/*
+ * <ini>
+ * gEnableHtSMPS - Enable the SM Power Save
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable SM Power Save
+ *
+ * Related: None
+ *
+ * Supported Feature: STA
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_ENABLE_HT_SMPS CFG_INI_BOOL( \
+	"gEnableHtSMPS", \
+	0, \
+	"Enable HT SM PowerSave")
+
+/*
+ * <ini>
+ * gHtSMPS - SMPS Mode
+ * @Min: 0
+ * @Max: 3
+ * @Default: 3
+ *
+ * This ini is used to set default SM Power Save Antenna mode
+ * 0 - Static
+ * 1 - Dynamic
+ * 2 - Reserved/Invalid
+ * 3 - Disabled
+ *
+ * Related: None
+ *
+ * Supported Feature: STA
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_HT_SMPS_MODE CFG_INI_UINT( \
+	"gHtSMPS", \
+	0, \
+	3, \
+	3, \
+	CFG_VALUE_OR_DEFAULT, \
+	"HT SM Power Save Config")
+
+/*
+ * <ini>
+ * gMaxAmsduNum - Max number of MSDU's in aggregate
+ * @Min: 0
+ * @Max: 3
+ * @Default: 1
+ * gMaxAmsduNum is the number of MSDU's transmitted in the 11n aggregate
+ * frame. Setting it to a value larger than 1 enables transmit aggregation.
+ * It is a PHY parameter that applies to all vdev's in firmware.
+ *
+ * Supported Feature: 11n aggregation
+ *
+ * Usage: Internal
+ *
+ * </ini>
+ */
+#define CFG_MAX_AMSDU_NUM CFG_INI_UINT( \
+	"gMaxAmsduNum", \
+	0, \
+	3, \
+	1, \
+	CFG_VALUE_OR_DEFAULT, \
+	"Max AMSDU Number")
+
+/*
+ * <ini>
+ * gMaxRxAmpduFactor - Provide the maximum ampdu factor.
+ * @Min: 0
+ * @Max: 3
+ * @Default: 3
+ *
+ * This ini is used to set default maxampdu factor
+ *
+ * Related: None
+ *
+ * Supported Feature: STA
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_MAX_RX_AMPDU_FACTOR CFG_INI_UINT( \
+	"gMaxRxAmpduFactor", \
+	0, \
+	3, \
+	3, \
+	CFG_VALUE_OR_DEFAULT, \
+	"Max Rx AMPDU Factor")
+
+/*
+ * <ini>
+ * ght_mpdu_density - Configuration option for HT MPDU density
+ * @Min: 0
+ * @Max: 7
+ * @Default: 7
+ *
+ * This ini is used to set default MDPU Density
+ *
+ * Related: None
+ *
+ * Supported Feature: STA
+ *
+ * Usage: Internal/External
+ *
+ * As per (Table 8-125 802.11-2012)
+ * 0 for no restriction
+ * 1 for 1/4 micro sec
+ * 2 for 1/2 micro sec
+ * 3 for 1 micro sec
+ * 4 for 2 micro sec
+ * 5 for 4 micro sec
+ * 6 for 8 micro sec
+ * 7 for 16 micro sec
+ *
+ * </ini>
+ */
+#define CFG_MPDU_DENSITY CFG_INI_UINT( \
+	"ght_mpdu_density", \
+	0, \
+	7, \
+	7, \
+	CFG_VALUE_OR_DEFAULT, \
+	"MPDU Density")
+
 #define CFG_HT_CAPS_ALL \
 #define CFG_HT_CAPS_ALL \
 	CFG(CFG_HT_CAP_INFO) \
 	CFG(CFG_HT_CAP_INFO) \
 	CFG(CFG_TX_LDPC_ENABLE) \
 	CFG(CFG_TX_LDPC_ENABLE) \
@@ -180,6 +377,17 @@
 	CFG(CFG_TX_STBC_ENABLE) \
 	CFG(CFG_TX_STBC_ENABLE) \
 	CFG(CFG_RX_STBC_ENABLE) \
 	CFG(CFG_RX_STBC_ENABLE) \
 	CFG(CFG_SHORT_GI_20MHZ) \
 	CFG(CFG_SHORT_GI_20MHZ) \
-	CFG(CFG_SHORT_GI_40MHZ)
+	CFG(CFG_SHORT_GI_40MHZ) \
+	CFG(CFG_SHORT_PREAMBLE) \
+	CFG(CFG_HT_AMPDU_PARAMS) \
+	CFG(CFG_EXT_HT_CAP_INFO) \
+	CFG(CFG_HT_INFO_FIELD_1) \
+	CFG(CFG_HT_INFO_FIELD_2) \
+	CFG(CFG_HT_INFO_FIELD_3) \
+	CFG(CFG_ENABLE_HT_SMPS) \
+	CFG(CFG_HT_SMPS_MODE) \
+	CFG(CFG_MAX_AMSDU_NUM) \
+	CFG(CFG_MAX_RX_AMPDU_FACTOR) \
+	CFG(CFG_MPDU_DENSITY)
 
 
 #endif /* __CFG_MLME_HT_CAPS_H */
 #endif /* __CFG_MLME_HT_CAPS_H */

+ 40 - 0
mlme/dispatcher/inc/wlan_mlme_api.h

@@ -177,6 +177,46 @@ QDF_STATUS wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc,
 				     struct mlme_ht_capabilities_info
 				     struct mlme_ht_capabilities_info
 				     ht_cap_info);
 				     ht_cap_info);
 
 
+/**
+ * wlan_mlme_get_max_amsdu_num() - get the max amsdu num
+ * @psoc: pointer to psoc object
+ * @value: pointer to the value where the max_amsdu num is to be filled
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_mlme_get_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
+				       uint8_t *value);
+
+/**
+ * wlan_mlme_set_max_amsdu_num() - set the max amsdu num
+ * @psoc: pointer to psoc object
+ * @value: value to be set for max_amsdu_num
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_mlme_set_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
+				       uint8_t value);
+
+/**
+ * wlan_mlme_get_ht_mpdu_density() - get the ht mpdu density
+ * @psoc: pointer to psoc object
+ * @value: pointer to the value where the ht mpdu density is to be filled
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_mlme_get_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
+					 uint8_t *value);
+
+/**
+ * wlan_mlme_set_ht_mpdu_density() - set the ht mpdu density
+ * @psoc: pointer to psoc object
+ * @value: value to be set for ht mpdu density
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_mlme_set_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
+					 uint8_t value);
+
 /**
 /**
  * wlan_mlme_get_band_capability() - Get the Band capability config
  * wlan_mlme_get_band_capability() - Get the Band capability config
  * @psoc: pointer to psoc object
  * @psoc: pointer to psoc object

+ 149 - 0
mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -301,12 +301,161 @@ struct mlme_ht_capabilities_info {
 } qdf_packed;
 } qdf_packed;
 #endif
 #endif
 
 
+/**
+ * struct mlme_ht_param_info - HT AMPDU Parameters Info
+ * @reserved: reserved bits
+ * @mpdu_density: MPDU Density
+ * @max_rx_ampdu_factor: Max Rx AMPDU Factor
+ */
+#ifndef ANI_LITTLE_BIT_ENDIAN
+struct mlme_ht_param_info {
+	uint8_t reserved:3;
+	uint8_t mpdu_density:3;
+	uint8_t max_rx_ampdu_factor:2;
+} qdf_packed;
+#else
+struct mlme_ht_param_info {
+	uint8_t max_rx_ampdu_factor:2;
+	uint8_t mpdu_density:3;
+	uint8_t reserved:3;
+#endif
+} qdf_packed;
+
+/**
+ * struct mlme_ht_ext_cap_info - Extended HT Capabilities Info
+ * reserved_2: Reserved Bits
+ * mcs_feedback: MCS Feedback Capability
+ * reserved_1: Reserved Bits
+ * transition_time: Time needed for transition between 20Mhz and 40 Mhz
+ * pco: PCO (Phased Coexistence Operation) Support
+ */
+#ifndef ANI_LITTLE_BIT_ENDIAN
+struct mlme_ht_ext_cap_info {
+	uint16_t reserved_2:6;
+	uint16_t mcs_feedback:2;
+	uint16_t reserved_1:5;
+	uint16_t transition_time:2;
+	uint16_t pco:1;
+} qdf_packed;
+#else
+struct mlme_ht_ext_cap_info {
+	uint16_t pco:1;
+	uint16_t transition_time:2;
+	uint16_t reserved1:5;
+	uint16_t mcs_feedback:2;
+	uint16_t reserved2:6;
+} qdf_packed;
+#endif
+
+/**
+ * struct mlme_ht_info_field_1 - Additional HT IE Field1
+ * @service_interval_granularity: Shortest Service Interval
+ * @controlled_access_only: Access Control for assoc requests
+ * @rifs_mode: Reduced Interframe Spacing mode
+ * @recommended_tx_width_set: Recommended Tx Channel Width
+ * @secondary_channel_offset: Secondary Channel Offset
+ */
+#ifndef ANI_LITTLE_BIT_ENDIAN
+struct mlme_ht_info_field_1 {
+	uint8_t service_interval_granularity:3;
+	uint8_t controlled_access_only:1;
+	uint8_t rifs_mode:1;
+	uint8_t recommended_tx_width_set:1;
+	uint8_t secondary_channel_offset:2;
+} qdf_packed;
+#else
+struct mlme_ht_info_field_1 {
+	uint8_t secondary_channel_offset:2;
+	uint8_t recommended_tx_width_set:1;
+	uint8_t rifs_mode:1;
+	uint8_t controlled_access_only:1;
+	uint8_t service_interval_granularity:3;
+} qdf_packed;
+#endif
+
+/* struct mlme_ht_info_field_2 - Additional HT IE Field2
+ * @reserved: reserved bits
+ * @obss_non_ht_sta_present: Protection for non-HT STAs by Overlapping BSS
+ * @transmit_burst_limit: Transmit Burst Limit
+ * @non_gf_devices_present: Non Greenfield devices present
+ * @op_mode: Operation Mode
+ */
+#ifndef ANI_LITTLE_BIT_ENDIAN
+struct mlme_ht_info_field_2 {
+	uint16_t reserved:11;
+	uint16_t obss_non_ht_sta_present:1;
+	uint16_t transmit_burst_limit:1;
+	uint16_t non_gf_devices_present:1;
+	uint16_t op_mode:2;
+} qdf_packed;
+#else
+struct mlme_ht_info_field_2 {
+	uint16_t op_mode:2;
+	uint16_t nonGFDevicesPresent:1;
+	uint16_t transmit_burst_limit:1;
+	uint16_t obss_non_ht_sta_present:1;
+	uint16_t reserved:11;
+} qdf_packed;
+#endif
+
+/**
+ * struct mlme_ht_info_field_3 - Additional HT IE Field3
+ * @reserved: reserved bits
+ * @pco_phase: PCO Phase
+ * @pco_active: PCO state
+ * @lsig_txop_protection_full_support: L-Sig TXOP Protection Full Support
+ * @secondary_beacon: Beacon ID
+ * @dual_cts_protection: Dual CTS protection Required
+ * @basic_stbc_mcs: Basic STBC MCS
+ */
+#ifndef ANI_LITTLE_BIT_ENDIAN
+struct mlme_ht_info_field_3 {
+	uint16_t reserved:4;
+	uint16_t pco_phase:1;
+	uint16_t pco_active:1;
+	uint16_t lsig_txop_protection_full_support:1;
+	uint16_t secondary_beacon:1;
+	uint16_t dual_cts_protection:1;
+	uint16_t basic_stbc_mcs:7;
+} qdf_packed;
+#else
+struct mlme_ht_info_field_3 {
+	uint16_t basic_stbc_mcs:7;
+	uint16_t dual_cts_protection:1;
+	uint16_t secondary_beacon:1;
+	uint16_t lsig_txop_protection_full_support:1;
+	uint16_t pco_active:1;
+	uint16_t pco_phase:1;
+	uint16_t reserved:4;
+} qdf_packed;
+#endif
+
 /**
 /**
  * struct wlan_mlme_ht_caps - HT Capabilities related config items
  * struct wlan_mlme_ht_caps - HT Capabilities related config items
  * @ht_cap_info: HT capabilities Info Structure
  * @ht_cap_info: HT capabilities Info Structure
+ * @ampdu_params: AMPDU parameters
+ * @ext_cap_info: HT EXT capabilities info
+ * @info_field_1: HT Information Subset 1
+ * @info_field_2: HT Information Subset 2
+ * @info_field_3: HT Information Subset 3
+ * @short_preamble: Short Preamble support
+ * @enable_ampdu_ps: Enable AMPDU Power Save
+ * @enable_smps: Enabled SM Power Save
+ * @smps : SM Power Save mode
+ * @max_num_amsdu: Max number of AMSDU
  */
  */
 struct wlan_mlme_ht_caps {
 struct wlan_mlme_ht_caps {
 	struct mlme_ht_capabilities_info ht_cap_info;
 	struct mlme_ht_capabilities_info ht_cap_info;
+	struct mlme_ht_param_info ampdu_params;
+	struct mlme_ht_ext_cap_info ext_cap_info;
+	struct mlme_ht_info_field_1 info_field_1;
+	struct mlme_ht_info_field_2 info_field_2;
+	struct mlme_ht_info_field_3 info_field_3;
+	bool short_preamble;
+	bool enable_ampdu_ps;
+	bool enable_smps;
+	uint8_t smps;
+	uint8_t max_num_amsdu;
 };
 };
 
 
 /*
 /*

+ 56 - 0
mlme/dispatcher/inc/wlan_mlme_ucfg_api.h

@@ -149,6 +149,62 @@ QDF_STATUS ucfg_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc,
 	return wlan_mlme_set_ht_cap_info(psoc, ht_cap_info);
 	return wlan_mlme_set_ht_cap_info(psoc, ht_cap_info);
 }
 }
 
 
+/**
+ * ucfg_mlme_get_max_amsdu_num() - get the max amsdu num
+ * @psoc: pointer to psoc object
+ * @value: pointer to the value where the max_amsdu num is to be filled
+ *
+ * Return: QDF_STATUS
+ */
+static inline
+QDF_STATUS ucfg_mlme_get_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
+				       uint8_t *value)
+{
+	return wlan_mlme_get_max_amsdu_num(psoc, value);
+}
+
+/**
+ * ucfg_mlme_set_max_amsdu_num() - set the max amsdu num
+ * @psoc: pointer to psoc object
+ * @value: value to be set for max_amsdu_num
+ *
+ * Return: QDF_STATUS
+ */
+static inline
+QDF_STATUS ucfg_mlme_set_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
+				       uint8_t value)
+{
+	return wlan_mlme_set_max_amsdu_num(psoc, value);
+}
+
+/**
+ * ucfg_mlme_get_ht_mpdu_density() - get the ht mpdu density
+ * @psoc: pointer to psoc object
+ * @value: pointer to the value where the ht mpdu density is to be filled
+ *
+ * Return: QDF_STATUS
+ */
+static inline
+QDF_STATUS ucfg_mlme_get_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
+					 uint8_t *value)
+{
+	return wlan_mlme_get_ht_mpdu_density(psoc, value);
+}
+
+/**
+ * ucfg_mlme_set_ht_mpdu_density() - set the ht mpdu density
+ * @psoc: pointer to psoc object
+ * @value: value to be set for ht mpdu density
+ *
+ * Return: QDF_STATUS
+ */
+static inline
+QDF_STATUS ucfg_mlme_set_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
+					 uint8_t value)
+{
+	return wlan_mlme_set_ht_mpdu_density(psoc, value);
+}
+
 /**
 /**
  * ucfg_mlme_get_band_capability() - Get the Band capability config
  * ucfg_mlme_get_band_capability() - Get the Band capability config
  * @psoc: pointer to psoc object
  * @psoc: pointer to psoc object

+ 74 - 0
mlme/dispatcher/src/wlan_mlme_api.c

@@ -90,6 +90,80 @@ QDF_STATUS wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;
 }
 }
 
 
+QDF_STATUS wlan_mlme_get_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
+				       uint8_t *value)
+{
+	struct wlan_mlme_psoc_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_obj(psoc);
+	if (!mlme_obj) {
+		mlme_err("Failed to get MLME Obj");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	*value = mlme_obj->cfg.ht_caps.max_num_amsdu;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS wlan_mlme_set_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
+				       uint8_t value)
+{
+	struct wlan_mlme_psoc_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_obj(psoc);
+	if (!mlme_obj) {
+		mlme_err("Failed to get MLME Obj");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!cfg_in_range(CFG_MAX_AMSDU_NUM, value)) {
+		mlme_err("Error in setting Max AMSDU Num");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	mlme_obj->cfg.ht_caps.max_num_amsdu = value;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS wlan_mlme_get_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
+					 uint8_t *value)
+{
+	struct wlan_mlme_psoc_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_obj(psoc);
+	if (!mlme_obj) {
+		mlme_err("Failed to get MLME Obj");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	*value = (uint8_t)mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS wlan_mlme_set_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
+					 uint8_t value)
+{
+	struct wlan_mlme_psoc_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_obj(psoc);
+	if (!mlme_obj) {
+		mlme_err("Failed to get MLME Obj");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!cfg_in_range(CFG_MPDU_DENSITY, value)) {
+		mlme_err("Invalid value %d", value);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density = value;
+
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS wlan_mlme_get_band_capability(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS wlan_mlme_get_band_capability(struct wlan_objmgr_psoc *psoc,
 					 uint8_t *band_capability)
 					 uint8_t *band_capability)
 {
 {