mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 22:52:19 +02:00
wifi: mt76: mt7615: fix use_cts_prot support
Driver should not directly write WTBL to prevent overwritten issues.
With this fix, when driver needs to adjust its behavior for compatibility,
especially concerning older 11g/n devices, by enabling or disabling CTS
protection frames, often for hidden SSIDs or to manage legacy clients.
Fixes: e34235ccc5 ("wifi: mt76: mt7615: enable use_cts_prot support")
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Link: https://patch.msgid.link/edb87088b0111b32fafc6c4179f54a5286dd37d8.1768879119.git.ryder.lee@mediatek.com
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
dcfbd5d3b8
commit
1974a67d9b
|
|
@ -1167,21 +1167,6 @@ void mt7615_mac_set_rates(struct mt7615_phy *phy, struct mt7615_sta *sta,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(mt7615_mac_set_rates);
|
||||
|
||||
void mt7615_mac_enable_rtscts(struct mt7615_dev *dev,
|
||||
struct ieee80211_vif *vif, bool enable)
|
||||
{
|
||||
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
|
||||
u32 addr;
|
||||
|
||||
addr = mt7615_mac_wtbl_addr(dev, mvif->sta.wcid.idx) + 3 * 4;
|
||||
|
||||
if (enable)
|
||||
mt76_set(dev, addr, MT_WTBL_W3_RTS);
|
||||
else
|
||||
mt76_clear(dev, addr, MT_WTBL_W3_RTS);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt7615_mac_enable_rtscts);
|
||||
|
||||
static int
|
||||
mt7615_mac_wtbl_update_key(struct mt7615_dev *dev, struct mt76_wcid *wcid,
|
||||
struct ieee80211_key_conf *key,
|
||||
|
|
|
|||
|
|
@ -583,9 +583,6 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw,
|
|||
}
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_ERP_CTS_PROT)
|
||||
mt7615_mac_enable_rtscts(dev, vif, info->use_cts_prot);
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON_ENABLED && info->enable_beacon) {
|
||||
mt7615_mcu_add_bss_info(phy, vif, NULL, true);
|
||||
mt7615_mcu_sta_add(phy, vif, NULL, true);
|
||||
|
|
@ -598,6 +595,10 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw,
|
|||
BSS_CHANGED_BEACON_ENABLED))
|
||||
mt7615_mcu_add_beacon(dev, hw, vif, info->enable_beacon);
|
||||
|
||||
if (changed & BSS_CHANGED_HT || changed & BSS_CHANGED_ERP_CTS_PROT)
|
||||
mt7615_mcu_set_protection(phy, vif, info->ht_operation_mode,
|
||||
info->use_cts_prot);
|
||||
|
||||
if (changed & BSS_CHANGED_PS)
|
||||
mt76_connac_mcu_set_vif_ps(&dev->mt76, vif);
|
||||
|
||||
|
|
|
|||
|
|
@ -2564,3 +2564,50 @@ int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
|
|||
return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_ROC),
|
||||
&req, sizeof(req), false);
|
||||
}
|
||||
|
||||
int mt7615_mcu_set_protection(struct mt7615_phy *phy, struct ieee80211_vif *vif,
|
||||
u8 ht_mode, bool use_cts_prot)
|
||||
{
|
||||
struct mt7615_dev *dev = phy->dev;
|
||||
struct {
|
||||
u8 prot_idx;
|
||||
u8 band;
|
||||
u8 rsv[2];
|
||||
|
||||
bool long_nav;
|
||||
bool prot_mm;
|
||||
bool prot_gf;
|
||||
bool prot_bw40;
|
||||
bool prot_rifs;
|
||||
bool prot_bw80;
|
||||
bool prot_bw160;
|
||||
u8 prot_erp_mask;
|
||||
} __packed req = {
|
||||
.prot_idx = 0x2,
|
||||
.band = phy != &dev->phy,
|
||||
};
|
||||
|
||||
switch (ht_mode & IEEE80211_HT_OP_MODE_PROTECTION) {
|
||||
case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
|
||||
case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
|
||||
req.prot_mm = true;
|
||||
req.prot_gf = true;
|
||||
fallthrough;
|
||||
case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
|
||||
req.prot_bw40 = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ht_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT)
|
||||
req.prot_gf = true;
|
||||
|
||||
if (use_cts_prot) {
|
||||
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
|
||||
u8 i = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0 : mvif->mt76.omac_idx;
|
||||
|
||||
req.prot_erp_mask = BIT(i);
|
||||
}
|
||||
|
||||
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(PROTECT_CTRL), &req,
|
||||
sizeof(req), true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -467,8 +467,6 @@ void mt7615_mac_reset_counters(struct mt7615_phy *phy);
|
|||
void mt7615_mac_cca_stats_reset(struct mt7615_phy *phy);
|
||||
void mt7615_mac_set_scs(struct mt7615_phy *phy, bool enable);
|
||||
void mt7615_mac_enable_nf(struct mt7615_dev *dev, bool ext_phy);
|
||||
void mt7615_mac_enable_rtscts(struct mt7615_dev *dev,
|
||||
struct ieee80211_vif *vif, bool enable);
|
||||
void mt7615_mac_sta_poll(struct mt7615_dev *dev);
|
||||
int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
|
||||
struct sk_buff *skb, struct mt76_wcid *wcid,
|
||||
|
|
@ -523,7 +521,8 @@ int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable);
|
|||
int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy);
|
||||
int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy);
|
||||
int mt7615_dfs_init_radar_detector(struct mt7615_phy *phy);
|
||||
|
||||
int mt7615_mcu_set_protection(struct mt7615_phy *phy, struct ieee80211_vif *vif,
|
||||
u8 ht_mode, bool use_cts_prot);
|
||||
int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
|
||||
struct ieee80211_channel *chan, int duration);
|
||||
|
||||
|
|
|
|||
|
|
@ -455,8 +455,6 @@ enum mt7615_reg_base {
|
|||
#define MT_WTBL_RIUCR3_RATE6 GENMASK(19, 8)
|
||||
#define MT_WTBL_RIUCR3_RATE7 GENMASK(31, 20)
|
||||
|
||||
#define MT_WTBL_W3_RTS BIT(22)
|
||||
|
||||
#define MT_WTBL_W5_CHANGE_BW_RATE GENMASK(7, 5)
|
||||
#define MT_WTBL_W5_SHORT_GI_20 BIT(8)
|
||||
#define MT_WTBL_W5_SHORT_GI_40 BIT(9)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user