]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mt76: mt7996: fix issues with manually triggered radar detection
authorStanleyYP Wang <StanleyYP.Wang@mediatek.com>
Thu, 12 Mar 2026 09:57:24 +0000 (17:57 +0800)
committerFelix Fietkau <nbd@nbd.name>
Tue, 24 Mar 2026 15:49:31 +0000 (15:49 +0000)
Disallow triggering radar detection on non-DFS channels to prevent paused
TX queues from failing to resume, as a channel switch is not performed in
this case.

Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Link: https://patch.msgid.link/20260312095724.2117448-6-shayne.chen@mediatek.com
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/debugfs.c

index 6cc63f87b2226e9165eeeaf56b61c1c6d4d34052..34af800964d11d14b74c6eecfb413592204f5822 100644 (file)
@@ -226,14 +226,23 @@ mt7996_radar_trigger(void *data, u64 val)
 #define RADAR_BACKGROUND       2
        struct mt7996_dev *dev = data;
        struct mt7996_phy *phy = mt7996_band_phy(dev, NL80211_BAND_5GHZ);
-       int rdd_idx;
+       struct cfg80211_chan_def *chandef;
+       int rdd_idx, ret;
 
        if (!phy || !val || val > RADAR_BACKGROUND)
                return -EINVAL;
 
-       if (val == RADAR_BACKGROUND && !dev->rdd2_phy) {
-               dev_err(dev->mt76.dev, "Background radar is not enabled\n");
-               return -EINVAL;
+       if (test_bit(MT76_SCANNING, &phy->mt76->state))
+               return -EBUSY;
+
+       if (val == RADAR_BACKGROUND) {
+               if (!dev->rdd2_phy || !cfg80211_chandef_valid(&dev->rdd2_chandef)) {
+                       dev_err(dev->mt76.dev, "Background radar is not enabled\n");
+                       return -EINVAL;
+               }
+               chandef = &dev->rdd2_chandef;
+       } else {
+               chandef = &phy->mt76->chandef;
        }
 
        rdd_idx = mt7996_get_rdd_idx(phy, val == RADAR_BACKGROUND);
@@ -242,6 +251,11 @@ mt7996_radar_trigger(void *data, u64 val)
                return -EINVAL;
        }
 
+       ret = cfg80211_chandef_dfs_required(dev->mt76.hw->wiphy, chandef,
+                                           NL80211_IFTYPE_AP);
+       if (ret <= 0)
+               return ret;
+
        return mt7996_mcu_rdd_cmd(dev, RDD_RADAR_EMULATE, rdd_idx, 0);
 }