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. > > 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@xxxxxxxxxxx> I don't see the need to add my S-O-B here, better drop it. > Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@xxxxxxxxxxx> > --- > 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; >