NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/37403: USB tape drive Illegal Requests for any use



The following reply was made to PR kern/37403; it has been noted by GNATS.

From: Jesse Peterson <jpeterson275%comcast.net@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: Manuel Bouyer <bouyer%antioche.eu.org@localhost>, 
kern-bug-people%netbsd.org@localhost,
 gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost
Subject: Re: kern/37403: USB tape drive Illegal Requests for any use
Date: Mon, 19 Oct 2009 09:25:22 -0700

 After finally getting a chance to pick this up again I've found an (ugly) 
solution to this issue.
 
 The problem in the logs here seem to indicate a SCSI error when attempting to 
MODE SELECT. After some investigation into the details of that it eventually 
came to be that the block size was getting set to 0 and thus reported as such 
to the MODE SELECT SCSI command. I'm not sure if this is because the value is 
not between the allowed block size (2 <= blksize <= 16777215) or because the 
blksize is not changanble (the change mask a la PC field is not queried in the 
MODE SENSE) or what. What I do know is that the tape drive seems to start 
working great when this patch is applied:
 
 --- sys/dev/scsipi/st.c.orig   2008-11-19 18:50:27.000000000 -0800
 +++ sys/dev/scsipi/st.c        2009-10-19 08:48:50.000000000 -0700
 @@ -1024,10 +1024,24 @@
         * 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"));
 +       */
 +
 +      /* force block size */
 +      if (st->media_blksize > 0)
 +              st->flags |= ST_FIXEDBLOCKS;
 +      else
 +              st->flags &= ~ST_FIXEDBLOCKS;
 +      st->blksize = st->media_blksize;
 +      SC_DEBUG(st->sc_periph, SCSIPI_DB3,
 +              ("Give up and default to media_blksize of %d\n", 
st->media_blksize));
 +      goto done;
 +
 +      
  
  done:
        /*
 
 Which successfully does the MODE SELECT with the right block size (512 in this 
device's case).
 
 Now obviously this isn't good for all devices (as implemented in this patch) - 
just note that it works for this hardware. I'm not sure if this particular 
drive cannot do variable-sized blocks (in which case a drive quirk would work 
okay I think) or this is an artifact of the In-System ISD-300 ATAPI-to-USB SCSI 
over Bulk-Only adapter chip that this is using. I think it is the former 
because the same exact issue come ups when I use the drive over FireWire which 
uses an Oxford 911 IEEE1394 adapter chip (which also does SCSI over SBP-2).
 
 I think the right solution is to do a drive quirk only if the drive is not 
directly SCSI attached? While I couldn't find any definitive docs this is a 
somewhat modern drive (AIT-1) which makes me think variable blocks (0 size) 
shouldn't be a problem.
 
 P.S. As an aside why do ATAPI drives not do an actual MODE SELECT command? The 
function returns an error when it is attempted for ATAPI tape drive.
 


Home | Main Index | Thread Index | Old Index