X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=net%2Feth.c;h=7059123b4ee5a1ea51dc447cdf8141b0e6516358;hb=429168ea88daf7140005c790796fc150d746aacf;hp=3b06440ca977ffd3d8135ab59c3072c2d8424522;hpb=c609719b8d1b2dca590e0ed499016d041203e403;p=oweals%2Fu-boot.git diff --git a/net/eth.c b/net/eth.c index 3b06440ca9..7059123b4e 100644 --- a/net/eth.c +++ b/net/eth.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2001, 2002 + * (C) Copyright 2001-2004 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * See file CREDITS for list of people who contributed to this @@ -31,13 +31,27 @@ extern int gt6426x_eth_initialize(bd_t *bis); #endif +extern int au1x00_enet_initialize(bd_t*); +extern int dc21x4x_initialize(bd_t*); +extern int e1000_initialize(bd_t*); extern int eepro100_initialize(bd_t*); +extern int eth_3com_initialize(bd_t*); +extern int fec_initialize(bd_t*); +extern int inca_switch_initialize(bd_t*); +extern int mpc5xxx_fec_initialize(bd_t*); +extern int mv6436x_eth_initialize(bd_t *); +extern int mv6446x_eth_initialize(bd_t *); extern int natsemi_initialize(bd_t*); extern int ns8382x_initialize(bd_t*); -extern int dc21x4x_initialize(bd_t*); extern int pcnet_initialize(bd_t*); -extern int fec_initialize(bd_t*); +extern int plb2800_eth_initialize(bd_t*); +extern int ppc_4xx_eth_initialize(bd_t *); +extern int ppc_440x_eth_initialize(bd_t *); +extern int rtl8139_initialize(bd_t*); +extern int rtl8169_initialize(bd_t*); extern int scc_initialize(bd_t*); +extern int skge_initialize(bd_t*); +extern int tsec_initialize(bd_t*, int); static struct eth_device *eth_devices, *eth_current; @@ -74,6 +88,14 @@ int eth_register(struct eth_device* dev) if (!eth_devices) { eth_current = eth_devices = dev; +#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 } else { for (d=eth_devices; d->next!=eth_devices; d=d->next); d->next = dev; @@ -94,12 +116,61 @@ int eth_initialize(bd_t *bis) eth_devices = NULL; eth_current = NULL; +#ifdef CONFIG_DB64360 + mv6436x_eth_initialize(bis); +#endif +#ifdef CONFIG_DB64460 + mv6446x_eth_initialize(bis); +#endif +#if defined(CONFIG_405GP) || defined(CONFIG_405EP) || \ + ( defined(CONFIG_440) && !defined(CONFIG_NET_MULTI) ) + ppc_4xx_eth_initialize(bis); +#endif +#if defined(CONFIG_440) && defined(CONFIG_NET_MULTI) + ppc_440x_eth_initialize(bis); +#endif +#ifdef CONFIG_INCA_IP_SWITCH + inca_switch_initialize(bis); +#endif +#ifdef CONFIG_PLB2800_ETHER + plb2800_eth_initialize(bis); +#endif +#ifdef SCC_ENET + scc_initialize(bis); +#endif +#if defined(FEC_ENET) || defined(CONFIG_ETHER_ON_FCC) + fec_initialize(bis); +#endif +#if defined(CONFIG_MPC5xxx_FEC) + mpc5xxx_fec_initialize(bis); +#endif +#if defined(CONFIG_SK98) + skge_initialize(bis); +#endif +#if defined(CONFIG_MPC85XX_TSEC1) + tsec_initialize(bis, 0); +#endif +#if defined(CONFIG_MPC85XX_TSEC2) + tsec_initialize(bis, 1); +#endif +#if defined(CONFIG_MPC85XX_FEC) + tsec_initialize(bis, 2); +#endif +#if defined(CONFIG_AU1X00) + au1x00_enet_initialize(bis); +#endif +#ifdef CONFIG_E1000 + e1000_initialize(bis); +#endif #ifdef CONFIG_EEPRO100 eepro100_initialize(bis); #endif #ifdef CONFIG_TULIP dc21x4x_initialize(bis); #endif +#ifdef CONFIG_3COM + eth_3com_initialize(bis); +#endif #ifdef CONFIG_PCNET pcnet_initialize(bis); #endif @@ -112,11 +183,11 @@ int eth_initialize(bd_t *bis) #ifdef CONFIG_NS8382X ns8382x_initialize(bis); #endif -#ifdef SCC_ENET - scc_initialize(bis); +#if defined(CONFIG_RTL8139) + rtl8139_initialize(bis); #endif -#ifdef FEC_ENET - fec_initialize(bis); +#if defined(CONFIG_RTL8169) + rtl8169_initialize(bis); #endif if (!eth_devices) { @@ -149,13 +220,14 @@ int eth_initialize(bd_t *bis) if (memcmp(dev->enetaddr, "\0\0\0\0\0\0", 6) && memcmp(dev->enetaddr, env_enetaddr, 6)) { - printf("\nWarning: %s HW address don't match:\n", dev->name); - printf("Address in SROM is " + printf ("\nWarning: %s MAC addresses don't match:\n", + dev->name); + printf ("Address in SROM is " "%02X:%02X:%02X:%02X:%02X:%02X\n", dev->enetaddr[0], dev->enetaddr[1], dev->enetaddr[2], dev->enetaddr[3], dev->enetaddr[4], dev->enetaddr[5]); - printf("Address in environment is " + printf ("Address in environment is " "%02X:%02X:%02X:%02X:%02X:%02X\n", env_enetaddr[0], env_enetaddr[1], env_enetaddr[2], env_enetaddr[3], @@ -169,6 +241,16 @@ int eth_initialize(bd_t *bis) dev = dev->next; } while(dev != eth_devices); +#ifdef CONFIG_NET_MULTI + /* update current ethernet name */ + if (eth_current) { + char *act = getenv("ethact"); + if (act == NULL || strcmp(act, eth_current->name) != 0) + setenv("ethact", eth_current->name); + } else + setenv("ethact", NULL); +#endif + putc ('\n'); } @@ -181,9 +263,8 @@ void eth_set_enetaddr(int num, char *addr) { char *end; int i; -#ifdef DEBUG - printf("eth_set_enetaddr(num=%d, addr=%s)\n", num, addr); -#endif + debug ("eth_set_enetaddr(num=%d, addr=%s)\n", num, addr); + if (!eth_devices) return; @@ -201,14 +282,12 @@ void eth_set_enetaddr(int num, char *addr) { return; } -#ifdef DEBUG - printf("Setting new HW address on %s\n", dev->name); - printf("New Address is " - "%02X:%02X:%02X:%02X:%02X:%02X\n", - dev->enetaddr[0], dev->enetaddr[1], - dev->enetaddr[2], dev->enetaddr[3], - dev->enetaddr[4], dev->enetaddr[5]); -#endif + debug ( "Setting new HW address on %s\n" + "New Address is %02X:%02X:%02X:%02X:%02X:%02X\n", + dev->name, + dev->enetaddr[0], dev->enetaddr[1], + dev->enetaddr[2], dev->enetaddr[3], + dev->enetaddr[4], dev->enetaddr[5]); memcpy(dev->enetaddr, enetaddr, 6); } @@ -222,20 +301,14 @@ int eth_init(bd_t *bis) old_current = eth_current; do { -#ifdef DEBUG - printf("Trying %s\n", eth_current->name); -#endif + debug ("Trying %s\n", eth_current->name); if (eth_current->init(eth_current, bis)) { eth_current->state = ETH_STATE_ACTIVE; - printf("%s configured\n", eth_current->name); return 1; } - -#ifdef DEBUG - puts ("FAIL\n"); -#endif + debug ("FAIL\n"); eth_try_another(0); } while (old_current != eth_current); @@ -276,17 +349,51 @@ void eth_try_another(int first_restart) if (!eth_current) return; - if (first_restart) - { + if (first_restart) { first_failed = eth_current; } eth_current = eth_current->next; - if (first_failed == eth_current) +#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 + + if (first_failed == eth_current) { NetRestartWrap = 1; } } +#ifdef CONFIG_NET_MULTI +void eth_set_current(void) +{ + char *act; + struct eth_device* old_current; + + if (!eth_current) /* XXX no current */ + return; + + act = getenv("ethact"); + if (act != NULL) { + old_current = eth_current; + do { + if (strcmp(eth_current->name, act) == 0) + return; + eth_current = eth_current->next; + } while (old_current != eth_current); + } + + setenv("ethact", eth_current->name); +} +#endif + +char *eth_get_name (void) +{ + return (eth_current ? eth_current->name : "unknown"); +} #endif