From 9b770cb3dacdc3e08c0cbee53ec0c0effcd879c3 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Thu, 11 Sep 2025 15:16:19 -0700 Subject: [PATCH] wifi: mt76: mt76_eeprom_override to int mt76_eeprom_override has of_get_mac_address, which can return -EPROBE_DEFER if the nvmem driver gets loaded after mt76 for some reason. Make sure this gets passed to probe so that nvmem mac overrides always work. Signed-off-by: Rosen Penev Link: https://patch.msgid.link/20250911221619.16035-1-rosenp@gmail.com Signed-off-by: Felix Fietkau --- eeprom.c | 24 +++++++++++++++++------- mt76.h | 2 +- mt7603/eeprom.c | 3 +-- mt7615/eeprom.c | 4 +--- mt7615/init.c | 5 ++++- mt76x0/eeprom.c | 6 +++++- mt76x2/eeprom.c | 4 +++- mt7915/eeprom.c | 4 +--- mt7915/init.c | 4 +++- mt7921/init.c | 4 +++- mt7925/init.c | 4 +++- mt7996/eeprom.c | 3 +-- mt7996/init.c | 4 +++- 13 files changed, 46 insertions(+), 25 deletions(-) diff --git a/eeprom.c b/eeprom.c index 30b744a1..b21ee5b5 100644 --- a/eeprom.c +++ b/eeprom.c @@ -163,7 +163,7 @@ static int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int len) return mt76_get_of_data_from_nvmem(dev, eep, "eeprom", len); } -void +int mt76_eeprom_override(struct mt76_phy *phy) { struct mt76_dev *dev = phy->dev; @@ -177,14 +177,22 @@ mt76_eeprom_override(struct mt76_phy *phy) if (ret) continue; - if (reg == phy->band_idx) { - found_mac = !of_get_mac_address(band_np, phy->macaddr); - break; - } + if (reg != phy->band_idx) + continue; + + ret = of_get_mac_address(band_np, phy->macaddr); + if (ret == -EPROBE_DEFER) + return ret; + + found_mac = !ret; + break; } - if (!found_mac) - of_get_mac_address(np, phy->macaddr); + if (!found_mac) { + ret = of_get_mac_address(np, phy->macaddr); + if (ret == -EPROBE_DEFER) + return ret; + } if (!is_valid_ether_addr(phy->macaddr)) { eth_random_addr(phy->macaddr); @@ -192,6 +200,8 @@ mt76_eeprom_override(struct mt76_phy *phy) "Invalid MAC address, using random address %pM\n", phy->macaddr); } + + return 0; } EXPORT_SYMBOL_GPL(mt76_eeprom_override); diff --git a/mt76.h b/mt76.h index 0bc66154..f5051b28 100644 --- a/mt76.h +++ b/mt76.h @@ -1299,7 +1299,7 @@ void mt76_seq_puts_array(struct seq_file *file, const char *str, s8 *val, int len); int mt76_eeprom_init(struct mt76_dev *dev, int len); -void mt76_eeprom_override(struct mt76_phy *phy); +int mt76_eeprom_override(struct mt76_phy *phy); int mt76_get_of_data_from_mtd(struct mt76_dev *dev, void *eep, int offset, int len); int mt76_get_of_data_from_nvmem(struct mt76_dev *dev, void *eep, const char *cell_name, int len); diff --git a/mt7603/eeprom.c b/mt7603/eeprom.c index f5a6b03b..88382b53 100644 --- a/mt7603/eeprom.c +++ b/mt7603/eeprom.c @@ -182,7 +182,6 @@ int mt7603_eeprom_init(struct mt7603_dev *dev) dev->mphy.antenna_mask = 1; dev->mphy.chainmask = dev->mphy.antenna_mask; - mt76_eeprom_override(&dev->mphy); - return 0; + return mt76_eeprom_override(&dev->mphy); } diff --git a/mt7615/eeprom.c b/mt7615/eeprom.c index ccedea7e..d4bc7e11 100644 --- a/mt7615/eeprom.c +++ b/mt7615/eeprom.c @@ -351,8 +351,6 @@ int mt7615_eeprom_init(struct mt7615_dev *dev, u32 addr) memcpy(dev->mphy.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR, ETH_ALEN); - mt76_eeprom_override(&dev->mphy); - - return 0; + return mt76_eeprom_override(&dev->mphy); } EXPORT_SYMBOL_GPL(mt7615_eeprom_init); diff --git a/mt7615/init.c b/mt7615/init.c index aae80005..3e7af3e5 100644 --- a/mt7615/init.c +++ b/mt7615/init.c @@ -570,7 +570,10 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev) ETH_ALEN); mphy->macaddr[0] |= 2; mphy->macaddr[0] ^= BIT(7); - mt76_eeprom_override(mphy); + + ret = mt76_eeprom_override(mphy); + if (ret) + return ret; /* second phy can only handle 5 GHz */ mphy->cap.has_5ghz = true; diff --git a/mt76x0/eeprom.c b/mt76x0/eeprom.c index bcd24c90..f6720a46 100644 --- a/mt76x0/eeprom.c +++ b/mt76x0/eeprom.c @@ -332,7 +332,11 @@ int mt76x0_eeprom_init(struct mt76x02_dev *dev) memcpy(dev->mphy.macaddr, (u8 *)dev->mt76.eeprom.data + MT_EE_MAC_ADDR, ETH_ALEN); - mt76_eeprom_override(&dev->mphy); + + err = mt76_eeprom_override(&dev->mphy); + if (err) + return err; + mt76x02_mac_setaddr(dev, dev->mphy.macaddr); mt76x0_set_chip_cap(dev); diff --git a/mt76x2/eeprom.c b/mt76x2/eeprom.c index 1fe5f5a0..e7df3b93 100644 --- a/mt76x2/eeprom.c +++ b/mt76x2/eeprom.c @@ -499,7 +499,9 @@ int mt76x2_eeprom_init(struct mt76x02_dev *dev) mt76x02_eeprom_parse_hw_cap(dev); mt76x2_eeprom_get_macaddr(dev); - mt76_eeprom_override(&dev->mphy); + ret = mt76_eeprom_override(&dev->mphy); + if (ret) + return ret; dev->mphy.macaddr[0] &= ~BIT(1); return 0; diff --git a/mt7915/eeprom.c b/mt7915/eeprom.c index c0f3402d..38dfd5de 100644 --- a/mt7915/eeprom.c +++ b/mt7915/eeprom.c @@ -284,9 +284,7 @@ int mt7915_eeprom_init(struct mt7915_dev *dev) memcpy(dev->mphy.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR, ETH_ALEN); - mt76_eeprom_override(&dev->mphy); - - return 0; + return mt76_eeprom_override(&dev->mphy); } int mt7915_eeprom_get_target_power(struct mt7915_dev *dev, diff --git a/mt7915/init.c b/mt7915/init.c index cad60b36..3eae4b9c 100644 --- a/mt7915/init.c +++ b/mt7915/init.c @@ -705,7 +705,9 @@ mt7915_register_ext_phy(struct mt7915_dev *dev, struct mt7915_phy *phy) mphy->macaddr[0] |= 2; mphy->macaddr[0] ^= BIT(7); } - mt76_eeprom_override(mphy); + ret = mt76_eeprom_override(mphy); + if (ret) + return ret; /* init wiphy according to mphy and phy */ mt7915_init_wiphy(phy); diff --git a/mt7921/init.c b/mt7921/init.c index 14e17dc9..b9098a73 100644 --- a/mt7921/init.c +++ b/mt7921/init.c @@ -189,7 +189,9 @@ static int __mt7921_init_hardware(struct mt792x_dev *dev) if (ret) goto out; - mt76_eeprom_override(&dev->mphy); + ret = mt76_eeprom_override(&dev->mphy); + if (ret) + goto out; ret = mt7921_mcu_set_eeprom(dev); if (ret) diff --git a/mt7925/init.c b/mt7925/init.c index 4249bad8..d7d5afe3 100644 --- a/mt7925/init.c +++ b/mt7925/init.c @@ -249,7 +249,9 @@ static int __mt7925_init_hardware(struct mt792x_dev *dev) if (ret) goto out; - mt76_eeprom_override(&dev->mphy); + ret = mt76_eeprom_override(&dev->mphy); + if (ret) + goto out; ret = mt7925_mcu_set_eeprom(dev); if (ret) diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c index 87c6192b..da3231c9 100644 --- a/mt7996/eeprom.c +++ b/mt7996/eeprom.c @@ -334,9 +334,8 @@ int mt7996_eeprom_init(struct mt7996_dev *dev) return ret; memcpy(dev->mphy.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR, ETH_ALEN); - mt76_eeprom_override(&dev->mphy); - return 0; + return mt76_eeprom_override(&dev->mphy); } int mt7996_eeprom_get_target_power(struct mt7996_dev *dev, diff --git a/mt7996/init.c b/mt7996/init.c index 09c73a6d..f1cf1ffb 100644 --- a/mt7996/init.c +++ b/mt7996/init.c @@ -703,7 +703,9 @@ static int mt7996_register_phy(struct mt7996_dev *dev, enum mt76_band_id band) if (band == MT_BAND2) mphy->macaddr[0] ^= BIT(6); } - mt76_eeprom_override(mphy); + ret = mt76_eeprom_override(mphy); + if (ret) + goto error; /* init wiphy according to mphy and phy */ mt7996_init_wiphy_band(mphy->hw, phy);