Xinu7/src/serve11/sys/ethread.c

/* ethread.c - ethread */

#include <conf.h>
#include <kernel.h>
#include <proc.h>
#include <network.h>

/*------------------------------------------------------------------------
 *  ethread - read a single packet from the ethernet
 *------------------------------------------------------------------------
 */
ethread(devptr, buff, len)
struct	devsw	*devptr;
char	*buff;
int	len;
{
	char	ps;
	char	*wbuff;
	struct	etblk	*etptr;
	struct	dcmd	*dcmptr;
	struct	dqregs	*dqptr;

	etptr = (struct etblk *) devptr->dvioblk;
	dcmptr = etptr->ercmd;
	dqptr = etptr->eioaddr;
	wait(etptr->etrsem);
	disable(ps);
	etptr->etrpid = currpid;
	recvclr();
	ethrstrt(etptr, buff, len);
	while (recvtim(DQ_RTO) == TIMEOUT) {
		wbuff = (dcmptr=etptr->ewcmd)->dc_buf;
		ethstrt(etptr, buff);
		ethrstrt(etptr, buff, len);
		if (etptr->etlen != 0) {
			ethwstrt(etptr, wbuff, etptr->etlen, DC_NORM);
		}
	}
	if ( (dcmptr->dc_st1 & DC_LUSE) == DC_ERRU) {
		len = SYSERR;
	} else {
		len = (dcmptr->dc_st1&DC_HLEN)|(dcmptr->dc_st2 & DC_LLEN);
		len += DC_XLEN;
	}
	signal(etptr->etrsem);
	restore(ps);
	return(len);
}