wifi: mt76: mt7921: fix the wrong rate pickup for the chanctx driver
authorSean Wang <sean.wang@mediatek.com>
Mon, 18 Sep 2023 08:03:07 +0000 (16:03 +0800)
committerFelix Fietkau <nbd@nbd.name>
Sat, 30 Sep 2023 18:03:05 +0000 (20:03 +0200)
The variable band should be determined by the ieee80211_chanctx_conf when
the driver is a kind of chanctx one e.g mt7921 and mt7922 driver so we
added the extension to mt76_connac2_mac_tx_rate_val by distinguishing if
it can support chanctx to fix the incorrect rate pickup.

Fixes: 41ac53c899bd ("wifi: mt76: mt7921: introduce chanctx support")
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Reviewed-by: David Ruth <druth@chromium.org>
Tested-by: David Ruth <druth@chromium.org>
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c

index 8cd1a7ed82f423fa29bc31f9bf426449413c903b..cb76053973aa84e26a5669c3e397e36d3f1cd311 100644 (file)
@@ -1744,11 +1744,16 @@ mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc,
 }
 EXPORT_SYMBOL_GPL(mt76_init_queue);
 
-u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx)
+u16 mt76_calculate_default_rate(struct mt76_phy *phy,
+                               struct ieee80211_vif *vif, int rateidx)
 {
+       struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
+       struct cfg80211_chan_def *chandef = mvif->ctx ?
+                                           &mvif->ctx->def :
+                                           &phy->chandef;
        int offset = 0;
 
-       if (phy->chandef.chan->band != NL80211_BAND_2GHZ)
+       if (chandef->chan->band != NL80211_BAND_2GHZ)
                offset = 4;
 
        /* pick the lowest rate for hidden nodes */
index fabed3f3ef32d7b0e47237d7b8c8b9a5058e18bc..fede40cf86b748c735ec3ea36ec0fe2af329f196 100644 (file)
@@ -1107,7 +1107,8 @@ int mt76_get_of_eeprom(struct mt76_dev *dev, void *data, int offset, int len);
 struct mt76_queue *
 mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc,
                int ring_base, u32 flags);
-u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx);
+u16 mt76_calculate_default_rate(struct mt76_phy *phy,
+                               struct ieee80211_vif *vif, int rateidx);
 static inline int mt76_init_tx_queue(struct mt76_phy *phy, int qid, int idx,
                                     int n_desc, int ring_base, u32 flags)
 {
index 3b63c64e7d54a1e690f7152c9f1b0880ec653532..93402d2c253894c697a241c88bb007df16554d31 100644 (file)
@@ -293,7 +293,10 @@ u16 mt76_connac2_mac_tx_rate_val(struct mt76_phy *mphy,
                                 struct ieee80211_vif *vif,
                                 bool beacon, bool mcast)
 {
-       u8 nss = 0, mode = 0, band = mphy->chandef.chan->band;
+       struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
+       struct cfg80211_chan_def *chandef = mvif->ctx ?
+                                           &mvif->ctx->def : &mphy->chandef;
+       u8 nss = 0, mode = 0, band = chandef->chan->band;
        int rateidx = 0, mcast_rate;
 
        if (!vif)
@@ -326,7 +329,7 @@ u16 mt76_connac2_mac_tx_rate_val(struct mt76_phy *mphy,
                rateidx = ffs(vif->bss_conf.basic_rates) - 1;
 
 legacy:
-       rateidx = mt76_calculate_default_rate(mphy, rateidx);
+       rateidx = mt76_calculate_default_rate(mphy, vif, rateidx);
        mode = rateidx >> 8;
        rateidx &= GENMASK(7, 0);
 out: