Some RF registers need different values for various chips.
For at least mt76x0_rf_central_tab registers, overwriting them later does
not work, as the wrong values can cause the entire system to hang on some
devices with MT7610E

Signed-off-by: Felix Fietkau <[email protected]>
---
 .../wireless/mediatek/mt76/mt76x0/mt76x0.h    |  6 ++-
 .../net/wireless/mediatek/mt76/mt76x0/phy.c   | 47 ++++++++++++++++++-
 2 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h 
b/drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h
index 33475788bc26..989ed00c0b7a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h
@@ -33,8 +33,10 @@
 
 static inline bool is_mt7610e(struct mt76x02_dev *dev)
 {
-       /* TODO */
-       return false;
+       if (!mt76_is_mmio(dev))
+               return false;
+
+       return mt76_chip(&dev->mt76) == 0x7610;
 }
 
 static inline bool is_mt7630(struct mt76x02_dev *dev)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c 
b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
index 10041e673c31..d294325221f3 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
@@ -775,13 +775,56 @@ static void mt76x0_phy_calibration_work(struct 
work_struct *work)
                                     MT_CALIBRATE_INTERVAL);
 }
 
+static void mt76x0_rf_patch_reg_array(struct mt76x02_dev *dev,
+                                     const struct mt76_reg_pair *rp, int len)
+{
+       int i;
+
+       for (i = 0; i < len; i++) {
+               u32 reg = rp[i].reg;
+               u8 val = rp[i].value;
+
+               switch (reg) {
+               case MT_RF(0, 3):
+                       if (mt76_is_mmio(dev)) {
+                               if (is_mt7630(dev))
+                                       val = 0x70;
+                               else
+                                       val = 0x63;
+                       } else {
+                               val = 0x73;
+                       }
+                       break;
+               case MT_RF(0, 21):
+                       if (is_mt7610e(dev))
+                               val = 0x10;
+                       else
+                               val = 0x12;
+                       break;
+               case MT_RF(5, 2):
+                       if (is_mt7630(dev))
+                               val = 0x1d;
+                       else if (is_mt7610e(dev))
+                               val = 0x00;
+                       else
+                               val = 0x0c;
+                       break;
+               default:
+                       break;
+               }
+               mt76x0_rf_wr(dev, reg, val);
+       }
+}
+
 static void mt76x0_phy_rf_init(struct mt76x02_dev *dev)
 {
        int i;
        u8 val;
 
-       RF_RANDOM_WRITE(dev, mt76x0_rf_central_tab);
-       RF_RANDOM_WRITE(dev, mt76x0_rf_2g_channel_0_tab);
+       mt76x0_rf_patch_reg_array(dev, mt76x0_rf_central_tab,
+                                 ARRAY_SIZE(mt76x0_rf_central_tab));
+       mt76x0_rf_patch_reg_array(dev, mt76x0_rf_2g_channel_0_tab,
+                                 ARRAY_SIZE(mt76x0_rf_2g_channel_0_tab));
        RF_RANDOM_WRITE(dev, mt76x0_rf_5g_channel_0_tab);
        RF_RANDOM_WRITE(dev, mt76x0_rf_vga_channel_0_tab);
        mt76x0_phy_rf_switch_band(dev, NULL);
-- 
2.17.0

Reply via email to