X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=net%2Feth.c;h=6082c9007278d8a742702a17c3e4e81d86582164;hb=52eb2c79110151b9017a0829c4d44ee7b8e2ca04;hp=4bbf84b6bb028c2d01ce644b83dd020bc2b1e4be;hpb=8206bfae3ab7f99965136384360ba2de0c6f4c3b;p=u-boot diff --git a/net/eth.c b/net/eth.c index 4bbf84b6bb..6082c90072 100644 --- a/net/eth.c +++ b/net/eth.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2001-2004 + * (C) Copyright 2001-2010 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * See file CREDITS for list of people who contributed to this @@ -26,7 +26,6 @@ #include #include -#ifdef CONFIG_CMD_NET void eth_parse_enetaddr(const char *addr, uchar *enetaddr) { char *end; @@ -53,12 +52,23 @@ int eth_setenv_enetaddr(char *name, const uchar *enetaddr) return setenv(name, buf); } -#endif -#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) +int eth_getenv_enetaddr_by_index(int index, uchar *enetaddr) +{ + char enetvar[32]; + sprintf(enetvar, index ? "eth%daddr" : "ethaddr", index); + return eth_getenv_enetaddr(enetvar, enetaddr); +} + +#ifdef CONFIG_NET_MULTI -static char *act = NULL; -static int env_changed_id = 0; +static int eth_mac_skip(int index) +{ + char enetvar[15]; + char *skip_state; + sprintf(enetvar, index ? "eth%dmacskip" : "ethmacskip", index); + return ((skip_state = getenv(enetvar)) != NULL); +} /* * CPU and board-specific Ethernet initializations. Aliased function @@ -68,8 +78,8 @@ static int __def_eth_init(bd_t *bis) { return -1; } -int cpu_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init"))); -int board_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init"))); +int cpu_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init"))); +int board_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init"))); extern int mv6436x_eth_initialize(bd_t *); extern int mv6446x_eth_initialize(bd_t *); @@ -92,7 +102,7 @@ struct eth_device *eth_get_dev(void) return eth_current; } -struct eth_device *eth_get_dev_by_name(char *devname) +struct eth_device *eth_get_dev_by_name(const char *devname) { struct eth_device *dev, *target_dev; @@ -171,7 +181,8 @@ int eth_register(struct eth_device* dev) } #endif } else { - for (d=eth_devices; d->next!=eth_devices; d=d->next); + for (d=eth_devices; d->next!=eth_devices; d=d->next) + ; d->next = dev; } @@ -183,7 +194,6 @@ int eth_register(struct eth_device* dev) int eth_initialize(bd_t *bis) { - char enetvar[32]; unsigned char env_enetaddr[6]; int eth_number = 0; @@ -194,10 +204,18 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) miiphy_init(); #endif - /* Try board-specific initialization first. If it fails or isn't - * present, try the cpu-specific initialization */ - if (board_eth_init(bis) < 0) - cpu_eth_init(bis); + /* + * If board-specific initialization exists, call it. + * If not, call a CPU-specific one + */ + if (board_eth_init != __def_eth_init) { + if (board_eth_init(bis) < 0) + printf("Board Net Initialization Failed\n"); + } else if (cpu_eth_init != __def_eth_init) { + if (cpu_eth_init(bis) < 0) + printf("CPU Net Initialization Failed\n"); + } else + printf("Net Initialization Skipped\n"); #if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750) mv6436x_eth_initialize(bis); @@ -224,8 +242,10 @@ int eth_initialize(bd_t *bis) puts (" [PRIME]"); } - sprintf(enetvar, eth_number ? "eth%daddr" : "ethaddr", eth_number); - eth_getenv_enetaddr(enetvar, env_enetaddr); + if (strchr(dev->name, ' ')) + puts("\nWarning: eth device name has a space!\n"); + + eth_getenv_enetaddr_by_index(eth_number, env_enetaddr); if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) { if (memcmp(dev->enetaddr, "\0\0\0\0\0\0", 6) && @@ -241,12 +261,16 @@ int eth_initialize(bd_t *bis) memcpy(dev->enetaddr, env_enetaddr, 6); } + if (dev->write_hwaddr && + !eth_mac_skip(eth_number) && + is_valid_ether_addr(dev->enetaddr)) { + dev->write_hwaddr(dev); + } eth_number++; dev = dev->next; } while(dev != eth_devices); -#ifdef CONFIG_NET_MULTI /* update current ethernet name */ if (eth_current) { char *act = getenv("ethact"); @@ -254,7 +278,6 @@ int eth_initialize(bd_t *bis) setenv("ethact", eth_current->name); } else setenv("ethact", NULL); -#endif putc ('\n'); } @@ -262,31 +285,6 @@ int eth_initialize(bd_t *bis) return eth_number; } -void eth_set_enetaddr(int num, char *addr) { - struct eth_device *dev; - unsigned char enetaddr[6]; - - debug ("eth_set_enetaddr(num=%d, addr=%s)\n", num, addr); - - if (!eth_devices) - return; - - eth_parse_enetaddr(addr, enetaddr); - - dev = eth_devices; - while(num-- > 0) { - dev = dev->next; - - if (dev == eth_devices) - return; - } - - debug ( "Setting new HW address on %s\n" - "New Address is %pM\n", - dev->name, enetaddr); - - memcpy(dev->enetaddr, enetaddr, 6); -} #ifdef CONFIG_MCAST_TFTP /* Multicast. * mcast_addr: multicast ipaddr from which multicast Mac is made @@ -335,23 +333,37 @@ u32 ether_crc (size_t len, unsigned char const *p) int eth_init(bd_t *bis) { - struct eth_device* old_current; + int eth_number; + struct eth_device *old_current, *dev; if (!eth_current) { puts ("No ethernet found.\n"); return -1; } + /* Sync environment with network devices */ + eth_number = 0; + dev = eth_devices; + do { + uchar env_enetaddr[6]; + + if (eth_getenv_enetaddr_by_index(eth_number, env_enetaddr)) + memcpy(dev->enetaddr, env_enetaddr, 6); + + ++eth_number; + dev = dev->next; + } while (dev != eth_devices); + old_current = eth_current; do { - debug ("Trying %s\n", eth_current->name); + debug("Trying %s\n", eth_current->name); if (eth_current->init(eth_current,bis) >= 0) { eth_current->state = ETH_STATE_ACTIVE; return 0; } - debug ("FAIL\n"); + debug("FAIL\n"); eth_try_another(0); } while (old_current != eth_current); @@ -435,7 +447,7 @@ int eth_receive(volatile void *packet, int length) void eth_try_another(int first_restart) { static struct eth_device *first_failed = NULL; - char *ethrotate; + char *ethrotate, *act; /* * Do not rotate between network interfaces when @@ -454,23 +466,20 @@ void eth_try_another(int first_restart) eth_current = eth_current->next; -#ifdef CONFIG_NET_MULTI /* update current ethernet name */ - { - char *act = getenv("ethact"); - if (act == NULL || strcmp(act, eth_current->name) != 0) - setenv("ethact", eth_current->name); - } -#endif + act = getenv("ethact"); + if (act == NULL || strcmp(act, eth_current->name) != 0) + setenv("ethact", eth_current->name); if (first_failed == eth_current) { NetRestartWrap = 1; } } -#ifdef CONFIG_NET_MULTI void eth_set_current(void) { + static char *act = NULL; + static int env_changed_id = 0; struct eth_device* old_current; int env_id; @@ -493,19 +502,19 @@ void eth_set_current(void) setenv("ethact", eth_current->name); } -#endif char *eth_get_name (void) { return (eth_current ? eth_current->name : "unknown"); } -#elif defined(CONFIG_CMD_NET) && !defined(CONFIG_NET_MULTI) + +#else /* !CONFIG_NET_MULTI */ + +#warning Ethernet driver is deprecated. Please update to use CONFIG_NET_MULTI extern int at91rm9200_miiphy_initialize(bd_t *bis); -extern int emac4xx_miiphy_initialize(bd_t *bis); extern int mcf52x2_miiphy_initialize(bd_t *bis); extern int ns7520_miiphy_initialize(bd_t *bis); -extern int davinci_eth_miiphy_initialize(bd_t *bis); int eth_initialize(bd_t *bis) @@ -517,17 +526,11 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_AT91RM9200) at91rm9200_miiphy_initialize(bis); #endif -#if defined(CONFIG_PPC4xx_EMAC) - emac4xx_miiphy_initialize(bis); -#endif #if defined(CONFIG_MCF52x2) mcf52x2_miiphy_initialize(bis); #endif #if defined(CONFIG_DRIVER_NS7520_ETHERNET) ns7520_miiphy_initialize(bis); -#endif -#if defined(CONFIG_DRIVER_TI_EMAC) - davinci_eth_miiphy_initialize(bis); #endif return 0; }