Lines Matching full:fd
93 /* configuration flags for fd */
308 fdsettype(struct fd_data *fd, struct fd_type *ft) in fdsettype() argument
310 fd->ft = ft; in fdsettype()
312 fd->sectorsize = 128 << fd->ft->secsize; in fdsettype()
559 if (fdc_cmd(fdc, 2, NE7CMD_SENSED, fdc->fd->fdsu, 1, &st3)) in fdc_sense_drive()
620 fd_select(struct fd_data *fd) in fd_select() argument
625 fdc = fd->fdc; in fd_select()
627 fdc->fdout |= FDO_FDMAEN | FDO_FRST | fd->fdsu; in fd_select()
634 struct fd_data *fd; in fd_turnon() local
638 fd = arg; in fd_turnon()
639 mtx_assert(&fd->fdc->fdc_mtx, MA_OWNED); in fd_turnon()
640 fd->flags &= ~FD_MOTORWAIT; in fd_turnon()
641 fd->flags |= FD_MOTOR; in fd_turnon()
644 bp = bioq_takefirst(&fd->fd_bq); in fd_turnon()
647 bioq_disksort(&fd->fdc->head, bp); in fd_turnon()
651 wakeup(&fd->fdc->head); in fd_turnon()
655 fd_motor(struct fd_data *fd, int turnon) in fd_motor() argument
659 fdc = fd->fdc; in fd_motor()
664 fd->flags |= FD_MOTORWAIT; in fd_motor()
665 fdc->fdout |= (FDO_MOEN0 << fd->fdsu); in fd_motor()
666 callout_reset(&fd->toffhandle, hz, fd_turnon, fd); in fd_motor()
668 callout_stop(&fd->toffhandle); in fd_motor()
669 fd->flags &= ~(FD_MOTOR|FD_MOTORWAIT); in fd_motor()
670 fdc->fdout &= ~(FDO_MOEN0 << fd->fdsu); in fd_motor()
678 struct fd_data *fd = xfd; in fd_turnoff() local
680 mtx_assert(&fd->fdc->fdc_mtx, MA_OWNED); in fd_turnoff()
681 fd_motor(fd, 0); in fd_turnoff()
714 cptr = fdc->fd->fd_ioptr; in fdc_pio()
715 count = fdc->fd->fd_iosize; in fdc_pio()
731 struct fd_data *fd; in fdc_biodone() local
734 fd = fdc->fd; in fdc_biodone()
738 if (--fd->fd_iocount == 0) in fdc_biodone()
739 callout_reset(&fd->toffhandle, 4 * hz, fd_turnoff, fd); in fdc_biodone()
741 fdc->fd = NULL; in fdc_biodone()
744 if ((debugflags & 2) && fd->fdc->retry > 0) in fdc_biodone()
745 printf("retries: %d\n", fd->fdc->retry); in fdc_biodone()
760 struct fd_data *fd; in fdc_worker() local
774 fd = fdc->fd; in fdc_worker()
776 (fdc->retry >= retries || (fd->options & FDOPT_NORETRY))) { in fdc_worker()
781 fd->flags |= FD_EMPTY; in fdc_worker()
788 if (fd != NULL && (fd->flags & FD_ISADMA)) { in fdc_worker()
791 fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); in fdc_worker()
793 fd->flags &= ~FD_ISADMA; in fdc_worker()
832 fd = fdc->fd = bp->bio_driver1; in fdc_worker()
834 fd->fd_ioptr = bp->bio_data; in fdc_worker()
837 fd->fd_ioptr += i; in fdc_worker()
838 fd->fd_iosize = bp->bio_length - i; in fdc_worker()
843 fd_select(fd); in fdc_worker()
845 fddsr_wr(fdc, fd->ft->trans); in fdc_worker()
847 fdctl_wr(fdc, fd->ft->trans); in fdc_worker()
850 if ((!(device_get_flags(fd->dev) & FD_NO_CHLINE) && in fdc_worker()
852 !(fd->flags & FD_EMPTY)) || in fdc_worker()
853 fd_probe_disk(fd, &need_recal) == 0) in fdc_worker()
861 if (fd->flags & FD_EMPTY) in fdc_worker()
869 fd->flags |= FD_EMPTY; in fdc_worker()
870 fd->flags |= FD_NEWDISK; in fdc_worker()
873 g_orphan_provider(fd->fd_provider, ENXIO); in fdc_worker()
874 fd->fd_provider->flags |= G_PF_WITHER; in fdc_worker()
875 fd->fd_provider = in fdc_worker()
876 g_new_providerf(fd->fd_geom, "%s", fd->fd_geom->name); in fdc_worker()
877 g_error_provider(fd->fd_provider, 0); in fdc_worker()
891 mfm = (fd->ft->flags & FL_MFM)? NE7CMD_MFM: 0; in fdc_worker()
892 steptrac = (fd->ft->flags & FL_2STEP)? 2: 1; in fdc_worker()
893 i = fd->ft->sectrac * fd->ft->heads; in fdc_worker()
898 head = sec / fd->ft->sectrac; in fdc_worker()
899 sec = sec % fd->ft->sectrac + 1; in fdc_worker()
904 fd->fd_iosize = imin(nsect * fd->sectorsize, bp->bio_resid); in fdc_worker()
905 nsect = fd->fd_iosize / fd->sectorsize; in fdc_worker()
907 fd->fd_iosize = fd->sectorsize; in fdc_worker()
912 if ((need_recal & (1 << fd->fdsu)) || in fdc_worker()
913 (cylinder == 0 && fd->track != 0) || in fdc_worker()
916 if (fdc_cmd(fdc, 2, NE7CMD_RECAL, fd->fdsu, 0)) in fdc_worker()
925 need_recal &= ~(1 << fd->fdsu); in fdc_worker()
926 fd->track = 0; in fdc_worker()
929 tsleep(fdc->fd, PRIBIO, "fdhdstl", settle); in fdc_worker()
935 if (cylinder != fd->track) { in fdc_worker()
937 if (fdc_cmd(fdc, 3, NE7CMD_SEEK, fd->fdsu, descyl, 0)) in fdc_worker()
945 need_recal |= (1 << fd->fdsu); in fdc_worker()
950 tsleep(fdc->fd, PRIBIO, "fdhdstl", settle); in fdc_worker()
952 fd->track = cylinder; in fdc_worker()
956 bp->bio_cmd, bp->bio_pblkno, fd->fd_iosize, in fdc_worker()
957 fd->fd_ioptr, fdc->retry); in fdc_worker()
966 fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); in fdc_worker()
968 fd->flags |= FD_ISADMA; in fdc_worker()
977 fdbcdr_wr(fdc, 1, fd->fd_iosize); in fdc_worker()
990 head << 2 | fd->fdsu, in fdc_worker()
1001 head << 2 | fd->fdsu, 0)) in fdc_worker()
1008 head << 2 | fd->fdsu, /* head & unit */ in fdc_worker()
1009 fd->track, /* track */ in fdc_worker()
1012 fd->ft->secsize, /* sector size */ in fdc_worker()
1013 fd->ft->sectrac, /* sectors/track */ in fdc_worker()
1014 fd->ft->gap, /* gap size */ in fdc_worker()
1015 fd->ft->datalen, /* data length */ in fdc_worker()
1023 head << 2 | fd->fdsu, /* head & unit */ in fdc_worker()
1024 fd->track, /* track */ in fdc_worker()
1027 fd->ft->secsize, /* sector size */ in fdc_worker()
1028 fd->ft->sectrac, /* sectors/track */ in fdc_worker()
1029 fd->ft->gap, /* gap size */ in fdc_worker()
1030 fd->ft->datalen, /* data length */ in fdc_worker()
1046 if (fd->flags & FD_ISADMA) { in fdc_worker()
1049 fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); in fdc_worker()
1051 fd->flags &= ~FD_ISADMA; in fdc_worker()
1097 need_recal |= (1 << fd->fdsu); in fdc_worker()
1106 if (fd->options & FDOPT_NOERROR) in fdc_worker()
1127 bp->bio_resid -= fd->fd_iosize; in fdc_worker()
1128 bp->bio_completed += fd->fd_iosize; in fdc_worker()
1129 fd->fd_ioptr += fd->fd_iosize; in fdc_worker()
1178 fd_enqueue(struct fd_data *fd, struct bio *bp) in fd_enqueue() argument
1182 fdc = fd->fdc; in fd_enqueue()
1185 if (fd->fd_iocount++ == 0) in fd_enqueue()
1186 callout_stop(&fd->toffhandle); in fd_enqueue()
1187 if (fd->flags & FD_MOTOR) { in fd_enqueue()
1193 bioq_insert_tail(&fd->fd_bq, bp); in fd_enqueue()
1194 if (!(fd->flags & FD_MOTORWAIT)) in fd_enqueue()
1195 fd_motor(fd, 1); in fd_enqueue()
1204 fd_probe_disk(struct fd_data *fd, int *recal) in fd_probe_disk() argument
1210 fdc = fd->fdc; in fd_probe_disk()
1211 oopts = fd->options; in fd_probe_disk()
1212 fd->options |= FDOPT_NOERRLOG | FDOPT_NORETRY; in fd_probe_disk()
1222 fd->flags |= FD_NEWDISK; in fd_probe_disk()
1224 if (fdc_cmd(fdc, 2, NE7CMD_RECAL, fd->fdsu, 0)) in fd_probe_disk()
1233 if (fdc_cmd(fdc, 3, NE7CMD_SEEK, fd->fdsu, 1, 0)) in fd_probe_disk()
1238 *recal |= (1 << fd->fdsu); in fd_probe_disk()
1243 fd->flags |= FD_EMPTY; in fd_probe_disk()
1251 fd->flags &= ~FD_EMPTY; in fd_probe_disk()
1253 fd->flags |= FD_WP; in fd_probe_disk()
1255 fd->flags &= ~FD_WP; in fd_probe_disk()
1261 fd->options = oopts; in fd_probe_disk()
1266 fdmisccmd(struct fd_data *fd, u_int cmd, void *data) in fdmisccmd() argument
1284 (finfo->cyl * fd->ft->heads + finfo->head) * in fdmisccmd()
1285 fd->ft->sectrac; in fdmisccmd()
1290 (idfield->cyl * fd->ft->heads + idfield->head) * in fdmisccmd()
1291 fd->ft->sectrac; in fdmisccmd()
1297 bp->bio_offset = bp->bio_pblkno * fd->sectorsize; in fdmisccmd()
1299 bp->bio_driver1 = fd; in fdmisccmd()
1302 fd_enqueue(fd, bp); in fdmisccmd()
1317 fdautoselect(struct fd_data *fd) in fdautoselect() argument
1323 if (!(fd->ft->flags & FL_AUTO)) in fdautoselect()
1326 fdtp = fd_native_types[fd->type]; in fdautoselect()
1327 fdsettype(fd, fdtp); in fdautoselect()
1328 if (!(fd->ft->flags & FL_AUTO)) in fdautoselect()
1351 oopts = fd->options; in fdautoselect()
1352 fd->options |= FDOPT_NOERRLOG | FDOPT_NORETRY; in fdautoselect()
1354 fdsettype(fd, fdtp); in fdautoselect()
1357 rv = fdmisccmd(fd, BIO_RDID, &id); in fdautoselect()
1363 id.head = fd->ft->heads - 1; in fdautoselect()
1364 rv = fdmisccmd(fd, BIO_RDID, &id); in fdautoselect()
1372 fd->options = oopts; in fdautoselect()
1375 device_printf(fd->dev, "autoselection failed\n"); in fdautoselect()
1376 fdsettype(fd, fd_native_types[fd->type]); in fdautoselect()
1380 device_printf(fd->dev, in fdautoselect()
1382 fd->ft->size / 2); in fdautoselect()
1383 fdprinttype(fd->ft); in fdautoselect()
1399 .name = "FD",
1410 struct fd_data *fd; in fd_access() local
1414 fd = pp->geom->softc; in fd_access()
1415 fdc = fd->fdc; in fd_access()
1429 fd->options &= ~(FDOPT_NORETRY | FDOPT_NOERRLOG | FDOPT_NOERROR); in fd_access()
1434 if (fdmisccmd(fd, BIO_PROBE, NULL)) in fd_access()
1436 if (fd->flags & FD_EMPTY) in fd_access()
1438 if (fd->flags & FD_NEWDISK) { in fd_access()
1439 if (fdautoselect(fd) != 0 && in fd_access()
1440 (device_get_flags(fd->dev) & FD_NO_CHLINE)) { in fd_access()
1442 fd->flags |= FD_EMPTY; in fd_access()
1447 fd->flags &= ~FD_NEWDISK; in fd_access()
1452 if (w > 0 && (fd->flags & FD_WP)) { in fd_access()
1456 pp->sectorsize = fd->sectorsize; in fd_access()
1457 pp->stripesize = fd->ft->heads * fd->ft->sectrac * fd->sectorsize; in fd_access()
1458 pp->mediasize = pp->stripesize * fd->ft->tracks; in fd_access()
1465 struct fd_data * fd; in fd_start() local
1467 fd = bp->bio_to->geom->softc; in fd_start()
1468 bp->bio_driver1 = fd; in fd_start()
1470 if (g_handleattr_int(bp, "GEOM::fwsectors", fd->ft->sectrac)) in fd_start()
1472 if (g_handleattr_int(bp, "GEOM::fwheads", fd->ft->heads)) in fd_start()
1481 bp->bio_pblkno = bp->bio_offset / fd->sectorsize; in fd_start()
1483 fd_enqueue(fd, bp); in fd_start()
1490 struct fd_data *fd; in fd_ioctl() local
1495 fd = pp->geom->softc; in fd_ioctl()
1499 *(struct fd_type *)data = *fd->ft; in fd_ioctl()
1508 fd->fts = *(struct fd_type *)data; in fd_ioctl()
1509 if (fd->fts.sectrac) { in fd_ioctl()
1511 fdsettype(fd, &fd->fts); in fd_ioctl()
1513 fdsettype(fd, fd_native_types[fd->type]); in fd_ioctl()
1516 fdprinttype(fd->ft); in fd_ioctl()
1520 *(int *)data = fd->options; in fd_ioctl()
1524 fd->options = *(int *)data; in fd_ioctl()
1531 fd->fdc->fdc_errs = 0; in fd_ioctl()
1536 if ((fd->fdc->flags & FDC_STAT_VALID) == 0) in fd_ioctl()
1538 memcpy(fsp->status, fd->fdc->status, 7 * sizeof(u_int)); in fd_ioctl()
1542 *(enum fd_drivetype *)data = fd->type; in fd_ioctl()
1551 error = fdmisccmd(fd, BIO_FMT, data); in fd_ioctl()
1552 mtx_lock(&fd->fdc->fdc_mtx); in fd_ioctl()
1553 fd->flags |= FD_NEWDISK; in fd_ioctl()
1554 mtx_unlock(&fd->fdc->fdc_mtx); in fd_ioctl()
1561 error = fdmisccmd(fd, BIO_RDID, data); in fd_ioctl()
1566 /* For backwards compat with old fd*(8) tools */ in fd_ioctl()
1886 struct fd_data *fd; in fd_probe() local
1892 fd = device_get_softc(dev); in fd_probe()
1896 fd->dev = dev; in fd_probe()
1897 fd->fdc = fdc; in fd_probe()
1898 fd->fdsu = fdsu; in fd_probe()
1903 fd->type = type; in fd_probe()
1907 fd->flags = FD_EMPTY; in fd_probe()
1908 fd->type = type; in fd_probe()
1913 if (fd->type == FDT_NONE && (unit == 0 || unit == 1)) { in fd_probe()
1916 fd->type = (rtcin(RTC_FDISKETTE) & 0xf0) >> 4; in fd_probe()
1918 fd->type = rtcin(RTC_FDISKETTE) & 0x0f; in fd_probe()
1919 if (fd->type == FDT_288M_1) in fd_probe()
1920 fd->type = FDT_288M; in fd_probe()
1924 if (fd->type == FDT_NONE) in fd_probe()
1930 fd_select(fd); in fd_probe()
1931 fd_motor(fd, 1); in fd_probe()
1932 fdc->fd = fd; in fd_probe()
1969 fd_motor(fd, 0); in fd_probe()
1970 fdc->fd = NULL; in fd_probe()
1979 switch (fd->type) { in fd_probe()
1998 fd->track = FD_NO_TRACK; in fd_probe()
1999 fd->fdc = fdc; in fd_probe()
2000 fd->fdsu = fdsu; in fd_probe()
2001 fd->options = 0; in fd_probe()
2002 callout_init_mtx(&fd->toffhandle, &fd->fdc->fdc_mtx, 0); in fd_probe()
2005 fdsettype(fd, fd_native_types[fd->type]); in fd_probe()
2017 struct fd_data *fd; in fd_attach2() local
2019 fd = arg; in fd_attach2()
2021 fd->fd_geom = g_new_geomf(&g_fd_class, in fd_attach2()
2022 "fd%d", device_get_unit(fd->dev)); in fd_attach2()
2023 fd->fd_provider = g_new_providerf(fd->fd_geom, "%s", fd->fd_geom->name); in fd_attach2()
2024 fd->fd_geom->softc = fd; in fd_attach2()
2025 g_error_provider(fd->fd_provider, 0); in fd_attach2()
2031 struct fd_data *fd; in fd_attach() local
2033 fd = device_get_softc(dev); in fd_attach()
2034 g_post_event(fd_attach2, fd, M_WAITOK, NULL); in fd_attach()
2035 fd->flags |= FD_EMPTY; in fd_attach()
2036 bioq_init(&fd->fd_bq); in fd_attach()
2044 struct fd_data *fd; in fd_providergone() local
2046 fd = pp->geom->softc; in fd_providergone()
2047 fd->gone = true; in fd_providergone()
2048 wakeup(fd); in fd_providergone()
2054 struct fd_data *fd = arg; in fd_detach_geom() local
2057 g_wither_geom(fd->fd_geom, ENXIO); in fd_detach_geom()
2063 struct fd_data *fd; in fd_detach() local
2065 fd = device_get_softc(dev); in fd_detach()
2067 g_waitfor_event(fd_detach_geom, fd, M_WAITOK, NULL); in fd_detach()
2068 while (!fd->gone) { in fd_detach()
2069 tsleep(fd, PZERO, "fdgone", hz/10); in fd_detach()
2077 callout_drain(&fd->toffhandle); in fd_detach()
2094 "fd",
2106 DRIVER_MODULE(fd, fdc, fd_driver, fdc_modevent, 0);