Lines Matching defs:st

1 /*	$OpenBSD: st.c,v 1.191 2024/09/04 07:54:53 mglocker Exp $	*/
2 /* $NetBSD: st.c,v 1.71 1997/02/21 23:03:49 thorpej Exp $ */
234 NULL, "st", DV_TAPE
267 struct st_softc *st = (void *)self;
277 st->sc_link = link;
279 link->device_softc = st;
288 st->quirks = finger->quirkdata.quirks;
289 st->mode = finger->quirkdata.mode;
290 CLR(st->flags, ST_MODE_BLKSIZE | ST_MODE_DENSITY);
291 if (st->mode.blksize != 0)
292 SET(st->flags, ST_MODE_BLKSIZE);
293 if (st->mode.density != 0)
294 SET(st->flags, ST_MODE_DENSITY);
298 scsi_xsh_set(&st->sc_xsh, link, ststart);
300 st->sc_dk.dk_name = st->sc_dev.dv_xname;
303 bufq_init(&st->sc_bufq, BUFQ_FIFO);
306 st->media_fileno = -1;
307 st->media_blkno = -1;
308 st->media_eom = -1;
317 st->sc_dk.dk_flags = DKF_NOLABELREAD;
318 disk_attach(&st->sc_dev, &st->sc_dk);
324 struct st_softc *st = (struct st_softc *)self;
328 SET(st->flags, ST_DYING);
329 scsi_xsh_del(&st->sc_xsh);
339 struct st_softc *st = (struct st_softc *)self;
342 bufq_drain(&st->sc_bufq);
351 bufq_destroy(&st->sc_bufq);
353 disk_detach(&st->sc_dk);
365 struct st_softc *st;
368 st = stlookup(STUNIT(dev));
369 if (st == NULL)
371 if (ISSET(st->flags, ST_DYING)) {
372 device_unref(&st->sc_dev);
375 link = st->sc_link;
377 if ((error = disk_lock(&st->sc_dk)) != 0) {
378 device_unref(&st->sc_dev);
414 st_unmount(st, NOEJECT, DOREWIND);
421 error = st_mount_tape(st, flags);
433 SET(st->flags, ST_WRITTEN);
437 disk_unlock(&st->sc_dk);
438 device_unref(&st->sc_dev);
450 struct st_softc *st;
453 st = stlookup(STUNIT(dev));
454 if (st == NULL)
456 if (ISSET(st->flags, ST_DYING)) {
460 link = st->sc_link;
462 disk_lock_nointr(&st->sc_dk);
466 if (ISSET(st->flags, ST_WRITTEN) && !ISSET(st->flags, ST_FM_WRITTEN))
467 st_write_filemarks(st, 1, 0);
471 st_unmount(st, NOEJECT, DOREWIND);
474 st_unmount(st, NOEJECT, NOREWIND);
477 st_unmount(st, EJECT, DOREWIND);
480 st_unmount(st, EJECT, NOREWIND);
484 scsi_xsh_del(&st->sc_xsh);
486 disk_unlock(&st->sc_dk);
489 device_unref(&st->sc_dev);
497 st_mount_tape(struct st_softc *st, int flags)
499 struct scsi_link *link = st->sc_link;
502 if (ISSET(st->flags, ST_MOUNTED))
511 if ((error = st_load(st, LD_LOAD, 0)) != 0)
527 if (ISSET(st->quirks, ST_Q_SENSE_HELP))
528 if ((error = st_touch_tape(st)) != 0)
535 (error = st_read_block_limits(st, 0)) != 0)
544 if ((error = st_mode_sense(st, 0)) != 0)
552 if (ISSET(st->flags, ST_MODE_DENSITY))
553 st->density = st->mode.density;
555 st->density = st->media_density;
561 CLR(st->flags, ST_FIXEDBLOCKS);
562 if (ISSET(st->flags, ST_MODE_BLKSIZE)) {
563 st->blksize = st->mode.blksize;
564 if (st->blksize)
565 SET(st->flags, ST_FIXEDBLOCKS);
567 if ((error = st_decide_mode(st, 0)) != 0)
570 if ((error = st_mode_select(st, 0)) != 0) {
571 printf("%s: cannot set selected mode\n", st->sc_dev.dv_xname);
576 SET(st->flags, ST_MOUNTED);
578 st->media_fileno = 0;
579 st->media_blkno = 0;
580 st->media_eom = -1;
593 st_unmount(struct st_softc *st, int eject, int rewind)
595 struct scsi_link *link = st->sc_link;
603 st->media_fileno = -1;
604 st->media_blkno = -1;
606 if (!ISSET(st->flags, ST_MOUNTED))
609 st_check_eod(st, 0, &nmarks, SCSI_IGNORE_NOT_READY);
611 st_rewind(st, 0, SCSI_IGNORE_NOT_READY);
615 st_load(st, LD_UNLOAD, SCSI_IGNORE_NOT_READY);
616 CLR(st->flags, ST_MOUNTED);
626 st_decide_mode(struct st_softc *st, int first_read)
628 struct scsi_link *link = st->sc_link;
634 SET(st->flags, ST_FIXEDBLOCKS);
635 if (st->media_blksize > 0)
636 st->blksize = st->media_blksize;
638 st->blksize = DEF_FIXED_BSIZE;
646 if (st->blkmin && (st->blkmin == st->blkmax)) {
647 SET(st->flags, ST_FIXEDBLOCKS);
648 st->blksize = st->blkmin;
650 ("blkmin == blkmax of %d\n", st->blkmin));
657 switch (st->density) {
662 CLR(st->flags, ST_FIXEDBLOCKS);
663 st->blksize = 0;
672 SET(st->flags, ST_FIXEDBLOCKS);
673 if (st->media_blksize > 0)
674 st->blksize = st->media_blksize;
676 st->blksize = DEF_FIXED_BSIZE;
686 if (st->media_blksize > 0)
687 SET(st->flags, ST_FIXEDBLOCKS);
689 CLR(st->flags, ST_FIXEDBLOCKS);
690 st->blksize = st->media_blksize;
692 ("Used media_blksize of %d\n", st->media_blksize));
699 CLR(st->flags, ST_FIXEDBLOCKS);
700 st->blksize = 0;
713 switch (st->density) {
721 CLR(st->flags, ST_2FM_AT_EOD);
724 SET(st->flags, ST_2FM_AT_EOD);
739 struct st_softc *st;
742 st = stlookup(STUNIT(bp->b_dev));
743 if (st == NULL) {
747 if (ISSET(st->flags, ST_DYING)) {
751 link = st->sc_link;
764 if (ISSET(st->flags, ST_FIXEDBLOCKS)) {
765 if (bp->b_bcount % st->blksize) {
767 st->sc_dev.dv_xname, st->blksize);
775 else if (bp->b_bcount < st->blkmin ||
776 (st->blkmax && bp->b_bcount > st->blkmax)) {
778 st->sc_dev.dv_xname, st->blkmin, st->blkmax);
788 bufq_queue(&st->sc_bufq, bp);
795 scsi_xsh_add(&st->sc_xsh);
797 device_unref(&st->sc_dev);
807 if (st)
808 device_unref(&st->sc_dev);
815 struct st_softc *st = link->device_softc;
822 if (ISSET(st->flags, ST_DYING)) {
831 if (!ISSET(st->flags, ST_MOUNTED) ||
835 bufq_drain(&st->sc_bufq);
841 bp = bufq_dequeue(&st->sc_bufq);
851 if (ISSET(st->flags, ST_FIXEDBLOCKS)) {
856 if (ISSET(st->flags, ST_AT_FILEMARK)) {
864 if (st_space(st, 0, SP_FILEMARKS, 0)) {
877 CLR(st->flags, ST_AT_FILEMARK);
890 if (ISSET(st->flags, ST_EOM_PENDING | ST_EIO_PENDING)) {
892 if (ISSET(st->flags, ST_EIO_PENDING)) {
896 CLR(st->flags, ST_EOM_PENDING | ST_EIO_PENDING);
912 CLR(st->flags, ST_FM_WRITTEN);
913 SET(st->flags, ST_WRITTEN);
924 if (ISSET(st->flags, ST_FIXEDBLOCKS)) {
926 _lto3b(bp->b_bcount / st->blksize, cmd->len);
930 if (st->media_blkno != -1) {
932 if (ISSET(st->flags, ST_FIXEDBLOCKS))
933 st->media_blkno += _3btol(cmd->len);
935 st->media_blkno++;
947 disk_busy(&st->sc_dk);
957 if (bufq_peek(&st->sc_bufq))
958 scsi_xsh_add(&st->sc_xsh);
964 struct st_softc *st = xs->sc_link->device_softc;
1011 disk_unbusy(&st->sc_dk, bp->b_bcount - xs->resid, bp->b_blkno,
1061 struct st_softc *st;
1070 st = stlookup(STUNIT(dev));
1071 if (st == NULL)
1074 if (ISSET(st->flags, ST_DYING)) {
1079 hold_blksize = st->blksize;
1080 hold_density = st->density;
1090 error = st_mode_sense(st, SCSI_SILENT);
1094 SC_DEBUG(st->sc_link, SDEV_DB1, ("[ioctl: get status]\n"));
1097 g->mt_blksiz = st->blksize;
1098 g->mt_density = st->density;
1099 g->mt_mblksiz = st->mode.blksize;
1100 g->mt_mdensity = st->mode.density;
1101 if (ISSET(st->sc_link->flags, SDEV_READONLY))
1103 if (ISSET(st->flags, ST_MOUNTED))
1105 g->mt_resid = st->mt_resid;
1106 g->mt_erreg = st->mt_erreg;
1107 g->mt_fileno = st->media_fileno;
1108 g->mt_blkno = st->media_blkno;
1112 st->mt_resid = 0;
1113 st->mt_erreg = 0;
1118 SC_DEBUG(st->sc_link, SDEV_DB1,
1124 error = st_write_filemarks(st, number, flags);
1129 error = st_check_eod(st, 0, &nmarks, flags);
1131 error = st_space(st, number - nmarks,
1137 error = st_check_eod(st, 1, &nmarks, flags);
1139 error = st_space(st, number, SP_BLKS, flags);
1142 error = st_rewind(st, 0, flags);
1145 st_unmount(st, EJECT, DOREWIND);
1150 error = st_load(st, LD_RETENSION, flags);
1152 error = st_load(st, LD_LOAD, flags);
1155 error = st_check_eod(st, 0, &nmarks, flags);
1157 error = st_space(st, 1, SP_EOM, flags);
1160 CLR(st->flags, ST_DONTBUFFER);
1163 SET(st->flags, ST_DONTBUFFER);
1166 error = st_erase(st, number, flags);
1170 CLR(st->flags, ST_FIXEDBLOCKS);
1172 if ((st->blkmin || st->blkmax) &&
1173 (number < st->blkmin ||
1174 number > st->blkmax)) {
1178 SET(st->flags, ST_FIXEDBLOCKS);
1180 st->blksize = number;
1188 st->density = number;
1202 error = st_rdpos(st, 0, (u_int32_t *) arg);
1206 error = st_rdpos(st, 1, (u_int32_t *) arg);
1210 error = st_setpos(st, 0, (u_int32_t *) arg);
1214 error = st_setpos(st, 1, (u_int32_t *) arg);
1219 error = scsi_do_ioctl(st->sc_link, cmd, arg, flag);
1229 if ((error = st_mode_select(st, 0)) != 0) {/* put it back as it was */
1230 printf("%s: cannot set selected mode\n", st->sc_dev.dv_xname);
1231 st->density = hold_density;
1232 st->blksize = hold_blksize;
1233 if (st->blksize)
1234 SET(st->flags, ST_FIXEDBLOCKS);
1236 CLR(st->flags, ST_FIXEDBLOCKS);
1245 st->mode.blksize = st->blksize;
1246 SET(st->flags, ST_MODE_BLKSIZE);
1249 st->mode.density = st->density;
1250 SET(st->flags, ST_MODE_DENSITY);
1255 device_unref(&st->sc_dev);
1263 st_read(struct st_softc *st, char *buf, int size, int flags)
1272 xs = scsi_xs_get(st->sc_link, flags | SCSI_DATA_IN);
1283 if (ISSET(st->flags, ST_FIXEDBLOCKS)) {
1285 _lto3b(size / (st->blksize ? st->blksize : DEF_FIXED_BSIZE),
1300 st_read_block_limits(struct st_softc *st, int flags)
1304 struct scsi_link *link = st->sc_link;
1333 st->blkmin = _2btol(block_limits->min_length);
1334 st->blkmax = _3btol(block_limits->max_length);
1336 ("(%d <= blksize <= %d)\n", st->blkmin, st->blkmax));
1356 st_mode_sense(struct st_softc *st, int flags)
1359 struct scsi_link *link = st->sc_link;
1395 st->media_blksize = block_size;
1396 st->media_density = density;
1400 st->media_density, st->media_blksize,
1417 st_mode_select(struct st_softc *st, int flags)
1421 struct scsi_link *link = st->sc_link;
1441 if (ISSET(st->quirks, ST_Q_UNIMODAL)) {
1444 st->density, st->blksize));
1456 general.density = st->density;
1457 if (ISSET(st->flags, ST_FIXEDBLOCKS))
1458 _lto3b(st->blksize, general.blklen);
1494 if (!ISSET(st->flags, ST_DONTBUFFER))
1499 error = scsi_mode_select(st->sc_link, 0, &outbuf->hdr,
1507 if (!ISSET(st->flags, ST_DONTBUFFER))
1513 error = scsi_mode_select_big(st->sc_link, 0, &outbuf->hdr_big,
1527 st_erase(struct st_softc *st, int full, int flags)
1533 xs = scsi_xs_get(st->sc_link, flags);
1567 st_space(struct st_softc *st, int number, u_int what, int flags)
1575 if (ISSET(st->flags, ST_PER_ACTION)) {
1577 CLR(st->flags, ST_PER_ACTION);
1580 if (ISSET(st->flags, ST_AT_FILEMARK)) {
1586 error = st_space(st, 0, SP_FILEMARKS,
1591 if (ISSET(st->flags, ST_BLANK_READ)) {
1592 CLR(st->flags, ST_BLANK_READ);
1595 CLR(st->flags, ST_EIO_PENDING | ST_EOM_PENDING);
1600 if (ISSET(st->flags, ST_EIO_PENDING)) {
1603 CLR(st->flags, ST_EIO_PENDING);
1607 CLR(st->flags, ST_EIO_PENDING);
1610 if (ISSET(st->flags, ST_AT_FILEMARK)) {
1611 CLR(st->flags, ST_AT_FILEMARK);
1614 if (ISSET(st->flags, ST_BLANK_READ) && (number < 0)) {
1616 CLR(st->flags, ST_BLANK_READ);
1621 if (ISSET(st->flags, ST_EOM_PENDING)) {
1623 CLR(st->flags, ST_EOM_PENDING);
1626 if (ISSET(st->flags, ST_EIO_PENDING)) {
1628 CLR(st->flags, ST_EIO_PENDING);
1631 if (ISSET(st->flags, ST_AT_FILEMARK))
1632 CLR(st->flags, ST_AT_FILEMARK);
1638 xs = scsi_xs_get(st->sc_link, flags);
1649 CLR(st->flags, ST_EOD_DETECTED);
1655 st->media_fileno = -1;
1656 st->media_blkno = -1;
1660 if (st->media_blkno != -1) {
1661 st->media_blkno += number;
1662 if (st->media_blkno < 0)
1663 st->media_blkno = -1;
1667 if (st->media_fileno != -1) {
1668 if (!ISSET(st->flags, ST_EOD_DETECTED))
1669 st->media_fileno += number;
1670 if (st->media_fileno > st->media_eom)
1671 st->media_eom = st->media_fileno;
1672 st->media_blkno = 0;
1676 if (st->media_eom != -1) {
1677 st->media_fileno = st->media_eom;
1678 st->media_blkno = 0;
1680 st->media_fileno = -1;
1681 st->media_blkno = -1;
1685 st->media_fileno = -1;
1686 st->media_blkno = -1;
1698 st_write_filemarks(struct st_softc *st, int number, int flags)
1707 xs = scsi_xs_get(st->sc_link, flags);
1718 if (ISSET(st->flags, ST_FM_WRITTEN)) /* already have one down */
1719 CLR(st->flags, ST_WRITTEN);
1721 SET(st->flags, ST_FM_WRITTEN);
1722 CLR(st->flags, ST_PER_ACTION);
1725 CLR(st->flags, ST_PER_ACTION | ST_WRITTEN);
1737 st->media_fileno = -1;
1738 st->media_blkno = -1;
1739 st->media_eom = -1;
1740 } else if (st->media_fileno != -1) {
1741 st->media_fileno += number;
1742 st->media_eom = st->media_fileno;
1743 st->media_blkno = 0;
1758 st_check_eod(struct st_softc *st, int position, int *nmarks, int flags)
1762 switch (st->flags & (ST_WRITTEN | ST_FM_WRITTEN | ST_2FM_AT_EOD)) {
1773 error = st_write_filemarks(st, *nmarks, flags);
1775 error = st_space(st, -*nmarks, SP_FILEMARKS, flags);
1783 st_load(struct st_softc *st, u_int type, int flags)
1789 st->media_fileno = -1;
1790 st->media_blkno = -1;
1791 st->media_eom = -1;
1794 error = st_check_eod(st, 0, &nmarks, flags);
1799 if (ISSET(st->quirks, ST_Q_IGNORE_LOADS)) {
1804 return st_rewind(st, 0, flags);
1810 xs = scsi_xs_get(st->sc_link, flags);
1830 st_rewind(struct st_softc *st, u_int immediate, int flags)
1836 error = st_check_eod(st, 0, &nmarks, flags);
1839 CLR(st->flags, ST_PER_ACTION);
1841 xs = scsi_xs_get(st->sc_link, flags);
1855 st->media_fileno = 0;
1856 st->media_blkno = 0;
1873 struct st_softc *st = link->device_softc;
1888 * We do custom processing in st for the unit becoming ready case.
1918 SET(st->flags, ST_EOD_DETECTED);
1921 st->media_fileno = number - info;
1922 st->media_eom = st->media_fileno;
1926 SET(st->flags, ST_BOD_DETECTED);
1927 st->media_fileno = -1;
1928 st->media_blkno = -1;
1943 * 'resid' can be in units of st->blksize or bytes. xs->resid and
1949 if (ISSET(st->flags, ST_FIXEDBLOCKS))
1950 resid = info * st->blksize; /* XXXX overflow? */
1963 if (ISSET(st->flags, ST_FIXEDBLOCKS)) {
1964 resid /= st->blksize;
1965 datalen /= st->blksize;
1969 if (st->media_fileno != -1) {
1970 st->media_fileno++;
1971 if (st->media_fileno > st->media_eom)
1972 st->media_eom = st->media_fileno;
1973 st->media_blkno = 0;
1975 if (!ISSET(st->flags, ST_FIXEDBLOCKS))
1977 SET(st->flags, ST_AT_FILEMARK);
1981 SET(st->flags, ST_EOM_PENDING);
1983 if (ISSET(st->flags, ST_FIXEDBLOCKS))
1988 if (!ISSET(st->flags, ST_FIXEDBLOCKS)) {
1993 "%d\n", st->sc_dev.dv_xname, resid,
2002 "residual\n", st->sc_dev.dv_xname, resid);
2003 SET(st->flags, ST_EIO_PENDING);
2009 if (ISSET(st->quirks, ST_Q_SENSE_HELP) &&
2011 st->blksize -= 512;
2014 if (ISSET(st->flags, ST_FIXEDBLOCKS) && xs->resid == xs->datalen) {
2015 if (ISSET(st->flags, ST_EIO_PENDING))
2017 if (ISSET(st->flags, ST_AT_FILEMARK))
2027 if (ISSET(st->quirks, ST_Q_SENSE_HELP) &&
2030 st->blksize -= 512;
2031 } else if (!ISSET(st->flags, ST_2FM_AT_EOD | ST_BLANK_READ)) {
2032 SET(st->flags, ST_BLANK_READ);
2033 SET(st->flags, ST_EOM_PENDING);
2059 st_touch_tape(struct st_softc *st)
2065 if ((error = st_mode_sense(st, 0)) != 0)
2073 st->blksize = 1024;
2075 switch (st->blksize) {
2078 readsize = st->blksize;
2079 SET(st->flags, ST_FIXEDBLOCKS);
2083 CLR(st->flags, ST_FIXEDBLOCKS);
2085 if ((error = st_mode_select(st, 0)) != 0)
2087 st_read(st, buf, readsize, SCSI_SILENT); /* XXX */
2088 if ((error = st_rewind(st, 0, 0)) != 0)
2090 } while (readsize != 1 && readsize > st->blksize);