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

1999/0423/alphapc/devfloppy.c (diff list | history)

1999/0415/sys/src/9/alphapc/devfloppy.c:118,1271999/0423/sys/src/9/alphapc/devfloppy.c:118,125 (short | long | prev | next)
1999/0415    
static void 
fldump(void) 
{ 
mb(); 
	DPRINT("sra %ux srb %ux dor %ux msr %ux dir %ux\n", inb(Psra), inb(Psrb), 
		inb(Pdor), inb(Pmsr), inb(Pdir)); 
mb(); 
} 
 
/* 
1999/0415/sys/src/9/alphapc/devfloppy.c:146,1531999/0423/sys/src/9/alphapc/devfloppy.c:144,149
1999/0415    
	FDrive *dp; 
	FType *t; 
	ulong maxtsize; 
                 
	dmainit(DMAchan); 
	 
	floppysetup0(&fl); 
 
1999/0415/sys/src/9/alphapc/devfloppy.c:163,1681999/0423/sys/src/9/alphapc/devfloppy.c:159,166
1999/0415    
			maxtsize = t->tsize; 
	} 
 
1999/0423    
	dmainit(DMAchan, maxtsize); 
 
1999/0415    
	/* 
	 *  allocate the drive storage 
	 */ 
1999/0415/sys/src/9/alphapc/devfloppy.c:174,1821999/0423/sys/src/9/alphapc/devfloppy.c:172,178
1999/0415    
	 */ 
	fl.motor = 0; 
	delay(10); 
mb(); 
	outb(Pdor, fl.motor | Fintena | Fena); 
mb(); 
	delay(10); 
 
	/* 
1999/0415/sys/src/9/alphapc/devfloppy.c:267,2751999/0423/sys/src/9/alphapc/devfloppy.c:263,269
1999/0415    
	/* 
	 *  if floppy has changed or first time through 
	 */ 
mb(); 
	if((inb(Pdir)&Fchange) || dp->vers == 0){ 
mb(); 
		DPRINT("changed\n"); 
		fldump(); 
		dp->vers++; 
1999/0415/sys/src/9/alphapc/devfloppy.c:276,2891999/0423/sys/src/9/alphapc/devfloppy.c:270,277
1999/0415    
		floppysetdef(dp); 
		start = dp->t; 
		dp->confused = 1;	/* make floppyon recal */ 
DPRINT("b4 floppyon:\n"); 
fldump(); 
		floppyon(dp); 
DPRINT("after floppyon:\n"); 
fldump(); 
		floppyseek(dp, dp->t->heads*dp->t->tsize); 
DPRINT("after floppyseek:\n"); 
fldump(); 
		while(waserror()){ 
			while(++dp->t){ 
				if(dp->t == &floppytype[nelem(floppytype)]) 
1999/0415/sys/src/9/alphapc/devfloppy.c:486,4941999/0423/sys/src/9/alphapc/devfloppy.c:474,480
1999/0415    
	/* start motor and select drive */ 
	alreadyon = fl.motor & MOTORBIT(dp->dev); 
	fl.motor |= MOTORBIT(dp->dev); 
mb(); 
	outb(Pdor, fl.motor | Fintena | Fena | dp->dev); 
mb(); 
	if(!alreadyon){ 
		/* wait for drive to spin up */ 
		tsleep(&dp->r, return0, 0, 750); 
1999/0415/sys/src/9/alphapc/devfloppy.c:500,5081999/0423/sys/src/9/alphapc/devfloppy.c:486,492
1999/0415    
	/* set transfer rate */ 
	if(fl.rate != dp->t->rate){ 
		fl.rate = dp->t->rate; 
mb(); 
		outb(Pdsr, fl.rate); 
mb(); 
	} 
 
	/* get drive to a known cylinder */ 
1999/0415/sys/src/9/alphapc/devfloppy.c:521,5291999/0423/sys/src/9/alphapc/devfloppy.c:505,511
1999/0415    
floppyoff(FDrive *dp) 
{ 
	fl.motor &= ~MOTORBIT(dp->dev); 
mb(); 
	outb(Pdor, fl.motor | Fintena | Fena | dp->dev); 
mb(); 
} 
 
/* 
1999/0415/sys/src/9/alphapc/devfloppy.c:538,5471999/0423/sys/src/9/alphapc/devfloppy.c:520,527
1999/0415    
	fl.nstat = 0; 
	for(i = 0; i < fl.ncmd; i++){ 
		for(tries = 0; ; tries++){ 
mb(); 
			if((inb(Pmsr)&(Ffrom|Fready)) == Fready) 
				break; 
mb(); 
			if(tries > 1000){ 
				DPRINT("cmd %ux can't be sent (%d)\n", fl.cmd[0], i); 
				fldump(); 
1999/0415/sys/src/9/alphapc/devfloppy.c:552,5601999/0423/sys/src/9/alphapc/devfloppy.c:532,538
1999/0415    
			} 
			microdelay(8);	/* for machine independence */ 
		} 
mb(); 
		outb(Pfdata, fl.cmd[i]); 
mb(); 
	} 
	return 0; 
} 
1999/0415/sys/src/9/alphapc/devfloppy.c:576,5841999/0423/sys/src/9/alphapc/devfloppy.c:554,560
1999/0415    
	for(i = 0; i < sizeof(fl.stat); i++){ 
		/* wait for status byte */ 
		for(tries = 0; ; tries++){ 
mb(); 
			s = inb(Pmsr)&(Ffrom|Fready); 
mb(); 
			if(s == Fready){ 
				fl.nstat = i; 
				return fl.nstat; 
1999/0415/sys/src/9/alphapc/devfloppy.c:593,6021999/0423/sys/src/9/alphapc/devfloppy.c:569,575
1999/0415    
			} 
			microdelay(8);	/* for machine independence */ 
		} 
mb(); 
		fl.stat[i] = inb(Pfdata); 
mb(); 
// print("stat[%d]: %.2ux\n", i, fl.stat[i]); 
	} 
	fl.nstat = sizeof(fl.stat); 
	return fl.nstat; 
1999/0415/sys/src/9/alphapc/devfloppy.c:686,6941999/0423/sys/src/9/alphapc/devfloppy.c:659,665
1999/0415    
		return -1; 
	floppywait(); 
	if(fl.nstat < 2){ 
mb(); 
		DPRINT("recalibrate: confused %ux\n", inb(Pmsr)); 
mb(); 
		fl.confused = 1; 
		return -1; 
	} 
1999/0415/sys/src/9/alphapc/devfloppy.c:729,7411999/0423/sys/src/9/alphapc/devfloppy.c:700,708
1999/0415    
		splhi(); 
		fl.ncmd = 1; 
		fl.cmd[0] = 0; 
mb(); 
		outb(Pdor, 0); 
mb(); 
		delay(10); 
mb(); 
		outb(Pdor, Fintena|Fena); 
mb(); 
		delay(10); 
		spllo(); 
		fl.motor = 0; 
1999/0415/sys/src/9/alphapc/devfloppy.c:747,7551999/0423/sys/src/9/alphapc/devfloppy.c:714,720
1999/0415    
			dp->confused = 1; 
 
		/* set rate to a known value */ 
mb(); 
		outb(Pdsr, 0); 
mb(); 
		fl.rate = 0; 
 
		DPRINT("floppyrevive out\n"); 


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