Lines Matching refs:fd

1 /*	$NetBSD: fd.c,v 1.89 2024/12/21 17:40:11 tsutsui Exp $	*/
34 * @(#)fd.c 7.4 (Berkeley) 5/25/91
71 * @(#)fd.c 7.4 (Berkeley) 5/25/91
75 __KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.89 2024/12/21 17:40:11 tsutsui Exp $");
112 * Print a complaint when no fd children were specified
121 #error "fdc but no fd?"
271 CFATTACH_DECL_NEW(fd, sizeof(struct fd_softc),
566 struct fd_softc *fd = device_private(self);
571 fd->sc_dv = self;
573 callout_init(&fd->sc_motoron_ch, 0);
574 callout_init(&fd->sc_motoroff_ch, 0);
584 bufq_alloc(&fd->sc_q, "disksort", BUFQ_SORT_CYLINDER);
585 fd->sc_cylin = -1;
586 fd->sc_drive = drive;
587 fd->sc_deftype = type;
588 fdc->sc_fd[drive] = fd;
593 disk_init(&fd->sc_dk, device_xname(self), &fddkdriver);
594 disk_attach(&fd->sc_dk);
639 struct fd_softc *fd;
641 fd = device_private(self);
642 fd_motor_off(fd);
648 fd_dev_to_type(struct fd_softc *fd, dev_t dev)
654 return type ? &fd_types[type - 1] : fd->sc_deftype;
660 struct fd_softc *fd;
666 if ((fd = device_lookup_private(&fd_cd, unit)) == 0 ||
680 if (bp->b_blkno + sz > fd->sc_type->size) {
681 sz = fd->sc_type->size - bp->b_blkno;
698 bp->b_blkno / (FDC_BSIZE / DEV_BSIZE) / fd->sc_type->seccyl;
704 (int)fd->sc_blkno, bp->b_cylinder);
709 bufq_put(fd->sc_q, bp);
710 callout_stop(&fd->sc_motoroff_ch); /* a good idea */
711 if (fd->sc_active == 0)
712 fdstart(fd);
717 fdc = device_private(device_parent(fd->sc_dv));
733 fdstart(struct fd_softc *fd)
735 struct fdc_softc *fdc = device_private(device_parent(fd->sc_dv));
739 fd->sc_active = 1;
740 TAILQ_INSERT_TAIL(&fdc->sc_drives, fd, sc_drivechain);
748 fdfinish(struct fd_softc *fd, struct buf *bp)
750 struct fdc_softc *fdc = device_private(device_parent(fd->sc_dv));
758 (void)bufq_get(fd->sc_q);
759 if (TAILQ_NEXT(fd, sc_drivechain) && ++fd->sc_ops >= 8) {
760 fd->sc_ops = 0;
761 TAILQ_REMOVE(&fdc->sc_drives, fd, sc_drivechain);
762 if (bufq_peek(fd->sc_q) != NULL) {
763 TAILQ_INSERT_TAIL(&fdc->sc_drives, fd, sc_drivechain);
765 fd->sc_active = 0;
767 bp->b_resid = fd->sc_bcount;
768 fd->sc_skip = 0;
772 callout_reset(&fd->sc_motoroff_ch, 5 * hz, fd_motor_off, fd);
796 struct fd_softc *fd;
802 if ((fd = fdc->sc_fd[n]) && (fd->sc_flags & FD_MOTOR))
815 struct fd_softc *fd = arg;
819 fd->sc_flags &= ~(FD_MOTOR | FD_MOTOR_WAIT);
820 fd_set_motor(device_private(device_parent(fd->sc_dv)));
827 struct fd_softc *fd = arg;
828 struct fdc_softc *fdc = device_private(device_parent(fd->sc_dv));
832 fd->sc_flags &= ~FD_MOTOR_WAIT;
833 if ((TAILQ_FIRST(&fdc->sc_drives) == fd) &&
883 struct fd_softc *fd;
887 fd = device_lookup_private(&fd_cd, unit);
888 if (fd == NULL)
890 type = fd_dev_to_type(fd, dev);
894 if ((fd->sc_flags & FD_OPEN) != 0 &&
895 fd->sc_type != type)
898 fd->sc_type = type;
899 fd->sc_cylin = -1;
900 fd->sc_flags |= FD_OPEN;
905 if (fd->sc_dk.dk_openmask == 0)
912 fd->sc_dk.dk_copenmask |= pmask;
916 fd->sc_dk.dk_bopenmask |= pmask;
919 fd->sc_dk.dk_openmask =
920 fd->sc_dk.dk_copenmask | fd->sc_dk.dk_bopenmask;
928 struct fd_softc *fd = device_lookup_private(&fd_cd, FDUNIT(dev));
931 fd->sc_flags &= ~FD_OPEN;
932 fd->sc_opts &= ~(FDOPT_NORETRY|FDOPT_SILENT);
936 fd->sc_dk.dk_copenmask &= ~pmask;
940 fd->sc_dk.dk_bopenmask &= ~pmask;
943 fd->sc_dk.dk_openmask =
944 fd->sc_dk.dk_copenmask | fd->sc_dk.dk_bopenmask;
1037 struct fd_softc *fd = TAILQ_FIRST(&fdc->sc_drives);
1041 fdcstatus(fd->sc_dv, 0, "timeout");
1043 if (bufq_peek(fd->sc_q) != NULL)
1163 struct fd_softc *fd;
1185 fd = TAILQ_FIRST(&fdc->sc_drives);
1186 if (fd == NULL) {
1192 bp = bufq_peek(fd->sc_q);
1194 fd->sc_ops = 0;
1195 TAILQ_REMOVE(&fdc->sc_drives, fd, sc_drivechain);
1196 fd->sc_active = 0;
1206 fd->sc_skip = 0;
1207 fd->sc_bcount = bp->b_bcount;
1208 fd->sc_blkno = bp->b_blkno / (FDC_BSIZE / DEV_BSIZE);
1209 callout_stop(&fd->sc_motoroff_ch);
1210 if ((fd->sc_flags & FD_MOTOR_WAIT) != 0) {
1214 if ((fd->sc_flags & FD_MOTOR) == 0) {
1216 struct fd_softc *ofd = fdc->sc_fd[fd->sc_drive ^ 1];
1221 fd->sc_flags |= FD_MOTOR | FD_MOTOR_WAIT;
1226 callout_reset(&fd->sc_motoron_ch, hz / 4,
1227 fd_motor_on, fd);
1229 fd->sc_flags &= ~FD_MOTOR_WAIT;
1242 fd->sc_cylin = bp->b_cylinder;
1247 if (fd->sc_cylin == bp->b_cylinder)
1252 OUT_FDC(fdc, fd->sc_type->steprate, SEEKTIMEDOUT);
1258 OUT_FDC(fdc, fd->sc_drive, SEEKTIMEDOUT); /* drive number */
1259 OUT_FDC(fdc, bp->b_cylinder * fd->sc_type->step, SEEKTIMEDOUT);
1261 fd->sc_cylin = -1;
1265 iostat_seek(fd->sc_dk.dk_stats);
1266 disk_busy(&fd->sc_dk);
1285 fd->sc_skip = (char *)&(finfo->fd_formb_cylno(0)) -
1287 type = fd->sc_type;
1288 sec = fd->sc_blkno % type->seccyl;
1290 nblks = uimin(nblks, fd->sc_bcount / FDC_BSIZE);
1292 fd->sc_nblks = nblks;
1293 fd->sc_nbytes = finfo ? bp->b_bcount : nblks * FDC_BSIZE;
1300 block = (fd->sc_cylin * type->heads + head) *
1302 if (block != fd->sc_blkno) {
1305 fd->sc_blkno);
1315 fdc->sc_data = (char *)bp->b_data + fd->sc_skip;
1316 fdc->sc_tc = fd->sc_nbytes;
1323 read ? "read" : "write", fd->sc_drive,
1324 fd->sc_cylin, head, sec, nblks);
1332 OUT_FDC(fdc, (head << 2) | fd->sc_drive, IOTIMEDOUT);
1342 OUT_FDC(fdc, (head << 2) | fd->sc_drive, IOTIMEDOUT);
1343 OUT_FDC(fdc, fd->sc_cylin, IOTIMEDOUT); /*track*/
1352 disk_busy(&fd->sc_dk);
1370 disk_unbusy(&fd->sc_dk, 0, 0);
1374 cyl != bp->b_cylinder * fd->sc_type->step) {
1377 fdcstatus(fd->sc_dv, 2, "seek failed");
1382 fd->sc_cylin = bp->b_cylinder;
1402 disk_unbusy(&fd->sc_dk, (bp->b_bcount - bp->b_resid),
1408 fdcstatus(fd->sc_dv, 7,
1412 (int)fd->sc_blkno, fd->sc_nblks,
1445 diskerr(bp, "fd", "soft error", LOG_PRINTF,
1446 fd->sc_skip / FDC_BSIZE, NULL);
1466 fd->sc_blkno += fd->sc_nblks;
1467 fd->sc_skip += fd->sc_nbytes;
1468 fd->sc_bcount -= fd->sc_nbytes;
1469 if (!finfo && fd->sc_bcount > 0) {
1470 bp->b_cylinder = fd->sc_blkno / fd->sc_type->seccyl;
1473 fdfinish(fd, bp);
1499 OUT_FDC(fdc, fd->sc_drive, RECALTIMEDOUT);
1517 fdcstatus(fd->sc_dv, 2, "recalibrate failed");
1522 fd->sc_cylin = 0;
1526 if (fd->sc_flags & FD_MOTOR_WAIT)
1531 fdcstatus(fd->sc_dv, 0, "stray interrupt");
1545 struct fd_softc *fd;
1548 fd = fdc->sc_drives.tqh_first;
1549 bp = bufq_peek(fd->sc_q);
1552 if (fd->sc_opts & FDOPT_NORETRY)
1576 if ((fd->sc_opts & FDOPT_SILENT) == 0) {
1577 diskerr(bp, "fd", "hard error", LOG_PRINTF,
1578 fd->sc_skip / FDC_BSIZE, NULL);
1584 fdfinish(fd, bp);
1592 struct fd_softc *fd = device_lookup_private(&fd_cd, FDUNIT(dev));
1602 *(struct disklabel *)addr = *(fd->sc_dk.dk_label);
1615 error = setdisklabel(fd->sc_dk.dk_label,
1616 (struct disklabel *)addr, 0, fd->sc_dk.dk_cpulabel);
1620 error = writedisklabel(dev, fdstrategy, fd->sc_dk.dk_label,
1621 fd->sc_dk.dk_cpulabel);
1637 if ((fd->sc_dk.dk_openmask & ~(1 << part)) != 0 ||
1638 fd->sc_dk.dk_bopenmask + fd->sc_dk.dk_copenmask !=
1639 fd->sc_dk.dk_openmask) {
1645 fd_do_eject(device_private(device_parent(fd->sc_dv)),
1646 fd->sc_drive);
1652 form_parms->nbps = 128 * (1 << fd->sc_type->secsize);
1653 form_parms->ncyl = fd->sc_type->tracks;
1654 form_parms->nspt = fd->sc_type->sectrac;
1655 form_parms->ntrk = fd->sc_type->heads;
1656 form_parms->stepspercyl = fd->sc_type->step;
1657 form_parms->gaplen = fd->sc_type->gap2;
1658 form_parms->fillbyte = fd->sc_type->fillbyte;
1659 form_parms->interleave = fd->sc_type->interleave;
1660 switch (fd->sc_type->rate) {
1691 fd->sc_type->rate = FDC_500KBPS;
1694 fd->sc_type->rate = FDC_300KBPS;
1697 fd->sc_type->rate = FDC_250KBPS;
1707 fd->sc_type->sectrac = form_parms->nspt;
1710 fd->sc_type->heads = form_parms->ntrk;
1711 fd->sc_type->seccyl = form_parms->nspt * form_parms->ntrk;
1712 fd->sc_type->secsize = ffs(i) - 1;
1713 fd->sc_type->gap2 = form_parms->gaplen;
1714 fd->sc_type->tracks = form_parms->ncyl;
1715 fd->sc_type->size = fd->sc_type->seccyl * form_parms->ncyl *
1717 fd->sc_type->step = form_parms->stepspercyl;
1718 fd->sc_type->fillbyte = form_parms->fillbyte;
1719 fd->sc_type->interleave = form_parms->interleave;
1731 if (form_cmd->head >= fd->sc_type->heads ||
1732 form_cmd->cylinder >= fd->sc_type->tracks) {
1739 fd_formb->transfer_rate = fd->sc_type->rate;
1740 fd_formb->fd_formb_secshift = fd->sc_type->secsize;
1741 fd_formb->fd_formb_nsecs = fd->sc_type->sectrac;
1742 fd_formb->fd_formb_gaplen = fd->sc_type->gap2;
1743 fd_formb->fd_formb_fillbyte = fd->sc_type->fillbyte;
1750 j += fd->sc_type->interleave;
1756 fd_formb->fd_formb_secsize(i) = fd->sc_type->secsize;
1764 *(int *)addr = fd->sc_opts;
1768 fd->sc_opts = *(int *)addr;
1776 device_private(device_parent(fd->sc_dv));
1790 device_private(device_parent(fd->sc_dv));
1802 device_private(device_parent(fd->sc_dv));
1827 struct fd_softc *fd = device_lookup_private(&fd_cd, FDUNIT(dev));
1828 struct fd_type *type = fd->sc_type;
1871 struct fd_softc *fd = device_lookup_private(&fd_cd, unit);
1872 struct disklabel *lp = fd->sc_dk.dk_label;
1873 struct cpu_disklabel *clp = fd->sc_dk.dk_cpulabel;
1880 lp->d_secpercyl = fd->sc_type->seccyl;
1881 lp->d_nsectors = fd->sc_type->sectrac;
1882 lp->d_ncylinders = fd->sc_type->tracks;
1883 lp->d_ntracks = fd->sc_type->heads; /* Go figure... */
1947 struct fd_softc *fd;
1951 fd = device_private(dev);
1953 fd_do_eject(fdc, fd->sc_drive);
1979 struct fd_softc *fd;
1991 panic("fd: mountroot: fdopen");
2008 panic("fd: mountroot: fdread error %d", bp->b_error);
2020 fd = device_lookup_private(&fd_cd, 0);
2021 fdc = device_private(device_parent(fd->sc_dv));