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; }
/* * 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; }