Xinu7/src/serve11/sys/ethstrt.c

/* ethstrt.c - ethstrt.c */

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

/*------------------------------------------------------------------------
 *  ethstrt  -  reset DEQNA Ethernet hardware and leave it operating
 *------------------------------------------------------------------------
 */
ethstrt(etptr, setup)
struct	etblk	*etptr;
struct	dqsetup	*setup;
{
	struct	dqregs	*dqptr;
	struct	dcmd	*dcmptr;
	int	i, j;

	dqptr = etptr->eioaddr;

	/* initialize device */

	dqptr->d_csr |=  DQ_REST;
	dqptr->d_csr &= ~DQ_REST;
	dqptr->d_vect = (etptr->etdev)->dvivec;

	/* build setup packet */

	for (i=0 ; i < (DQ_ROWS>>1) ; i++) {
		setup->dq_set[i+DQ_SETD][0] = setup->dq_set[i][0] = 0;
		setup->dq_set[i+DQ_SETD][1] = setup->dq_set[i][1] =
			i<EPADLEN ? DQ_BCST : 0;
		for (j=2 ; j<DQ_COLS ; j++)
			setup->dq_set[i+DQ_SETD][j] = setup->dq_set[i][j]=
				i<EPADLEN ? etptr->etpaddr[i] : 0;
	}
	ethrstrt(etptr, setup->dq_echo,
		sizeof(setup->dq_echo) + sizeof(setup->dq_crc) );
	ethwstrt(etptr, setup->dq_set, sizeof(setup->dq_set), DC_SETUP);

	/* poll device until setup processed */

	for (dcmptr=etptr->ercmd ; dcmptr->dc_st1 == DC_INIT ; )
		;

	/* reset device, leaving it online */

	dqptr->d_csr |=  DQ_REST;
	dqptr->d_csr &= ~DQ_REST;
	dqptr->d_csr &= ~DQ_ELOP;
	dqptr->d_csr |= (DQ_ENBL| DQ_IEN | DQ_ILOP);
	return(OK);
}