[PATCH v3 2/2] wifi: mt76: support per-band MAC addresses from OF child nodes

From: Daniel Golle
Date: Mon Jul 31 2023 - 18:24:48 EST


With dual-band-dual-congruent front-ends which appear as two independent
radios it is desirable to assign a per-band MAC address from device-tree,
eg. using nvmem-cells.
Support specifying MAC-address related properties in band-specific child
nodes, e.g.
wifi@0,0 {
reg = <0x0000 0 0 0 0>;
#addr-cells = <1>;
#size-cells = <0>;

band@0 {
/* 2.4 GHz */
reg = <0>;
nvmem-cells = <&macaddr 2>;
nvmem-cell-names = "mac-address";
};

band@1 {
/* 5 GHz */
reg = <1>;
nvmem-cells = <&macaddr 3>;
nvmem-cell-names = "mac-address";
};
};

Signed-off-by: Daniel Golle <daniel@xxxxxxxxxxxxxx>
Tested-by: Shiji Yang <yangshiji66@xxxxxxxxxxx>
---
Changes since v2:
* none

Changes since v1:
* refactor and add missing of_node_put()

drivers/net/wireless/mediatek/mt76/eeprom.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c
index 36564930aef12..c2b3386cada1c 100644
--- a/drivers/net/wireless/mediatek/mt76/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt76/eeprom.c
@@ -161,9 +161,25 @@ void
mt76_eeprom_override(struct mt76_phy *phy)
{
struct mt76_dev *dev = phy->dev;
- struct device_node *np = dev->dev->of_node;
+ struct device_node *np = dev->dev->of_node, *band_np;
+ bool found_mac = false;
+ u32 reg;
+ int ret;
+
+ for_each_child_of_node(np, band_np) {
+ ret = of_property_read_u32(band_np, "reg", &reg);
+ if (ret)
+ continue;
+
+ if (reg == phy->band_idx) {
+ found_mac = !of_get_mac_address(band_np, phy->macaddr);
+ of_node_put(band_np);
+ break;
+ }
+ }

- of_get_mac_address(np, phy->macaddr);
+ if (!found_mac)
+ of_get_mac_address(np, phy->macaddr);

if (!is_valid_ether_addr(phy->macaddr)) {
eth_random_addr(phy->macaddr);
--
2.41.0