Lines Matching refs:fdc
264 void fd_set_motor(struct fdc_softc *fdc, int reset);
267 int fdcresult(struct fdc_softc *fdc);
268 void fdcstart(struct fdc_softc *fdc);
271 void fdcretry(struct fdc_softc *fdc);
295 fdprint(void *aux, const char *fdc) in fdprint() argument
299 if (!fdc) in fdprint()
307 struct fdc_softc *fdc = device_private(self); in fdcresume() local
309 mutex_enter(&fdc->sc_mtx); in fdcresume()
310 (void)fdcintr1(fdc); in fdcresume()
311 mutex_exit(&fdc->sc_mtx); in fdcresume()
318 struct fdc_softc *fdc = device_private(self); in fdcsuspend() local
322 mutex_enter(&fdc->sc_mtx); in fdcsuspend()
323 while (fdc->sc_state != DEVIDLE) in fdcsuspend()
324 cv_wait(&fdc->sc_cv, &fdc->sc_mtx); in fdcsuspend()
326 if ((fd = fdc->sc_fd[drive]) == NULL) in fdcsuspend()
330 fd_set_motor(fdc, 0); in fdcsuspend()
331 mutex_exit(&fdc->sc_mtx); in fdcsuspend()
338 struct fdc_softc *fdc = device_private(self); in fdc_childdet() local
342 KASSERT(fdc->sc_fd[drive] == fd); /* but the kid is not my son */ in fdc_childdet()
343 fdc->sc_fd[drive] = NULL; in fdc_childdet()
350 struct fdc_softc *fdc = device_private(self); in fdcdetach() local
357 isa_dmamap_destroy(fdc->sc_ic, fdc->sc_drq); in fdcdetach()
358 isa_drq_free(fdc->sc_ic, fdc->sc_drq); in fdcdetach()
360 callout_destroy(&fdc->sc_intr_ch); in fdcdetach()
361 callout_destroy(&fdc->sc_timo_ch); in fdcdetach()
363 cv_destroy(&fdc->sc_cv); in fdcdetach()
364 mutex_destroy(&fdc->sc_mtx); in fdcdetach()
370 fdcattach(struct fdc_softc *fdc) in fdcattach() argument
372 mutex_init(&fdc->sc_mtx, MUTEX_DEFAULT, IPL_BIO); in fdcattach()
373 cv_init(&fdc->sc_cv, "fdcwake"); in fdcattach()
374 callout_init(&fdc->sc_timo_ch, 0); in fdcattach()
375 callout_init(&fdc->sc_intr_ch, 0); in fdcattach()
377 fdc->sc_state = DEVIDLE; in fdcattach()
378 TAILQ_INIT(&fdc->sc_drives); in fdcattach()
380 fdc->sc_maxiosize = isa_dmamaxsize(fdc->sc_ic, fdc->sc_drq); in fdcattach()
382 if (isa_drq_alloc(fdc->sc_ic, fdc->sc_drq) != 0) { in fdcattach()
383 aprint_normal_dev(fdc->sc_dev, "can't reserve drq %d\n", in fdcattach()
384 fdc->sc_drq); in fdcattach()
388 if (isa_dmamap_create(fdc->sc_ic, fdc->sc_drq, fdc->sc_maxiosize, in fdcattach()
390 aprint_normal_dev(fdc->sc_dev, "can't set up ISA DMA map\n"); in fdcattach()
394 config_interrupts(fdc->sc_dev, fdcfinishattach); in fdcattach()
396 if (!pmf_device_register(fdc->sc_dev, fdcsuspend, fdcresume)) { in fdcattach()
397 aprint_error_dev(fdc->sc_dev, in fdcattach()
405 struct fdc_softc *fdc = device_private(self); in fdcfinishattach() local
406 bus_space_tag_t iot = fdc->sc_iot; in fdcfinishattach()
407 bus_space_handle_t ioh = fdc->sc_ioh; in fdcfinishattach()
422 aprint_normal_dev(fdc->sc_dev, "can't reset controller\n"); in fdcfinishattach()
434 if (device_unit(fdc->sc_dev) == 0) { in fdcfinishattach()
436 fdc->sc_known = 1; in fdcfinishattach()
437 fdc->sc_knownfds[0] = fd_nvtotype(device_xname(fdc->sc_dev), in fdcfinishattach()
439 if (fdc->sc_knownfds[0] != NULL) in fdcfinishattach()
440 fdc->sc_present |= 1; in fdcfinishattach()
441 fdc->sc_knownfds[1] = fd_nvtotype(device_xname(fdc->sc_dev), in fdcfinishattach()
443 if (fdc->sc_knownfds[1] != NULL) in fdcfinishattach()
444 fdc->sc_present |= 2; in fdcfinishattach()
449 fdc->sc_state = PROBING; in fdcfinishattach()
451 if (fdc->sc_known) { in fdcfinishattach()
452 if (fdc->sc_present & (1 << fa.fa_drive)) { in fdcfinishattach()
453 fa.fa_deftype = fdc->sc_knownfds[fa.fa_drive]; in fdcfinishattach()
454 config_found(fdc->sc_dev, (void *)&fa, in fdcfinishattach()
464 config_found(fdc->sc_dev, &fa, fdprint, in fdcfinishattach()
472 config_found(fdc->sc_dev, &fa, fdprint, in fdcfinishattach()
477 fdc->sc_state = DEVIDLE; in fdcfinishattach()
483 struct fdc_softc *fdc = device_private(parent); in fdprobe() local
487 bus_space_tag_t iot = fdc->sc_iot; in fdprobe()
488 bus_space_handle_t ioh = fdc->sc_ioh; in fdprobe()
503 if (fdc->sc_known) in fdprobe()
506 mutex_enter(&fdc->sc_mtx); in fdprobe()
510 (void) fdcresult(fdc); in fdprobe()
516 (void) cv_timedwait(&fdc->sc_cv, &fdc->sc_mtx, hz / 4); in fdprobe()
521 if (cv_timedwait(&fdc->sc_cv, &fdc->sc_mtx, 2 * hz) != EWOULDBLOCK){ in fdprobe()
528 n = fdcresult(fdc); in fdprobe()
534 printf(" %x", fdc->sc_status[i]); in fdprobe()
540 mutex_exit(&fdc->sc_mtx); in fdprobe()
543 if (n != 2 || (fdc->sc_status[1] != 0)) in fdprobe()
546 if (n != 2 || (fdc->sc_status[0] & 0xf8) != 0x20) in fdprobe()
559 struct fdc_softc *fdc = device_private(parent); in fdattach() local
582 fdc->sc_fd[drive] = fd; in fdattach()
652 fd_nvtotype(const char *fdc, int nvraminfo, int drive) in fd_nvtotype() argument
683 fdc, drive, type); in fd_nvtotype()
703 struct fdc_softc *fdc = device_private(device_parent(fd->sc_dev)); in fdstrategy() local
746 mutex_enter(&fdc->sc_mtx); in fdstrategy()
753 if (fdc->sc_state == DEVIDLE) { in fdstrategy()
755 fdcstart(fdc); in fdstrategy()
759 mutex_exit(&fdc->sc_mtx); in fdstrategy()
771 struct fdc_softc *fdc = device_private(device_parent(fd->sc_dev)); in fdstart() local
772 int active = !TAILQ_EMPTY(&fdc->sc_drives); in fdstart()
774 KASSERT(mutex_owned(&fdc->sc_mtx)); in fdstart()
777 TAILQ_INSERT_TAIL(&fdc->sc_drives, fd, sc_drivechain); in fdstart()
781 fdcstart(fdc); in fdstart()
787 struct fdc_softc *fdc = device_private(device_parent(fd->sc_dev)); in fdfinish() local
798 TAILQ_REMOVE(&fdc->sc_drives, fd, sc_drivechain); in fdfinish()
800 TAILQ_INSERT_TAIL(&fdc->sc_drives, fd, sc_drivechain); in fdfinish()
812 fdc->sc_state = DEVIDLE; in fdfinish()
830 fd_set_motor(struct fdc_softc *fdc, int reset) in fd_set_motor() argument
836 if ((fd = TAILQ_FIRST(&fdc->sc_drives)) != NULL) in fd_set_motor()
843 if ((fd = fdc->sc_fd[n]) && (fd->sc_flags & FD_MOTOR)) in fd_set_motor()
845 bus_space_write_1(fdc->sc_iot, fdc->sc_ioh, fdout, status); in fd_set_motor()
852 struct fdc_softc *fdc; in fd_motor_off() local
854 fdc = device_private(device_parent(fd->sc_dev)); in fd_motor_off()
856 mutex_enter(&fdc->sc_mtx); in fd_motor_off()
858 fd_set_motor(fdc, 0); in fd_motor_off()
859 mutex_exit(&fdc->sc_mtx); in fd_motor_off()
866 struct fdc_softc *fdc = device_private(device_parent(fd->sc_dev)); in fd_motor_on() local
868 mutex_enter(&fdc->sc_mtx); in fd_motor_on()
870 if (TAILQ_FIRST(&fdc->sc_drives) == fd && fdc->sc_state == MOTORWAIT) in fd_motor_on()
871 (void)fdcintr1(fdc); in fd_motor_on()
872 mutex_exit(&fdc->sc_mtx); in fd_motor_on()
876 fdcresult(struct fdc_softc *fdc) in fdcresult() argument
878 bus_space_tag_t iot = fdc->sc_iot; in fdcresult()
879 bus_space_handle_t ioh = fdc->sc_ioh; in fdcresult()
890 if (n >= sizeof(fdc->sc_status)) { in fdcresult()
894 fdc->sc_status[n++] = in fdcresult()
961 fdcstart(struct fdc_softc *fdc) in fdcstart() argument
964 KASSERT(mutex_owned(&fdc->sc_mtx)); in fdcstart()
966 if (!device_is_active(fdc->sc_dev)) in fdcstart()
972 if (fdc->sc_state != DEVIDLE) { in fdcstart()
977 (void)fdcintr1(fdc); in fdcstart()
981 fdcpstatus(int n, struct fdc_softc *fdc) in fdcpstatus() argument
990 snprintb(bits, sizeof(bits), NE7_ST0BITS, fdc->sc_status[0]); in fdcpstatus()
991 printf(" (st0 %s cyl %d)\n", bits, fdc->sc_status[1]); in fdcpstatus()
994 snprintb(bits, sizeof(bits), NE7_ST0BITS, fdc->sc_status[0]); in fdcpstatus()
996 snprintb(bits, sizeof(bits), NE7_ST1BITS, fdc->sc_status[1]); in fdcpstatus()
998 snprintb(bits, sizeof(bits), NE7_ST2BITS, fdc->sc_status[2]); in fdcpstatus()
1001 fdc->sc_status[3], fdc->sc_status[4], fdc->sc_status[5]); in fdcpstatus()
1014 struct fdc_softc *fdc = device_private(device_parent(dv)); in fdcstatus() local
1017 out_fdc(fdc->sc_iot, fdc->sc_ioh, NE7CMD_SENSEI); in fdcstatus()
1018 (void) fdcresult(fdc); in fdcstatus()
1021 fdcpstatus(n, fdc); in fdcstatus()
1030 struct fdc_softc *fdc = arg; in fdctimeout() local
1031 struct fd_softc *fd = TAILQ_FIRST(&fdc->sc_drives); in fdctimeout()
1033 mutex_enter(&fdc->sc_mtx); in fdctimeout()
1035 log(LOG_ERR, "fdctimeout: state %d\n", fdc->sc_state); in fdctimeout()
1040 fdc->sc_state++; in fdctimeout()
1042 fdc->sc_state = DEVIDLE; in fdctimeout()
1044 (void)fdcintr1(fdc); in fdctimeout()
1045 mutex_exit(&fdc->sc_mtx); in fdctimeout()
1049 fdcintr1(struct fdc_softc *fdc) in fdcintr1() argument
1051 #define st0 fdc->sc_status[0] in fdcintr1()
1052 #define cyl fdc->sc_status[1] in fdcintr1()
1055 bus_space_tag_t iot = fdc->sc_iot; in fdcintr1()
1056 bus_space_handle_t ioh = fdc->sc_ioh; in fdcintr1()
1061 KASSERT(mutex_owned(&fdc->sc_mtx)); in fdcintr1()
1062 if (fdc->sc_state == PROBING) { in fdcintr1()
1066 fdc->sc_probe++; in fdcintr1()
1072 fd = TAILQ_FIRST(&fdc->sc_drives); in fdcintr1()
1074 fdc->sc_state = DEVIDLE; in fdcintr1()
1082 TAILQ_REMOVE(&fdc->sc_drives, fd, sc_drivechain); in fdcintr1()
1090 switch (fdc->sc_state) { in fdcintr1()
1092 fdc->sc_errors = 0; in fdcintr1()
1098 fdc->sc_state = MOTORWAIT; in fdcintr1()
1103 struct fd_softc *ofd = fdc->sc_fd[fd->sc_drive ^ 1]; in fdcintr1()
1109 fd_set_motor(fdc, 0); in fdcintr1()
1110 fdc->sc_state = MOTORWAIT; in fdcintr1()
1117 fd_set_motor(fdc, 0); in fdcintr1()
1134 fdc->sc_state = SEEKWAIT; in fdcintr1()
1139 callout_reset(&fdc->sc_timo_ch, 4 * hz, fdctimeout, fdc); in fdcintr1()
1151 nblks = uimin(nblks, fdc->sc_maxiosize / FDC_BSIZE); in fdcintr1()
1171 isa_dmastart(fdc->sc_ic, fdc->sc_drq, in fdcintr1()
1174 bus_space_write_1(iot, fdc->sc_fdctlioh, 0, type->rate); in fdcintr1()
1183 fdc->sc_errors = 4; in fdcintr1()
1184 fdcretry(fdc); in fdcintr1()
1206 fdc->sc_state = IOCOMPLETE; in fdcintr1()
1211 callout_reset(&fdc->sc_timo_ch, 2 * hz, fdctimeout, fdc); in fdcintr1()
1215 callout_stop(&fdc->sc_timo_ch); in fdcintr1()
1216 fdc->sc_state = SEEKCOMPLETE; in fdcintr1()
1218 callout_reset(&fdc->sc_intr_ch, hz / 50, fdcintrcb, fdc); in fdcintr1()
1227 if (fdcresult(fdc) != 2 || (st0 & 0xf8) != 0x20 || in fdcintr1()
1232 fdcretry(fdc); in fdcintr1()
1239 isa_dmaabort(fdc->sc_ic, fdc->sc_drq); in fdcintr1()
1244 fdcretry(fdc); in fdcintr1()
1248 callout_stop(&fdc->sc_timo_ch); in fdcintr1()
1253 if (fdcresult(fdc) != 7 || (st0 & 0xf8) != 0) { in fdcintr1()
1254 isa_dmaabort(fdc->sc_ic, fdc->sc_drq); in fdcintr1()
1261 fdcretry(fdc); in fdcintr1()
1264 isa_dmadone(fdc->sc_ic, fdc->sc_drq); in fdcintr1()
1265 if (fdc->sc_errors) { in fdcintr1()
1269 fdc->sc_errors = 0; in fdcintr1()
1283 fd_set_motor(fdc, 1); in fdcintr1()
1285 fd_set_motor(fdc, 0); in fdcintr1()
1286 fdc->sc_state = RESETCOMPLETE; in fdcintr1()
1287 callout_reset(&fdc->sc_timo_ch, hz / 2, fdctimeout, fdc); in fdcintr1()
1291 callout_stop(&fdc->sc_timo_ch); in fdcintr1()
1295 (void) fdcresult(fdc); in fdcintr1()
1302 fdc->sc_state = RECALWAIT; in fdcintr1()
1303 callout_reset(&fdc->sc_timo_ch, 5 * hz, fdctimeout, fdc); in fdcintr1()
1307 callout_stop(&fdc->sc_timo_ch); in fdcintr1()
1308 fdc->sc_state = RECALCOMPLETE; in fdcintr1()
1310 callout_reset(&fdc->sc_intr_ch, hz / 30, fdcintrcb, fdc); in fdcintr1()
1315 if (fdcresult(fdc) != 2 || (st0 & 0xf8) != 0x20 || cyl != 0) { in fdcintr1()
1319 fdcretry(fdc); in fdcintr1()
1338 cv_signal(&fdc->sc_cv); in fdcintr1()
1352 struct fdc_softc *fdc = arg; in fdcintr() local
1354 mutex_enter(&fdc->sc_mtx); in fdcintr()
1355 rc = fdcintr1(fdc); in fdcintr()
1356 mutex_exit(&fdc->sc_mtx); in fdcintr()
1361 fdcretry(struct fdc_softc *fdc) in fdcretry() argument
1366 fd = TAILQ_FIRST(&fdc->sc_drives); in fdcretry()
1371 switch (fdc->sc_errors) { in fdcretry()
1374 fdc->sc_state = DOSEEK; in fdcretry()
1379 fdc->sc_state = DORECAL; in fdcretry()
1384 fdc->sc_state = DORESET; in fdcretry()
1392 fdcpstatus(7, fdc); in fdcretry()
1398 fdc->sc_errors++; in fdcretry()