plan 9 kernel history: overview | file list | diff list

1991/0809/pc/devfloppy.c (diff list | history)

1991/0806/sys/src/9/pc/devfloppy.c:29,361991/0809/sys/src/9/pc/devfloppy.c:29,34 (short | long | prev | next)
1991/0727    
	 Fwrite=	 0x47,	/* write cmd */ 
	 Fmulti=	 0x80,	/* or'd with Fread or Fwrite for multi-head */ 
 
1991/0731    
	Ndrive=	4,	/* floppies/controller */ 
1991/0727    
                 
1991/0728    
	DMAchan=	2,	/* floppy dma channel */ 
 
1991/0727    
	/* sector size encodings */ 
1991/0806/sys/src/9/pc/devfloppy.c:123,1281991/0809/sys/src/9/pc/devfloppy.c:121,129
1991/0731    
	long	len;		/* size of xfer */ 
1991/0727    
 
1991/0731    
	Rendez	r;		/* waiting here for motor to spin up */ 
1991/0809    
 
	uchar	*ccache;	/* cylinder cache (always read a whole cyl) */ 
	int	ccyl;		/* number of cached cylinder */ 
1991/0727    
}; 
 
/* 
1991/0806/sys/src/9/pc/devfloppy.c:132,1381991/0809/sys/src/9/pc/devfloppy.c:133,139
1991/0727    
{ 
1991/0731    
	QLock;			/* exclusive access to the contoller */ 
 
	Drive	d[Ndrive];	/* the floppy drives */ 
1991/0809    
	Drive	*d;		/* the floppy drives */ 
1991/0727    
	uchar	stat[8];	/* status of an operation */ 
	int	confused; 
1991/0731    
	int	intr;		/* true if interrupt occured */ 
1991/0806/sys/src/9/pc/devfloppy.c:173,1781991/0809/sys/src/9/pc/devfloppy.c:174,180
1991/0802    
}; 
#define NFDIR	(sizeof(floppydir)/sizeof(Dirtab)) 
1991/0731    
 
1991/0809    
#define k64(x) (((ulong)(x))>>16) 
1991/0731    
void 
floppyreset(void) 
{ 
1991/0806/sys/src/9/pc/devfloppy.c:188,1961991/0809/sys/src/9/pc/devfloppy.c:190,203
1991/0802    
	} 
 
	/* 
1991/0809    
	 *  allocate the drive storage 
	 */ 
	floppy.d = ialloc(conf.nfloppy*sizeof(Drive), 0); 
 
	/* 
1991/0802    
	 *  stop the motors 
	 */ 
1991/0731    
	for(dp = floppy.d; dp < &floppy.d[Ndrive]; dp++){ 
1991/0809    
	for(dp = floppy.d; dp < &floppy.d[conf.nfloppy]; dp++){ 
1991/0731    
		dp->dev = dp - floppy.d; 
		dp->t = &floppytype[0];		/* default type */ 
1991/0802    
		floppydir[2*dp->dev].length = dp->t->cap; 
1991/0806/sys/src/9/pc/devfloppy.c:198,2031991/0809/sys/src/9/pc/devfloppy.c:205,220
1991/0802    
		dp->cyl = -1;		/* because we don't know */ 
1991/0731    
		motoroff(dp); 
	} 
1991/0809    
 
	/* 
	 *  allocate cylinder caches that don't cross 64k boundaries 
	 */ 
	for(dp = floppy.d; dp < &floppy.d[conf.nfloppy]; dp++){ 
		do { 
			dp->ccache = ialloc(dp->t->cap, 1); 
		} while(k64(dp->ccache) != k64(dp->ccache+dp->t->cap)); 
		dp->ccyl = -1; 
	} 
1991/0731    
	setvec(Floppyvec, floppyintr); 
} 
 
1991/0806/sys/src/9/pc/devfloppy.c:272,2821991/0809/sys/src/9/pc/devfloppy.c:289,304
1991/0802    
	a[3] = x; 
} 
 
1991/0809    
/* 
 *  the floppy is so slow, we always read a cylinder 
 *  at a time and cache the extra bytes. 
 */ 
