static int mc_fixup_mac_addr(void *blob, int nodeoffset, const char *propname, struct eth_device *eth_dev, enum mc_fixup_type type) { int err = 0, len = 0, size, i; unsigned char env_enetaddr[ARP_HLEN]; unsigned int enetaddr_32[ARP_HLEN]; void *val = NULL; switch (type) { case MC_FIXUP_DPL: /* DPL likes its addresses on 32 * ARP_HLEN bits */ for (i = 0; i < ARP_HLEN; i++) enetaddr_32[i] = cpu_to_fdt32(eth_dev->enetaddr[i]); val = enetaddr_32; len = sizeof(enetaddr_32); break; case MC_FIXUP_DPC: val = eth_dev->enetaddr; len = ARP_HLEN; break; } /* MAC address property present */ if (fdt_get_property(blob, nodeoffset, propname, NULL)) { /* u-boot MAC addr randomly assigned - leave the present one */ if (!eth_env_get_enetaddr_by_index("eth", eth_dev->index, env_enetaddr)) return err; } else { size = MC_DT_INCREASE_SIZE + strlen(propname) + len; /* make room for mac address property */ err = fdt_increase_size(blob, size); if (err) { printf("fdt_increase_size: err=%s\n", fdt_strerror(err)); return err; } } err = fdt_setprop(blob, nodeoffset, propname, val, len); if (err) { printf("fdt_setprop: err=%s\n", fdt_strerror(err)); return err; } return err; }
/* * If there is no MAC address in the environment, then it will be initialized * (silently) from the value in the EEPROM. */ void davinci_sync_env_enetaddr(uint8_t *rom_enetaddr) { uint8_t env_enetaddr[6]; int ret; ret = eth_env_get_enetaddr_by_index("eth", 0, env_enetaddr); if (!ret) { /* * There is no MAC address in the environment, so we * initialize it from the value in the EEPROM. */ debug("### Setting environment from EEPROM MAC address = " "\"%pM\"\n", env_enetaddr); ret = !eth_env_set_enetaddr("ethaddr", rom_enetaddr); } if (!ret) printf("Failed to set mac address from EEPROM: %d\n", ret); }