| 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,36 – 1991/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 |
| |
| 1991/0727 | ||
| 1991/0728 | DMAchan= 2, /* floppy dma channel */ | |
| 1991/0727 | /* sector size encodings */ | |
| 1991/0806/sys/src/9/pc/devfloppy.c:123,128 – 1991/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,138 – 1991/0809/sys/src/9/pc/devfloppy.c:133,139 | ||
| 1991/0727 | { | |
| 1991/0731 | QLock; /* exclusive access to the contoller */ | |
| 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,178 – 1991/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,196 – 1991/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 |
| |
| 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,203 – 1991/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,282 – 1991/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; | |
| 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,295 – 1991/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: | |
| 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,377 – 1991/0809/sys/src/9/pc/devfloppy.c:414,420 | ||
| 1991/0727 | ||
| 1991/0802 | waserror(); for(;;){ | |
| 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,389 – 1991/0809/sys/src/9/pc/devfloppy.c:425,430 | ||
| 1991/0803 | disp++; if(owl(disp&1) < 0) print("owl failed\n"); | |
| 1991/0802 | tsleep(&floppy.kr, return0, 0, 5*1000); | |
| 1991/0803 | ||
| 1991/0727 | } | |
| 1991/0806/sys/src/9/pc/devfloppy.c:592,598 – 1991/0809/sys/src/9/pc/devfloppy.c:633,639 | ||
| 1991/0727 | delay(1); outb(Fmotor, Fintena|Fena); spllo(); | |
| 1991/0731 |
| |
| 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,609 – 1991/0809/sys/src/9/pc/devfloppy.c:644,650 | ||
| 1991/0727 | /* * recalibrate any confused drives */ | |
| 1991/0731 |
| |
| 1991/0809 | for(dp = floppy.d; floppy.confused == 0 && dp < &floppy.d[conf.nfloppy]; dp++){ | |
| 1991/0727 | if(dp->confused == 0) floppyrecal(dp); | |