mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
wifi: mt76: mt7996: rely on mt76_connac2_mac_tx_rate_val
In order to fix a possible NULL pointer dereference in
mt7996_mac_write_txwi() of vif pointer, export
mt76_connac2_mac_tx_rate_val utility routine and reuse it
in mt7996 driver.
Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Signed-off-by: Lorenzo Bianconi <[email protected]>
Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
committed by
Felix Fietkau
parent
9107381d0f
commit
36d2a5bf78
+2
-46
@@ -959,51 +959,6 @@ mt7996_mac_write_txwi_80211(struct mt7996_dev *dev, __le32 *txwi,
|
||||
}
|
||||
}
|
||||
|
||||
static u16
|
||||
mt7996_mac_tx_rate_val(struct mt76_phy *mphy, struct ieee80211_vif *vif,
|
||||
bool beacon, bool mcast)
|
||||
{
|
||||
u8 mode = 0, band = mphy->chandef.chan->band;
|
||||
int rateidx = 0, mcast_rate;
|
||||
|
||||
if (beacon) {
|
||||
struct cfg80211_bitrate_mask *mask;
|
||||
|
||||
mask = &vif->bss_conf.beacon_tx_rate;
|
||||
if (hweight16(mask->control[band].he_mcs[0]) == 1) {
|
||||
rateidx = ffs(mask->control[band].he_mcs[0]) - 1;
|
||||
mode = MT_PHY_TYPE_HE_SU;
|
||||
goto out;
|
||||
} else if (hweight16(mask->control[band].vht_mcs[0]) == 1) {
|
||||
rateidx = ffs(mask->control[band].vht_mcs[0]) - 1;
|
||||
mode = MT_PHY_TYPE_VHT;
|
||||
goto out;
|
||||
} else if (hweight8(mask->control[band].ht_mcs[0]) == 1) {
|
||||
rateidx = ffs(mask->control[band].ht_mcs[0]) - 1;
|
||||
mode = MT_PHY_TYPE_HT;
|
||||
goto out;
|
||||
} else if (hweight32(mask->control[band].legacy) == 1) {
|
||||
rateidx = ffs(mask->control[band].legacy) - 1;
|
||||
goto legacy;
|
||||
}
|
||||
}
|
||||
|
||||
mcast_rate = vif->bss_conf.mcast_rate[band];
|
||||
if (mcast && mcast_rate > 0)
|
||||
rateidx = mcast_rate - 1;
|
||||
else
|
||||
rateidx = ffs(vif->bss_conf.basic_rates) - 1;
|
||||
|
||||
legacy:
|
||||
rateidx = mt76_calculate_default_rate(mphy, rateidx);
|
||||
mode = rateidx >> 8;
|
||||
rateidx &= GENMASK(7, 0);
|
||||
|
||||
out:
|
||||
return FIELD_PREP(MT_TX_RATE_IDX, rateidx) |
|
||||
FIELD_PREP(MT_TX_RATE_MODE, mode);
|
||||
}
|
||||
|
||||
void mt7996_mac_write_txwi(struct mt7996_dev *dev, __le32 *txwi,
|
||||
struct sk_buff *skb, struct mt76_wcid *wcid, int pid,
|
||||
struct ieee80211_key_conf *key, u32 changed)
|
||||
@@ -1091,7 +1046,8 @@ void mt7996_mac_write_txwi(struct mt7996_dev *dev, __le32 *txwi,
|
||||
/* Fixed rata is available just for 802.11 txd */
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
bool multicast = is_multicast_ether_addr(hdr->addr1);
|
||||
u16 rate = mt7996_mac_tx_rate_val(mphy, vif, beacon, multicast);
|
||||
u16 rate = mt76_connac2_mac_tx_rate_val(mphy, vif, beacon,
|
||||
multicast);
|
||||
|
||||
/* fix to bw 20 */
|
||||
val = MT_TXD6_FIXED_BW |
|
||||
|
||||
Reference in New Issue
Block a user