Lines Matching refs:fd

311 fdsettype(struct fd_data *fd, struct fd_type *ft)  in fdsettype()  argument
313 fd->ft = ft; in fdsettype()
315 fd->sectorsize = 128 << fd->ft->secsize; in fdsettype()
562 if (fdc_cmd(fdc, 2, NE7CMD_SENSED, fdc->fd->fdsu, 1, &st3)) in fdc_sense_drive()
623 fd_select(struct fd_data *fd) in fd_select() argument
628 fdc = fd->fdc; in fd_select()
630 fdc->fdout |= FDO_FDMAEN | FDO_FRST | fd->fdsu; in fd_select()
637 struct fd_data *fd; in fd_turnon() local
641 fd = arg; in fd_turnon()
642 mtx_assert(&fd->fdc->fdc_mtx, MA_OWNED); in fd_turnon()
643 fd->flags &= ~FD_MOTORWAIT; in fd_turnon()
644 fd->flags |= FD_MOTOR; in fd_turnon()
647 bp = bioq_takefirst(&fd->fd_bq); in fd_turnon()
650 bioq_disksort(&fd->fdc->head, bp); in fd_turnon()
654 wakeup(&fd->fdc->head); in fd_turnon()
658 fd_motor(struct fd_data *fd, int turnon) in fd_motor() argument
662 fdc = fd->fdc; in fd_motor()
667 fd->flags |= FD_MOTORWAIT; in fd_motor()
668 fdc->fdout |= (FDO_MOEN0 << fd->fdsu); in fd_motor()
669 callout_reset(&fd->toffhandle, hz, fd_turnon, fd); in fd_motor()
671 callout_stop(&fd->toffhandle); in fd_motor()
672 fd->flags &= ~(FD_MOTOR|FD_MOTORWAIT); in fd_motor()
673 fdc->fdout &= ~(FDO_MOEN0 << fd->fdsu); in fd_motor()
681 struct fd_data *fd = xfd; in fd_turnoff() local
683 mtx_assert(&fd->fdc->fdc_mtx, MA_OWNED); in fd_turnoff()
684 fd_motor(fd, 0); in fd_turnoff()
717 cptr = fdc->fd->fd_ioptr; in fdc_pio()
718 count = fdc->fd->fd_iosize; in fdc_pio()
734 struct fd_data *fd; in fdc_biodone() local
737 fd = fdc->fd; in fdc_biodone()
741 if (--fd->fd_iocount == 0) in fdc_biodone()
742 callout_reset(&fd->toffhandle, 4 * hz, fd_turnoff, fd); in fdc_biodone()
744 fdc->fd = NULL; in fdc_biodone()
747 if ((debugflags & 2) && fd->fdc->retry > 0) in fdc_biodone()
748 printf("retries: %d\n", fd->fdc->retry); in fdc_biodone()
763 struct fd_data *fd; in fdc_worker() local
777 fd = fdc->fd; in fdc_worker()
779 (fdc->retry >= retries || (fd->options & FDOPT_NORETRY))) { in fdc_worker()
784 fd->flags |= FD_EMPTY; in fdc_worker()
791 if (fd != NULL && (fd->flags & FD_ISADMA)) { in fdc_worker()
794 fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); in fdc_worker()
796 fd->flags &= ~FD_ISADMA; in fdc_worker()
835 fd = fdc->fd = bp->bio_driver1; in fdc_worker()
837 fd->fd_ioptr = bp->bio_data; in fdc_worker()
840 fd->fd_ioptr += i; in fdc_worker()
841 fd->fd_iosize = bp->bio_length - i; in fdc_worker()
846 fd_select(fd); in fdc_worker()
848 fddsr_wr(fdc, fd->ft->trans); in fdc_worker()
850 fdctl_wr(fdc, fd->ft->trans); in fdc_worker()
853 if ((!(device_get_flags(fd->dev) & FD_NO_CHLINE) && in fdc_worker()
855 !(fd->flags & FD_EMPTY)) || in fdc_worker()
856 fd_probe_disk(fd, &need_recal) == 0) in fdc_worker()
864 if (fd->flags & FD_EMPTY) in fdc_worker()
872 fd->flags |= FD_EMPTY; in fdc_worker()
873 fd->flags |= FD_NEWDISK; in fdc_worker()
876 g_orphan_provider(fd->fd_provider, ENXIO); in fdc_worker()
877 fd->fd_provider->flags |= G_PF_WITHER; in fdc_worker()
878 fd->fd_provider = in fdc_worker()
879 g_new_providerf(fd->fd_geom, "%s", fd->fd_geom->name); in fdc_worker()
880 g_error_provider(fd->fd_provider, 0); in fdc_worker()
894 mfm = (fd->ft->flags & FL_MFM)? NE7CMD_MFM: 0; in fdc_worker()
895 steptrac = (fd->ft->flags & FL_2STEP)? 2: 1; in fdc_worker()
896 i = fd->ft->sectrac * fd->ft->heads; in fdc_worker()
901 head = sec / fd->ft->sectrac; in fdc_worker()
902 sec = sec % fd->ft->sectrac + 1; in fdc_worker()
907 fd->fd_iosize = imin(nsect * fd->sectorsize, bp->bio_resid); in fdc_worker()
908 nsect = fd->fd_iosize / fd->sectorsize; in fdc_worker()
910 fd->fd_iosize = fd->sectorsize; in fdc_worker()
915 if ((need_recal & (1 << fd->fdsu)) || in fdc_worker()
916 (cylinder == 0 && fd->track != 0) || in fdc_worker()
919 if (fdc_cmd(fdc, 2, NE7CMD_RECAL, fd->fdsu, 0)) in fdc_worker()
928 need_recal &= ~(1 << fd->fdsu); in fdc_worker()
929 fd->track = 0; in fdc_worker()
932 tsleep(fdc->fd, PRIBIO, "fdhdstl", settle); in fdc_worker()
938 if (cylinder != fd->track) { in fdc_worker()
940 if (fdc_cmd(fdc, 3, NE7CMD_SEEK, fd->fdsu, descyl, 0)) in fdc_worker()
948 need_recal |= (1 << fd->fdsu); in fdc_worker()
953 tsleep(fdc->fd, PRIBIO, "fdhdstl", settle); in fdc_worker()
955 fd->track = cylinder; in fdc_worker()
959 bp->bio_cmd, bp->bio_pblkno, fd->fd_iosize, in fdc_worker()
960 fd->fd_ioptr, fdc->retry); in fdc_worker()
969 fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); in fdc_worker()
971 fd->flags |= FD_ISADMA; in fdc_worker()
980 fdbcdr_wr(fdc, 1, fd->fd_iosize); in fdc_worker()
993 head << 2 | fd->fdsu, in fdc_worker()
1004 head << 2 | fd->fdsu, 0)) in fdc_worker()
1011 head << 2 | fd->fdsu, /* head & unit */ in fdc_worker()
1012 fd->track, /* track */ in fdc_worker()
1015 fd->ft->secsize, /* sector size */ in fdc_worker()
1016 fd->ft->sectrac, /* sectors/track */ in fdc_worker()
1017 fd->ft->gap, /* gap size */ in fdc_worker()
1018 fd->ft->datalen, /* data length */ in fdc_worker()
1026 head << 2 | fd->fdsu, /* head & unit */ in fdc_worker()
1027 fd->track, /* track */ in fdc_worker()
1030 fd->ft->secsize, /* sector size */ in fdc_worker()
1031 fd->ft->sectrac, /* sectors/track */ in fdc_worker()
1032 fd->ft->gap, /* gap size */ in fdc_worker()
1033 fd->ft->datalen, /* data length */ in fdc_worker()
1049 if (fd->flags & FD_ISADMA) { in fdc_worker()
1052 fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); in fdc_worker()
1054 fd->flags &= ~FD_ISADMA; in fdc_worker()
1100 need_recal |= (1 << fd->fdsu); in fdc_worker()
1109 if (fd->options & FDOPT_NOERROR) in fdc_worker()
1130 bp->bio_resid -= fd->fd_iosize; in fdc_worker()
1131 bp->bio_completed += fd->fd_iosize; in fdc_worker()
1132 fd->fd_ioptr += fd->fd_iosize; in fdc_worker()
1181 fd_enqueue(struct fd_data *fd, struct bio *bp) in fd_enqueue() argument
1187 fdc = fd->fdc; in fd_enqueue()
1190 if (fd->fd_iocount++ == 0) in fd_enqueue()
1191 callout_stop(&fd->toffhandle); in fd_enqueue()
1192 if (fd->flags & FD_MOTOR) { in fd_enqueue()
1198 bioq_insert_tail(&fd->fd_bq, bp); in fd_enqueue()
1199 if (!(fd->flags & FD_MOTORWAIT)) in fd_enqueue()
1200 fd_motor(fd, 1); in fd_enqueue()
1209 fd_probe_disk(struct fd_data *fd, int *recal) in fd_probe_disk() argument
1215 fdc = fd->fdc; in fd_probe_disk()
1216 oopts = fd->options; in fd_probe_disk()
1217 fd->options |= FDOPT_NOERRLOG | FDOPT_NORETRY; in fd_probe_disk()
1227 fd->flags |= FD_NEWDISK; in fd_probe_disk()
1229 if (fdc_cmd(fdc, 2, NE7CMD_RECAL, fd->fdsu, 0)) in fd_probe_disk()
1238 if (fdc_cmd(fdc, 3, NE7CMD_SEEK, fd->fdsu, 1, 0)) in fd_probe_disk()
1243 *recal |= (1 << fd->fdsu); in fd_probe_disk()
1248 fd->flags |= FD_EMPTY; in fd_probe_disk()
1256 fd->flags &= ~FD_EMPTY; in fd_probe_disk()
1258 fd->flags |= FD_WP; in fd_probe_disk()
1260 fd->flags &= ~FD_WP; in fd_probe_disk()
1266 fd->options = oopts; in fd_probe_disk()
1271 fdmisccmd(struct fd_data *fd, u_int cmd, void *data) in fdmisccmd() argument
1289 (finfo->cyl * fd->ft->heads + finfo->head) * in fdmisccmd()
1290 fd->ft->sectrac; in fdmisccmd()
1295 (idfield->cyl * fd->ft->heads + idfield->head) * in fdmisccmd()
1296 fd->ft->sectrac; in fdmisccmd()
1302 bp->bio_offset = bp->bio_pblkno * fd->sectorsize; in fdmisccmd()
1304 bp->bio_driver1 = fd; in fdmisccmd()
1307 fd_enqueue(fd, bp); in fdmisccmd()
1322 fdautoselect(struct fd_data *fd) in fdautoselect() argument
1328 if (!(fd->ft->flags & FL_AUTO)) in fdautoselect()
1331 fdtp = fd_native_types[fd->type]; in fdautoselect()
1332 fdsettype(fd, fdtp); in fdautoselect()
1333 if (!(fd->ft->flags & FL_AUTO)) in fdautoselect()
1356 oopts = fd->options; in fdautoselect()
1357 fd->options |= FDOPT_NOERRLOG | FDOPT_NORETRY; in fdautoselect()
1359 fdsettype(fd, fdtp); in fdautoselect()
1362 rv = fdmisccmd(fd, BIO_RDID, &id); in fdautoselect()
1368 id.head = fd->ft->heads - 1; in fdautoselect()
1369 rv = fdmisccmd(fd, BIO_RDID, &id); in fdautoselect()
1377 fd->options = oopts; in fdautoselect()
1380 device_printf(fd->dev, "autoselection failed\n"); in fdautoselect()
1381 fdsettype(fd, fd_native_types[fd->type]); in fdautoselect()
1385 device_printf(fd->dev, in fdautoselect()
1387 fd->ft->size / 2); in fdautoselect()
1388 fdprinttype(fd->ft); in fdautoselect()
1413 struct fd_data *fd; in fd_access() local
1418 fd = pp->geom->softc; in fd_access()
1419 fdc = fd->fdc; in fd_access()
1433 fd->options &= ~(FDOPT_NORETRY | FDOPT_NOERRLOG | FDOPT_NOERROR); in fd_access()
1434 device_unbusy(fd->dev); in fd_access()
1440 if (fdmisccmd(fd, BIO_PROBE, NULL)) in fd_access()
1442 if (fd->flags & FD_EMPTY) in fd_access()
1444 if (fd->flags & FD_NEWDISK) { in fd_access()
1445 if (fdautoselect(fd) != 0 && in fd_access()
1446 (device_get_flags(fd->dev) & FD_NO_CHLINE)) { in fd_access()
1448 fd->flags |= FD_EMPTY; in fd_access()
1453 fd->flags &= ~FD_NEWDISK; in fd_access()
1456 device_busy(fd->dev); in fd_access()
1460 if (w > 0 && (fd->flags & FD_WP)) { in fd_access()
1462 device_unbusy(fd->dev); in fd_access()
1466 pp->sectorsize = fd->sectorsize; in fd_access()
1467 pp->stripesize = fd->ft->heads * fd->ft->sectrac * fd->sectorsize; in fd_access()
1468 pp->mediasize = pp->stripesize * fd->ft->tracks; in fd_access()
1476 struct fd_data * fd; in fd_start() local
1478 fd = bp->bio_to->geom->softc; in fd_start()
1479 fdc = fd->fdc; in fd_start()
1480 bp->bio_driver1 = fd; in fd_start()
1482 if (g_handleattr_int(bp, "GEOM::fwsectors", fd->ft->sectrac)) in fd_start()
1484 if (g_handleattr_int(bp, "GEOM::fwheads", fd->ft->heads)) in fd_start()
1493 bp->bio_pblkno = bp->bio_offset / fd->sectorsize; in fd_start()
1495 fd_enqueue(fd, bp); in fd_start()
1502 struct fd_data *fd; in fd_ioctl() local
1507 fd = pp->geom->softc; in fd_ioctl()
1511 *(struct fd_type *)data = *fd->ft; in fd_ioctl()
1520 fd->fts = *(struct fd_type *)data; in fd_ioctl()
1521 if (fd->fts.sectrac) { in fd_ioctl()
1523 fdsettype(fd, &fd->fts); in fd_ioctl()
1525 fdsettype(fd, fd_native_types[fd->type]); in fd_ioctl()
1528 fdprinttype(fd->ft); in fd_ioctl()
1532 *(int *)data = fd->options; in fd_ioctl()
1536 fd->options = *(int *)data; in fd_ioctl()
1543 fd->fdc->fdc_errs = 0; in fd_ioctl()
1548 if ((fd->fdc->flags & FDC_STAT_VALID) == 0) in fd_ioctl()
1550 memcpy(fsp->status, fd->fdc->status, 7 * sizeof(u_int)); in fd_ioctl()
1554 *(enum fd_drivetype *)data = fd->type; in fd_ioctl()
1563 error = fdmisccmd(fd, BIO_FMT, data); in fd_ioctl()
1564 mtx_lock(&fd->fdc->fdc_mtx); in fd_ioctl()
1565 fd->flags |= FD_NEWDISK; in fd_ioctl()
1566 mtx_unlock(&fd->fdc->fdc_mtx); in fd_ioctl()
1573 error = fdmisccmd(fd, BIO_RDID, data); in fd_ioctl()
1903 struct fd_data *fd; in fd_probe() local
1909 fd = device_get_softc(dev); in fd_probe()
1913 fd->dev = dev; in fd_probe()
1914 fd->fdc = fdc; in fd_probe()
1915 fd->fdsu = fdsu; in fd_probe()
1921 fd->type = type; in fd_probe()
1925 fd->flags = FD_EMPTY; in fd_probe()
1926 fd->type = type; in fd_probe()
1930 if (fd->type == FDT_NONE && (unit == 0 || unit == 1)) { in fd_probe()
1933 fd->type = (rtcin(RTC_FDISKETTE) & 0xf0) >> 4; in fd_probe()
1935 fd->type = rtcin(RTC_FDISKETTE) & 0x0f; in fd_probe()
1936 if (fd->type == FDT_288M_1) in fd_probe()
1937 fd->type = FDT_288M; in fd_probe()
1941 if (fd->type == FDT_NONE) in fd_probe()
1947 fd_select(fd); in fd_probe()
1948 fd_motor(fd, 1); in fd_probe()
1949 fdc->fd = fd; in fd_probe()
1986 fd_motor(fd, 0); in fd_probe()
1987 fdc->fd = NULL; in fd_probe()
1996 switch (fd->type) { in fd_probe()
2015 fd->track = FD_NO_TRACK; in fd_probe()
2016 fd->fdc = fdc; in fd_probe()
2017 fd->fdsu = fdsu; in fd_probe()
2018 fd->options = 0; in fd_probe()
2019 callout_init_mtx(&fd->toffhandle, &fd->fdc->fdc_mtx, 0); in fd_probe()
2022 fdsettype(fd, fd_native_types[fd->type]); in fd_probe()
2034 struct fd_data *fd; in fd_attach2() local
2036 fd = arg; in fd_attach2()
2038 fd->fd_geom = g_new_geomf(&g_fd_class, in fd_attach2()
2039 "fd%d", device_get_unit(fd->dev)); in fd_attach2()
2040 fd->fd_provider = g_new_providerf(fd->fd_geom, "%s", fd->fd_geom->name); in fd_attach2()
2041 fd->fd_geom->softc = fd; in fd_attach2()
2042 g_error_provider(fd->fd_provider, 0); in fd_attach2()
2048 struct fd_data *fd; in fd_attach() local
2050 fd = device_get_softc(dev); in fd_attach()
2051 g_post_event(fd_attach2, fd, M_WAITOK, NULL); in fd_attach()
2052 fd->flags |= FD_EMPTY; in fd_attach()
2053 bioq_init(&fd->fd_bq); in fd_attach()
2061 struct fd_data *fd = arg; in fd_detach_geom() local
2064 g_wither_geom(fd->fd_geom, ENXIO); in fd_detach_geom()
2070 struct fd_data *fd; in fd_detach() local
2072 fd = device_get_softc(dev); in fd_detach()
2073 g_waitfor_event(fd_detach_geom, fd, M_WAITOK, NULL); in fd_detach()
2075 tsleep(fd, PZERO, "fdd", hz/10); in fd_detach()
2076 callout_drain(&fd->toffhandle); in fd_detach()
2105 DRIVER_MODULE(fd, fdc, fd_driver, fd_devclass, fdc_modevent, 0);