diff options
-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; |