]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mt76: mt7996: rework background radar check for mt7990
authorStanleyYP Wang <StanleyYP.Wang@mediatek.com>
Wed, 9 Apr 2025 14:07:49 +0000 (22:07 +0800)
committerFelix Fietkau <nbd@nbd.name>
Wed, 21 May 2025 12:49:38 +0000 (14:49 +0200)
The MT7990 comes in 2T2R and 3T3R variants, with only the 2T2R supporting
background radar.

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

index 6f3eb053ef02125b0cb9613ecf61c54b7aa80432..7bfd19ed95944acdb46320780581169d8e4ff2dd 100644 (file)
@@ -376,3 +376,30 @@ s8 mt7996_eeprom_get_power_delta(struct mt7996_dev *dev, int band)
 
        return val & MT_EE_RATE_DELTA_SIGN ? delta : -delta;
 }
+
+bool mt7996_eeprom_has_background_radar(struct mt7996_dev *dev)
+{
+       switch (mt76_chip(&dev->mt76)) {
+       case MT7996_DEVICE_ID:
+               if (dev->var.type == MT7996_VAR_TYPE_233)
+                       return false;
+               break;
+       case MT7992_DEVICE_ID:
+               if (dev->var.type == MT7992_VAR_TYPE_23)
+                       return false;
+               break;
+       case MT7990_DEVICE_ID: {
+               u8 path, rx_path, nss, *eeprom = dev->mt76.eeprom.data;
+
+               mt7996_eeprom_parse_stream(eeprom, MT_BAND1, &path, &rx_path, &nss);
+               /* Disable background radar capability in 3T3R */
+               if (path == 3 || rx_path == 3)
+                       return false;
+               break;
+               }
+       default:
+               return false;
+       }
+
+       return true;
+}
index 9a8b10c50f72465270342c720fa277227092bb68..e26451add9a3da4d5e9c08e70b75d6483ad03b76 100644 (file)
@@ -475,7 +475,7 @@ mt7996_init_wiphy(struct ieee80211_hw *hw, struct mtk_wed_device *wed)
        wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
        wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER);
 
-       if (mt7996_has_background_radar(dev) &&
+       if (mt7996_eeprom_has_background_radar(dev) &&
            (!mdev->dev->of_node ||
             !of_property_read_bool(mdev->dev->of_node,
                                    "mediatek,disable-radar-background")))
index 92b01ed82e7e7b610dc7185284e5bfb70cc6eaeb..a45cd3ff61a013bb66d9c7a7f33189b6caf98c27 100644 (file)
@@ -488,25 +488,6 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
        return band <= MT_BAND2;
 }
 
-static inline bool
-mt7996_has_background_radar(struct mt7996_dev *dev)
-{
-       switch (mt76_chip(&dev->mt76)) {
-       case MT7996_DEVICE_ID:
-               if (dev->var.type == MT7996_VAR_TYPE_233)
-                       return false;
-               break;
-       case MT7992_DEVICE_ID:
-               if (dev->var.type == MT7992_VAR_TYPE_23)
-                       return false;
-               break;
-       default:
-               return false;
-       }
-
-       return true;
-}
-
 static inline struct mt7996_phy *
 mt7996_band_phy(struct mt7996_dev *dev, enum nl80211_band band)
 {
@@ -570,6 +551,7 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy);
 int mt7996_eeprom_get_target_power(struct mt7996_dev *dev,
                                   struct ieee80211_channel *chan);
 s8 mt7996_eeprom_get_power_delta(struct mt7996_dev *dev, int band);
+bool mt7996_eeprom_has_background_radar(struct mt7996_dev *dev);
 int mt7996_dma_init(struct mt7996_dev *dev);
 void mt7996_dma_reset(struct mt7996_dev *dev, bool force);
 void mt7996_dma_prefetch(struct mt7996_dev *dev);