]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: push EHT MU-MIMO params to hardware
authorPradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
Tue, 1 Jul 2025 01:04:01 +0000 (18:04 -0700)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Wed, 2 Jul 2025 14:02:25 +0000 (07:02 -0700)
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>
drivers/net/wireless/ath/ath12k/mac.c
drivers/net/wireless/ath/ath12k/wmi.h

index c81cecb01c0613a629b7f8a87b8739e7ef428b9d..811b44c703b4893f9db37617b3fa0cd39f28f68a 100644 (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);
 
index 07cba3997e7516e426f019dd00802cec2c80eafe..0964ca03069abd5b3357f830b65fc28411cab752 100644 (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