Lines Matching refs:fd

310 fdsettype(struct fd_data *fd, struct fd_type *ft)  in fdsettype()  argument
312 fd->ft = ft; in fdsettype()
314 fd->sectorsize = 128 << fd->ft->secsize; in fdsettype()
561 if (fdc_cmd(fdc, 2, NE7CMD_SENSED, fdc->fd->fdsu, 1, &st3)) in fdc_sense_drive()
622 fd_select(struct fd_data *fd) in fd_select() argument
627 fdc = fd->fdc; in fd_select()
629 fdc->fdout |= FDO_FDMAEN | FDO_FRST | fd->fdsu; in fd_select()
636 struct fd_data *fd; in fd_turnon() local
640 fd = arg; in fd_turnon()
641 mtx_assert(&fd->fdc->fdc_mtx, MA_OWNED); in fd_turnon()
642 fd->flags &= ~FD_MOTORWAIT; in fd_turnon()
643 fd->flags |= FD_MOTOR; in fd_turnon()
646 bp = bioq_takefirst(&fd->fd_bq); in fd_turnon()
649 bioq_disksort(&fd->fdc->head, bp); in fd_turnon()
653 wakeup(&fd->fdc->head); in fd_turnon()
657 fd_motor(struct fd_data *fd, int turnon) in fd_motor() argument
661 fdc = fd->fdc; in fd_motor()
666 fd->flags |= FD_MOTORWAIT; in fd_motor()
667 fdc->fdout |= (FDO_MOEN0 << fd->fdsu); in fd_motor()
668 callout_reset(&fd->toffhandle, hz, fd_turnon, fd); in fd_motor()
670 callout_stop(&fd->toffhandle); in fd_motor()
671 fd->flags &= ~(FD_MOTOR|FD_MOTORWAIT); in fd_motor()
672 fdc->fdout &= ~(FDO_MOEN0 << fd->fdsu); in fd_motor()
680 struct fd_data *fd = xfd; in fd_turnoff() local
682 mtx_assert(&fd->fdc->fdc_mtx, MA_OWNED); in fd_turnoff()
683 fd_motor(fd, 0); in fd_turnoff()
716 cptr = fdc->fd->fd_ioptr; in fdc_pio()
717 count = fdc->fd->fd_iosize; in fdc_pio()
733 struct fd_data *fd; in fdc_biodone() local
736 fd = fdc->fd; in fdc_biodone()
740 if (--fd->fd_iocount == 0) in fdc_biodone()
741 callout_reset(&fd->toffhandle, 4 * hz, fd_turnoff, fd); in fdc_biodone()
743 fdc->fd = NULL; in fdc_biodone()
746 if ((debugflags & 2) && fd->fdc->retry > 0) in fdc_biodone()
747 printf("retries: %d\n", fd->fdc->retry); in fdc_biodone()
762 struct fd_data *fd; in fdc_worker() local
776 fd = fdc->fd; in fdc_worker()
778 (fdc->retry >= retries || (fd->options & FDOPT_NORETRY))) { in fdc_worker()
783 fd->flags |= FD_EMPTY; in fdc_worker()
790 if (fd != NULL && (fd->flags & FD_ISADMA)) { in fdc_worker()
793 fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); in fdc_worker()
795 fd->flags &= ~FD_ISADMA; in fdc_worker()
834 fd = fdc->fd = bp->bio_driver1; in fdc_worker()
836 fd->fd_ioptr = bp->bio_data; in fdc_worker()
839 fd->fd_ioptr += i; in fdc_worker()
840 fd->fd_iosize = bp->bio_length - i; in fdc_worker()
845 fd_select(fd); in fdc_worker()
847 fddsr_wr(fdc, fd->ft->trans); in fdc_worker()
849 fdctl_wr(fdc, fd->ft->trans); in fdc_worker()
852 if ((!(device_get_flags(fd->dev) & FD_NO_CHLINE) && in fdc_worker()
854 !(fd->flags & FD_EMPTY)) || in fdc_worker()
855 fd_probe_disk(fd, &need_recal) == 0) in fdc_worker()
863 if (fd->flags & FD_EMPTY) in fdc_worker()
871 fd->flags |= FD_EMPTY; in fdc_worker()
872 fd->flags |= FD_NEWDISK; in fdc_worker()
875 g_orphan_provider(fd->fd_provider, ENXIO); in fdc_worker()
876 fd->fd_provider->flags |= G_PF_WITHER; in fdc_worker()
877 fd->fd_provider = in fdc_worker()
878 g_new_providerf(fd->fd_geom, "%s", fd->fd_geom->name); in fdc_worker()
879 g_error_provider(fd->fd_provider, 0); in fdc_worker()
893 mfm = (fd->ft->flags & FL_MFM)? NE7CMD_MFM: 0; in fdc_worker()
894 steptrac = (fd->ft->flags & FL_2STEP)? 2: 1; in fdc_worker()
895 i = fd->ft->sectrac * fd->ft->heads; in fdc_worker()
900 head = sec / fd->ft->sectrac; in fdc_worker()
901 sec = sec % fd->ft->sectrac + 1; in fdc_worker()
906 fd->fd_iosize = imin(nsect * fd->sectorsize, bp->bio_resid); in fdc_worker()
907 nsect = fd->fd_iosize / fd->sectorsize; in fdc_worker()
909 fd->fd_iosize = fd->sectorsize; in fdc_worker()
914 if ((need_recal & (1 << fd->fdsu)) || in fdc_worker()
915 (cylinder == 0 && fd->track != 0) || in fdc_worker()
918 if (fdc_cmd(fdc, 2, NE7CMD_RECAL, fd->fdsu, 0)) in fdc_worker()
927 need_recal &= ~(1 << fd->fdsu); in fdc_worker()
928 fd->track = 0; in fdc_worker()
931 tsleep(fdc->fd, PRIBIO, "fdhdstl", settle); in fdc_worker()
937 if (cylinder != fd->track) { in fdc_worker()
939 if (fdc_cmd(fdc, 3, NE7CMD_SEEK, fd->fdsu, descyl, 0)) in fdc_worker()
947 need_recal |= (1 << fd->fdsu); in fdc_worker()
952 tsleep(fdc->fd, PRIBIO, "fdhdstl", settle); in fdc_worker()
954 fd->track = cylinder; in fdc_worker()
958 bp->bio_cmd, bp->bio_pblkno, fd->fd_iosize, in fdc_worker()
959 fd->fd_ioptr, fdc->retry); in fdc_worker()
968 fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); in fdc_worker()
970 fd->flags |= FD_ISADMA; in fdc_worker()
979 fdbcdr_wr(fdc, 1, fd->fd_iosize); in fdc_worker()
992 head << 2 | fd->fdsu, in fdc_worker()
1003 head << 2 | fd->fdsu, 0)) in fdc_worker()
1010 head << 2 | fd->fdsu, /* head & unit */ in fdc_worker()
1011 fd->track, /* track */ in fdc_worker()
1014 fd->ft->secsize, /* sector size */ in fdc_worker()
1015 fd->ft->sectrac, /* sectors/track */ in fdc_worker()
1016 fd->ft->gap, /* gap size */ in fdc_worker()
1017 fd->ft->datalen, /* data length */ in fdc_worker()
1025 head << 2 | fd->fdsu, /* head & unit */ in fdc_worker()
1026 fd->track, /* track */ in fdc_worker()
1029 fd->ft->secsize, /* sector size */ in fdc_worker()
1030 fd->ft->sectrac, /* sectors/track */ in fdc_worker()
1031 fd->ft->gap, /* gap size */ in fdc_worker()
1032 fd->ft->datalen, /* data length */ in fdc_worker()
1048 if (fd->flags & FD_ISADMA) { in fdc_worker()
1051 fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); in fdc_worker()
1053 fd->flags &= ~FD_ISADMA; in fdc_worker()
1099 need_recal |= (1 << fd->fdsu); in fdc_worker()
1108 if (fd->options & FDOPT_NOERROR) in fdc_worker()
1129 bp->bio_resid -= fd->fd_iosize; in fdc_worker()
1130 bp->bio_completed += fd->fd_iosize; in fdc_worker()
1131 fd->fd_ioptr += fd->fd_iosize; in fdc_worker()
1180 fd_enqueue(struct fd_data *fd, struct bio *bp) in fd_enqueue() argument
1184 fdc = fd->fdc; in fd_enqueue()
1187 if (fd->fd_iocount++ == 0) in fd_enqueue()
1188 callout_stop(&fd->toffhandle); in fd_enqueue()
1189 if (fd->flags & FD_MOTOR) { in fd_enqueue()
1195 bioq_insert_tail(&fd->fd_bq, bp); in fd_enqueue()
1196 if (!(fd->flags & FD_MOTORWAIT)) in fd_enqueue()
1197 fd_motor(fd, 1); in fd_enqueue()
1206 fd_probe_disk(struct fd_data *fd, int *recal) in fd_probe_disk() argument
1212 fdc = fd->fdc; in fd_probe_disk()
1213 oopts = fd->options; in fd_probe_disk()
1214 fd->options |= FDOPT_NOERRLOG | FDOPT_NORETRY; in fd_probe_disk()
1224 fd->flags |= FD_NEWDISK; in fd_probe_disk()
1226 if (fdc_cmd(fdc, 2, NE7CMD_RECAL, fd->fdsu, 0)) in fd_probe_disk()
1235 if (fdc_cmd(fdc, 3, NE7CMD_SEEK, fd->fdsu, 1, 0)) in fd_probe_disk()
1240 *recal |= (1 << fd->fdsu); in fd_probe_disk()
1245 fd->flags |= FD_EMPTY; in fd_probe_disk()
1253 fd->flags &= ~FD_EMPTY; in fd_probe_disk()
1255 fd->flags |= FD_WP; in fd_probe_disk()
1257 fd->flags &= ~FD_WP; in fd_probe_disk()
1263 fd->options = oopts; in fd_probe_disk()
1268 fdmisccmd(struct fd_data *fd, u_int cmd, void *data) in fdmisccmd() argument
1286 (finfo->cyl * fd->ft->heads + finfo->head) * in fdmisccmd()
1287 fd->ft->sectrac; in fdmisccmd()
1292 (idfield->cyl * fd->ft->heads + idfield->head) * in fdmisccmd()
1293 fd->ft->sectrac; in fdmisccmd()
1299 bp->bio_offset = bp->bio_pblkno * fd->sectorsize; in fdmisccmd()
1301 bp->bio_driver1 = fd; in fdmisccmd()
1304 fd_enqueue(fd, bp); in fdmisccmd()
1319 fdautoselect(struct fd_data *fd) in fdautoselect() argument
1325 if (!(fd->ft->flags & FL_AUTO)) in fdautoselect()
1328 fdtp = fd_native_types[fd->type]; in fdautoselect()
1329 fdsettype(fd, fdtp); in fdautoselect()
1330 if (!(fd->ft->flags & FL_AUTO)) in fdautoselect()
1353 oopts = fd->options; in fdautoselect()
1354 fd->options |= FDOPT_NOERRLOG | FDOPT_NORETRY; in fdautoselect()
1356 fdsettype(fd, fdtp); in fdautoselect()
1359 rv = fdmisccmd(fd, BIO_RDID, &id); in fdautoselect()
1365 id.head = fd->ft->heads - 1; in fdautoselect()
1366 rv = fdmisccmd(fd, BIO_RDID, &id); in fdautoselect()
1374 fd->options = oopts; in fdautoselect()
1377 device_printf(fd->dev, "autoselection failed\n"); in fdautoselect()
1378 fdsettype(fd, fd_native_types[fd->type]); in fdautoselect()
1382 device_printf(fd->dev, in fdautoselect()
1384 fd->ft->size / 2); in fdautoselect()
1385 fdprinttype(fd->ft); in fdautoselect()
1412 struct fd_data *fd; in fd_access() local
1416 fd = pp->geom->softc; in fd_access()
1417 fdc = fd->fdc; in fd_access()
1431 fd->options &= ~(FDOPT_NORETRY | FDOPT_NOERRLOG | FDOPT_NOERROR); in fd_access()
1436 if (fdmisccmd(fd, BIO_PROBE, NULL)) in fd_access()
1438 if (fd->flags & FD_EMPTY) in fd_access()
1440 if (fd->flags & FD_NEWDISK) { in fd_access()
1441 if (fdautoselect(fd) != 0 && in fd_access()
1442 (device_get_flags(fd->dev) & FD_NO_CHLINE)) { in fd_access()
1444 fd->flags |= FD_EMPTY; in fd_access()
1449 fd->flags &= ~FD_NEWDISK; in fd_access()
1454 if (w > 0 && (fd->flags & FD_WP)) { in fd_access()
1458 pp->sectorsize = fd->sectorsize; in fd_access()
1459 pp->stripesize = fd->ft->heads * fd->ft->sectrac * fd->sectorsize; in fd_access()
1460 pp->mediasize = pp->stripesize * fd->ft->tracks; in fd_access()
1467 struct fd_data * fd; in fd_start() local
1469 fd = bp->bio_to->geom->softc; in fd_start()
1470 bp->bio_driver1 = fd; in fd_start()
1472 if (g_handleattr_int(bp, "GEOM::fwsectors", fd->ft->sectrac)) in fd_start()
1474 if (g_handleattr_int(bp, "GEOM::fwheads", fd->ft->heads)) in fd_start()
1483 bp->bio_pblkno = bp->bio_offset / fd->sectorsize; in fd_start()
1485 fd_enqueue(fd, bp); in fd_start()
1492 struct fd_data *fd; in fd_ioctl() local
1497 fd = pp->geom->softc; in fd_ioctl()
1501 *(struct fd_type *)data = *fd->ft; in fd_ioctl()
1510 fd->fts = *(struct fd_type *)data; in fd_ioctl()
1511 if (fd->fts.sectrac) { in fd_ioctl()
1513 fdsettype(fd, &fd->fts); in fd_ioctl()
1515 fdsettype(fd, fd_native_types[fd->type]); in fd_ioctl()
1518 fdprinttype(fd->ft); in fd_ioctl()
1522 *(int *)data = fd->options; in fd_ioctl()
1526 fd->options = *(int *)data; in fd_ioctl()
1533 fd->fdc->fdc_errs = 0; in fd_ioctl()
1538 if ((fd->fdc->flags & FDC_STAT_VALID) == 0) in fd_ioctl()
1540 memcpy(fsp->status, fd->fdc->status, 7 * sizeof(u_int)); in fd_ioctl()
1544 *(enum fd_drivetype *)data = fd->type; in fd_ioctl()
1553 error = fdmisccmd(fd, BIO_FMT, data); in fd_ioctl()
1554 mtx_lock(&fd->fdc->fdc_mtx); in fd_ioctl()
1555 fd->flags |= FD_NEWDISK; in fd_ioctl()
1556 mtx_unlock(&fd->fdc->fdc_mtx); in fd_ioctl()
1563 error = fdmisccmd(fd, BIO_RDID, data); in fd_ioctl()
1889 struct fd_data *fd; in fd_probe() local
1895 fd = device_get_softc(dev); in fd_probe()
1899 fd->dev = dev; in fd_probe()
1900 fd->fdc = fdc; in fd_probe()
1901 fd->fdsu = fdsu; in fd_probe()
1906 fd->type = type; in fd_probe()
1910 fd->flags = FD_EMPTY; in fd_probe()
1911 fd->type = type; in fd_probe()
1916 if (fd->type == FDT_NONE && (unit == 0 || unit == 1)) { in fd_probe()
1919 fd->type = (rtcin(RTC_FDISKETTE) & 0xf0) >> 4; in fd_probe()
1921 fd->type = rtcin(RTC_FDISKETTE) & 0x0f; in fd_probe()
1922 if (fd->type == FDT_288M_1) in fd_probe()
1923 fd->type = FDT_288M; in fd_probe()
1927 if (fd->type == FDT_NONE) in fd_probe()
1933 fd_select(fd); in fd_probe()
1934 fd_motor(fd, 1); in fd_probe()
1935 fdc->fd = fd; in fd_probe()
1972 fd_motor(fd, 0); in fd_probe()
1973 fdc->fd = NULL; in fd_probe()
1982 switch (fd->type) { in fd_probe()
2001 fd->track = FD_NO_TRACK; in fd_probe()
2002 fd->fdc = fdc; in fd_probe()
2003 fd->fdsu = fdsu; in fd_probe()
2004 fd->options = 0; in fd_probe()
2005 callout_init_mtx(&fd->toffhandle, &fd->fdc->fdc_mtx, 0); in fd_probe()
2008 fdsettype(fd, fd_native_types[fd->type]); in fd_probe()
2020 struct fd_data *fd; in fd_attach2() local
2022 fd = arg; in fd_attach2()
2024 fd->fd_geom = g_new_geomf(&g_fd_class, in fd_attach2()
2025 "fd%d", device_get_unit(fd->dev)); in fd_attach2()
2026 fd->fd_provider = g_new_providerf(fd->fd_geom, "%s", fd->fd_geom->name); in fd_attach2()
2027 fd->fd_geom->softc = fd; in fd_attach2()
2028 g_error_provider(fd->fd_provider, 0); in fd_attach2()
2034 struct fd_data *fd; in fd_attach() local
2036 fd = device_get_softc(dev); in fd_attach()
2037 g_post_event(fd_attach2, fd, M_WAITOK, NULL); in fd_attach()
2038 fd->flags |= FD_EMPTY; in fd_attach()
2039 bioq_init(&fd->fd_bq); in fd_attach()
2047 struct fd_data *fd; in fd_providergone() local
2049 fd = pp->geom->softc; in fd_providergone()
2050 fd->gone = true; in fd_providergone()
2051 wakeup(fd); in fd_providergone()
2057 struct fd_data *fd = arg; in fd_detach_geom() local
2060 g_wither_geom(fd->fd_geom, ENXIO); in fd_detach_geom()
2066 struct fd_data *fd; in fd_detach() local
2068 fd = device_get_softc(dev); in fd_detach()
2070 g_waitfor_event(fd_detach_geom, fd, M_WAITOK, NULL); in fd_detach()
2071 while (!fd->gone) { in fd_detach()
2072 tsleep(fd, PZERO, "fdgone", hz/10); in fd_detach()
2080 callout_drain(&fd->toffhandle); in fd_detach()
2109 DRIVER_MODULE(fd, fdc, fd_driver, fdc_modevent, 0);