diff options
author | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 07:59:22 +0000 |
---|---|---|
committer | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 17:53:06 -0500 |
commit | 46c495d52400965fc54ada7e0b9024192b9234ba (patch) | |
tree | 16ff79ddc1d3fb2b8c2d0798ba3143411f0779ff | |
parent | cb1c991120983b2b2690564eb6e9d3bfd1c6ae7e (diff) | |
download | u-boot-imx-46c495d52400965fc54ada7e0b9024192b9234ba.zip u-boot-imx-46c495d52400965fc54ada7e0b9024192b9234ba.tar.gz u-boot-imx-46c495d52400965fc54ada7e0b9024192b9234ba.tar.bz2 |
net: Fix net buffer initialization
A new non-static function net_init() will initialize buffers and
read from the environment. Only update from the env on each entry
to NetLoop().
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | include/net.h | 1 | ||||
-rw-r--r-- | net/net.c | 45 |
2 files changed, 32 insertions, 14 deletions
diff --git a/include/net.h b/include/net.h index 9564051..ec41366 100644 --- a/include/net.h +++ b/include/net.h @@ -436,6 +436,7 @@ extern IPaddr_t Mcast_addr; #endif /* Initialize the network adapter */ +extern void net_init(void); extern int NetLoop(enum proto_t); /* Shutdown adapters and cleanup */ @@ -265,6 +265,31 @@ static void net_cleanup_loop(void) net_clear_handlers(); } +void net_init(void) +{ + static int first_call = 1; + + if (first_call) { + /* + * Setup packet buffers, aligned correctly. + */ + int i; + + NetTxPacket = &PktBuf[0] + (PKTALIGN - 1); + NetTxPacket -= (ulong)NetTxPacket % PKTALIGN; + for (i = 0; i < PKTBUFSRX; i++) + NetRxPackets[i] = NetTxPacket + (i + 1) * PKTSIZE_ALIGN; + + ArpInit(); + net_clear_handlers(); + + /* Only need to setup buffer pointers once. */ + first_call = 0; + } + + NetInitLoop(); +} + /**********************************************************************/ /* * Main network processing loop. @@ -272,28 +297,15 @@ static void net_cleanup_loop(void) int NetLoop(enum proto_t protocol) { - int i; bd_t *bd = gd->bd; int ret = -1; NetRestarted = 0; NetDevExists = 0; - - NetTxPacket = NULL; NetTryCount = 1; - ArpInit(); - net_clear_handlers(); - - /* - * Setup packet buffers, aligned correctly. - */ - NetTxPacket = &PktBuf[0] + (PKTALIGN - 1); - NetTxPacket -= (ulong)NetTxPacket % PKTALIGN; - for (i = 0; i < PKTBUFSRX; i++) - NetRxPackets[i] = NetTxPacket + (i+1)*PKTSIZE_ALIGN; - bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start"); + net_init(); eth_halt(); eth_set_current(); if (eth_init(bd) < 0) { @@ -624,6 +636,11 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int eth_hdr_size; int pkt_hdr_size; + /* make sure the NetTxPacket is initialized (NetInit() was called) */ + assert(NetTxPacket != NULL); + if (NetTxPacket == NULL) + return -1; + /* convert to new style broadcast */ if (dest == 0) dest = 0xFFFFFFFF; |