Xinu7/src/sys/sys/dsinter.c

/* dsinter.c - dsinter */

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

/*------------------------------------------------------------------------
 *  dsinter  --  process disk interrupt (DTC interface; XEBEC controller)
 *------------------------------------------------------------------------
 */
INTPROC	dsinter(dsptr)
	struct	dsblk	*dsptr;
{
	struct	dtc	*dtptr;
	struct	dreq	*drptr;

	dtptr = dsptr->dcsr;
	drptr = dsptr->dreqlst;
	if (drptr == DRNULL) {
		panic("Disk interrupt when disk not busy");
		return;
	}
	if (dtptr->dt_csr & DTERROR)
		drptr->drstat = SYSERR;
	else
		drptr->drstat = OK;
	if ( (dsptr->dreqlst=drptr->drnext) != DRNULL)
		dskstrt(dsptr);
	switch (drptr->drop) {

		case DREAD:
		case DSYNC:
			ready(drptr->drpid, RESCHYES);
			return;

		case DWRITE:
			freebuf(drptr->drbuff);
			/* fall through */
		case DSEEK:
			freebuf(drptr);
	}
}