Browse Source

qcacld-3.0: Configure vdev HE Tx beamform settings to FW

Configure vdev HE Tx beamforming parameters to FW.

Change-Id: I990d9a9cb84300b07dd6acf67bbddf72abaf80b5
CRs-Fixed: 2609937
Kiran Kumar Lokere 5 years ago
parent
commit
8bb8b28622
4 changed files with 98 additions and 51 deletions
  1. 18 0
      core/mac/src/pe/lim/lim_utils.c
  2. 36 0
      core/wma/inc/wma_he.h
  3. 2 51
      core/wma/src/wma_dev_if.c
  4. 42 0
      core/wma/src/wma_he.c

+ 18 - 0
core/mac/src/pe/lim/lim_utils.c

@@ -6817,6 +6817,7 @@ void lim_update_usr_he_cap(struct mac_context *mac_ctx, struct pe_session *sessi
 	struct he_cap_network_endian *he_cap_from_ie;
 	uint8_t extracted_buff[DOT11F_IE_HE_CAP_MAX_LEN + 2];
 	QDF_STATUS status;
+	struct sir_vht_config *vht_cfg = &session->vht_config;
 	qdf_mem_zero(extracted_buff, sizeof(extracted_buff));
 	status = lim_strip_ie(mac_ctx, add_ie->probeRespBCNData_buff,
 			&add_ie->probeRespBCNDataLen,
@@ -6843,6 +6844,23 @@ void lim_update_usr_he_cap(struct mac_context *mac_ctx, struct pe_session *sessi
 
 	pe_debug("After update: su_beamformer: %d, su_beamformee: %d, mu_beamformer: %d",
 		he_cap->su_beamformer, he_cap->su_beamformee, he_cap->mu_beamformer);
+	if (!he_cap->su_beamformer) {
+		he_cap->mu_beamformer = 0;
+		he_cap->num_sounding_lt_80 = 0;
+		he_cap->num_sounding_gt_80 = 0;
+		vht_cfg->su_beam_former = 0;
+		vht_cfg->mu_beam_former = 0;
+		vht_cfg->num_soundingdim = 0;
+	}
+	if (!he_cap->su_beamformee) {
+		he_cap->bfee_sts_lt_80 = 0;
+		he_cap->bfee_sts_gt_80 = 0;
+		vht_cfg->su_beam_formee = 0;
+		vht_cfg->mu_beam_formee = 0;
+		vht_cfg->csnof_beamformer_antSup = 0;
+	}
+	wma_set_he_txbf_params(session->vdev_id, he_cap->su_beamformer,
+			       he_cap->su_beamformee, he_cap->mu_beamformer);
 }
 
 void lim_decide_he_op(struct mac_context *mac_ctx, uint32_t *mlme_he_ops,

+ 36 - 0
core/wma/inc/wma_he.h

@@ -134,6 +134,33 @@ void wma_populate_peer_he_cap(struct peer_assoc_params *peer,
  */
 void wma_update_vdev_he_ops(uint32_t *he_ops, tDot11fIEhe_op *he_op);
 
+#define DOT11AX_HEMU_MODE 0x30
+#define HE_SUBFEE 0
+#define HE_SUBFER 1
+#define HE_MUBFEE 2
+#define HE_MUBFER 3
+
+/**
+ * wma_set_he_txbf_params() - set HE Tx beamforming params to FW
+ * @vdev_id: VDEV id
+ * @su bfer: SU beamformer capability
+ * @su bfee: SU beamformee capability
+ * @mu bfer: MU beamformer capability
+ *
+ * Return: None
+ */
+void wma_set_he_txbf_params(uint8_t vdev_id, bool su_bfer,
+			    bool su_bfee, bool mu_bfer);
+
+
+/**
+ * wma_set_he_txbf_cfg() - set HE Tx beamforming mlme cfg to FW
+ * @mac: Global MAC context
+ * @vdev_id: VDEV id
+ *
+ * Return: None
+ */
+void wma_set_he_txbf_cfg(struct mac_context *mac, uint8_t vdev_id);
 /**
  * wma_vdev_set_he_bss_params() - set HE OPs in vdev start
  * @wma: pointer to wma handle
@@ -257,6 +284,15 @@ void wma_update_vdev_he_ops(uint32_t *he_ops, tDot11fIEhe_op *he_op)
 {
 }
 
+static inline void wma_set_he_txbf_params(uint8_t vdev_id, bool su_bfer,
+					  bool su_bfee, bool mu_bfer)
+{
+}
+
+static inline void wma_set_he_txbf_cfg(struct mac_context *mac, uint8_t vdev_id)
+{
+}
+
 static inline  QDF_STATUS wma_update_he_ops_ie(tp_wma_handle wma,
 			uint8_t vdev_id, tDot11fIEhe_op *he_ops)
 {

+ 2 - 51
core/wma/src/wma_dev_if.c

@@ -2481,28 +2481,6 @@ QDF_STATUS wma_vdev_self_peer_create(struct vdev_mlme_obj *vdev_mlme)
 	return status;
 }
 
-#define DOT11AX_HEMU_MODE 0x30
-#define HE_SUBFEE 0
-#define HE_SUBFER 1
-#define HE_MUBFEE 2
-#define HE_MUBFER 3
-
-#ifdef WLAN_FEATURE_11AX
-static inline uint32_t wma_get_txbf_cap(struct mac_context *mac)
-{
-	return
-	(mac->mlme_cfg->he_caps.dot11_he_cap.su_beamformer << HE_SUBFER) |
-	(mac->mlme_cfg->he_caps.dot11_he_cap.su_beamformee << HE_SUBFEE) |
-	(1 << HE_MUBFEE) |
-	(mac->mlme_cfg->he_caps.dot11_he_cap.mu_beamformer << HE_MUBFER);
-}
-#else
-static inline uint32_t wma_get_txbf_cap(struct mac_context *mac)
-{
-	return 0;
-}
-#endif
-
 QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -2517,7 +2495,6 @@ QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
 	struct vdev_mlme_obj *vdev_mlme;
 	tp_wma_handle wma_handle;
 	uint8_t amsdu_val;
-	uint32_t hemu_mode;
 
 	if (!mac) {
 		WMA_LOGE("%s: Failed to get mac", __func__);
@@ -2684,34 +2661,8 @@ QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
 		WMA_LOGE("failed to set TX_STBC(status = %d)", status);
 
 	wma_set_vdev_mgmt_rate(wma_handle, vdev_id);
-	if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX)) {
-		hemu_mode = DOT11AX_HEMU_MODE;
-		hemu_mode |= wma_get_txbf_cap(mac);
-		/*
-		 * Enable / disable trigger access for a AP vdev's peers.
-		 * For a STA mode vdev this will enable/disable triggered
-		 * access and enable/disable Multi User mode of operation.
-		 * A value of 0 in a given bit disables corresponding mode.
-		 * bit | hemu mode
-		 * ---------------
-		 *  0  | HE SUBFEE
-		 *  1  | HE SUBFER
-		 *  2  | HE MUBFEE
-		 *  3  | HE MUBFER
-		 *  4  | DL OFDMA, for AP its DL Tx OFDMA for Sta its Rx OFDMA
-		 *  5  | UL OFDMA, for AP its Tx OFDMA trigger for Sta its
-		 *                 Rx OFDMA trigger receive & UL response
-		 *  6  | UL MUMIMO
-		 */
-		status = wma_vdev_set_param(wma_handle->wmi_handle,
-					    vdev_id,
-					    WMI_VDEV_PARAM_SET_HEMU_MODE,
-					    hemu_mode);
-		WMA_LOGD("set HEMU_MODE (hemu_mode = 0x%x)", hemu_mode);
-		if (QDF_IS_STATUS_ERROR(status))
-			WMA_LOGE("failed to set HEMU_MODE(status = %d)",
-				 status);
-	}
+	if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
+		wma_set_he_txbf_cfg(mac, vdev_id);
 
 	/* Initialize roaming offload state */
 	if (vdev_mlme->mgmt.generic.type == WMI_VDEV_TYPE_STA &&

+ 42 - 0
core/wma/src/wma_he.c

@@ -1366,6 +1366,48 @@ QDF_STATUS wma_update_he_ops_ie(tp_wma_handle wma, uint8_t vdev_id,
 	return ret;
 }
 
+void wma_set_he_txbf_cfg(struct mac_context *mac, uint8_t vdev_id)
+{
+	wma_set_he_txbf_params(vdev_id,
+			mac->mlme_cfg->he_caps.dot11_he_cap.su_beamformer,
+			mac->mlme_cfg->he_caps.dot11_he_cap.su_beamformee,
+			mac->mlme_cfg->he_caps.dot11_he_cap.mu_beamformer);
+}
+
+void wma_set_he_txbf_params(uint8_t vdev_id, bool su_bfer,
+			    bool su_bfee, bool mu_bfer)
+{
+	uint32_t hemu_mode;
+	QDF_STATUS status;
+	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
+
+	hemu_mode = DOT11AX_HEMU_MODE;
+	hemu_mode |= ((su_bfer << HE_SUBFER) | (su_bfee << HE_SUBFEE) |
+		      (mu_bfer << HE_MUBFER) | (su_bfee << HE_MUBFEE));
+	/*
+	 * Enable / disable trigger access for a AP vdev's peers.
+	 * For a STA mode vdev this will enable/disable triggered
+	 * access and enable/disable Multi User mode of operation.
+	 * A value of 0 in a given bit disables corresponding mode.
+	 * bit | hemu mode
+	 * ---------------
+	 *  0  | HE SUBFEE
+	 *  1  | HE SUBFER
+	 *  2  | HE MUBFEE
+	 *  3  | HE MUBFER
+	 *  4  | DL OFDMA, for AP its DL Tx OFDMA for Sta its Rx OFDMA
+	 *  5  | UL OFDMA, for AP its Tx OFDMA trigger for Sta its
+	 *                 Rx OFDMA trigger receive & UL response
+	 *  6  | UL MUMIMO
+	 */
+	status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
+				    WMI_VDEV_PARAM_SET_HEMU_MODE, hemu_mode);
+	WMA_LOGD("set HEMU_MODE (hemu_mode = 0x%x)", hemu_mode);
+
+	if (QDF_IS_STATUS_ERROR(status))
+		WMA_LOGE("failed to set HEMU_MODE(status = %d)", status);
+}
+
 QDF_STATUS wma_get_he_capabilities(struct he_capability *he_cap)
 {
 	tp_wma_handle wma_handle;