netbsd-bugs@netbsd.org
[Top] [All Lists]

Re: kern/37403

Subject: Re: kern/37403
From: Jesse Peterson
Date: Thu, 22 Oct 2009 23:45:02 +0000 UTC
The following reply was made to PR kern/37403; it has been noted by GNATS.

From: Jesse Peterson <jpeterson275@xxxxxxxxxxx>
To: gnats-bugs@xxxxxxxxxx
Cc: 
Subject: Re: kern/37403
Date: Thu, 22 Oct 2009 16:40:47 -0700

 After looking into this even more I've come to the conclusion that this drive
 has some quirks. The major quirk that this PR is about is its odd MODE SELECT
 block size handling. Basically one cannot set the block size to 0 (variable-
 block mode) in the MODE SELECT. One receives a CHECK CONDITION. However within
 the drive's READ BLOCK LIMITs (2 <= blksize <= 16777215) you can change the
 drive's blocking size.
 
 That said the st(4) drive makes an assumption/guess on variable sized blocks
 at the end of the open() call. Which of course fails and since one needs to
 open the device to ioctl() to change the block size there's a bit of a catch-
 22 in there. So the I made a patch, below, which adds a quirk to use the 
drive's
 MODE SENSEd media block size instead of guessing variable block size.
 
 Perhaps a better approach would be to try variable then fall-back on media-size
 (which has the possibility of working not just for this quirky drive but others
 with similar problems). I have a vision of a one-day unified SCSI/ATAPI tape
 driver. :)
 
 The manual (which describes the drive's ATAPI command interface and of most
 interest its description of the MODE SENSE and MODE SELECT commands) says that
 the drive should support a zero blocksize (variable) setting and together with
 the "fixed" bit in the READ/WRITE CDBs should be enough to use it. However
 we get CHECK CONDITIONs when I try to set it. This happens over USB Bulk-Only
 and IEEE 1394 SBP-2, so I doubt it would be any different when ATAPI-attached.
 
 Manual linked here:
 http://sony.storagesupport.com/node/394
 
 
 See also related PR kern/42214.
 
 Patch: 
 
 --- st.c.orig  2008-11-19 18:50:27.000000000 -0800
 +++ st.c       2009-10-22 16:34:41.000000000 -0700
 @@ -306,6 +306,13 @@
                {0, 0, 0},                             /* minor 8-11 */
                {0, 0, 0}                              /* minor 12-15 */
        }}},
 +      {{T_SEQUENTIAL, T_REMOV,
 +       "SONY", "SDX-420C", "0103"},     {ST_Q_BLKMEDIA, 0, {
 +              {0, 0, 0},                             /* minor 0-3 */
 +              {0, 0, 0},                             /* minor 4-7 */
 +              {0, 0, 0},                             /* minor 8-11 */
 +              {0, 0, 0}                              /* minor 12-15 */
 +      }}},
  };
  
  #define NOEJECT 0
 @@ -1020,14 +1027,24 @@
                    ("Used media_blksize of %d\n", st->media_blksize));
                goto done;
        }
 -      /*
 -       * We're getting no hints from any direction.  Choose variable-
 -       * length blocks arbitrarily.
 -       */
 -      st->flags &= ~ST_FIXEDBLOCKS;
 -      st->blksize = 0;
 -      SC_DEBUG(st->sc_periph, SCSIPI_DB3,
 -          ("Give up and default to variable mode\n"));
 +      else if (st->quirks & ST_Q_BLKMEDIA)
 +      {
 +              st->flags |= ST_FIXEDBLOCKS;
 +              st->blksize = st->media_blksize;
 +              SC_DEBUG(st->sc_periph, SCSIPI_DB3,
 +                      ("Used media_blksize of %d\n", st->media_blksize));
 +      }
 +      else
 +      {
 +              /*
 +               * We're getting no hints from any direction.  Choose variable-
 +               * length blocks arbitrarily.
 +               */
 +              st->flags &= ~ST_FIXEDBLOCKS;
 +              st->blksize = 0;
 +              SC_DEBUG(st->sc_periph, SCSIPI_DB3,
 +                      ("Give up and default to variable mode\n"));
 +      }
  
  done:
        /*
 --- stvar.h.orig       2008-04-28 13:23:58.000000000 -0700
 +++ stvar.h    2009-10-22 16:35:17.000000000 -0700
 @@ -79,6 +79,7 @@
  #define       ST_Q_NOPREVENT          0x0020  /* does not support PREVENT */
  #define       ST_Q_ERASE_NOIMM        0x0040  /* drive rejects ERASE/w Immed 
bit */
  #define       ST_Q_NOFILEMARKS        0x0080  /* can only write 0 filemarks */
 +#define       ST_Q_BLKMEDIA           0x0100  /* try the media/sense block 
size */
        u_int page_0_size;
  #define       MAX_PAGE_0_SIZE 64
        struct modes modes[4];
 

<Prev in Thread] Current Thread [Next in Thread>