Commit ade25ca7 authored by Peter Chiu's avatar Peter Chiu Committed by Felix Fietkau

mt76: mt7915: fix mcs_map in mt7915_mcu_set_sta_he_mcs()

Should use peer's bandwidth instead of chandef->width to
get correct mcs_map.

Fixes: 76be6c07 ("mt76: mt7915: add .set_bitrate_mask() callback")
Signed-off-by: default avatarPeter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 11005b18
...@@ -86,24 +86,12 @@ mt7915_mcu_get_sta_nss(u16 mcs_map) ...@@ -86,24 +86,12 @@ mt7915_mcu_get_sta_nss(u16 mcs_map)
static void static void
mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs, mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs,
const u16 *mask) u16 mcs_map)
{ {
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
struct cfg80211_chan_def *chandef = &msta->vif->phy->mt76->chandef; enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band;
const u16 *mask = msta->vif->bitrate_mask.control[band].he_mcs;
int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss; int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
u16 mcs_map;
switch (chandef->width) {
case NL80211_CHAN_WIDTH_80P80:
mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_80p80);
break;
case NL80211_CHAN_WIDTH_160:
mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_160);
break;
default:
mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_80);
break;
}
for (nss = 0; nss < max_nss; nss++) { for (nss = 0; nss < max_nss; nss++) {
int mcs; int mcs;
...@@ -765,11 +753,9 @@ static void ...@@ -765,11 +753,9 @@ static void
mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta, mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem; struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem;
enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band; struct ieee80211_he_mcs_nss_supp mcs_map;
const u16 *mcs_mask = msta->vif->bitrate_mask.control[band].he_mcs;
struct sta_rec_he *he; struct sta_rec_he *he;
struct tlv *tlv; struct tlv *tlv;
u32 cap = 0; u32 cap = 0;
...@@ -859,22 +845,23 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta, ...@@ -859,22 +845,23 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
he->he_cap = cpu_to_le32(cap); he->he_cap = cpu_to_le32(cap);
mcs_map = sta->he_cap.he_mcs_nss_supp;
switch (sta->bandwidth) { switch (sta->bandwidth) {
case IEEE80211_STA_RX_BW_160: case IEEE80211_STA_RX_BW_160:
if (elem->phy_cap_info[0] & if (elem->phy_cap_info[0] &
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
mt7915_mcu_set_sta_he_mcs(sta, mt7915_mcu_set_sta_he_mcs(sta,
&he->max_nss_mcs[CMD_HE_MCS_BW8080], &he->max_nss_mcs[CMD_HE_MCS_BW8080],
mcs_mask); le16_to_cpu(mcs_map.rx_mcs_80p80));
mt7915_mcu_set_sta_he_mcs(sta, mt7915_mcu_set_sta_he_mcs(sta,
&he->max_nss_mcs[CMD_HE_MCS_BW160], &he->max_nss_mcs[CMD_HE_MCS_BW160],
mcs_mask); le16_to_cpu(mcs_map.rx_mcs_160));
fallthrough; fallthrough;
default: default:
mt7915_mcu_set_sta_he_mcs(sta, mt7915_mcu_set_sta_he_mcs(sta,
&he->max_nss_mcs[CMD_HE_MCS_BW80], &he->max_nss_mcs[CMD_HE_MCS_BW80],
mcs_mask); le16_to_cpu(mcs_map.rx_mcs_80));
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment