コード例 #1
0
ファイル: devfloppy.c プロジェクト: biddyweb/plan9
static void
floppyintr(Ureg *ur)
{
    USED(ur);
    switch(fl.cmd[0]&~Fmulti) {
    case Fread:
    case Fwrite:
    case Fformat:
    case Fdumpreg:
        floppyresult();
        break;
    case Fseek:
    case Frecal:
    default:
        floppysense();	/* to clear interrupt */
        break;
    }
    fl.ncmd = 0;
}
コード例 #2
0
ファイル: devfloppy.c プロジェクト: carriercomm/plan9-gpl
/*
 *  start a floppy drive's motor.
 */
static int
floppyon(FDrive *dp)
{
	int alreadyon;
	int tries;

	if(fl.confused)
		floppyrevive();

	/* start motor and select drive */
	alreadyon = fl.motor & MOTORBIT(dp->dev);
	fl.motor |= MOTORBIT(dp->dev);
	outb(Pdor, fl.motor | Fintena | Fena | dp->dev);
	if(!alreadyon){
		/* wait for drive to spin up */
		tsleep(&up->sleep, return0, 0, 750);

		/* clear any pending interrupts */
		floppysense();
	}

	/* set transfer rate */
	if(fl.rate != dp->t->rate){
		fl.rate = dp->t->rate;
		outb(Pdsr, fl.rate);
	}

	/* get drive to a known cylinder */
	if(dp->confused)
		for(tries = 0; tries < 4; tries++)
			if(floppyrecal(dp) >= 0)
				break;
	dp->lasttouched = m->ticks;
	fl.selected = dp;

	/* return -1 if this didn't work */
	if(dp->confused)
		return -1;
	return 0;
}