root/scsi/st.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. stmatch
  2. stattach
  3. st_identify_drive
  4. st_loadquirks
  5. stopen
  6. stclose
  7. st_mount_tape
  8. st_unmount
  9. st_decide_mode
  10. ststrategy
  11. ststart
  12. strestart
  13. stread
  14. stwrite
  15. stioctl
  16. st_read
  17. st_read_block_limits
  18. st_mode_sense
  19. st_mode_select
  20. st_erase
  21. st_space
  22. st_write_filemarks
  23. st_check_eod
  24. st_load
  25. st_rewind
  26. st_interpret_sense
  27. st_touch_tape
  28. stdump

    1 /*      $OpenBSD: st.c,v 1.75 2007/06/06 17:15:14 deraadt Exp $ */
    2 /*      $NetBSD: st.c,v 1.71 1997/02/21 23:03:49 thorpej Exp $  */
    3 
    4 /*
    5  * Copyright (c) 1994 Charles Hannum.  All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *      This product includes software developed by Charles Hannum.
   18  * 4. The name of the author may not be used to endorse or promote products
   19  *    derived from this software without specific prior written permission.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   31  */
   32 
   33 /*
   34  * Originally written by Julian Elischer (julian@tfs.com)
   35  * for TRW Financial Systems for use under the MACH(2.5) operating system.
   36  *
   37  * TRW Financial Systems, in accordance with their agreement with Carnegie
   38  * Mellon University, makes this software available to CMU to distribute
   39  * or use in any manner that they see fit as long as this message is kept with
   40  * the software. For this reason TFS also grants any other persons or
   41  * organisations permission to use or modify this software.
   42  *
   43  * TFS supplies this software to be publicly redistributed
   44  * on the understanding that TFS is not responsible for the correct
   45  * functioning of this software in any circumstances.
   46  *
   47  * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
   48  * major changes by Julian Elischer (julian@jules.dialix.oz.au) May 1993
   49  */
   50 
   51 /*
   52  * To do:
   53  * work out some better way of guessing what a good timeout is going
   54  * to be depending on whether we expect to retension or not.
   55  */
   56 
   57 #include <sys/types.h>
   58 #include <sys/param.h>
   59 #include <sys/systm.h>
   60 #include <sys/timeout.h>
   61 #include <sys/fcntl.h>
   62 #include <sys/errno.h>
   63 #include <sys/ioctl.h>
   64 #include <sys/stat.h>
   65 #include <sys/malloc.h>
   66 #include <sys/buf.h>
   67 #include <sys/proc.h>
   68 #include <sys/user.h>
   69 #include <sys/mtio.h>
   70 #include <sys/device.h>
   71 #include <sys/conf.h>
   72 
   73 #include <scsi/scsi_all.h>
   74 #include <scsi/scsi_tape.h>
   75 #include <scsi/scsiconf.h>
   76 
   77 /* Defines for device specific stuff */
   78 #define DEF_FIXED_BSIZE  512
   79 #define ST_RETRIES      4       /* only on non IO commands */
   80 
   81 #define STMODE(z)       ( minor(z)       & 0x03)
   82 #define STUNIT(z)       ((minor(z) >> 4)       )
   83 
   84 #define ST_IO_TIME      (3 * 60 * 1000)         /* 3 minutes */
   85 #define ST_CTL_TIME     (30 * 1000)             /* 30 seconds */
   86 #define ST_SPC_TIME     (4 * 60 * 60 * 1000)    /* 4 hours */
   87 
   88 /*
   89  * Maximum density code allowed in SCSI spec (SSC2R08f, Section 8.3).
   90  */
   91 #define SCSI_MAX_DENSITY_CODE           0xff
   92 
   93 /*
   94  * Define various devices that we know mis-behave in some way,
   95  * and note how they are bad, so we can correct for them
   96  */
   97 struct modes {
   98         u_int quirks;                   /* same definitions as in quirkdata */
   99         int blksize;
  100         u_int8_t density;
  101 };
  102 
  103 struct quirkdata {
  104         u_int quirks;
  105 #define ST_Q_FORCE_BLKSIZE      0x0001
  106 #define ST_Q_SENSE_HELP         0x0002  /* must do READ for good MODE SENSE */
  107 #define ST_Q_IGNORE_LOADS       0x0004
  108 #define ST_Q_BLKSIZE            0x0008  /* variable-block media_blksize > 0 */
  109 #define ST_Q_UNIMODAL           0x0010  /* unimode drive rejects mode select */
  110         struct modes modes;
  111 };
  112 
  113 struct st_quirk_inquiry_pattern {
  114         struct scsi_inquiry_pattern pattern;
  115         struct quirkdata quirkdata;
  116 };
  117 
  118 const struct st_quirk_inquiry_pattern st_quirk_patterns[] = {
  119         {{T_SEQUENTIAL, T_REMOV,
  120          "        ", "                ", "    "}, {0,
  121                 {ST_Q_FORCE_BLKSIZE, 512, 0}}},         /* minor 0-3 */
  122         {{T_SEQUENTIAL, T_REMOV,
  123          "TANDBERG", " TDC 3600       ", ""},     {0,
  124                 {0, 0, 0}}},                            /* minor 0-3 */
  125         {{T_SEQUENTIAL, T_REMOV,
  126          "TANDBERG", " TDC 3800       ", ""},     {0,
  127                 {ST_Q_FORCE_BLKSIZE, 512, 0}}},         /* minor 0-3 */
  128         /*
  129          * At least -005 and -007 need this.  I'll assume they all do unless I
  130          * hear otherwise.  - mycroft, 31MAR1994
  131          */
  132         {{T_SEQUENTIAL, T_REMOV,
  133          "ARCHIVE ", "VIPER 2525 25462", ""},     {0,
  134                 {ST_Q_SENSE_HELP, 0, 0}}},              /* minor 0-3 */
  135         /*
  136          * One user reports that this works for his tape drive.  It probably
  137          * needs more work.  - mycroft, 09APR1994
  138          */
  139         {{T_SEQUENTIAL, T_REMOV,
  140          "SANKYO  ", "CP525           ", ""},    {0,
  141                 {ST_Q_FORCE_BLKSIZE, 512, 0}}},         /* minor 0-3 */
  142         {{T_SEQUENTIAL, T_REMOV,
  143          "ANRITSU ", "DMT780          ", ""},     {0,
  144                 {ST_Q_FORCE_BLKSIZE, 512, 0}}},         /* minor 0-3 */
  145         {{T_SEQUENTIAL, T_REMOV,
  146          "ARCHIVE ", "VIPER 150  21247", ""},     {0,
  147                 {0, 0, 0}}},                            /* minor 0-3 */
  148         {{T_SEQUENTIAL, T_REMOV,
  149          "ARCHIVE ", "VIPER 150  21531", ""},     {0,
  150                 {ST_Q_SENSE_HELP, 0, 0}}},              /* minor 0-3 */
  151         {{T_SEQUENTIAL, T_REMOV,
  152          "WANGTEK ", "5099ES SCSI", ""},          {0,
  153                 {ST_Q_FORCE_BLKSIZE, 512, 0}}},         /* minor 0-3 */
  154         {{T_SEQUENTIAL, T_REMOV,
  155          "WANGTEK ", "5150ES SCSI", ""},          {0,
  156                 {ST_Q_FORCE_BLKSIZE, 512, 0}}},         /* minor 0-3 */
  157         {{T_SEQUENTIAL, T_REMOV,
  158          "WANGTEK ", "5525ES SCSI REV7", ""},     {0,
  159                 {0, 0, 0}}},                            /* minor 0-3 */
  160         {{T_SEQUENTIAL, T_REMOV,
  161          "WangDAT ", "Model 1300      ", ""},     {0,
  162                 {0, 0, 0}}},                            /* minor 0-3 */
  163         {{T_SEQUENTIAL, T_REMOV,
  164          "EXABYTE ", "EXB-8200        ", "263H"}, {0,
  165                 {0, 0, 0}}},                            /* minor 0-3 */
  166         {{T_SEQUENTIAL, T_REMOV,
  167          "HP      ", "T4000s          ", ""},     {ST_Q_UNIMODAL,
  168                 {0, 0, QIC_3095}}},                     /* minor 0-3 */
  169 #if 0
  170         {{T_SEQUENTIAL, T_REMOV,
  171          "EXABYTE ", "EXB-8200        ", ""},     {0,
  172                 {0, 0, 0}}},                            /* minor 0-3 */
  173 #endif
  174         {{T_SEQUENTIAL, T_REMOV,
  175          "WANGTEK ", "5150ES SCSI FA15\0""01 A", "????"}, {0,
  176                 {ST_Q_IGNORE_LOADS, 0, 0}}},            /* minor 0-3 */
  177         {{T_SEQUENTIAL, T_REMOV,
  178          "TEAC    ", "MT-2ST/N50      ", ""},     {ST_Q_IGNORE_LOADS,
  179                 {0, 0, 0}}},                            /* minor 0-3 */
  180 };
  181 
  182 #define NOEJECT 0
  183 #define EJECT 1
  184 
  185 #define NOREWIND 0
  186 #define DOREWIND 1
  187 
  188 struct st_softc {
  189         struct device sc_dev;
  190 /*--------------------present operating parameters, flags etc.----------------*/
  191         int flags;              /* see below                          */
  192         u_int quirks;           /* quirks for the open mode           */
  193         int blksize;            /* blksize we are using               */
  194         u_int8_t density;       /* present density                    */
  195         short mt_resid;         /* last (short) resid                 */
  196         short mt_erreg;         /* last error (sense key) seen        */
  197 /*--------------------device/scsi parameters----------------------------------*/
  198         struct scsi_link *sc_link;      /* our link to the adpter etc.        */
  199 /*--------------------parameters reported by the device ----------------------*/
  200         int blkmin;             /* min blk size                       */
  201         int blkmax;             /* max blk size                       */
  202         const struct quirkdata *quirkdata;      /* if we have a rogue entry */
  203 /*--------------------parameters reported by the device for this media--------*/
  204         u_int64_t numblks;              /* nominal blocks capacity            */
  205         u_int32_t media_blksize;        /* 0 if not ST_FIXEDBLOCKS            */
  206         u_int32_t media_density;        /* this is what it said when asked    */
  207         int media_fileno;               /* relative to BOT. -1 means unknown. */
  208         int media_blkno;                /* relative to BOF. -1 means unknown. */
  209 /*--------------------quirks for the whole drive------------------------------*/
  210         u_int drive_quirks;     /* quirks of this drive               */
  211 /*--------------------How we should set up when opening each minor device----*/
  212         struct modes modes;     /* plus more for each mode            */
  213         u_int8_t  modeflags;    /* flags for the modes                */
  214 #define DENSITY_SET_BY_USER     0x01
  215 #define DENSITY_SET_BY_QUIRK    0x02
  216 #define BLKSIZE_SET_BY_USER     0x04
  217 #define BLKSIZE_SET_BY_QUIRK    0x08
  218 /*--------------------storage for sense data returned by the drive------------*/
  219         struct buf buf_queue;           /* the queue of pending IO operations */
  220         struct timeout sc_timeout;
  221 };
  222 
  223 
  224 int     stmatch(struct device *, void *, void *);
  225 void    stattach(struct device *, struct device *, void *);
  226 void    st_identify_drive(struct st_softc *, struct scsi_inquiry_data *);
  227 void    st_loadquirks(struct st_softc *);
  228 int     st_mount_tape(dev_t, int);
  229 void    st_unmount(struct st_softc *, int, int);
  230 int     st_decide_mode(struct st_softc *, int);
  231 void    ststart(void *);
  232 void    strestart(void *);
  233 int     st_read(struct st_softc *, char *, int, int);
  234 int     st_read_block_limits(struct st_softc *, int);
  235 int     st_mode_sense(struct st_softc *, int);
  236 int     st_mode_select(struct st_softc *, int);
  237 int     st_space(struct st_softc *, int, u_int, int);
  238 int     st_write_filemarks(struct st_softc *, int, int);
  239 int     st_check_eod(struct st_softc *, int, int *, int);
  240 int     st_load(struct st_softc *, u_int, int);
  241 int     st_rewind(struct st_softc *, u_int, int);
  242 int     st_interpret_sense(struct scsi_xfer *);
  243 int     st_touch_tape(struct st_softc *);
  244 int     st_erase(struct st_softc *, int, int);
  245 
  246 struct cfattach st_ca = {
  247         sizeof(struct st_softc), stmatch, stattach
  248 };
  249 
  250 struct cfdriver st_cd = {
  251         NULL, "st", DV_TAPE
  252 };
  253 
  254 struct scsi_device st_switch = {
  255         st_interpret_sense,
  256         ststart,
  257         NULL,
  258         NULL,
  259 };
  260 
  261 #define ST_INFO_VALID   0x0001
  262 #define ST_BLOCK_SET    0x0002  /* block size, mode set by ioctl      */
  263 #define ST_WRITTEN      0x0004  /* data have been written, EOD needed */
  264 #define ST_FIXEDBLOCKS  0x0008
  265 #define ST_AT_FILEMARK  0x0010
  266 #define ST_EIO_PENDING  0x0020  /* we couldn't report it then (had data) */
  267 #define ST_READONLY     0x0080  /* st_mode_sense says write protected */
  268 #define ST_FM_WRITTEN   0x0100  /*
  269                                  * EOF file mark written  -- used with
  270                                  * ~ST_WRITTEN to indicate that multiple file
  271                                  * marks have been written
  272                                  */
  273 #define ST_BLANK_READ   0x0200  /* BLANK CHECK encountered already */
  274 #define ST_2FM_AT_EOD   0x0400  /* write 2 file marks at EOD */
  275 #define ST_MOUNTED      0x0800  /* Device is presently mounted */
  276 #define ST_DONTBUFFER   0x1000  /* Disable buffering/caching */
  277 
  278 #define ST_PER_ACTION   (ST_AT_FILEMARK | ST_EIO_PENDING | ST_BLANK_READ)
  279 #define ST_PER_MOUNT    (ST_INFO_VALID | ST_BLOCK_SET | ST_WRITTEN | \
  280                          ST_FIXEDBLOCKS | ST_READONLY | ST_FM_WRITTEN | \
  281                          ST_2FM_AT_EOD | ST_PER_ACTION)
  282 
  283 const struct scsi_inquiry_pattern st_patterns[] = {
  284         {T_SEQUENTIAL, T_REMOV,
  285          "",         "",                 ""},
  286 };
  287 
  288 int
  289 stmatch(parent, match, aux)
  290         struct device *parent;
  291         void *match, *aux;
  292 {
  293         struct scsi_attach_args *sa = aux;
  294         int priority;
  295 
  296         (void)scsi_inqmatch(sa->sa_inqbuf,
  297             st_patterns, sizeof(st_patterns)/sizeof(st_patterns[0]),
  298             sizeof(st_patterns[0]), &priority);
  299         return (priority);
  300 }
  301 
  302 /*
  303  * The routine called by the low level scsi routine when it discovers
  304  * A device suitable for this driver
  305  */
  306 void
  307 stattach(parent, self, aux)
  308         struct device *parent, *self;
  309         void *aux;
  310 {
  311         struct st_softc *st = (void *)self;
  312         struct scsi_attach_args *sa = aux;
  313         struct scsi_link *sc_link = sa->sa_sc_link;
  314 
  315         SC_DEBUG(sc_link, SDEV_DB2, ("stattach:\n"));
  316 
  317         /*
  318          * Store information needed to contact our base driver
  319          */
  320         st->sc_link = sc_link;
  321         sc_link->device = &st_switch;
  322         sc_link->device_softc = st;
  323 
  324         /*
  325          * Check if the drive is a known criminal and take
  326          * Any steps needed to bring it into line
  327          */
  328         st_identify_drive(st, sa->sa_inqbuf);
  329         printf("\n");
  330 
  331         timeout_set(&st->sc_timeout, strestart, st);
  332 
  333         /*
  334          * Set up the buf queue for this device
  335          */
  336         st->buf_queue.b_active = 0;
  337         st->buf_queue.b_actf = 0;
  338         st->buf_queue.b_actb = &st->buf_queue.b_actf;
  339 
  340         /* Start up with media position unknown. */
  341         st->media_fileno = -1;
  342         st->media_blkno = -1;
  343 
  344         /*
  345          * Reset the media loaded flag, sometimes the data
  346          * acquired at boot time is not quite accurate.  This
  347          * will be checked again at the first open.
  348          */
  349         sc_link->flags &= ~SDEV_MEDIA_LOADED;
  350 }
  351 
  352 /*
  353  * Use the inquiry routine in 'scsi_base' to get drive info so we can
  354  * Further tailor our behaviour.
  355  */
  356 void
  357 st_identify_drive(st, inqbuf)
  358         struct st_softc *st;
  359         struct scsi_inquiry_data *inqbuf;
  360 {
  361         const struct st_quirk_inquiry_pattern *finger;
  362         int priority;
  363 
  364         finger = (const struct st_quirk_inquiry_pattern *)scsi_inqmatch(inqbuf,
  365             st_quirk_patterns,
  366             sizeof(st_quirk_patterns)/sizeof(st_quirk_patterns[0]),
  367             sizeof(st_quirk_patterns[0]), &priority);
  368         if (priority != 0) {
  369                 st->quirkdata = &finger->quirkdata;
  370                 st->drive_quirks = finger->quirkdata.quirks;
  371                 st->quirks = finger->quirkdata.quirks;  /* start value */
  372                 st_loadquirks(st);
  373         }
  374 }
  375 
  376 /*
  377  * initialise the subdevices to the default (QUIRK) state.
  378  * this will remove any setting made by the system operator or previous
  379  * operations.
  380  */
  381 void
  382 st_loadquirks(st)
  383         struct st_softc *st;
  384 {
  385         const struct    modes *mode;
  386         struct  modes *mode2;
  387 
  388         mode = &st->quirkdata->modes;
  389         mode2 = &st->modes;
  390         bzero(mode2, sizeof(struct modes));
  391         st->modeflags &= ~(BLKSIZE_SET_BY_QUIRK |
  392             DENSITY_SET_BY_QUIRK | BLKSIZE_SET_BY_USER |
  393             DENSITY_SET_BY_USER);
  394         if ((mode->quirks | st->drive_quirks) & ST_Q_FORCE_BLKSIZE) {
  395                 mode2->blksize = mode->blksize;
  396                 st->modeflags |= BLKSIZE_SET_BY_QUIRK;
  397         }
  398         if (mode->density) {
  399                 mode2->density = mode->density;
  400                 st->modeflags |= DENSITY_SET_BY_QUIRK;
  401         }
  402 }
  403 
  404 /*
  405  * open the device.
  406  */
  407 int
  408 stopen(dev, flags, fmt, p)
  409         dev_t dev;
  410         int flags;
  411         int fmt;
  412         struct proc *p;
  413 {
  414         struct scsi_link *sc_link;
  415         struct st_softc *st;
  416         int error = 0, unit;
  417 
  418         unit = STUNIT(dev);
  419         if (unit >= st_cd.cd_ndevs)
  420                 return (ENXIO);
  421         st = st_cd.cd_devs[unit];
  422         if (!st)
  423                 return (ENXIO);
  424 
  425         sc_link = st->sc_link;
  426 
  427         SC_DEBUG(sc_link, SDEV_DB1, ("open: dev=0x%x (unit %d (of %d))\n", dev,
  428             unit, st_cd.cd_ndevs));
  429 
  430         /*
  431          * Tape is an exclusive media. Only one open at a time.
  432          */
  433         if (sc_link->flags & SDEV_OPEN) {
  434                 SC_DEBUG(sc_link, SDEV_DB4, ("already open\n"));
  435                 return (EBUSY);
  436         }
  437 
  438         /* Use st_interpret_sense() now. */
  439         sc_link->flags |= SDEV_OPEN;
  440 
  441         /*
  442          * Check the unit status. This clears any outstanding errors and
  443          * will ensure that media is present.
  444          */
  445         error = scsi_test_unit_ready(sc_link, TEST_READY_RETRIES,
  446             SCSI_SILENT | SCSI_IGNORE_MEDIA_CHANGE |
  447             SCSI_IGNORE_ILLEGAL_REQUEST);
  448 
  449         /*
  450          * Terminate any exising mount session if there is no media.
  451          */
  452         if ((sc_link->flags & SDEV_MEDIA_LOADED) == 0)
  453                 st_unmount(st, NOEJECT, DOREWIND);
  454 
  455         if (error) {
  456                 sc_link->flags &= ~SDEV_OPEN;
  457                 return (error);
  458         }
  459 
  460         if ((st->flags & ST_MOUNTED) == 0) {
  461                 error = st_mount_tape(dev, flags);
  462                 if (error) {
  463                         sc_link->flags &= ~SDEV_OPEN;
  464                         return (error);
  465                 }
  466         }
  467 
  468         /*
  469          * Make sure that a tape opened in write-only mode will have
  470          * file marks written on it when closed, even if not written to.
  471          * This is for SUN compatibility
  472          */
  473         if ((flags & O_ACCMODE) == FWRITE)
  474                 st->flags |= ST_WRITTEN;
  475 
  476         SC_DEBUG(sc_link, SDEV_DB2, ("open complete\n"));
  477         return (0);
  478 }
  479 
  480 /*
  481  * close the device.. only called if we are the LAST
  482  * occurence of an open device
  483  */
  484 int
  485 stclose(dev, flags, mode, p)
  486         dev_t dev;
  487         int flags;
  488         int mode;
  489         struct proc *p;
  490 {
  491         struct st_softc *st = st_cd.cd_devs[STUNIT(dev)];
  492 
  493         SC_DEBUG(st->sc_link, SDEV_DB1, ("closing\n"));
  494         if ((st->flags & (ST_WRITTEN | ST_FM_WRITTEN)) == ST_WRITTEN)
  495                 st_write_filemarks(st, 1, 0);
  496         switch (STMODE(dev)) {
  497         case 0:         /* normal */
  498                 st_unmount(st, NOEJECT, DOREWIND);
  499                 break;
  500         case 3:         /* eject, no rewind */
  501                 st_unmount(st, EJECT, NOREWIND);
  502                 break;
  503         case 1:         /* no rewind */
  504                 /* leave mounted unless media seems to have been removed */
  505                 if (!(st->sc_link->flags & SDEV_MEDIA_LOADED))
  506                         st_unmount(st, NOEJECT, NOREWIND);
  507                 break;
  508         case 2:         /* rewind, eject */
  509                 st_unmount(st, EJECT, DOREWIND);
  510                 break;
  511         }
  512         st->sc_link->flags &= ~SDEV_OPEN;
  513         timeout_del(&st->sc_timeout);
  514 
  515         return 0;
  516 }
  517 
  518 /*
  519  * Start a new mount session.
  520  * Copy in all the default parameters from the selected device mode.
  521  * and try guess any that seem to be defaulted.
  522  */
  523 int
  524 st_mount_tape(dev, flags)
  525         dev_t dev;
  526         int flags;
  527 {
  528         int unit;
  529         u_int mode;
  530         struct st_softc *st;
  531         struct scsi_link *sc_link;
  532         int error = 0;
  533 
  534         unit = STUNIT(dev);
  535         mode = STMODE(dev);
  536         st = st_cd.cd_devs[unit];
  537         sc_link = st->sc_link;
  538 
  539         if (st->flags & ST_MOUNTED)
  540                 return 0;
  541 
  542         SC_DEBUG(sc_link, SDEV_DB1, ("mounting\n"));
  543         st->quirks = st->drive_quirks | st->modes.quirks;
  544         /*
  545          * If the media is new, then make sure we give it a chance to
  546          * to do a 'load' instruction.  (We assume it is new.)
  547          */
  548         if ((error = st_load(st, LD_LOAD, 0)) != 0)
  549                 return error;
  550         /*
  551          * Throw another dummy instruction to catch
  552          * 'Unit attention' errors. Some drives appear to give
  553          * these after doing a Load instruction.
  554          * (noteably some DAT drives)
  555          */
  556         /* XXX */
  557         scsi_test_unit_ready(sc_link, TEST_READY_RETRIES, SCSI_SILENT);
  558 
  559         /*
  560          * Some devices can't tell you much until they have been
  561          * asked to look at the media. This quirk does this.
  562          */
  563         if (st->quirks & ST_Q_SENSE_HELP)
  564                 if ((error = st_touch_tape(st)) != 0)
  565                         return error;
  566         /*
  567          * Load the physical device parameters
  568          * loads: blkmin, blkmax
  569          */
  570         if (!(sc_link->flags & SDEV_ATAPI) &&
  571             (error = st_read_block_limits(st, 0)) != 0) {
  572                 return error;
  573         }
  574 
  575         /*
  576          * Load the media dependent parameters
  577          * includes: media_blksize,media_density,numblks
  578          * As we have a tape in, it should be reflected here.
  579          * If not you may need the "quirk" above.
  580          */
  581         if ((error = st_mode_sense(st, 0)) != 0)
  582                 return error;
  583 
  584         /*
  585          * If we have gained a permanent density from somewhere,
  586          * then use it in preference to the one supplied by
  587          * default by the driver.
  588          */
  589         if (st->modeflags & (DENSITY_SET_BY_QUIRK | DENSITY_SET_BY_USER))
  590                 st->density = st->modes.density;
  591         else
  592                 st->density = st->media_density;
  593         /*
  594          * If we have gained a permanent blocksize
  595          * then use it in preference to the one supplied by
  596          * default by the driver.
  597          */
  598         st->flags &= ~ST_FIXEDBLOCKS;
  599         if (st->modeflags & (BLKSIZE_SET_BY_QUIRK | BLKSIZE_SET_BY_USER)) {
  600                 st->blksize = st->modes.blksize;
  601                 if (st->blksize)
  602                         st->flags |= ST_FIXEDBLOCKS;
  603         } else {
  604                 if ((error = st_decide_mode(st, FALSE)) != 0)
  605                         return error;
  606         }
  607         if ((error = st_mode_select(st, 0)) != 0) {
  608                 printf("%s: cannot set selected mode\n", st->sc_dev.dv_xname);
  609                 return error;
  610         }
  611         scsi_prevent(sc_link, PR_PREVENT,
  612             SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_NOT_READY);
  613         st->flags |= ST_MOUNTED;
  614         sc_link->flags |= SDEV_MEDIA_LOADED;    /* move earlier? */
  615 
  616         return 0;
  617 }
  618 
  619 /*
  620  * End the present mount session.
  621  * Rewind, and optionally eject the tape.
  622  * Reset various flags to indicate that all new
  623  * operations require another mount operation
  624  */
  625 void
  626 st_unmount(st, eject, rewind)
  627         struct st_softc *st;
  628         int eject, rewind;
  629 {
  630         struct scsi_link *sc_link = st->sc_link;
  631         int nmarks;
  632 
  633         st->media_fileno = -1;
  634         st->media_blkno = -1;
  635 
  636         if (!(st->flags & ST_MOUNTED))
  637                 return;
  638         SC_DEBUG(sc_link, SDEV_DB1, ("unmounting\n"));
  639         st_check_eod(st, FALSE, &nmarks, SCSI_IGNORE_NOT_READY);
  640         if (rewind)
  641                 st_rewind(st, 0, SCSI_IGNORE_NOT_READY);
  642         scsi_prevent(sc_link, PR_ALLOW,
  643             SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_NOT_READY);
  644         if (eject)
  645                 st_load(st, LD_UNLOAD, SCSI_IGNORE_NOT_READY);
  646         st->flags &= ~ST_MOUNTED;
  647         sc_link->flags &= ~SDEV_MEDIA_LOADED;
  648 }
  649 
  650 /*
  651  * Given all we know about the device, media, mode, 'quirks' and
  652  * initial operation, make a decision as to how we should be set
  653  * to run (regarding blocking and EOD marks)
  654  */
  655 int
  656 st_decide_mode(st, first_read)
  657         struct st_softc *st;
  658         int     first_read;
  659 {
  660         struct scsi_link *sc_link = st->sc_link;
  661 
  662         SC_DEBUG(sc_link, SDEV_DB2, ("starting block mode decision\n"));
  663 
  664         /* ATAPI tapes are always fixed blocksize. */
  665         if (sc_link->flags & SDEV_ATAPI) {
  666                 st->flags |= ST_FIXEDBLOCKS;
  667                 if (st->media_blksize > 0)
  668                         st->blksize = st->media_blksize;
  669                 else
  670                         st->blksize = DEF_FIXED_BSIZE;
  671                 goto done;
  672         }
  673 
  674         /*
  675          * If the drive can only handle fixed-length blocks and only at
  676          * one size, perhaps we should just do that.
  677          */
  678         if (st->blkmin && (st->blkmin == st->blkmax)) {
  679                 st->flags |= ST_FIXEDBLOCKS;
  680                 st->blksize = st->blkmin;
  681                 SC_DEBUG(sc_link, SDEV_DB3,
  682                     ("blkmin == blkmax of %d\n", st->blkmin));
  683                 goto done;
  684         }
  685         /*
  686          * If the tape density mandates (or even suggests) use of fixed
  687          * or variable-length blocks, comply.
  688          */
  689         switch (st->density) {
  690         case HALFINCH_800:
  691         case HALFINCH_1600:
  692         case HALFINCH_6250:
  693         case DDS:
  694                 st->flags &= ~ST_FIXEDBLOCKS;
  695                 st->blksize = 0;
  696                 SC_DEBUG(sc_link, SDEV_DB3, ("density specified variable\n"));
  697                 goto done;
  698         case QIC_11:
  699         case QIC_24:
  700         case QIC_120:
  701         case QIC_150:
  702         case QIC_525:
  703         case QIC_1320:
  704                 st->flags |= ST_FIXEDBLOCKS;
  705                 if (st->media_blksize > 0)
  706                         st->blksize = st->media_blksize;
  707                 else
  708                         st->blksize = DEF_FIXED_BSIZE;
  709                 SC_DEBUG(sc_link, SDEV_DB3, ("density specified fixed\n"));
  710                 goto done;
  711         }
  712         /*
  713          * If we're about to read the tape, perhaps we should choose
  714          * fixed or variable-length blocks and block size according to
  715          * what the drive found on the tape.
  716          */
  717         if (first_read &&
  718             (!(st->quirks & ST_Q_BLKSIZE) || (st->media_blksize == 0) ||
  719             (st->media_blksize == DEF_FIXED_BSIZE) ||
  720             (st->media_blksize == 1024))) {
  721                 if (st->media_blksize > 0)
  722                         st->flags |= ST_FIXEDBLOCKS;
  723                 else
  724                         st->flags &= ~ST_FIXEDBLOCKS;
  725                 st->blksize = st->media_blksize;
  726                 SC_DEBUG(sc_link, SDEV_DB3,
  727                     ("Used media_blksize of %d\n", st->media_blksize));
  728                 goto done;
  729         }
  730         /*
  731          * We're getting no hints from any direction.  Choose variable-
  732          * length blocks arbitrarily.
  733          */
  734         st->flags &= ~ST_FIXEDBLOCKS;
  735         st->blksize = 0;
  736         SC_DEBUG(sc_link, SDEV_DB3,
  737             ("Give up and default to variable mode\n"));
  738 
  739 done:
  740         /*
  741          * Decide whether or not to write two file marks to signify end-
  742          * of-data.  Make the decision as a function of density.  If
  743          * the decision is not to use a second file mark, the SCSI BLANK
  744          * CHECK condition code will be recognized as end-of-data when
  745          * first read.
  746          * (I think this should be a by-product of fixed/variable..julian)
  747          */
  748         switch (st->density) {
  749 /*      case 8 mm:   What is the SCSI density code for 8 mm, anyway? */
  750         case QIC_11:
  751         case QIC_24:
  752         case QIC_120:
  753         case QIC_150:
  754         case QIC_525:
  755         case QIC_1320:
  756                 st->flags &= ~ST_2FM_AT_EOD;
  757                 break;
  758         default:
  759                 st->flags |= ST_2FM_AT_EOD;
  760         }
  761         return 0;
  762 }
  763 
  764 /*
  765  * Actually translate the requested transfer into
  766  * one the physical driver can understand
  767  * The transfer is described by a buf and will include
  768  * only one physical transfer.
  769  */
  770 void
  771 ststrategy(bp)
  772         struct buf *bp;
  773 {
  774         struct st_softc *st = st_cd.cd_devs[STUNIT(bp->b_dev)];
  775         struct buf *dp;
  776         int s;
  777 
  778         SC_DEBUG(st->sc_link, SDEV_DB2, ("ststrategy: %ld bytes @ blk %d\n",
  779             bp->b_bcount, bp->b_blkno));
  780         /*
  781          * If it's a null transfer, return immediately.
  782          */
  783         if (bp->b_bcount == 0)
  784                 goto done;
  785         /*
  786          * Odd sized request on fixed drives are verboten
  787          */
  788         if (st->flags & ST_FIXEDBLOCKS) {
  789                 if (bp->b_bcount % st->blksize) {
  790                         printf("%s: bad request, must be multiple of %d\n",
  791                             st->sc_dev.dv_xname, st->blksize);
  792                         bp->b_error = EIO;
  793                         goto bad;
  794                 }
  795         }
  796         /*
  797          * as are out-of-range requests on variable drives.
  798          */
  799         else if (bp->b_bcount < st->blkmin ||
  800                  (st->blkmax && bp->b_bcount > st->blkmax)) {
  801                 printf("%s: bad request, must be between %d and %d\n",
  802                     st->sc_dev.dv_xname, st->blkmin, st->blkmax);
  803                 bp->b_error = EIO;
  804                 goto bad;
  805         }
  806         s = splbio();
  807 
  808         /*
  809          * Place it in the queue of activities for this tape
  810          * at the end (a bit silly because we only have on user..
  811          * (but it could fork()))
  812          */
  813         dp = &st->buf_queue;
  814         bp->b_actf = NULL;
  815         bp->b_actb = dp->b_actb;
  816         *dp->b_actb = bp;
  817         dp->b_actb = &bp->b_actf;
  818 
  819         /*
  820          * Tell the device to get going on the transfer if it's
  821          * not doing anything, otherwise just wait for completion
  822          * (All a bit silly if we're only allowing 1 open but..)
  823          */
  824         ststart(st);
  825 
  826         splx(s);
  827         return;
  828 bad:
  829         bp->b_flags |= B_ERROR;
  830 done:
  831         /*
  832          * Correctly set the buf to indicate a completed xfer
  833          */
  834         bp->b_resid = bp->b_bcount;
  835         s = splbio();
  836         biodone(bp);
  837         splx(s);
  838 }
  839 
  840 /*
  841  * ststart looks to see if there is a buf waiting for the device
  842  * and that the device is not already busy. If both are true,
  843  * It dequeues the buf and creates a scsi command to perform the
  844  * transfer required. The transfer request will call scsi_done
  845  * on completion, which will in turn call this routine again
  846  * so that the next queued transfer is performed.
  847  * The bufs are queued by the strategy routine (ststrategy)
  848  *
  849  * This routine is also called after other non-queued requests
  850  * have been made of the scsi driver, to ensure that the queue
  851  * continues to be drained.
  852  * ststart() is called at splbio from ststrategy, strestart and scsi_done()
  853  */
  854 void
  855 ststart(v)
  856         void *v;
  857 {
  858         struct st_softc *st = v;
  859         struct scsi_link *sc_link = st->sc_link;
  860         struct buf *bp, *dp;
  861         struct scsi_rw_tape cmd;
  862         int flags, error;
  863 
  864         SC_DEBUG(sc_link, SDEV_DB2, ("ststart\n"));
  865 
  866         splassert(IPL_BIO);
  867 
  868         /*
  869          * See if there is a buf to do and we are not already
  870          * doing one
  871          */
  872         while (sc_link->openings > 0) {
  873                 /* if a special awaits, let it proceed first */
  874                 if (sc_link->flags & SDEV_WAITING) {
  875                         sc_link->flags &= ~SDEV_WAITING;
  876                         wakeup((caddr_t)sc_link);
  877                         return;
  878                 }
  879 
  880                 dp = &st->buf_queue;
  881                 if ((bp = dp->b_actf) == NULL)
  882                         return;
  883                 if ((dp = bp->b_actf) != NULL)
  884                         dp->b_actb = bp->b_actb;
  885                 else
  886                         st->buf_queue.b_actb = bp->b_actb;
  887                 *bp->b_actb = dp;
  888 
  889                 /*
  890                  * if the device has been unmounted by the user
  891                  * then throw away all requests until done
  892                  */
  893                 if (!(st->flags & ST_MOUNTED) ||
  894                     !(sc_link->flags & SDEV_MEDIA_LOADED)) {
  895                         /* make sure that one implies the other.. */
  896                         sc_link->flags &= ~SDEV_MEDIA_LOADED;
  897                         bp->b_flags |= B_ERROR;
  898                         bp->b_resid = bp->b_bcount;
  899                         bp->b_error = EIO;
  900                         biodone(bp);
  901                         continue;
  902                 }
  903                 /*
  904                  * only FIXEDBLOCK devices have pending operations
  905                  */
  906                 if (st->flags & ST_FIXEDBLOCKS) {
  907                         /*
  908                          * If we are at a filemark but have not reported it yet
  909                          * then we should report it now
  910                          */
  911                         if (st->flags & ST_AT_FILEMARK) {
  912                                 if ((bp->b_flags & B_READ) == B_WRITE) {
  913                                         /*
  914                                          * Handling of ST_AT_FILEMARK in
  915                                          * st_space will fill in the right file
  916                                          * mark count.
  917                                          * Back up over filemark
  918                                          */
  919                                         if (st_space(st, 0, SP_FILEMARKS, 0)) {
  920                                                 bp->b_flags |= B_ERROR;
  921                                                 bp->b_resid = bp->b_bcount;
  922                                                 bp->b_error = EIO;
  923                                                 biodone(bp);
  924                                                 continue;
  925                                         }
  926                                 } else {
  927                                         bp->b_resid = bp->b_bcount;
  928                                         bp->b_error = 0;
  929                                         bp->b_flags &= ~B_ERROR;
  930                                         st->flags &= ~ST_AT_FILEMARK;
  931                                         biodone(bp);
  932                                         continue;       /* seek more work */
  933                                 }
  934                         }
  935                         /*
  936                          * If we are at EIO (e.g. EOM) but have not reported it
  937                          * yet then we should report it now
  938                          */
  939                         if (st->flags & ST_EIO_PENDING) {
  940                                 bp->b_resid = bp->b_bcount;
  941                                 bp->b_error = EIO;
  942                                 bp->b_flags |= B_ERROR;
  943                                 st->flags &= ~ST_EIO_PENDING;
  944                                 biodone(bp);
  945                                 continue;       /* seek more work */
  946                         }
  947                 }
  948 
  949                 /*
  950                  *  Fill out the scsi command
  951                  */
  952                 bzero(&cmd, sizeof(cmd));
  953                 if ((bp->b_flags & B_READ) == B_WRITE) {
  954                         cmd.opcode = WRITE;
  955                         st->flags &= ~ST_FM_WRITTEN;
  956                         st->flags |= ST_WRITTEN;
  957                         flags = SCSI_DATA_OUT;
  958                 } else {
  959                         cmd.opcode = READ;
  960                         flags = SCSI_DATA_IN;
  961                 }
  962 
  963                 /*
  964                  * Handle "fixed-block-mode" tape drives by using the
  965                  * block count instead of the length.
  966                  */
  967                 if (st->flags & ST_FIXEDBLOCKS) {
  968                         cmd.byte2 |= SRW_FIXED;
  969                         _lto3b(bp->b_bcount / st->blksize, cmd.len);
  970                 } else
  971                         _lto3b(bp->b_bcount, cmd.len);
  972 
  973                 if (st->media_blkno != -1) {
  974                         /* Update block count now, errors will set it to -1. */
  975                         if (st->flags & ST_FIXEDBLOCKS)
  976                                 st->media_blkno += _3btol(cmd.len);
  977                         else if (cmd.len != 0)
  978                                 st->media_blkno++;
  979                 }
  980 
  981                 /*
  982                  * go ask the adapter to do all this for us
  983                  */
  984                 error = scsi_scsi_cmd(sc_link, (struct scsi_generic *) &cmd,
  985                     sizeof(cmd), (u_char *) bp->b_data, bp->b_bcount, 0,
  986                     ST_IO_TIME, bp, flags | SCSI_NOSLEEP);
  987                 switch (error) {
  988                 case 0:
  989                         timeout_del(&st->sc_timeout);
  990                         break;
  991                 case EAGAIN:
  992                         /*
  993                          * The device can't start another i/o. Try again later.
  994                          */
  995                         dp->b_actf = bp;
  996                         timeout_add(&st->sc_timeout, 1);
  997                         return;
  998                 default:
  999                         printf("%s: not queued\n", st->sc_dev.dv_xname);
 1000                         break;
 1001                 }
 1002         } /* go back and see if we can cram more work in.. */
 1003 }
 1004 
 1005 void
 1006 strestart(v)
 1007         void *v;
 1008 {
 1009         int s;
 1010 
 1011         s = splbio();
 1012         ststart(v);
 1013         splx(s);
 1014 }
 1015 
 1016 int
 1017 stread(dev, uio, iomode)
 1018         dev_t dev;
 1019         struct uio *uio;
 1020         int iomode;
 1021 {
 1022         struct st_softc *st = st_cd.cd_devs[STUNIT(dev)];
 1023 
 1024         return (physio(ststrategy, NULL, dev, B_READ,
 1025             st->sc_link->adapter->scsi_minphys, uio));
 1026 }
 1027 
 1028 int
 1029 stwrite(dev, uio, iomode)
 1030         dev_t dev;
 1031         struct uio *uio;
 1032         int iomode;
 1033 {
 1034         struct st_softc *st = st_cd.cd_devs[STUNIT(dev)];
 1035 
 1036         return (physio(ststrategy, NULL, dev, B_WRITE,
 1037             st->sc_link->adapter->scsi_minphys, uio));
 1038 }
 1039 
 1040 /*
 1041  * Perform special action on behalf of the user;
 1042  * knows about the internals of this device
 1043  */
 1044 int
 1045 stioctl(dev, cmd, arg, flag, p)
 1046         dev_t dev;
 1047         u_long cmd;
 1048         caddr_t arg;
 1049         int flag;
 1050         struct proc *p;
 1051 {
 1052         int error = 0;
 1053         int unit;
 1054         int nmarks;
 1055         int flags;
 1056         struct st_softc *st;
 1057         int hold_blksize;
 1058         u_int8_t hold_density;
 1059         struct mtop *mt = (struct mtop *) arg;
 1060         int number;
 1061 
 1062         /*
 1063          * Find the device that the user is talking about
 1064          */
 1065         flags = 0;              /* give error messages, act on errors etc. */
 1066         unit = STUNIT(dev);
 1067         st = st_cd.cd_devs[unit];
 1068         hold_blksize = st->blksize;
 1069         hold_density = st->density;
 1070 
 1071         switch (cmd) {
 1072 
 1073         case MTIOCGET: {
 1074                 struct mtget *g = (struct mtget *) arg;
 1075 
 1076                 /*
 1077                  * (to get the current state of READONLY)
 1078                  */
 1079                 error = st_mode_sense(st, SCSI_SILENT);
 1080                 if (error)
 1081                         break;
 1082 
 1083                 SC_DEBUG(st->sc_link, SDEV_DB1, ("[ioctl: get status]\n"));
 1084                 bzero(g, sizeof(struct mtget));
 1085                 g->mt_type = 0x7;       /* Ultrix compat *//*? */
 1086                 g->mt_blksiz = st->blksize;
 1087                 g->mt_density = st->density;
 1088                 g->mt_mblksiz = st->modes.blksize;
 1089                 g->mt_mdensity = st->modes.density;
 1090                 if (st->flags & ST_READONLY)
 1091                         g->mt_dsreg |= MT_DS_RDONLY;
 1092                 if (st->flags & ST_MOUNTED)
 1093                         g->mt_dsreg |= MT_DS_MOUNTED;
 1094                 g->mt_resid = st->mt_resid;
 1095                 g->mt_erreg = st->mt_erreg;
 1096                 g->mt_fileno = st->media_fileno;
 1097                 g->mt_blkno = st->media_blkno;
 1098                 /*
 1099                  * clear latched errors.
 1100                  */
 1101                 st->mt_resid = 0;
 1102                 st->mt_erreg = 0;
 1103                 break;
 1104         }
 1105         case MTIOCTOP: {
 1106 
 1107                 SC_DEBUG(st->sc_link, SDEV_DB1,
 1108                     ("[ioctl: op=0x%x count=0x%x]\n", mt->mt_op, mt->mt_count));
 1109 
 1110                 number = mt->mt_count;
 1111                 switch (mt->mt_op) {
 1112                 case MTWEOF:    /* write an end-of-file record */
 1113                         error = st_write_filemarks(st, number, flags);
 1114                         break;
 1115                 case MTBSF:     /* backward space file */
 1116                         number = -number;
 1117                 case MTFSF:     /* forward space file */
 1118                         error = st_check_eod(st, FALSE, &nmarks, flags);
 1119                         if (!error)
 1120                                 error = st_space(st, number - nmarks,
 1121                                     SP_FILEMARKS, flags);
 1122                         break;
 1123                 case MTBSR:     /* backward space record */
 1124                         number = -number;
 1125                 case MTFSR:     /* forward space record */
 1126                         error = st_check_eod(st, TRUE, &nmarks, flags);
 1127                         if (!error)
 1128                                 error = st_space(st, number, SP_BLKS, flags);
 1129                         break;
 1130                 case MTREW:     /* rewind */
 1131                         error = st_rewind(st, 0, flags);
 1132                         break;
 1133                 case MTOFFL:    /* rewind and put the drive offline */
 1134                         st_unmount(st, EJECT, DOREWIND);
 1135                         break;
 1136                 case MTNOP:     /* no operation, sets status only */
 1137                         break;
 1138                 case MTRETEN:   /* retension the tape */
 1139                         error = st_load(st, LD_RETENSION, flags);
 1140                         if (!error)
 1141                                 error = st_load(st, LD_LOAD, flags);
 1142                         break;
 1143                 case MTEOM:     /* forward space to end of media */
 1144                         error = st_check_eod(st, FALSE, &nmarks, flags);
 1145                         if (!error)
 1146                                 error = st_space(st, 1, SP_EOM, flags);
 1147                         break;
 1148                 case MTCACHE:   /* enable controller cache */
 1149                         st->flags &= ~ST_DONTBUFFER;
 1150                         goto try_new_value;
 1151                 case MTNOCACHE: /* disable controller cache */
 1152                         st->flags |= ST_DONTBUFFER;
 1153                         goto try_new_value;
 1154                 case MTERASE:   /* erase volume */
 1155                         error = st_erase(st, number, flags);
 1156                         break;
 1157                 case MTSETBSIZ: /* Set block size for device */
 1158                         if (number == 0) {
 1159                                 st->flags &= ~ST_FIXEDBLOCKS;
 1160                         } else {
 1161                                 if ((st->blkmin || st->blkmax) &&
 1162                                     (number < st->blkmin ||
 1163                                     number > st->blkmax)) {
 1164                                         error = EINVAL;
 1165                                         break;
 1166                                 }
 1167                                 st->flags |= ST_FIXEDBLOCKS;
 1168                         }
 1169                         st->blksize = number;
 1170                         st->flags |= ST_BLOCK_SET;      /*XXX */
 1171                         goto try_new_value;
 1172 
 1173                 case MTSETDNSTY:        /* Set density for device and mode */
 1174                         if (number < 0 || number > SCSI_MAX_DENSITY_CODE) {
 1175                                 error = EINVAL;
 1176                                 break;
 1177                         } else
 1178                                 st->density = number;
 1179                         goto try_new_value;
 1180 
 1181                 default:
 1182                         error = EINVAL;
 1183                 }
 1184                 break;
 1185         }
 1186         case MTIOCIEOT:
 1187         case MTIOCEEOT:
 1188                 break;
 1189 
 1190 #if 0
 1191         case MTIOCRDSPOS:
 1192                 error = st_rdpos(st, 0, (u_int32_t *) arg);
 1193                 break;
 1194 
 1195         case MTIOCRDHPOS:
 1196                 error = st_rdpos(st, 1, (u_int32_t *) arg);
 1197                 break;
 1198 
 1199         case MTIOCSLOCATE:
 1200                 error = st_setpos(st, 0, (u_int32_t *) arg);
 1201                 break;
 1202 
 1203         case MTIOCHLOCATE:
 1204                 error = st_setpos(st, 1, (u_int32_t *) arg);
 1205                 break;
 1206 #endif
 1207 
 1208         default:
 1209                 error = scsi_do_ioctl(st->sc_link, dev, cmd, arg, flag, p);
 1210                 break;
 1211         }
 1212         return error;
 1213 /*-----------------------------*/
 1214 try_new_value:
 1215         /*
 1216          * Check that the mode being asked for is aggreeable to the
 1217          * drive. If not, put it back the way it was.
 1218          */
 1219         if ((error = st_mode_select(st, 0)) != 0) {/* put it back as it was */
 1220                 printf("%s: cannot set selected mode\n", st->sc_dev.dv_xname);
 1221                 st->density = hold_density;
 1222                 st->blksize = hold_blksize;
 1223                 if (st->blksize)
 1224                         st->flags |= ST_FIXEDBLOCKS;
 1225                 else
 1226                         st->flags &= ~ST_FIXEDBLOCKS;
 1227                 return error;
 1228         }
 1229         /*
 1230          * As the drive liked it, if we are setting a new default,
 1231          * set it into the structures as such.
 1232          */
 1233         switch (mt->mt_op) {
 1234         case MTSETBSIZ:
 1235                 st->modes.blksize = st->blksize;
 1236                 st->modeflags |= BLKSIZE_SET_BY_USER;
 1237                 break;
 1238         case MTSETDNSTY:
 1239                 st->modes.density = st->density;
 1240                 st->modeflags |= DENSITY_SET_BY_USER;
 1241                 break;
 1242         }
 1243 
 1244         return 0;
 1245 }
 1246 
 1247 /*
 1248  * Do a synchronous read.
 1249  */
 1250 int
 1251 st_read(st, buf, size, flags)
 1252         struct st_softc *st;
 1253         int size;
 1254         int flags;
 1255         char *buf;
 1256 {
 1257         struct scsi_rw_tape cmd;
 1258 
 1259         /*
 1260          * If it's a null transfer, return immediately
 1261          */
 1262         if (size == 0)
 1263                 return 0;
 1264         bzero(&cmd, sizeof(cmd));
 1265         cmd.opcode = READ;
 1266         if (st->flags & ST_FIXEDBLOCKS) {
 1267                 cmd.byte2 |= SRW_FIXED;
 1268                 _lto3b(size / (st->blksize ? st->blksize : DEF_FIXED_BSIZE),
 1269                     cmd.len);
 1270         } else
 1271                 _lto3b(size, cmd.len);
 1272         return scsi_scsi_cmd(st->sc_link, (struct scsi_generic *) &cmd,
 1273             sizeof(cmd), (u_char *) buf, size, 0, ST_IO_TIME, NULL,
 1274             flags | SCSI_DATA_IN);
 1275 }
 1276 
 1277 /*
 1278  * Ask the drive what its min and max blk sizes are.
 1279  */
 1280 int
 1281 st_read_block_limits(st, flags)
 1282         struct st_softc *st;
 1283         int flags;
 1284 {
 1285         struct scsi_block_limits cmd;
 1286         struct scsi_block_limits_data block_limits;
 1287         struct scsi_link *sc_link = st->sc_link;
 1288         int error;
 1289 
 1290         /*
 1291          * First check if we have it all loaded
 1292          */
 1293         if ((sc_link->flags & SDEV_MEDIA_LOADED))
 1294                 return 0;
 1295 
 1296         /*
 1297          * do a 'Read Block Limits'
 1298          */
 1299         bzero(&cmd, sizeof(cmd));
 1300         cmd.opcode = READ_BLOCK_LIMITS;
 1301 
 1302         /*
 1303          * do the command, update the global values
 1304          */
 1305         error = scsi_scsi_cmd(sc_link, (struct scsi_generic *) &cmd,
 1306             sizeof(cmd), (u_char *) &block_limits, sizeof(block_limits),
 1307             ST_RETRIES, ST_CTL_TIME, NULL, flags | SCSI_DATA_IN);
 1308         if (error)
 1309                 return error;
 1310 
 1311         st->blkmin = _2btol(block_limits.min_length);
 1312         st->blkmax = _3btol(block_limits.max_length);
 1313 
 1314         SC_DEBUG(sc_link, SDEV_DB3,
 1315             ("(%d <= blksize <= %d)\n", st->blkmin, st->blkmax));
 1316         return 0;
 1317 }
 1318 
 1319 /*
 1320  * Get the scsi driver to send a full inquiry to the
 1321  * device and use the results to fill out the global
 1322  * parameter structure.
 1323  *
 1324  * called from:
 1325  * attach
 1326  * open
 1327  * ioctl (to reset original blksize)
 1328  */
 1329 int
 1330 st_mode_sense(st, flags)
 1331         struct st_softc *st;
 1332         int flags;
 1333 {
 1334         union scsi_mode_sense_buf *data;
 1335         struct scsi_link *sc_link = st->sc_link;
 1336         u_int64_t block_count;
 1337         u_int32_t density, block_size;
 1338         u_char *page0 = NULL;
 1339         u_int8_t dev_spec;
 1340         int error, big;
 1341 
 1342         data = malloc(sizeof(*data), M_TEMP, M_NOWAIT);
 1343         if (data == NULL)
 1344                 return (ENOMEM);
 1345 
 1346         /*
 1347          * Ask for page 0 (vendor specific) mode sense data.
 1348          */
 1349         error = scsi_do_mode_sense(sc_link, 0, data, (void **)&page0,
 1350             &density, &block_count, &block_size, 1, flags | SCSI_SILENT, &big);
 1351         if (error != 0) {
 1352                 free(data, M_TEMP);
 1353                 return (error);
 1354         }
 1355 
 1356         /* It is valid for no page0 to be available. */
 1357 
 1358         if (big)
 1359                 dev_spec = data->hdr_big.dev_spec;
 1360         else
 1361                 dev_spec = data->hdr.dev_spec;
 1362 
 1363         if (dev_spec & SMH_DSP_WRITE_PROT)
 1364                 st->flags |= ST_READONLY;
 1365         else
 1366                 st->flags &= ~ST_READONLY;
 1367 
 1368         st->numblks = block_count;
 1369         st->media_blksize = block_size;
 1370         st->media_density = density;
 1371 
 1372         SC_DEBUG(sc_link, SDEV_DB3,
 1373             ("density code 0x%x, %d-byte blocks, write-%s, ",
 1374             st->media_density, st->media_blksize,
 1375             st->flags & ST_READONLY ? "protected" : "enabled"));
 1376         SC_DEBUGN(sc_link, SDEV_DB3,
 1377             ("%sbuffered\n", dev_spec & SMH_DSP_BUFF_MODE ? "" : "un"));
 1378 
 1379         sc_link->flags |= SDEV_MEDIA_LOADED;
 1380 
 1381         free(data, M_TEMP);
 1382         return (0);
 1383 }
 1384 
 1385 /*
 1386  * Send a filled out parameter structure to the drive to
 1387  * set it into the desire modes etc.
 1388  */
 1389 int
 1390 st_mode_select(st, flags)
 1391         struct st_softc *st;
 1392         int flags;
 1393 {
 1394         union scsi_mode_sense_buf *inbuf, *outbuf;
 1395         struct scsi_blk_desc general;
 1396         struct scsi_link *sc_link = st->sc_link;
 1397         u_int8_t *page0 = NULL;
 1398         int error, big, page0_size;
 1399 
 1400         inbuf = malloc(sizeof(*inbuf), M_TEMP, M_NOWAIT);
 1401         if (inbuf == NULL)
 1402                 return (ENOMEM);
 1403         outbuf = malloc(sizeof(*outbuf), M_TEMP, M_NOWAIT);
 1404         if (outbuf == NULL) {
 1405                 free(inbuf, M_TEMP);
 1406                 return (ENOMEM);
 1407         }
 1408 
 1409         /*
 1410          * This quirk deals with drives that have only one valid mode and think
 1411          * this gives them license to reject all mode selects, even if the
 1412          * selected mode is the one that is supported.
 1413          */
 1414         if (st->quirks & ST_Q_UNIMODAL) {
 1415                 SC_DEBUG(sc_link, SDEV_DB3,
 1416                     ("not setting density 0x%x blksize 0x%x\n",
 1417                     st->density, st->blksize));
 1418                 free(inbuf, M_TEMP);
 1419                 free(outbuf, M_TEMP);
 1420                 return (0);
 1421         }
 1422 
 1423         if (sc_link->flags & SDEV_ATAPI) {
 1424                 free(inbuf, M_TEMP);
 1425                 free(outbuf, M_TEMP);
 1426                 return (0);
 1427         }
 1428 
 1429         bzero(outbuf, sizeof(*outbuf));
 1430         bzero(&general, sizeof(general));
 1431 
 1432         general.density = st->density;
 1433         if (st->flags & ST_FIXEDBLOCKS)
 1434                 _lto3b(st->blksize, general.blklen);
 1435 
 1436         /*
 1437          * Ask for page 0 (vendor specific) mode sense data.
 1438          */
 1439         error = scsi_do_mode_sense(sc_link, 0, inbuf, (void **)&page0, NULL,
 1440             NULL, NULL, 1, flags | SCSI_SILENT, &big);
 1441         if (error != 0) {
 1442                 free(inbuf, M_TEMP);
 1443                 free(outbuf, M_TEMP);
 1444                 return (error);
 1445         }
 1446 
 1447         if (page0 == NULL) {
 1448                 page0_size = 0;
 1449         } else if (big == 0) {
 1450                 page0_size = inbuf->hdr.data_length +
 1451                     sizeof(inbuf->hdr.data_length) - sizeof(inbuf->hdr) -
 1452                     inbuf->hdr.blk_desc_len;
 1453                 memcpy(&outbuf->buf[sizeof(outbuf->hdr)+ sizeof(general)],
 1454                     page0, page0_size);
 1455         } else {
 1456                 page0_size = _2btol(inbuf->hdr_big.data_length) +
 1457                     sizeof(inbuf->hdr_big.data_length) -
 1458                     sizeof(inbuf->hdr_big) -
 1459                    _2btol(inbuf->hdr_big.blk_desc_len);
 1460                 memcpy(&outbuf->buf[sizeof(outbuf->hdr_big) + sizeof(general)],
 1461                     page0, page0_size);
 1462         }
 1463 
 1464         /*
 1465          * Set up for a mode select.
 1466          */
 1467         if (big == 0) {
 1468                 outbuf->hdr.data_length = sizeof(outbuf->hdr) +
 1469                     sizeof(general) + page0_size -
 1470                     sizeof(outbuf->hdr.data_length);
 1471                 if ((st->flags & ST_DONTBUFFER) == 0)
 1472                         outbuf->hdr.dev_spec = SMH_DSP_BUFF_MODE_ON;
 1473                 outbuf->hdr.blk_desc_len = sizeof(general);
 1474                 memcpy(&outbuf->buf[sizeof(outbuf->hdr)],
 1475                     &general, sizeof(general));
 1476                 error = scsi_mode_select(st->sc_link, 0, &outbuf->hdr,
 1477                     flags, ST_CTL_TIME);
 1478                 free(inbuf, M_TEMP);
 1479                 free(outbuf, M_TEMP);
 1480                 return (error);
 1481         }
 1482 
 1483         /* MODE SENSE (10) header was returned, so use MODE SELECT (10). */
 1484         _lto2b((sizeof(outbuf->hdr_big) + sizeof(general) + page0_size -
 1485             sizeof(outbuf->hdr_big.data_length)), outbuf->hdr_big.data_length);
 1486         if ((st->flags & ST_DONTBUFFER) == 0)
 1487                 outbuf->hdr_big.dev_spec = SMH_DSP_BUFF_MODE_ON;
 1488         _lto2b(sizeof(general), outbuf->hdr_big.blk_desc_len);
 1489         memcpy(&outbuf->buf[sizeof(outbuf->hdr_big)], &general,
 1490             sizeof(general));
 1491 
 1492         error = scsi_mode_select_big(st->sc_link, 0, &outbuf->hdr_big,
 1493             flags, ST_CTL_TIME);
 1494         free(inbuf, M_TEMP);
 1495         free(outbuf, M_TEMP);
 1496         return (error);
 1497 }
 1498 
 1499 /*
 1500  * issue an erase command
 1501  */
 1502 int
 1503 st_erase(st, full, flags)
 1504         struct st_softc *st;
 1505         int full, flags;
 1506 {
 1507         struct scsi_erase cmd;
 1508         int tmo;
 1509 
 1510         /*
 1511          * Full erase means set LONG bit in erase command, which asks
 1512          * the drive to erase the entire unit.  Without this bit, we're
 1513          * asking the drive to write an erase gap.
 1514          */
 1515         bzero(&cmd, sizeof(cmd));
 1516         cmd.opcode = ERASE;
 1517         if (full) {
 1518                 cmd.byte2 = SE_IMMED|SE_LONG;
 1519                 tmo = ST_SPC_TIME;
 1520         } else {
 1521                 cmd.byte2 = SE_IMMED;
 1522                 tmo = ST_IO_TIME;
 1523         }
 1524 
 1525         /*
 1526          * XXX We always do this asynchronously, for now.  How long should
 1527          * we wait if we want to (eventually) to it synchronously?
 1528          */
 1529         return (scsi_scsi_cmd(st->sc_link, (struct scsi_generic *)&cmd,
 1530             sizeof(cmd), 0, 0, ST_RETRIES, tmo, NULL, flags));
 1531 }
 1532 
 1533 /*
 1534  * skip N blocks/filemarks/seq filemarks/eom
 1535  */
 1536 int
 1537 st_space(st, number, what, flags)
 1538         struct st_softc *st;
 1539         u_int what;
 1540         int flags;
 1541         int number;
 1542 {
 1543         struct scsi_space cmd;
 1544         int error;
 1545 
 1546         switch (what) {
 1547         case SP_BLKS:
 1548                 if (st->flags & ST_PER_ACTION) {
 1549                         if (number > 0) {
 1550                                 st->flags &= ~ST_PER_ACTION;
 1551                                 return EIO;
 1552                         } else if (number < 0) {
 1553                                 if (st->flags & ST_AT_FILEMARK) {
 1554                                         /*
 1555                                          * Handling of ST_AT_FILEMARK
 1556                                          * in st_space will fill in the
 1557                                          * right file mark count.
 1558                                          */
 1559                                         error = st_space(st, 0, SP_FILEMARKS,
 1560                                                 flags);
 1561                                         if (error)
 1562                                                 return error;
 1563                                 }
 1564                                 if (st->flags & ST_BLANK_READ) {
 1565                                         st->flags &= ~ST_BLANK_READ;
 1566                                         return EIO;
 1567                                 }
 1568                                 st->flags &= ~ST_EIO_PENDING;
 1569                         }
 1570                 }
 1571                 break;
 1572         case SP_FILEMARKS:
 1573                 if (st->flags & ST_EIO_PENDING) {
 1574                         if (number > 0) {
 1575                                 /* pretend we just discovered the error */
 1576                                 st->flags &= ~ST_EIO_PENDING;
 1577                                 return EIO;
 1578                         } else if (number < 0) {
 1579                                 /* back away from the error */
 1580                                 st->flags &= ~ST_EIO_PENDING;
 1581                         }
 1582                 }
 1583                 if (st->flags & ST_AT_FILEMARK) {
 1584                         st->flags &= ~ST_AT_FILEMARK;
 1585                         number--;
 1586                 }
 1587                 if ((st->flags & ST_BLANK_READ) && (number < 0)) {
 1588                         /* back away from unwritten tape */
 1589                         st->flags &= ~ST_BLANK_READ;
 1590                         number++;       /* XXX dubious */
 1591                 }
 1592                 break;
 1593         case SP_EOM:
 1594                 if (st->flags & ST_EIO_PENDING) {
 1595                         /* pretend we just discovered the error */
 1596                         st->flags &= ~ST_EIO_PENDING;
 1597                         return EIO;
 1598                 }
 1599                 if (st->flags & ST_AT_FILEMARK)
 1600                         st->flags &= ~ST_AT_FILEMARK;
 1601                 break;
 1602         }
 1603         if (number == 0)
 1604                 return 0;
 1605 
 1606         bzero(&cmd, sizeof(cmd));
 1607         cmd.opcode = SPACE;
 1608         cmd.byte2 = what;
 1609         _lto3b(number, cmd.number);
 1610 
 1611         error = scsi_scsi_cmd(st->sc_link, (struct scsi_generic *) &cmd,
 1612             sizeof(cmd), 0, 0, 0, ST_SPC_TIME, NULL, flags);
 1613 
 1614         if (error != 0) {
 1615                 st->media_fileno = -1;
 1616                 st->media_blkno = -1;
 1617         } else {
 1618                 switch (what) {
 1619                 case SP_BLKS:
 1620                         if (st->media_blkno != -1) {
 1621                                 st->media_blkno += number;
 1622                                 if (st->media_blkno < 0)
 1623                                         st->media_blkno = -1;
 1624                         }
 1625                         break;
 1626                 case SP_FILEMARKS:
 1627                         if (st->media_fileno != -1) {
 1628                                 st->media_fileno += number;
 1629                                 st->media_blkno = 0;
 1630                         }
 1631                         break;
 1632                 default:
 1633                         st->media_fileno = -1;
 1634                         st->media_blkno = -1;
 1635                         break;
 1636                 }
 1637         }
 1638 
 1639         return (error);
 1640 }
 1641 
 1642 /*
 1643  * write N filemarks
 1644  */
 1645 int
 1646 st_write_filemarks(st, number, flags)
 1647         struct st_softc *st;
 1648         int flags;
 1649         int number;
 1650 {
 1651         struct scsi_write_filemarks cmd;
 1652         int error;
 1653 
 1654         /*
 1655          * It's hard to write a negative number of file marks.
 1656          * Don't try.
 1657          */
 1658         if (number < 0)
 1659                 return EINVAL;
 1660         switch (number) {
 1661         case 0:         /* really a command to sync the drive's buffers */
 1662                 break;
 1663         case 1:
 1664                 if (st->flags & ST_FM_WRITTEN)  /* already have one down */
 1665                         st->flags &= ~ST_WRITTEN;
 1666                 else
 1667                         st->flags |= ST_FM_WRITTEN;
 1668                 st->flags &= ~ST_PER_ACTION;
 1669                 break;
 1670         default:
 1671                 st->flags &= ~(ST_PER_ACTION | ST_WRITTEN);
 1672         }
 1673 
 1674         bzero(&cmd, sizeof(cmd));
 1675         cmd.opcode = WRITE_FILEMARKS;
 1676         _lto3b(number, cmd.number);
 1677 
 1678         error = scsi_scsi_cmd(st->sc_link, (struct scsi_generic *) &cmd,
 1679             sizeof(cmd), 0, 0, 0, ST_IO_TIME * 4, NULL, flags);
 1680 
 1681         if (error != 0) {
 1682                 st->media_fileno = -1;
 1683                 st->media_blkno = -1;
 1684         } else if (st->media_fileno != -1) {
 1685                 st->media_fileno += number;
 1686                 st->media_blkno = 0;
 1687         }
 1688 
 1689         return (error);
 1690 }
 1691 
 1692 /*
 1693  * Make sure the right number of file marks is on tape if the
 1694  * tape has been written.  If the position argument is true,
 1695  * leave the tape positioned where it was originally.
 1696  *
 1697  * nmarks returns the number of marks to skip (or, if position
 1698  * true, which were skipped) to get back original position.
 1699  */
 1700 int
 1701 st_check_eod(st, position, nmarks, flags)
 1702         struct st_softc *st;
 1703         int position;
 1704         int *nmarks;
 1705         int flags;
 1706 {
 1707         int error;
 1708 
 1709         switch (st->flags & (ST_WRITTEN | ST_FM_WRITTEN | ST_2FM_AT_EOD)) {
 1710         default:
 1711                 *nmarks = 0;
 1712                 return 0;
 1713         case ST_WRITTEN:
 1714         case ST_WRITTEN | ST_FM_WRITTEN | ST_2FM_AT_EOD:
 1715                 *nmarks = 1;
 1716                 break;
 1717         case ST_WRITTEN | ST_2FM_AT_EOD:
 1718                 *nmarks = 2;
 1719         }
 1720         error = st_write_filemarks(st, *nmarks, flags);
 1721         if (position && !error)
 1722                 error = st_space(st, -*nmarks, SP_FILEMARKS, flags);
 1723         return error;
 1724 }
 1725 
 1726 /*
 1727  * load/unload/retension
 1728  */
 1729 int
 1730 st_load(st, type, flags)
 1731         struct st_softc *st;
 1732         u_int type;
 1733         int flags;
 1734 {
 1735         struct scsi_load cmd;
 1736 
 1737         st->media_fileno = -1;
 1738         st->media_blkno = -1;
 1739 
 1740         if (type != LD_LOAD) {
 1741                 int error;
 1742                 int nmarks;
 1743 
 1744                 error = st_check_eod(st, FALSE, &nmarks, flags);
 1745                 if (error)
 1746                         return error;
 1747         }
 1748         if (st->quirks & ST_Q_IGNORE_LOADS) {
 1749                 if (type == LD_LOAD) {
 1750                         /*
 1751                          * If we ignore loads, at least we should try a rewind.
 1752                          */
 1753                         return st_rewind(st, 0, flags);
 1754                 }
 1755                 return (0);
 1756         }
 1757 
 1758 
 1759         bzero(&cmd, sizeof(cmd));
 1760         cmd.opcode = LOAD;
 1761         cmd.how = type;
 1762 
 1763         return scsi_scsi_cmd(st->sc_link, (struct scsi_generic *) &cmd,
 1764             sizeof(cmd), 0, 0, ST_RETRIES, ST_SPC_TIME, NULL, flags);
 1765 }
 1766 
 1767 /*
 1768  *  Rewind the device
 1769  */
 1770 int
 1771 st_rewind(st, immediate, flags)
 1772         struct st_softc *st;
 1773         u_int immediate;
 1774         int flags;
 1775 {
 1776         struct scsi_rewind cmd;
 1777         int error;
 1778         int nmarks;
 1779 
 1780         error = st_check_eod(st, FALSE, &nmarks, flags);
 1781         if (error)
 1782                 return error;
 1783         st->flags &= ~ST_PER_ACTION;
 1784 
 1785         bzero(&cmd, sizeof(cmd));
 1786         cmd.opcode = REWIND;
 1787         cmd.byte2 = immediate;
 1788 
 1789         error = scsi_scsi_cmd(st->sc_link, (struct scsi_generic *) &cmd,
 1790             sizeof(cmd), 0, 0, ST_RETRIES,
 1791             immediate ? ST_CTL_TIME: ST_SPC_TIME, NULL, flags);
 1792 
 1793         if (error == 0) {
 1794                 st->media_fileno = 0;
 1795                 st->media_blkno = 0;
 1796         }
 1797 
 1798         return (error);
 1799 }
 1800 
 1801 /*
 1802  * Look at the returned sense and act on the error and detirmine
 1803  * The unix error number to pass back... (0 = report no error)
 1804  *                            (-1 = continue processing)
 1805  */
 1806 int
 1807 st_interpret_sense(xs)
 1808         struct scsi_xfer *xs;
 1809 {
 1810         struct scsi_sense_data *sense = &xs->sense;
 1811         struct scsi_link *sc_link = xs->sc_link;
 1812         struct st_softc *st = sc_link->device_softc;
 1813         struct buf *bp = xs->bp;
 1814         u_int8_t serr = sense->error_code & SSD_ERRCODE;
 1815         u_int8_t skey = sense->flags & SSD_KEY;
 1816         int32_t info;
 1817 
 1818         if (((sc_link->flags & SDEV_OPEN) == 0) ||
 1819             (serr != SSD_ERRCODE_CURRENT && serr != SSD_ERRCODE_DEFERRED))
 1820                 return (EJUSTRETURN); /* let the generic code handle it */
 1821 
 1822         switch (skey) {
 1823 
 1824         /*
 1825          * We do custom processing in st for the unit becoming ready case.
 1826          * in this case we do not allow xs->retries to be decremented
 1827          * only on the "Unit Becoming Ready" case. This is because tape
 1828          * drives report "Unit Becoming Ready" when loading media, etc.
 1829          * and can take a long time.  Rather than having a massive timeout 
 1830          * for all operations (which would cause other problems) we allow
 1831          * operations to wait (but be interruptable with Ctrl-C) forever
 1832          * as long as the drive is reporting that it is becoming ready.
 1833          * all other cases are handled as per the default.
 1834          */
 1835 
 1836         case SKEY_NOT_READY:
 1837                 if ((xs->flags & SCSI_IGNORE_NOT_READY) != 0)
 1838                         return (0);
 1839                 switch (ASC_ASCQ(sense)) {
 1840                 case SENSE_NOT_READY_BECOMING_READY:
 1841                         SC_DEBUG(sc_link, SDEV_DB1, ("not ready: busy (%#x)\n",
 1842                             sense->add_sense_code_qual));
 1843                         /* don't count this as a retry */
 1844                         xs->retries++;
 1845                         return (scsi_delay(xs, 1));
 1846                 default:
 1847                         return (EJUSTRETURN);
 1848         }
 1849         case SKEY_NO_SENSE:
 1850         case SKEY_RECOVERED_ERROR:
 1851         case SKEY_MEDIUM_ERROR:
 1852         case SKEY_VOLUME_OVERFLOW:
 1853         case SKEY_BLANK_CHECK:
 1854                 break;
 1855         default:
 1856                 return (EJUSTRETURN);
 1857         }
 1858 
 1859         /*
 1860          * Get the sense fields and work out what code
 1861          */
 1862         if (sense->error_code & SSD_ERRCODE_VALID)
 1863                 info = _4btol(sense->info);
 1864         else
 1865                 info = xs->datalen;     /* bad choice if fixed blocks */
 1866         if (st->flags & ST_FIXEDBLOCKS) {
 1867                 xs->resid = info * st->blksize;
 1868                 if (sense->flags & SSD_EOM) {
 1869                         st->flags |= ST_EIO_PENDING;
 1870                         if (bp)
 1871                                 bp->b_resid = xs->resid;
 1872                 }
 1873                 if (sense->flags & SSD_FILEMARK) {
 1874                         st->flags |= ST_AT_FILEMARK;
 1875                         if (st->media_fileno != -1) {
 1876                                 st->media_fileno++;
 1877                                 st->media_blkno = 0;
 1878                         }
 1879                         if (bp)
 1880                                 bp->b_resid = xs->resid;
 1881                 }
 1882                 if (sense->flags & SSD_ILI) {
 1883                         st->flags |= ST_EIO_PENDING;
 1884                         if (bp)
 1885                                 bp->b_resid = xs->resid;
 1886                         if (sense->error_code & SSD_ERRCODE_VALID &&
 1887                             (xs->flags & SCSI_SILENT) == 0)
 1888                                 printf("%s: block wrong size, %d blocks residual\n",
 1889                                     st->sc_dev.dv_xname, info);
 1890 
 1891                         /*
 1892                          * This quirk code helps the drive read
 1893                          * the first tape block, regardless of
 1894                          * format.  That is required for these
 1895                          * drives to return proper MODE SENSE
 1896                          * information.
 1897                          */
 1898                         if ((st->quirks & ST_Q_SENSE_HELP) &&
 1899                             !(sc_link->flags & SDEV_MEDIA_LOADED))
 1900                                 st->blksize -= 512;
 1901                 }
 1902                 /*
 1903                  * If no data was transferred, return immediately
 1904                  */
 1905                 if (xs->resid >= xs->datalen) {
 1906                         if (st->flags & ST_EIO_PENDING)
 1907                                 return EIO;
 1908                         if (st->flags & ST_AT_FILEMARK) {
 1909                                 if (bp)
 1910                                         bp->b_resid = xs->resid;
 1911                                 return 0;
 1912                         }
 1913                 }
 1914         } else {                /* must be variable mode */
 1915                 xs->resid = xs->datalen;        /* to be sure */
 1916                 if (sense->flags & SSD_EOM)
 1917                         return EIO;
 1918                 if (sense->flags & SSD_FILEMARK) {
 1919                         if (st->media_fileno != -1) {
 1920                                 st->media_fileno++;
 1921                                 st->media_blkno = 0;
 1922                         }
 1923                         if (bp)
 1924                                 bp->b_resid = bp->b_bcount;
 1925                         return 0;
 1926                 }
 1927                 if (sense->flags & SSD_ILI) {
 1928                         if (info < 0) {
 1929                                 /*
 1930                                  * the record was bigger than the read
 1931                                  */
 1932                                 if ((xs->flags & SCSI_SILENT) == 0)
 1933                                         printf("%s: %d-byte record too big\n",
 1934                                             st->sc_dev.dv_xname,
 1935                                             xs->datalen - info);
 1936                                 return (EIO);
 1937                         } else if (info > xs->datalen) {
 1938                                 /*
 1939                                  * huh? the residual is bigger than the request
 1940                                  */
 1941                                 if ((xs->flags & SCSI_SILENT) == 0) {
 1942                                         printf(
 1943                                             "%s: bad residual %d out of %d\n",
 1944                                             st->sc_dev.dv_xname, info,
 1945                                             xs->datalen);
 1946                                         return (EIO);
 1947                                 }
 1948                         }
 1949                         xs->resid = info;
 1950                         if (bp)
 1951                                 bp->b_resid = info;
 1952                         return (0);
 1953                 }
 1954         }
 1955 
 1956         if (skey == SKEY_BLANK_CHECK) {
 1957                 /*
 1958                  * This quirk code helps the drive read the first tape block,
 1959                  * regardless of format.  That is required for these drives to
 1960                  * return proper MODE SENSE information.
 1961                  */
 1962                 if ((st->quirks & ST_Q_SENSE_HELP) &&
 1963                     !(sc_link->flags & SDEV_MEDIA_LOADED)) {
 1964                         /* still starting */
 1965                         st->blksize -= 512;
 1966                 } else if (!(st->flags & (ST_2FM_AT_EOD | ST_BLANK_READ))) {
 1967                         st->flags |= ST_BLANK_READ;
 1968                         xs->resid = xs->datalen;
 1969                         if (bp) {
 1970                                 bp->b_resid = xs->resid;
 1971                                 /* return an EOF */
 1972                         }
 1973                         return (0);
 1974                 }
 1975         }
 1976 
 1977         return (EJUSTRETURN);
 1978 }
 1979 
 1980 /*
 1981  * The quirk here is that the drive returns some value to st_mode_sense
 1982  * incorrectly until the tape has actually passed by the head.
 1983  *
 1984  * The method is to set the drive to large fixed-block state (user-specified
 1985  * density and 1024-byte blocks), then read and rewind to get it to sense the
 1986  * tape.  If that doesn't work, try 512-byte fixed blocks.  If that doesn't
 1987  * work, as a last resort, try variable- length blocks.  The result will be
 1988  * the ability to do an accurate st_mode_sense.
 1989  *
 1990  * We know we can do a rewind because we just did a load, which implies rewind.
 1991  * Rewind seems preferable to space backward if we have a virgin tape.
 1992  *
 1993  * The rest of the code for this quirk is in ILI processing and BLANK CHECK
 1994  * error processing, both part of st_interpret_sense.
 1995  */
 1996 int
 1997 st_touch_tape(st)
 1998         struct st_softc *st;
 1999 {
 2000         char *buf;
 2001         int readsize;
 2002         int error;
 2003 
 2004         buf = malloc(1024, M_TEMP, M_NOWAIT);
 2005         if (!buf)
 2006                 return ENOMEM;
 2007 
 2008         if ((error = st_mode_sense(st, 0)) != 0)
 2009                 goto bad;
 2010         st->blksize = 1024;
 2011         do {
 2012                 switch (st->blksize) {
 2013                 case 512:
 2014                 case 1024:
 2015                         readsize = st->blksize;
 2016                         st->flags |= ST_FIXEDBLOCKS;
 2017                         break;
 2018                 default:
 2019                         readsize = 1;
 2020                         st->flags &= ~ST_FIXEDBLOCKS;
 2021                 }
 2022                 if ((error = st_mode_select(st, 0)) != 0)
 2023                         goto bad;
 2024                 st_read(st, buf, readsize, SCSI_SILENT);        /* XXX */
 2025                 if ((error = st_rewind(st, 0, 0)) != 0) {
 2026 bad:                    free(buf, M_TEMP);
 2027                         return error;
 2028                 }
 2029         } while (readsize != 1 && readsize > st->blksize);
 2030 
 2031         free(buf, M_TEMP);
 2032         return 0;
 2033 }
 2034 
 2035 int
 2036 stdump(dev, blkno, va, size)
 2037         dev_t dev;
 2038         daddr64_t blkno;
 2039         caddr_t va;
 2040         size_t size;
 2041 {
 2042 
 2043         /* Not implemented. */
 2044         return ENXIO;
 2045 }

/* [<][>][^][v][top][bottom][index][help] */