[PATCH ath-next V15 5/9] wifi: ath12k: fix TX and RX MCS rate configurations in HE mode
Pradeep Kumar Chitrapu
quic_pradeepc at quicinc.com
Mon Jun 30 22:37:16 PDT 2025
On 6/30/2025 7:14 PM, Baochen Qiang wrote:
>
>
> On 7/1/2025 9:04 AM, Pradeep Kumar Chitrapu wrote:
>> Currently, the TX and RX MCS rate configurations per peer are
>> reversed when sent to the firmware. As a result, RX MCS rates
>> are configured for TX, and vice versa. This commit rectifies
>> the configuration to match what the firmware expects.
>
> Please mention that you are rectifying only for AP mode. For STA, current code is good.
Sure..technically I am changing for all modes except STA mode
>
>>
>> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
>>
>> Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices")
>> Signed-off-by: Baochen Qiang <quic_bqiang at quicinc.com>
>
> I don't see the need to add my S-O-B here, better drop it.
Sure thanks
>
>> Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
>> ---
>> drivers/net/wireless/ath/ath12k/wmi.c | 19 +++++++++++++++++--
>> drivers/net/wireless/ath/ath12k/wmi.h | 2 ++
>> 2 files changed, 19 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c
>> index 6c6354b3e18e..cdf3406302ee 100644
>> --- a/drivers/net/wireless/ath/ath12k/wmi.c
>> +++ b/drivers/net/wireless/ath/ath12k/wmi.c
>> @@ -2183,6 +2183,8 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar,
>> struct ath12k_wmi_peer_assoc_arg *arg)
>> {
>> struct ath12k_wmi_pdev *wmi = ar->wmi;
>> + struct ath12k_base *ab = ar->ab;
>> + struct ath12k_link_vif *arvif;
>> struct wmi_peer_assoc_complete_cmd *cmd;
>> struct ath12k_wmi_vht_rate_set_params *mcs;
>> struct ath12k_wmi_he_rate_set_params *he_mcs;
>> @@ -2198,6 +2200,13 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar,
>> u16 eml_cap;
>> __le32 v;
>>
>> + arvif = ath12k_mac_get_arvif(ar, arg->vdev_id);
>> + if (!arvif) {
>> + ath12k_warn(ab, "failed to find arvif with vdev id %d\n",
>> + arg->vdev_id);
>> + return -EINVAL;
>> + }
>> +
>> peer_legacy_rates_align = roundup(arg->peer_legacy_rates.num_rates,
>> sizeof(u32));
>> peer_ht_rates_align = roundup(arg->peer_ht_rates.num_rates,
>> @@ -2333,8 +2342,14 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar,
>> he_mcs->tlv_header = ath12k_wmi_tlv_cmd_hdr(WMI_TAG_HE_RATE_SET,
>> sizeof(*he_mcs));
>>
>> - he_mcs->rx_mcs_set = cpu_to_le32(arg->peer_he_rx_mcs_set[i]);
>> - he_mcs->tx_mcs_set = cpu_to_le32(arg->peer_he_tx_mcs_set[i]);
>> + if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
>> + he_mcs->rx_mcs_set = cpu_to_le32(arg->peer_he_rx_mcs_set[i]);
>> + he_mcs->tx_mcs_set = cpu_to_le32(arg->peer_he_tx_mcs_set[i]);
>> +
>> + } else {
>> + he_mcs->rx_mcs_set = cpu_to_le32(arg->peer_he_tx_mcs_set[i]);
>> + he_mcs->tx_mcs_set = cpu_to_le32(arg->peer_he_rx_mcs_set[i]);
>> + }
>> ptr += sizeof(*he_mcs);
>> }
>>
>> diff --git a/drivers/net/wireless/ath/ath12k/wmi.h b/drivers/net/wireless/ath/ath12k/wmi.h
>> index 0964ca03069a..7ad84624600d 100644
>> --- a/drivers/net/wireless/ath/ath12k/wmi.h
>> +++ b/drivers/net/wireless/ath/ath12k/wmi.h
>> @@ -4162,7 +4162,9 @@ struct ath12k_wmi_vht_rate_set_params {
>>
>> struct ath12k_wmi_he_rate_set_params {
>> __le32 tlv_header;
>> + /* MCS at which the peer can receive */
>> __le32 rx_mcs_set;
>> + /* MCS at which the peer can transmit */
>> __le32 tx_mcs_set;
>> } __packed;
>>
>
More information about the ath12k
mailing list