On Thu, 2021-07-08 at 12:29 +0800, sean.wang@xxxxxxxxxxxx wrote: > From: Sean Wang <sean.wang@xxxxxxxxxxxx> > > Fix the current driver mgmt frame is not respecting the basic rates > field > provided by the AP and then unconditionally is using the lowest (1 or > 6 > Mbps) rate. > > For example, if the AP only supported basic rate {24, 36, 48, 54} > Mbps, > mt7921 cannot send mgmt frame with the rate not in the group. So, > instead, we pick up the lowest basic rate the AP can support to send. > > The patch also fixed up the hw_value in ieee80211_rate for MT7921 > hardware. > > Fixes: 163f4d22c118 ("mt76: mt7921: add MAC support") > Signed-off-by: Sean Wang <sean.wang@xxxxxxxxxxxx> > --- > .../net/wireless/mediatek/mt76/mt7921/init.c | 19 +++++++++++++++-- > .../net/wireless/mediatek/mt76/mt7921/mac.c | 21 +++++++++++++++ > ---- > .../wireless/mediatek/mt76/mt7921/mt7921.h | 14 +++++++++++++ > 3 files changed, 48 insertions(+), 6 deletions(-) > > > + int i, offset = 0; > + > + if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) > + offset = 4; > + > + i = ffs(vif->bss_conf.basic_rates) - 1; > + rate = &mt7921_rates[offset + i]; > + > + return rate->hw_value; > +} > + > void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi, > struct sk_buff *skb, struct mt76_wcid *wcid, > struct ieee80211_key_conf *key, bool beacon) > @@ -815,10 +831,7 @@ void mt7921_mac_write_txwi(struct mt7921_dev > *dev, __le32 *txwi, > /* hardware won't add HTC for mgmt/ctrl frame */ > txwi[2] |= cpu_to_le32(MT_TXD2_HTC_VLD); > > - if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) > - rate = MT7921_5G_RATE_DEFAULT; > - else > - rate = MT7921_2G_RATE_DEFAULT; > + rate = mt7921_default_basic_rates(dev, vif); .... > > \ > + .bitrate = _rate, \ > + .flags = IEEE80211_RATE_SHORT_PREAMBLE, \ > + .hw_value = (MT_PHY_TYPE_CCK << 6) | (_idx), \ > + .hw_value_short = (MT_PHY_TYPE_CCK << 6) | (4 + _idx), \ > +} > + > +#define MT7921_OFDM_RATE(_idx, _rate) { > \ > + .bitrate = _rate, \ > + .hw_value = (MT_PHY_TYPE_OFDM << 6) | (_idx), \ > + .hw_value_short = (MT_PHY_TYPE_OFDM << 6) | (_idx), \ > +} > + Nice catching. I shifted the wrong offset while bringing up mt7915, but I used the correct offset in TxD resulting in this mt7921 issue. Can you do me a favor to fix the offset of mt7915 as well? Ryder