]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mt76: mt7615: fix use_cts_prot support
authorRyder Lee <ryder.lee@mediatek.com>
Wed, 21 Jan 2026 17:41:56 +0000 (09:41 -0800)
committerFelix Fietkau <nbd@nbd.name>
Mon, 23 Mar 2026 09:21:25 +0000 (09:21 +0000)
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: e34235ccc5e3 ("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>
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
drivers/net/wireless/mediatek/mt76/mt7615/main.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
drivers/net/wireless/mediatek/mt76/mt7615/regs.h

index 45992fdcec60c36ed56575046147f5457f4f46d0..ce00514685016494748be3454701abb9e8978172 100644 (file)
@@ -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,
index 727266892c3df6ee6f0c6943df8811c4d930a1e3..fc619acbb40d0bfe3627e61b281dcd1e5a806d93 100644 (file)
@@ -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);
 
index fc0054f8bd602d8f662779f2696298ec8847c5fb..ff57ede87f71794e20bf992465b18f02490a3995 100644 (file)
@@ -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);
+}
index c93fd245c90fb1e3d57a0035416b1e4daaa36b57..391928405f322db97c6727762422af2398d861d5 100644 (file)
@@ -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);
 
index eb3c24d51987d1eca3dc16ce231fbec08de3ade7..e4133e9181d0f1b912a75202f3791622dbc827c5 100644 (file)
@@ -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)