/* * 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]; eth_getenv_enetaddr_by_index(0, env_enetaddr); if (!memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) { /* 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); eth_setenv_enetaddr("ethaddr", rom_enetaddr); } }
void lp8x4x_eth1_mac_init(void) { u8 eth1addr[8]; int i; u8 reg; eth_getenv_enetaddr_by_index("eth", 1, eth1addr); if (!is_valid_ether_addr(eth1addr)) return; for (i = 0, reg = 0x10; i < 6; i++, reg++) { writeb(reg, (u8 *)(DM9000_IO_2)); writeb(eth1addr[i], (u8 *)(DM9000_DATA_2)); } }
/* * 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_getenv_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_setenv_enetaddr("ethaddr", rom_enetaddr); } if (!ret) printf("Failed to set mac address from EEPROM: %d\n", ret); }
static int eth_post_probe(struct udevice *dev) { struct eth_device_priv *priv = dev->uclass_priv; struct eth_pdata *pdata = dev->platdata; unsigned char env_enetaddr[ARP_HLEN]; #if defined(CONFIG_NEEDS_MANUAL_RELOC) struct eth_ops *ops = eth_get_ops(dev); static int reloc_done; if (!reloc_done) { if (ops->start) ops->start += gd->reloc_off; if (ops->send) ops->send += gd->reloc_off; if (ops->recv) ops->recv += gd->reloc_off; if (ops->free_pkt) ops->free_pkt += gd->reloc_off; if (ops->stop) ops->stop += gd->reloc_off; #ifdef CONFIG_MCAST_TFTP if (ops->mcast) ops->mcast += gd->reloc_off; #endif if (ops->write_hwaddr) ops->write_hwaddr += gd->reloc_off; if (ops->read_rom_hwaddr) ops->read_rom_hwaddr += gd->reloc_off; reloc_done++; } #endif priv->state = ETH_STATE_INIT; /* Check if the device has a MAC address in ROM */ if (eth_get_ops(dev)->read_rom_hwaddr) eth_get_ops(dev)->read_rom_hwaddr(dev); eth_getenv_enetaddr_by_index("eth", dev->seq, env_enetaddr); if (!is_zero_ethaddr(env_enetaddr)) { if (!is_zero_ethaddr(pdata->enetaddr) && memcmp(pdata->enetaddr, env_enetaddr, ARP_HLEN)) { printf("\nWarning: %s MAC addresses don't match:\n", dev->name); printf("Address in ROM is %pM\n", pdata->enetaddr); printf("Address in environment is %pM\n", env_enetaddr); } /* Override the ROM MAC address */ memcpy(pdata->enetaddr, env_enetaddr, ARP_HLEN); } else if (is_valid_ethaddr(pdata->enetaddr)) { eth_setenv_enetaddr_by_index("eth", dev->seq, pdata->enetaddr); printf("\nWarning: %s using MAC address from ROM\n", dev->name); } else if (is_zero_ethaddr(pdata->enetaddr) || !is_valid_ethaddr(pdata->enetaddr)) { #ifdef CONFIG_NET_RANDOM_ETHADDR net_random_ethaddr(pdata->enetaddr); printf("\nWarning: %s (eth%d) using random MAC address - %pM\n", dev->name, dev->seq, pdata->enetaddr); #else printf("\nError: %s address not set.\n", dev->name); return -EINVAL; #endif } return 0; }
int ftmac110_initialize(bd_t *bis) { int i, card_nr = 0; struct eth_device *dev; struct ftmac110_chip *chip; dev = malloc(sizeof(*dev) + sizeof(*chip)); if (dev == NULL) { panic("ftmac110: out of memory 1\n"); return -1; } chip = (struct ftmac110_chip *)(dev + 1); memset(dev, 0, sizeof(*dev) + sizeof(*chip)); sprintf(dev->name, "FTMAC110#%d", card_nr); dev->iobase = CONFIG_FTMAC110_BASE; chip->regs = (void __iomem *)dev->iobase; dev->priv = chip; dev->init = ftmac110_probe; dev->halt = ftmac110_halt; dev->send = ftmac110_send; dev->recv = ftmac110_recv; if (!eth_getenv_enetaddr_by_index("eth", card_nr, dev->enetaddr)) eth_random_enetaddr(dev->enetaddr); /* allocate tx descriptors (it must be 16 bytes aligned) */ chip->txd = dma_alloc_coherent( sizeof(struct ftmac110_desc) * CFG_TXDES_NUM, &chip->txd_dma); if (!chip->txd) panic("ftmac110: out of memory 3\n"); memset(chip->txd, 0, sizeof(struct ftmac110_desc) * CFG_TXDES_NUM); for (i = 0; i < CFG_TXDES_NUM; ++i) { void *va = memalign(ARCH_DMA_MINALIGN, CFG_XBUF_SIZE); if (!va) panic("ftmac110: out of memory 4\n"); chip->txd[i].vbuf = va; chip->txd[i].pbuf = cpu_to_le32(virt_to_phys(va)); chip->txd[i].ctrl = 0; /* owned by SW */ } chip->txd[i - 1].ctrl |= cpu_to_le64(FTMAC110_TXD_END); chip->txd_idx = 0; /* allocate rx descriptors (it must be 16 bytes aligned) */ chip->rxd = dma_alloc_coherent( sizeof(struct ftmac110_desc) * CFG_RXDES_NUM, &chip->rxd_dma); if (!chip->rxd) panic("ftmac110: out of memory 4\n"); memset((void *)chip->rxd, 0, sizeof(struct ftmac110_desc) * CFG_RXDES_NUM); for (i = 0; i < CFG_RXDES_NUM; ++i) { void *va = memalign(ARCH_DMA_MINALIGN, CFG_XBUF_SIZE + 2); if (!va) panic("ftmac110: out of memory 5\n"); /* it needs to be exactly 2 bytes aligned */ va = ((uint8_t *)va + 2); chip->rxd[i].vbuf = va; chip->rxd[i].pbuf = cpu_to_le32(virt_to_phys(va)); chip->rxd[i].ctrl = cpu_to_le64(FTMAC110_RXD_OWNER | FTMAC110_RXD_BUFSZ(CFG_XBUF_SIZE)); } chip->rxd[i - 1].ctrl |= cpu_to_le64(FTMAC110_RXD_END); chip->rxd_idx = 0; eth_register(dev); #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) miiphy_register(dev->name, ftmac110_mdio_read, ftmac110_mdio_write); #endif card_nr++; return card_nr; }