Lines Matching refs:fd

1 /*	$OpenBSD: fd.c,v 1.53 2024/05/13 01:15:50 jsg Exp $	*/
2 /* $NetBSD: fd.c,v 1.112 2003/08/07 16:29:35 agc Exp $ */
64 * @(#)fd.c 7.4 (Berkeley) 5/25/91
102 * @(#)fd.c 7.4 (Berkeley) 5/25/91
285 NULL, "fd", DV_DISK
309 void fdfinish(struct fd_softc *fd, struct buf *bp);
622 struct fd_softc *fd = (void *)self;
627 timeout_set(&fd->sc_motoron_to, fd_motor_on, fd);
628 timeout_set(&fd->sc_motoroff_to, fd_motor_off, fd);
638 fd->sc_cylin = -1;
639 fd->sc_drive = drive;
640 fd->sc_deftype = type;
641 fdc->sc_fd[drive] = fd;
651 fd->sc_dk.dk_flags = DKF_NOLABELREAD;
652 fd->sc_dk.dk_name = fd->sc_dv.dv_xname;
653 bufq_init(&fd->sc_bufq, BUFQ_DEFAULT);
654 disk_attach(&fd->sc_dv, &fd->sc_dk);
673 fd_dev_to_type(struct fd_softc *fd, dev_t dev)
679 return (type ? &fd_types[type - 1] : fd->sc_deftype);
685 struct fd_softc *fd;
692 (fd = fd_cd.cd_devs[unit]) == 0 ||
694 (((bp->b_bcount % FD_BSIZE(fd)) != 0 ||
695 (bp->b_blkno * DEV_BSIZE) % FD_BSIZE(fd) != 0) &&
708 if (bp->b_blkno + sz > (fd->sc_type->size * DEV_BSIZE) / FD_BSIZE(fd)) {
709 sz = (fd->sc_type->size * DEV_BSIZE) / FD_BSIZE(fd)
728 (long long)fd->sc_blkno);
732 bufq_queue(&fd->sc_bufq, bp);
736 timeout_del(&fd->sc_motoroff_to); /* a good idea */
737 if (fd->sc_bp == NULL)
738 fdstart(fd);
741 struct fdc_softc *fdc = (void *)fd->sc_dv.dv_parent;
761 fdstart(struct fd_softc *fd)
763 struct fdc_softc *fdc = (void *)fd->sc_dv.dv_parent;
767 fd->sc_bp = bufq_dequeue(&fd->sc_bufq);
768 TAILQ_INSERT_TAIL(&fdc->sc_drives, fd, sc_drivechain);
776 fdfinish(struct fd_softc *fd, struct buf *bp)
778 struct fdc_softc *fdc = (void *)fd->sc_dv.dv_parent;
780 fd->sc_skip = 0;
781 fd->sc_bp = bufq_dequeue(&fd->sc_bufq);
789 if (TAILQ_NEXT(fd, sc_drivechain) != NULL && ++fd->sc_ops >= 8) {
790 fd->sc_ops = 0;
791 TAILQ_REMOVE(&fdc->sc_drives, fd, sc_drivechain);
792 if (fd->sc_bp != NULL)
793 TAILQ_INSERT_TAIL(&fdc->sc_drives, fd, sc_drivechain);
798 timeout_add_sec(&fd->sc_motoroff_to, 5);
825 struct fd_softc *fd;
830 if ((fd = TAILQ_FIRST(&fdc->sc_drives)) != NULL)
831 status |= fd->sc_drive;
834 if ((fd = fdc->sc_fd[n]) && (fd->sc_flags & FD_MOTOR))
843 struct fd_softc *fd = arg;
847 fd->sc_flags &= ~(FD_MOTOR | FD_MOTOR_WAIT);
848 fd_set_motor((struct fdc_softc *)fd->sc_dv.dv_parent);
855 struct fd_softc *fd = arg;
856 struct fdc_softc *fdc = (void *)fd->sc_dv.dv_parent;
860 fd->sc_flags &= ~FD_MOTOR_WAIT;
861 if (fd == TAILQ_FIRST(&fdc->sc_drives) && fdc->sc_state == MOTORWAIT)
935 struct fd_softc *fd;
941 fd = fd_cd.cd_devs[unit];
942 if (fd == NULL)
944 type = fd_dev_to_type(fd, dev);
948 if ((fd->sc_flags & FD_OPEN) != 0 &&
949 fd->sc_type != type)
952 fd->sc_type = type;
953 fd->sc_cylin = -1;
954 fd->sc_flags |= FD_OPEN;
959 if (fd->sc_dk.dk_openmask == 0)
960 fdgetdisklabel(dev, fd, fd->sc_dk.dk_label, 0);
966 fd->sc_dk.dk_copenmask |= pmask;
970 fd->sc_dk.dk_bopenmask |= pmask;
973 fd->sc_dk.dk_openmask =
974 fd->sc_dk.dk_copenmask | fd->sc_dk.dk_bopenmask;
982 struct fd_softc *fd = fd_cd.cd_devs[FDUNIT(dev)];
985 fd->sc_flags &= ~FD_OPEN;
986 fd->sc_opts &= ~(FDOPT_NORETRY|FDOPT_SILENT);
990 fd->sc_dk.dk_copenmask &= ~pmask;
994 fd->sc_dk.dk_bopenmask &= ~pmask;
997 fd->sc_dk.dk_openmask =
998 fd->sc_dk.dk_copenmask | fd->sc_dk.dk_bopenmask;
1035 struct fd_softc *fd = TAILQ_FIRST(&fdc->sc_drives);
1050 fd ? fd->sc_dv.dv_xname : "fdc", s, fdc->sc_state);
1080 struct fd_softc *fd;
1084 fd = TAILQ_FIRST(&fdc->sc_drives);
1085 if (fd == NULL) {
1092 if (fd->sc_bp != NULL)
1238 struct fd_softc *fd;
1258 fd = TAILQ_FIRST(&fdc->sc_drives);
1259 if (fd == NULL) {
1265 bp = fd->sc_bp;
1267 fd->sc_ops = 0;
1268 TAILQ_REMOVE(&fdc->sc_drives, fd, sc_drivechain);
1276 (FD_BSIZE(fd) * fd->sc_type->seccyl);
1281 fd->sc_skip = 0;
1282 fd->sc_bcount = bp->b_bcount;
1283 fd->sc_blkno = (bp->b_blkno * DEV_BSIZE) / FD_BSIZE(fd);
1284 timeout_del(&fd->sc_motoroff_to);
1285 if ((fd->sc_flags & FD_MOTOR_WAIT) != 0) {
1289 if ((fd->sc_flags & FD_MOTOR) == 0) {
1291 struct fd_softc *ofd = fdc->sc_fd[fd->sc_drive ^ 1];
1296 fd->sc_flags |= FD_MOTOR | FD_MOTOR_WAIT;
1301 timeout_add_msec(&fd->sc_motoron_to, 250);
1303 fd->sc_flags &= ~FD_MOTOR_WAIT;
1319 fd->sc_cylin = cylin;
1324 if (fd->sc_cylin == cylin)
1327 fd->sc_cylin = -1;
1331 fd->sc_dk.dk_seek++;
1333 disk_busy(&fd->sc_dk);
1338 FDC_WRFIFO(fdc, fd->sc_type->steprate);
1345 FDC_WRFIFO(fdc, fd->sc_drive); /* drive number */
1346 FDC_WRFIFO(fdc, cylin * fd->sc_type->step);
1355 disk_busy(&fd->sc_dk);
1357 fd->sc_cylin = -1;
1364 FDC_WRFIFO(fdc, fd->sc_drive); /* drive number */
1365 FDC_WRFIFO(fdc, 1 * fd->sc_type->step);
1370 disk_unbusy(&fd->sc_dk, 0, 0, 0);
1372 cyl != 1 * fd->sc_type->step) {
1388 fd->sc_skip = (char *)&(finfo->fd_formb_cylno(0)) -
1390 type = fd->sc_type;
1391 sec = fd->sc_blkno % type->seccyl;
1393 nblks = min(nblks, fd->sc_bcount / FD_BSIZE(fd));
1394 nblks = min(nblks, FDC_MAXIOSIZE / FD_BSIZE(fd));
1395 fd->sc_nblks = nblks;
1396 fd->sc_nbytes = finfo ? bp->b_bcount : nblks * FD_BSIZE(fd);
1403 block = (fd->sc_cylin * type->heads + head) *
1405 if (block != fd->sc_blkno) {
1407 (long long)block, (long long)fd->sc_blkno);
1417 fdc->sc_data = bp->b_data + fd->sc_skip;
1418 fdc->sc_tc = fd->sc_nbytes;
1428 fd->sc_drive, fd->sc_cylin, head, sec, nblks);
1434 disk_busy(&fd->sc_dk);
1442 FDC_WRFIFO(fdc, (head << 2) | fd->sc_drive);
1452 FDC_WRFIFO(fdc, (head << 2) | fd->sc_drive);
1453 FDC_WRFIFO(fdc, fd->sc_cylin); /*track*/
1475 disk_unbusy(&fd->sc_dk, 0, 0, 0);
1479 cyl != cylin * fd->sc_type->step) {
1487 fd->sc_cylin = cylin;
1519 disk_unbusy(&fd->sc_dk, (bp->b_bcount - bp->b_resid),
1527 disk_unbusy(&fd->sc_dk, (bp->b_bcount - bp->b_resid),
1539 (long long)fd->sc_blkno, fd->sc_nblks,
1571 diskerr(bp, "fd", "soft error", LOG_PRINTF,
1572 fd->sc_skip / FD_BSIZE(fd),
1592 fd->sc_blkno += fd->sc_nblks;
1593 fd->sc_skip += fd->sc_nbytes;
1594 fd->sc_bcount -= fd->sc_nbytes;
1595 bp->b_resid -= fd->sc_nbytes;
1596 if (finfo == NULL && fd->sc_bcount > 0) {
1597 cylin = fd->sc_blkno / fd->sc_type->seccyl;
1600 fdfinish(fd, bp);
1626 FDC_WRFIFO(fdc, fd->sc_drive);
1647 fd->sc_cylin = 0;
1651 if (fd->sc_flags & FD_MOTOR_WAIT)
1681 struct fd_softc *fd;
1685 fd = TAILQ_FIRST(&fdc->sc_drives);
1686 bp = fd->sc_bp;
1689 if (fd->sc_opts & FDOPT_NORETRY)
1697 printf("%s: read-only medium\n", fd->sc_dv.dv_xname);
1722 printf("%s: no medium?\n", fd->sc_dv.dv_xname);
1733 if ((fd->sc_opts & FDOPT_SILENT) == 0) {
1734 diskerr(bp, "fd", "hard error", LOG_PRINTF,
1735 fd->sc_skip / FD_BSIZE(fd),
1745 fdfinish(fd, bp);
1769 struct fd_softc *fd;
1782 fd = fd_cd.cd_devs[FDUNIT(dev)];
1783 fdc = (struct fdc_softc *)fd->sc_dv.dv_parent;
1788 fdgetdisklabel(dev, fd, lp, 0);
1789 bcopy(lp, fd->sc_dk.dk_label, sizeof(*lp));
1794 fdgetdisklabel(dev, fd, (struct disklabel *)addr, 1);
1798 *(struct disklabel *)addr = *(fd->sc_dk.dk_label);
1802 ((struct partinfo *)addr)->disklab = fd->sc_dk.dk_label;
1804 &fd->sc_dk.dk_label->d_partitions[DISKPART(dev)];
1812 error = setdisklabel(fd->sc_dk.dk_label,
1817 fdstrategy, fd->sc_dk.dk_label);
1834 fd_do_eject(fd);
1848 *(struct fd_type *)addr = *fd->sc_type;
1852 *(int *)addr = fd->sc_opts;
1856 fd->sc_opts = *(int *)addr;
1893 struct fd_softc *fd = fd_cd.cd_devs[FDUNIT(dev)];
1894 struct fd_type *type = fd->sc_type;
1911 + finfo->head * type->sectrac) * FD_BSIZE(fd))
1952 fdgetdisklabel(dev_t dev, struct fd_softc *fd, struct disklabel *lp,
1958 lp->d_secsize = FD_BSIZE(fd);
1959 lp->d_secpercyl = fd->sc_type->seccyl;
1960 lp->d_nsectors = fd->sc_type->sectrac;
1961 lp->d_ncylinders = fd->sc_type->tracks;
1962 lp->d_ntracks = fd->sc_type->heads; /* Go figure... */
1981 fd_do_eject(struct fd_softc *fd)
1983 struct fdc_softc *fdc = (void *)fd->sc_dv.dv_parent;