]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mt76x0: eeprom: load eeprom data from mtd by default
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Fri, 28 Sep 2018 11:39:06 +0000 (13:39 +0200)
committerFelix Fietkau <nbd@nbd.name>
Mon, 1 Oct 2018 10:34:43 +0000 (12:34 +0200)
Read eeprom data from mtd memory by default and fall-back
to efuse if it fails

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c

index ef9c3df6a1699be8feb4fcd466d26b9d52ec484e..166a1fd8644e24b7cb59bed209bfd0aa9f8e2106 100644 (file)
@@ -277,24 +277,54 @@ void mt76x0_get_power_info(struct mt76x0_dev *dev, u8 *info)
                info[1] = 5;
 }
 
+static int mt76x0_check_eeprom(struct mt76x0_dev *dev)
+{
+       u16 val;
+
+       val = get_unaligned_le16(dev->mt76.eeprom.data);
+       if (!val)
+               val = get_unaligned_le16(dev->mt76.eeprom.data +
+                                        MT_EE_PCI_ID);
+
+       switch (val) {
+       case 0x7650:
+       case 0x7610:
+               return 0;
+       default:
+               dev_err(dev->mt76.dev, "EEPROM data check failed: %04x\n",
+                       val);
+               return -EINVAL;
+       }
+}
+
+static int mt76x0_load_eeprom(struct mt76x0_dev *dev)
+{
+       int found;
+
+       found = mt76_eeprom_init(&dev->mt76, MT76X0_EEPROM_SIZE);
+       if (found < 0)
+               return found;
+
+       if (found && !mt76x0_check_eeprom(dev))
+               return 0;
+
+       found = mt76x0_efuse_physical_size_check(dev);
+       if (found < 0)
+               return found;
+
+       return mt76x02_get_efuse_data(&dev->mt76, 0, dev->mt76.eeprom.data,
+                                     MT76X0_EEPROM_SIZE, MT_EE_READ);
+}
+
 int mt76x0_eeprom_init(struct mt76x0_dev *dev)
 {
        u8 version, fae;
        u16 data;
-       int ret;
+       int err;
 
-       ret = mt76x0_efuse_physical_size_check(dev);
-       if (ret)
-               return ret;
-
-       ret = mt76_eeprom_init(&dev->mt76, MT76X0_EEPROM_SIZE);
-       if (ret < 0)
-               return ret;
-
-       ret = mt76x02_get_efuse_data(&dev->mt76, 0, dev->mt76.eeprom.data,
-                                    MT76X0_EEPROM_SIZE, MT_EE_READ);
-       if (ret)
-               return ret;
+       err = mt76x0_load_eeprom(dev);
+       if (err < 0)
+               return err;
 
        data = mt76x02_eeprom_get(&dev->mt76, MT_EE_VERSION);
        version = data >> 8;