wifi: ath12k: push EHT MU-MIMO params to hardware

Currently, only the EHT IE in management frames is updated with
respect to MU-MIMO configurations, but this change is not
reflected in the hardware. Add support to propagate MU-MIMO
configurations to the hardware as well for AP mode. Similar
support for STA mode will be added in future.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1

Co-developed-by: Muna Sinada <quic_msinada@quicinc.com>
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Link: https://patch.msgid.link/20250701010408.1257201-3-quic_pradeepc@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
Pradeep Kumar Chitrapu
2025-06-30 18:04:01 -07:00
committed by Jeff Johnson
parent 5d6707e88e
commit df8207bc0b
2 changed files with 79 additions and 0 deletions

View File

@@ -3279,6 +3279,58 @@ static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar,
return 0;
}
static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif)
{
struct ath12k_vif *ahvif = arvif->ahvif;
struct ath12k *ar = arvif->ar;
u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE;
u32 value = 0;
int ret;
struct ieee80211_bss_conf *link_conf;
link_conf = ath12k_mac_get_link_bss_conf(arvif);
if (!link_conf) {
ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n");
return -ENOENT;
}
if (!link_conf->eht_support)
return 0;
if (link_conf->eht_su_beamformer) {
value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER);
if (link_conf->eht_mu_beamformer &&
ahvif->vdev_type == WMI_VDEV_TYPE_AP)
value |= u32_encode_bits(EHT_MU_BFER_ENABLE,
EHT_MODE_MU_TX_BFER) |
u32_encode_bits(EHT_DL_MUOFDMA_ENABLE,
EHT_MODE_DL_OFDMA_MUMIMO) |
u32_encode_bits(EHT_UL_MUOFDMA_ENABLE,
EHT_MODE_UL_OFDMA_MUMIMO);
}
if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) |
u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA);
if (link_conf->eht_80mhz_full_bw_ul_mumimo)
value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO);
if (link_conf->eht_su_beamformee)
value |= u32_encode_bits(EHT_SU_BFEE_ENABLE,
EHT_MODE_SU_TX_BFEE);
}
ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
if (ret) {
ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n",
arvif->vdev_id, ret);
return ret;
}
return 0;
}
static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
struct ieee80211_link_sta *link_sta)
{
@@ -4018,6 +4070,12 @@ static void ath12k_mac_bss_info_changed(struct ath12k *ar,
ath12k_warn(ar->ab,
"failed to set HE TXBF config for vdev: %d\n",
arvif->vdev_id);
ret = ath12k_mac_set_eht_txbf_conf(arvif);
if (ret)
ath12k_warn(ar->ab,
"failed to set EHT TXBF config for vdev: %d\n",
arvif->vdev_id);
}
ath12k_control_beaconing(arvif, info);

View File

@@ -1178,6 +1178,7 @@ enum wmi_tlv_vdev_param {
WMI_VDEV_PARAM_BSS_COLOR,
WMI_VDEV_PARAM_SET_HEMU_MODE,
WMI_VDEV_PARAM_HEOPS_0_31 = 0x8003,
WMI_VDEV_PARAM_SET_EHT_MU_MODE = 0x8005,
};
enum wmi_tlv_peer_flags {
@@ -3153,6 +3154,26 @@ struct ath12k_wmi_rx_reorder_queue_remove_arg {
#define HE_MU_BFER_ENABLE 1
#define HE_SU_BFER_ENABLE 1
#define EHT_MODE_SU_TX_BFEE BIT(0)
#define EHT_MODE_SU_TX_BFER BIT(1)
#define EHT_MODE_MU_TX_BFEE BIT(2)
#define EHT_MODE_MU_TX_BFER BIT(3)
#define EHT_MODE_DL_OFDMA BIT(4)
#define EHT_MODE_UL_OFDMA BIT(5)
#define EHT_MODE_MUMIMO BIT(6)
#define EHT_MODE_DL_OFDMA_TXBF BIT(7)
#define EHT_MODE_DL_OFDMA_MUMIMO BIT(8)
#define EHT_MODE_UL_OFDMA_MUMIMO BIT(9)
#define EHT_DL_MUOFDMA_ENABLE 1
#define EHT_UL_MUOFDMA_ENABLE 1
#define EHT_DL_MUMIMO_ENABLE 1
#define EHT_UL_MUMIMO_ENABLE 1
#define EHT_MU_BFEE_ENABLE 1
#define EHT_SU_BFEE_ENABLE 1
#define EHT_MU_BFER_ENABLE 1
#define EHT_SU_BFER_ENABLE 1
#define HE_VHT_SOUNDING_MODE_ENABLE 1
#define HE_SU_MU_SOUNDING_MODE_ENABLE 1
#define HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE 1