Przeglądaj źródła

qcacld-3.0: Send beacon tx rate to firmware

Add data structures to save beacon tx rate.
The beacon data rate is multiples of 100 Kbps.
Firmware expects the data rate in the form of hw rate codes.
So convert the data rates to hw rate code.
And send it to firmware.

Change-Id: Ia39fd4c14defa729f75f2c45748fe5b04b909647
CRs-Fixed: 2099052
Jiachao Wu 7 lat temu
rodzic
commit
712d4fd6a6

+ 76 - 0
core/hdd/src/wlan_hdd_hostapd.c

@@ -8695,6 +8695,80 @@ int wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
 	return ret;
 	return ret;
 }
 }
 
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)) || \
+	defined(CFG80211_BEACON_TX_RATE_CUSTOM_BACKPORT)
+/**
+ * hdd_get_data_rate_from_rate_mask() - convert mask to rate
+ * @wiphy: Pointer to wiphy
+ * @band: band
+ * @bit_rate_mask: pointer to bit_rake_mask
+ *
+ * This function takes band and bit_rate_mask as input and
+ * derives the beacon_tx_rate based on the supported rates
+ * published as part of wiphy register.
+ *
+ * Return: data rate for success or zero for failure
+ */
+static uint16_t hdd_get_data_rate_from_rate_mask(struct wiphy *wiphy,
+		enum ieee80211_band band,
+		struct cfg80211_bitrate_mask *bit_rate_mask)
+{
+	struct ieee80211_supported_band *sband = wiphy->bands[band];
+	int sband_n_bitrates;
+	struct ieee80211_rate *sband_bitrates;
+	int i;
+
+	if (sband) {
+		sband_bitrates = sband->bitrates;
+		sband_n_bitrates = sband->n_bitrates;
+		for (i = 0; i < sband_n_bitrates; i++) {
+			if (bit_rate_mask->control[band].legacy ==
+			    sband_bitrates[i].hw_value)
+				return sband_bitrates[i].bitrate;
+		}
+	}
+	return 0;
+}
+
+/**
+ * hdd_update_beacon_rate() - Update beacon tx rate
+ * @pAdapter: Pointer to hdd_adapter_t
+ * @wiphy: Pointer to wiphy
+ * @params: Pointet to cfg80211_ap_settings
+ *
+ * This function updates the beacon tx rate which is provided
+ * as part of cfg80211_ap_settions in to the sapConfig
+ * structure
+ *
+ * Return: none
+ */
+static void hdd_update_beacon_rate(struct hdd_adapter *adapter,
+		struct wiphy *wiphy,
+		struct cfg80211_ap_settings *params)
+{
+	struct cfg80211_bitrate_mask *beacon_rate_mask;
+	enum ieee80211_band band;
+
+	band = params->chandef.chan->band;
+	beacon_rate_mask = &params->beacon_rate;
+	if (beacon_rate_mask->control[band].legacy) {
+		adapter->sessionCtx.ap.sapConfig.beacon_tx_rate =
+			hdd_get_data_rate_from_rate_mask(wiphy, band,
+					beacon_rate_mask);
+		hdd_debug("beacon mask value %u, rate %hu",
+			  params->beacon_rate.control[0].legacy,
+			  adapter->sessionCtx.ap.sapConfig.beacon_tx_rate);
+	}
+}
+#else
+static void hdd_update_beacon_rate(struct hdd_adapter *adapter,
+		struct wiphy *wiphy,
+		struct cfg80211_ap_settings *params)
+{
+}
+#endif
+
+
 /**
 /**
  * __wlan_hdd_cfg80211_start_ap() - start soft ap mode
  * __wlan_hdd_cfg80211_start_ap() - start soft ap mode
  * @wiphy: Pointer to wiphy structure
  * @wiphy: Pointer to wiphy structure
@@ -8881,6 +8955,8 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy,
 				     &params->chandef,
 				     &params->chandef,
 				     channel_type);
 				     channel_type);
 
 
+		hdd_update_beacon_rate(pAdapter, wiphy, params);
+
 		/* set authentication type */
 		/* set authentication type */
 		switch (params->auth_type) {
 		switch (params->auth_type) {
 		case NL80211_AUTHTYPE_OPEN_SYSTEM:
 		case NL80211_AUTHTYPE_OPEN_SYSTEM:

+ 1 - 1
core/mac/inc/sir_api.h

@@ -723,7 +723,7 @@ typedef struct sSirSmeStartBssReq {
 
 
 	bool obssEnabled;
 	bool obssEnabled;
 	uint8_t sap_dot11mc;
 	uint8_t sap_dot11mc;
-	uint8_t beacon_tx_rate;
+	uint16_t beacon_tx_rate;
 	bool vendor_vht_sap;
 	bool vendor_vht_sap;
 	uint32_t cac_duration_ms;
 	uint32_t cac_duration_ms;
 	uint32_t dfs_regdomain;
 	uint32_t dfs_regdomain;

+ 1 - 1
core/mac/src/pe/include/lim_session.h

@@ -497,7 +497,7 @@ typedef struct sPESession       /* Added to Support BT-AMP */
 	/* Supported NSS is intersection of self and peer NSS */
 	/* Supported NSS is intersection of self and peer NSS */
 	bool supported_nss_1x1;
 	bool supported_nss_1x1;
 	bool is_ext_caps_present;
 	bool is_ext_caps_present;
-	uint8_t beacon_tx_rate;
+	uint16_t beacon_tx_rate;
 	uint8_t *access_policy_vendor_ie;
 	uint8_t *access_policy_vendor_ie;
 	uint8_t access_policy;
 	uint8_t access_policy;
 	bool ignore_assoc_disallowed;
 	bool ignore_assoc_disallowed;

+ 1 - 0
core/mac/src/pe/lim/lim_process_mlm_req_messages.c

@@ -604,6 +604,7 @@ lim_mlm_add_bss(tpAniSirGlobal mac_ctx,
 	addbss_param->nss = session->nss;
 	addbss_param->nss = session->nss;
 	addbss_param->cac_duration_ms = mlm_start_req->cac_duration_ms;
 	addbss_param->cac_duration_ms = mlm_start_req->cac_duration_ms;
 	addbss_param->dfs_regdomain = mlm_start_req->dfs_regdomain;
 	addbss_param->dfs_regdomain = mlm_start_req->dfs_regdomain;
+	addbss_param->beacon_tx_rate = session->beacon_tx_rate;
 	if (QDF_IBSS_MODE == addbss_param->halPersona) {
 	if (QDF_IBSS_MODE == addbss_param->halPersona) {
 		addbss_param->nss_2g = mac_ctx->vdev_type_nss_2g.ibss;
 		addbss_param->nss_2g = mac_ctx->vdev_type_nss_2g.ibss;
 		addbss_param->nss_5g = mac_ctx->vdev_type_nss_5g.ibss;
 		addbss_param->nss_5g = mac_ctx->vdev_type_nss_5g.ibss;

+ 4 - 0
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -611,6 +611,8 @@ lim_configure_ap_start_bss_session(tpAniSirGlobal mac_ctx, tpPESession session,
 	session->isCoalesingInIBSSAllowed =
 	session->isCoalesingInIBSSAllowed =
 		sme_start_bss_req->isCoalesingInIBSSAllowed;
 		sme_start_bss_req->isCoalesingInIBSSAllowed;
 
 
+	session->beacon_tx_rate = sme_start_bss_req->beacon_tx_rate;
+
 }
 }
 
 
 /**
 /**
@@ -1114,6 +1116,8 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
 				pe_err("Set LOCAL_POWER_CONSTRAINT failed");
 				pe_err("Set LOCAL_POWER_CONSTRAINT failed");
 		}
 		}
 
 
+		mlm_start_req->beacon_tx_rate = session->beacon_tx_rate;
+
 		session->limPrevSmeState = session->limSmeState;
 		session->limPrevSmeState = session->limSmeState;
 		session->limSmeState = eLIM_SME_WT_START_BSS_STATE;
 		session->limSmeState = eLIM_SME_WT_START_BSS_STATE;
 		MTRACE(mac_trace
 		MTRACE(mac_trace

+ 1 - 1
core/mac/src/pe/lim/lim_types.h

@@ -197,7 +197,7 @@ typedef struct sLimMlmStartReq {
 	uint8_t ssidHidden;
 	uint8_t ssidHidden;
 	uint8_t wps_state;
 	uint8_t wps_state;
 	uint8_t obssProtEnabled;
 	uint8_t obssProtEnabled;
-	uint8_t beacon_tx_rate;
+	uint16_t beacon_tx_rate;
 	uint32_t cac_duration_ms;
 	uint32_t cac_duration_ms;
 	uint32_t dfs_regdomain;
 	uint32_t dfs_regdomain;
 } tLimMlmStartReq, *tpLimMlmStartReq;
 } tLimMlmStartReq, *tpLimMlmStartReq;

+ 1 - 1
core/sap/inc/sap_api.h

@@ -615,7 +615,7 @@ typedef struct sap_Config {
 	/* buffer for addn ies comes from hostapd */
 	/* buffer for addn ies comes from hostapd */
 	void *pProbeRespBcnIEsBuffer;
 	void *pProbeRespBcnIEsBuffer;
 	uint8_t sap_dot11mc; /* Specify if 11MC is enabled or disabled*/
 	uint8_t sap_dot11mc; /* Specify if 11MC is enabled or disabled*/
-	uint8_t beacon_tx_rate;
+	uint16_t beacon_tx_rate;
 	uint8_t *vendor_ie;
 	uint8_t *vendor_ie;
 	enum vendor_ie_access_policy vendor_ie_access_policy;
 	enum vendor_ie_access_policy vendor_ie_access_policy;
 	uint16_t sta_inactivity_timeout;
 	uint16_t sta_inactivity_timeout;

+ 2 - 0
core/sap/src/sap_fsm.c

@@ -3086,6 +3086,8 @@ static QDF_STATUS sap_fsm_state_ch_select(struct sap_context *sap_ctx,
 		sap_get_cac_dur_dfs_region(sap_ctx,
 		sap_get_cac_dur_dfs_region(sap_ctx,
 				&sap_ctx->csr_roamProfile.cac_duration_ms,
 				&sap_ctx->csr_roamProfile.cac_duration_ms,
 				&sap_ctx->csr_roamProfile.dfs_regdomain);
 				&sap_ctx->csr_roamProfile.dfs_regdomain);
+		sap_ctx->csr_roamProfile.beacon_tx_rate =
+				sap_ctx->beacon_tx_rate;
 		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
 		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
 		    FL("notify hostapd about channel selection: %d"),
 		    FL("notify hostapd about channel selection: %d"),
 		    sap_ctx->channel);
 		    sap_ctx->channel);

+ 1 - 1
core/sap/src/sap_internal.h

@@ -265,7 +265,7 @@ struct sap_context {
 	uint8_t dfs_vendor_channel;
 	uint8_t dfs_vendor_channel;
 	uint8_t dfs_vendor_chan_bw;
 	uint8_t dfs_vendor_chan_bw;
 	uint8_t chan_before_pre_cac;
 	uint8_t chan_before_pre_cac;
-	uint8_t beacon_tx_rate;
+	uint16_t beacon_tx_rate;
 	tSirMacRateSet supp_rate_set;
 	tSirMacRateSet supp_rate_set;
 	tSirMacRateSet extended_rate_set;
 	tSirMacRateSet extended_rate_set;
 	enum sap_acs_dfs_mode dfs_mode;
 	enum sap_acs_dfs_mode dfs_mode;

+ 2 - 0
core/sap/src/sap_module.c

@@ -912,6 +912,8 @@ QDF_STATUS wlansap_start_bss(void *pCtx,     /* pwextCtx */
 		     sizeof(pConfig->deny_mac));
 		     sizeof(pConfig->deny_mac));
 	pSapCtx->nDenyMac = pConfig->num_deny_mac;
 	pSapCtx->nDenyMac = pConfig->num_deny_mac;
 	sap_sort_mac_list(pSapCtx->denyMacList, pSapCtx->nDenyMac);
 	sap_sort_mac_list(pSapCtx->denyMacList, pSapCtx->nDenyMac);
+	pSapCtx->beacon_tx_rate = pConfig->beacon_tx_rate;
+
 	/* Fill in the event structure for FSM */
 	/* Fill in the event structure for FSM */
 	sapEvent.event = eSAP_HDD_START_INFRA_BSS;
 	sapEvent.event = eSAP_HDD_START_INFRA_BSS;
 	sapEvent.params = 0;    /* pSapPhysLinkCreate */
 	sapEvent.params = 0;    /* pSapPhysLinkCreate */

+ 1 - 1
core/sme/inc/csr_api.h

@@ -996,7 +996,7 @@ typedef struct tagCsrRoamProfile {
 	/* addIe params */
 	/* addIe params */
 	tSirAddIeParams addIeParams;
 	tSirAddIeParams addIeParams;
 	uint8_t sap_dot11mc;
 	uint8_t sap_dot11mc;
-	uint8_t beacon_tx_rate;
+	uint16_t beacon_tx_rate;
 	tSirMacRateSet  supported_rates;
 	tSirMacRateSet  supported_rates;
 	tSirMacRateSet  extended_rates;
 	tSirMacRateSet  extended_rates;
 	struct qdf_mac_addr bssid_hint;
 	struct qdf_mac_addr bssid_hint;

+ 1 - 1
core/sme/inc/csr_internal.h

@@ -333,7 +333,7 @@ struct csr_roamstart_bssparams {
 #endif
 #endif
 	tSirAddIeParams addIeParams;
 	tSirAddIeParams addIeParams;
 	uint8_t sap_dot11mc;
 	uint8_t sap_dot11mc;
-	uint8_t beacon_tx_rate;
+	uint16_t beacon_tx_rate;
 	uint32_t cac_duration_ms;
 	uint32_t cac_duration_ms;
 	uint32_t dfs_regdomain;
 	uint32_t dfs_regdomain;
 };
 };

+ 4 - 0
core/sme/src/csr/csr_api_roam.c

@@ -7931,6 +7931,8 @@ QDF_STATUS csr_roam_copy_profile(tpAniSirGlobal pMac,
 
 
 	update_profile_fils_info(pDstProfile, pSrcProfile);
 	update_profile_fils_info(pDstProfile, pSrcProfile);
 
 
+	pDstProfile->beacon_tx_rate = pSrcProfile->beacon_tx_rate;
+
 	if (pSrcProfile->supported_rates.numRates) {
 	if (pSrcProfile->supported_rates.numRates) {
 		qdf_mem_copy(pDstProfile->supported_rates.rate,
 		qdf_mem_copy(pDstProfile->supported_rates.rate,
 				pSrcProfile->supported_rates.rate,
 				pSrcProfile->supported_rates.rate,
@@ -13819,6 +13821,7 @@ QDF_STATUS csr_roam_issue_start_bss(tpAniSirGlobal pMac, uint32_t sessionId,
 	pParam->sap_dot11mc = pProfile->sap_dot11mc;
 	pParam->sap_dot11mc = pProfile->sap_dot11mc;
 	pParam->cac_duration_ms = pProfile->cac_duration_ms;
 	pParam->cac_duration_ms = pProfile->cac_duration_ms;
 	pParam->dfs_regdomain = pProfile->dfs_regdomain;
 	pParam->dfs_regdomain = pProfile->dfs_regdomain;
+	pParam->beacon_tx_rate = pProfile->beacon_tx_rate;
 
 
 	/* When starting an IBSS, start on the channel from the Profile. */
 	/* When starting an IBSS, start on the channel from the Profile. */
 	status = csr_send_mb_start_bss_req_msg(pMac, sessionId,
 	status = csr_send_mb_start_bss_req_msg(pMac, sessionId,
@@ -16077,6 +16080,7 @@ QDF_STATUS csr_send_mb_start_bss_req_msg(tpAniSirGlobal pMac, uint32_t
 			pMac->roam.configParam.vendor_vht_sap;
 			pMac->roam.configParam.vendor_vht_sap;
 	pMsg->cac_duration_ms = pParam->cac_duration_ms;
 	pMsg->cac_duration_ms = pParam->cac_duration_ms;
 	pMsg->dfs_regdomain = pParam->dfs_regdomain;
 	pMsg->dfs_regdomain = pParam->dfs_regdomain;
+	pMsg->beacon_tx_rate = pParam->beacon_tx_rate;
 
 
 	return umac_send_mb_message_to_mac(pMsg);
 	return umac_send_mb_message_to_mac(pMsg);
 }
 }

+ 17 - 1
core/wma/inc/wma.h

@@ -189,6 +189,21 @@
 #define WMA_IPV6_PROTO_GET_MIN_LEN        21
 #define WMA_IPV6_PROTO_GET_MIN_LEN        21
 #define WMA_IPV6_PKT_INFO_GET_MIN_LEN     62
 #define WMA_IPV6_PKT_INFO_GET_MIN_LEN     62
 #define WMA_ICMPV6_SUBTYPE_GET_MIN_LEN    55
 #define WMA_ICMPV6_SUBTYPE_GET_MIN_LEN    55
+
+/* Beacon tx rate */
+#define WMA_BEACON_TX_RATE_1_M            10
+#define WMA_BEACON_TX_RATE_2_M            20
+#define WMA_BEACON_TX_RATE_5_5_M          55
+#define WMA_BEACON_TX_RATE_11_M           110
+#define WMA_BEACON_TX_RATE_6_M            60
+#define WMA_BEACON_TX_RATE_9_M            90
+#define WMA_BEACON_TX_RATE_12_M           120
+#define WMA_BEACON_TX_RATE_18_M           180
+#define WMA_BEACON_TX_RATE_24_M           240
+#define WMA_BEACON_TX_RATE_36_M           360
+#define WMA_BEACON_TX_RATE_48_M           480
+#define WMA_BEACON_TX_RATE_54_M           540
+
 /**
 /**
  * ds_mode: distribution system mode
  * ds_mode: distribution system mode
  * @IEEE80211_NO_DS: NO DS at either side
  * @IEEE80211_NO_DS: NO DS at either side
@@ -1685,6 +1700,7 @@ struct wma_target_req {
  *			number of transmit streams
  *			number of transmit streams
  * @preferred_rx_streams: policy manager indicates the preferred
  * @preferred_rx_streams: policy manager indicates the preferred
  *			number of receive streams
  *			number of receive streams
+ * @beacon_tx_rate: beacon tx rate
  * @he_capable: HE capability
  * @he_capable: HE capability
  * @he_ops: HE operation
  * @he_ops: HE operation
  * @cac_duration_ms: cac duration in milliseconds
  * @cac_duration_ms: cac duration in milliseconds
@@ -1711,7 +1727,7 @@ struct wma_vdev_start_req {
 	bool is_quarter_rate;
 	bool is_quarter_rate;
 	uint32_t preferred_tx_streams;
 	uint32_t preferred_tx_streams;
 	uint32_t preferred_rx_streams;
 	uint32_t preferred_rx_streams;
-	uint8_t beacon_tx_rate;
+	uint16_t beacon_tx_rate;
 #ifdef WLAN_FEATURE_11AX
 #ifdef WLAN_FEATURE_11AX
 	bool he_capable;
 	bool he_capable;
 	uint32_t he_ops;
 	uint32_t he_ops;

+ 1 - 1
core/wma/inc/wma_if.h

@@ -525,7 +525,7 @@ typedef struct {
 	uint8_t nss;
 	uint8_t nss;
 	uint8_t nss_2g;
 	uint8_t nss_2g;
 	uint8_t nss_5g;
 	uint8_t nss_5g;
-	uint8_t beacon_tx_rate;
+	uint16_t beacon_tx_rate;
 	uint32_t tx_aggregation_size;
 	uint32_t tx_aggregation_size;
 	uint32_t rx_aggregation_size;
 	uint32_t rx_aggregation_size;
 #ifdef WLAN_FEATURE_11AX
 #ifdef WLAN_FEATURE_11AX

+ 2 - 0
core/wma/inc/wma_internal.h

@@ -609,6 +609,8 @@ void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
 
 
 void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params);
 void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params);
 
 
+uint32_t wma_get_bcn_rate_code(uint16_t rate);
+
 /*
 /*
  * wma_mgmt.c functions declarations
  * wma_mgmt.c functions declarations
  */
  */

+ 47 - 0
core/wma/src/wma_dev_if.c

@@ -2237,6 +2237,39 @@ end:
 	return txrx_vdev_handle;
 	return txrx_vdev_handle;
 }
 }
 
 
+uint32_t wma_get_bcn_rate_code(uint16_t rate)
+{
+	/* rate in multiples of 100 Kbps */
+	switch (rate) {
+	case WMA_BEACON_TX_RATE_1_M:
+		return WMI_BCN_TX_RATE_CODE_1_M;
+	case WMA_BEACON_TX_RATE_2_M:
+		return WMI_BCN_TX_RATE_CODE_2_M;
+	case WMA_BEACON_TX_RATE_5_5_M:
+		return WMI_BCN_TX_RATE_CODE_5_5_M;
+	case WMA_BEACON_TX_RATE_11_M:
+		return WMI_BCN_TX_RATE_CODE_11M;
+	case WMA_BEACON_TX_RATE_6_M:
+		return WMI_BCN_TX_RATE_CODE_6_M;
+	case WMA_BEACON_TX_RATE_9_M:
+		return WMI_BCN_TX_RATE_CODE_9_M;
+	case WMA_BEACON_TX_RATE_12_M:
+		return WMI_BCN_TX_RATE_CODE_12_M;
+	case WMA_BEACON_TX_RATE_18_M:
+		return WMI_BCN_TX_RATE_CODE_18_M;
+	case WMA_BEACON_TX_RATE_24_M:
+		return WMI_BCN_TX_RATE_CODE_24_M;
+	case WMA_BEACON_TX_RATE_36_M:
+		return WMI_BCN_TX_RATE_CODE_36_M;
+	case WMA_BEACON_TX_RATE_48_M:
+		return WMI_BCN_TX_RATE_CODE_48_M;
+	case WMA_BEACON_TX_RATE_54_M:
+		return WMI_BCN_TX_RATE_CODE_54_M;
+	default:
+		return WMI_BCN_TX_RATE_CODE_1_M;
+	}
+}
+
 /**
 /**
  * wma_vdev_start() - send vdev start request to fw
  * wma_vdev_start() - send vdev start request to fw
  * @wma: wma handle
  * @wma: wma handle
@@ -2356,6 +2389,19 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
 
 
 	params.beacon_intval = req->beacon_intval;
 	params.beacon_intval = req->beacon_intval;
 	params.dtim_period = req->dtim_period;
 	params.dtim_period = req->dtim_period;
+
+	if (req->beacon_tx_rate) {
+		WMA_LOGD("%s: beacon tx rate [%hu * 100 Kbps]",
+				__func__, req->beacon_tx_rate);
+		temp_flags |= WMI_UNIFIED_VDEV_START_BCN_TX_RATE_PRESENT;
+		/*
+		 * beacon_tx_rate is in multiples of 100 Kbps.
+		 * Convert the data rate to hw rate code.
+		 */
+		params.bcn_tx_rate_code =
+			wma_get_bcn_rate_code(req->beacon_tx_rate);
+	}
+
 	/* FIXME: Find out min, max and regulatory power levels */
 	/* FIXME: Find out min, max and regulatory power levels */
 	params.max_txpow = req->max_txpow;
 	params.max_txpow = req->max_txpow;
 	temp_reg_info_1 &= 0xff00ffff;
 	temp_reg_info_1 &= 0xff00ffff;
@@ -3361,6 +3407,7 @@ static void wma_add_bss_ap_mode(tp_wma_handle wma, tpAddBssParams add_bss)
 	req.dot11_mode = add_bss->dot11_mode;
 	req.dot11_mode = add_bss->dot11_mode;
 	req.beacon_intval = add_bss->beaconInterval;
 	req.beacon_intval = add_bss->beaconInterval;
 	req.dtim_period = add_bss->dtimPeriod;
 	req.dtim_period = add_bss->dtimPeriod;
+	req.beacon_tx_rate = add_bss->beacon_tx_rate;
 	req.hidden_ssid = add_bss->bHiddenSSIDEn;
 	req.hidden_ssid = add_bss->bHiddenSSIDEn;
 	req.is_dfs = add_bss->bSpectrumMgtEnabled;
 	req.is_dfs = add_bss->bSpectrumMgtEnabled;
 	req.oper_mode = BSS_OPERATIONAL_MODE_AP;
 	req.oper_mode = BSS_OPERATIONAL_MODE_AP;