Xinu7/src/sys/sys/dskstrt.c

/* dskstrt.c - dskstrt */

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

/*------------------------------------------------------------------------
 *  dskstrt  --  start an I/O operation on a disk device
 *------------------------------------------------------------------------
 */
dskstrt(dsptr)
	struct	dsblk	*dsptr;
{
	struct	xbdcb	*xptr;
	struct	dtc	*dtptr;
	struct	dreq	*drptr;

	/* build command for controller */

	drptr = dsptr->dreqlst;
	xptr = & dsptr->ddcb;
	xptr->xop    = (char) drptr->drop;		/* opcode	*/
	xptr->xunit  = (char) 0;			/* top addr bits*/
	xptr->xmaddr = (char) ((drptr->drdba>>8)&0377);	/* mid addr bits*/
	xptr->xladdr = (char) (drptr->drdba & 0377);	/* low addr bits*/
	xptr->xcount = (char) 1;			/* num of blocks*/
	xptr->xcntl  = (char) XRETRY;			/* retry code	*/

	/* feed command to controller through interface */

	dtptr = dsptr->dcsr;
	dtptr->dt_dar = drptr->drbuff;
	dtptr->dt_car = xptr;
	dtptr->dt_xdar = dtptr->dt_xcar = 0;
	dtptr->dt_csr = DTINTR | DTGO;
}