/* * 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; }
static void floppyalarm(Alarm* a) { FDrive *dp; for(dp = fl.d; dp < &fl.d[fl.ndrive]; dp++) { if((fl.motor&MOTORBIT(dp->dev)) && TK2SEC(m->ticks - dp->lasttouched) > 5) floppyoff(dp); } alarm(5*1000, floppyalarm, 0); cancel(a); }
static void floppykproc(void *) { FDrive *dp; while(waserror()) ; for(;;){ for(dp = fl.d; dp < &fl.d[fl.ndrive]; dp++){ if((fl.motor&MOTORBIT(dp->dev)) && TK2SEC(m->ticks - dp->lasttouched) > 5 && canqlock(&fl)){ if(TK2SEC(m->ticks - dp->lasttouched) > 5) floppyoff(dp); qunlock(&fl); } } tsleep(&up->sleep, return0, 0, 1000); } }