@ -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 ;