X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=net%2Feth.c;h=c4f24c64b63db4754aa1ea93fcd85ffbc7c1db5a;hb=0e715a7a3fe24b293c19bfff07f813b9ce51f0a9;hp=1b56a356c4f4544623b1093b6ef614dd1ff21a38;hpb=1f103105a3746ab12279b63b8c1d372c0ce2cc58;p=oweals%2Fu-boot.git diff --git a/net/eth.c b/net/eth.c index 1b56a356c4..c4f24c64b6 100644 --- a/net/eth.c +++ b/net/eth.c @@ -60,7 +60,22 @@ extern int npe_initialize(bd_t *); extern int uec_initialize(int); extern int bfin_EMAC_initialize(bd_t *); extern int atstk1000_eth_initialize(bd_t *); +extern int greth_initialize(bd_t *); +extern int atngw100_eth_initialize(bd_t *); extern int mcffec_initialize(bd_t*); +extern int mcdmafec_initialize(bd_t*); +extern int at91sam9_eth_initialize(bd_t *); + +#ifdef CONFIG_API +extern void (*push_packet)(volatile void *, int); + +static struct { + uchar data[PKTSIZE]; + int length; +} eth_rcv_bufs[PKTBUFSRX]; + +static unsigned int eth_rcv_current = 0, eth_rcv_last = 0; +#endif static struct eth_device *eth_devices, *eth_current; @@ -138,7 +153,8 @@ int eth_register(struct eth_device* dev) int eth_initialize(bd_t *bis) { - char enetvar[32], env_enetaddr[6]; + char enetvar[32]; + unsigned char env_enetaddr[6]; int i, eth_number = 0; char *tmp, *end; @@ -202,6 +218,12 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_UEC_ETH2) uec_initialize(1); #endif +#if defined(CONFIG_UEC_ETH3) + uec_initialize(2); +#endif +#if defined(CONFIG_UEC_ETH4) + uec_initialize(3); +#endif #if defined(FEC_ENET) || defined(CONFIG_ETHER_ON_FCC) fec_initialize(bis); @@ -254,9 +276,21 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_ATSTK1000) atstk1000_eth_initialize(bis); #endif +#if defined(CONFIG_GRETH) + greth_initialize(bis); +#endif +#if defined(CONFIG_ATNGW100) + atngw100_eth_initialize(bis); +#endif #if defined(CONFIG_MCFFEC) mcffec_initialize(bis); #endif +#if defined(CONFIG_FSLDMAFEC) + mcdmafec_initialize(bis); +#endif +#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) + at91sam9_eth_initialize(bis); +#endif if (!eth_devices) { puts ("No ethernet found.\n"); @@ -411,24 +445,26 @@ int eth_init(bd_t *bis) { struct eth_device* old_current; - if (!eth_current) - return 0; + if (!eth_current) { + puts ("No ethernet found.\n"); + return -1; + } old_current = eth_current; do { debug ("Trying %s\n", eth_current->name); - if (eth_current->init(eth_current, bis)) { + if (eth_current->init(eth_current,bis) >= 0) { eth_current->state = ETH_STATE_ACTIVE; - return 1; + return 0; } debug ("FAIL\n"); eth_try_another(0); } while (old_current != eth_current); - return 0; + return -1; } void eth_halt(void) @@ -457,9 +493,65 @@ int eth_rx(void) return eth_current->recv(eth_current); } +#ifdef CONFIG_API +static void eth_save_packet(volatile void *packet, int length) +{ + volatile char *p = packet; + int i; + + if ((eth_rcv_last+1) % PKTBUFSRX == eth_rcv_current) + return; + + if (PKTSIZE < length) + return; + + for (i = 0; i < length; i++) + eth_rcv_bufs[eth_rcv_last].data[i] = p[i]; + + eth_rcv_bufs[eth_rcv_last].length = length; + eth_rcv_last = (eth_rcv_last + 1) % PKTBUFSRX; +} + +int eth_receive(volatile void *packet, int length) +{ + volatile char *p = packet; + void *pp = push_packet; + int i; + + if (eth_rcv_current == eth_rcv_last) { + push_packet = eth_save_packet; + eth_rx(); + push_packet = pp; + + if (eth_rcv_current == eth_rcv_last) + return -1; + } + + if (length < eth_rcv_bufs[eth_rcv_current].length) + return -1; + + length = eth_rcv_bufs[eth_rcv_current].length; + + for (i = 0; i < length; i++) + p[i] = eth_rcv_bufs[eth_rcv_current].data[i]; + + eth_rcv_current = (eth_rcv_current + 1) % PKTBUFSRX; + return length; +} +#endif /* CONFIG_API */ + void eth_try_another(int first_restart) { static struct eth_device *first_failed = NULL; + char *ethrotate; + + /* + * Do not rotate between network interfaces when + * 'ethrotate' variable is set to 'no'. + */ + if (((ethrotate = getenv ("ethrotate")) != NULL) && + (strcmp(ethrotate, "no") == 0)) + return; if (!eth_current) return;