mt76: mt7603: check for single-stream EEPROM configuration
authorFelix Fietkau <nbd@nbd.name>
Tue, 25 Aug 2020 05:03:37 +0000 (07:03 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 24 Sep 2020 16:10:16 +0000 (18:10 +0200)
Some devices using MT7628 or MT7603 have only one antenna chain connected.
Detect these using the EEPROM rx/tx path settings

Reported-by: Qin Wei <me@vonger.cn>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7603/eeprom.c
drivers/net/wireless/mediatek/mt76/mt7603/eeprom.h
drivers/net/wireless/mediatek/mt76/mt7603/init.c

index 3ee06e2..01f1e0d 100644 (file)
@@ -147,8 +147,14 @@ static int mt7603_check_eeprom(struct mt76_dev *dev)
        }
 }
 
+static inline bool is_mt7688(struct mt7603_dev *dev)
+{
+       return mt76_rr(dev, MT_EFUSE_BASE + 0x64) & BIT(4);
+}
+
 int mt7603_eeprom_init(struct mt7603_dev *dev)
 {
+       u8 *eeprom;
        int ret;
 
        ret = mt7603_eeprom_load(dev);
@@ -163,9 +169,16 @@ int mt7603_eeprom_init(struct mt7603_dev *dev)
                               MT7603_EEPROM_SIZE);
        }
 
+       eeprom = (u8 *)dev->mt76.eeprom.data;
        dev->mt76.cap.has_2ghz = true;
-       memcpy(dev->mt76.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR,
-              ETH_ALEN);
+       memcpy(dev->mt76.macaddr, eeprom + MT_EE_MAC_ADDR, ETH_ALEN);
+
+       /* Check for 1SS devices */
+       dev->mphy.antenna_mask = 3;
+       if (FIELD_GET(MT_EE_NIC_CONF_0_RX_PATH, eeprom[MT_EE_NIC_CONF_0]) == 1 ||
+           FIELD_GET(MT_EE_NIC_CONF_0_TX_PATH, eeprom[MT_EE_NIC_CONF_0]) == 1 ||
+           is_mt7688(dev))
+               dev->mphy.antenna_mask = 1;
 
        mt76_eeprom_override(&dev->mt76);
 
index b893fac..4687d6d 100644 (file)
@@ -85,4 +85,7 @@ enum mt7603_eeprom_source {
        MT_EE_SRC_FLASH,
 };
 
+#define MT_EE_NIC_CONF_0_RX_PATH               GENMASK(3, 0)
+#define MT_EE_NIC_CONF_0_TX_PATH               GENMASK(7, 4)
+
 #endif
index 9419659..c4848fa 100644 (file)
@@ -536,11 +536,6 @@ int mt7603_register_device(struct mt7603_dev *dev)
        tasklet_init(&dev->mt76.pre_tbtt_tasklet, mt7603_pre_tbtt_tasklet,
                     (unsigned long)dev);
 
-       /* Check for 7688, which only has 1SS */
-       dev->mphy.antenna_mask = 3;
-       if (mt76_rr(dev, MT_EFUSE_BASE + 0x64) & BIT(4))
-               dev->mphy.antenna_mask = 1;
-
        dev->slottime = 9;
        dev->sensitivity_limit = 28;
        dev->dynamic_sensitivity = true;