1991/0731    
long 
floppyread(Chan *c, void *a, long n) 
{ 
	Drive *dp; 
	long rv, i; 
1991/0809    
	long rv, nn, len, cyl; 
	int sec; 
1991/0731    
	uchar *aa = a; 
 
1991/0802    
	if(c->qid.path == CHDIR) 
1991/0806/sys/src/9/pc/devfloppy.c:286,2951991/0809/sys/src/9/pc/devfloppy.c:308,338
1991/0802    
	dp = &floppy.d[c->qid.path & ~Qmask]; 
	switch ((int)(c->qid.path & Qmask)) { 
	case Qdata: 
		for(rv = 0; rv < n; rv += i){ 
			i = floppyxfer(dp, Fread, aa+rv, c->offset+rv, n-rv); 
			if(i <= 0) 
				break; 
1991/0809    
		if(c->offset % dp->t->bytes) 
			errors("bad offset"); 
		if(n % dp->t->bytes) 
			errors("bad len"); 
		nn = dp->t->bytes * dp->t->sectors * dp->t->heads; 
		for(rv = 0; rv < n; rv += len){ 
			/* 
			 *  truncate xfer at cylinder boundary 
			 */ 
			dp->len = n - rv; 
			floppypos(dp, c->offset+rv); 
			cyl = dp->tcyl; 
			len = dp->len; 
			sec = dp->tsec + dp->thead * dp->t->sectors; 
 
			/* 
			 *  read the cylinder 
			 */ 
			if(dp->ccyl != cyl){ 
				dp->ccyl = -1; 
				if(floppyxfer(dp, Fread, dp->ccache, cyl * nn, nn) != nn) 
					errors("floppy read err"); 
				dp->ccyl = cyl; 
			} 
			memmove(aa+rv, dp->ccache + (sec-1)*dp->t->bytes, len); 
1991/0802    
		} 
		break; 
	case Qstruct: 
1991/0806/sys/src/9/pc/devfloppy.c:371,3771991/0809/sys/src/9/pc/devfloppy.c:414,420
1991/0727    
 
1991/0802    
	waserror(); 
	for(;;){ 
		for(dp = floppy.d; dp < &floppy.d[Ndrive]; dp++){ 
1991/0809    
		for(dp = floppy.d; dp < &floppy.d[conf.nfloppy]; dp++){ 
1991/0802    
			if(dp->motoron && TK2SEC(m->ticks - dp->lasttouched) > 5 
			&& canqlock(dp)){ 
				if(TK2SEC(m->ticks - dp->lasttouched) > 5) 
1991/0806/sys/src/9/pc/devfloppy.c:382,3891991/0809/sys/src/9/pc/devfloppy.c:425,430
1991/0803    
		disp++; 
		if(owl(disp&1) < 0) 
			print("owl failed\n"); 
		if(mail((disp>>1)&1) < 0) 
			print("mail failed\n"); 
1991/0802    
		tsleep(&floppy.kr, return0, 0, 5*1000); 
1991/0803    
		 
1991/0727    
	} 
1991/0806/sys/src/9/pc/devfloppy.c:592,5981991/0809/sys/src/9/pc/devfloppy.c:633,639
1991/0727    
		delay(1); 
		outb(Fmotor, Fintena|Fena); 
		spllo(); 
1991/0731    
		for(dp = floppy.d; dp < &floppy.d[Ndrive]; dp++){ 
1991/0809    
		for(dp = floppy.d; dp < &floppy.d[conf.nfloppy]; dp++){ 
1991/0727    
			dp->motoron = 0; 
			dp->confused = 1; 
		} 
1991/0806/sys/src/9/pc/devfloppy.c:603,6091991/0809/sys/src/9/pc/devfloppy.c:644,650
1991/0727    
	/* 
	 *  recalibrate any confused drives 
	 */ 
1991/0731    
	for(dp = floppy.d; floppy.confused == 0 && dp < &floppy.d[Ndrive]; dp++){ 
1991/0809    
	for(dp = floppy.d; floppy.confused == 0 && dp < &floppy.d[conf.nfloppy]; dp++){ 
1991/0727    
		if(dp->confused == 0) 
			floppyrecal(dp); 
 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)