net: ks8851: Implement EEPROM MAC address readout
authorMarek Vasut <marex@denx.de>
Thu, 8 Oct 2020 13:14:17 +0000 (15:14 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 9 Nov 2020 19:18:09 +0000 (14:18 -0500)
In case there is an EEPROM attached to the KS8851 MAC and the EEPROM
contains a valid MAC address, the MAC address is loaded into the NIC
registers on power on. Read the MAC address out of the NIC registers
and provide it to U-Boot.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Eugen Hristev <eugen.hristev@microchip.com>
Cc: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/ks8851_mll.c

index d226684..58e065c 100644 (file)
@@ -622,6 +622,34 @@ static int ks8851_write_hwaddr(struct udevice *dev)
        return 0;
 }
 
+static int ks8851_read_rom_hwaddr(struct udevice *dev)
+{
+       struct ks_net *ks = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       u16 addrl, addrm, addrh;
+
+       /* No EEPROM means no valid MAC address. */
+       if (!(ks_rdreg16(ks, KS_CCR) & CCR_EEPROM))
+               return -EINVAL;
+
+       /*
+        * If the EEPROM contains valid MAC address, it is loaded into
+        * the NIC on power on. Read the MAC out of the NIC registers.
+        */
+       addrl = ks_rdreg16(ks, KS_MARL);
+       addrm = ks_rdreg16(ks, KS_MARM);
+       addrh = ks_rdreg16(ks, KS_MARH);
+
+       pdata->enetaddr[0] = (addrh >> 8) & 0xff;
+       pdata->enetaddr[1] = addrh & 0xff;
+       pdata->enetaddr[2] = (addrm >> 8) & 0xff;
+       pdata->enetaddr[3] = addrm & 0xff;
+       pdata->enetaddr[4] = (addrl >> 8) & 0xff;
+       pdata->enetaddr[5] = addrl & 0xff;
+
+       return !is_valid_ethaddr(pdata->enetaddr);
+}
+
 static int ks8851_bind(struct udevice *dev)
 {
        return device_set_name(dev, dev->name);
@@ -654,6 +682,7 @@ static const struct eth_ops ks8851_ops = {
        .send           = ks8851_send,
        .recv           = ks8851_recv,
        .write_hwaddr   = ks8851_write_hwaddr,
+       .read_rom_hwaddr = ks8851_read_rom_hwaddr,
 };
 
 static const struct udevice_id ks8851_ids[] = {