From 46c495d52400965fc54ada7e0b9024192b9234ba Mon Sep 17 00:00:00 2001 From: Joe Hershberger Date: Wed, 23 May 2012 07:59:22 +0000 Subject: 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 Acked-by: Simon Glass --- include/net.h | 1 + net/net.c | 45 +++++++++++++++++++++++++++++++-------------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/include/net.h b/include/net.h index 9564051c56e..ec413664f7d 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 */ diff --git a/net/net.c b/net/net.c index 4c6dfd1ca1c..4b4c0f1e5f4 100644 --- a/net/net.c +++ b/net/net.c @@ -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; -- cgit v1.2.3