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
This commit is contained in:
Kiran Kumar Lokere 2020-01-26 01:18:13 -08:00 committed by nshrivas
parent 77ccdbfdf3
commit 8bb8b28622
4 changed files with 98 additions and 51 deletions

View File

@ -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,

View File

@ -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)
{

View File

@ -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 &&

View File

@ -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;