diff options
Diffstat (limited to 'net/net.c')
| -rw-r--r-- | net/net.c | 45 | 
1 files changed, 31 insertions, 14 deletions
| @@ -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; |