Alex:

I was very pleased to get your message.  You are giving the driver a good 
workout!

On Tue, 2 Sep 2003, Alex Sanks wrote:

> Anyway, I've tried running it with a 2280 board attached to a Windows XP 
> host and ran into some problems.  I don't know if you've ever watched 
> what mass storage on Windows does, but it seems to always try to execute 
> SCSI command 0x23.  What this is, I have no idea (it's vendor specific 
> according to the SCSI spec)  In any case, naturally this command fails 
> and the endpoint is stalled and an INVALID COMMAND status is returned in 
> the CSW.  So far so good.
> 
> After the failed command, a REQUEST SENSE (0x03) command is called by 
> the host to see what happened.  Unfortuantely, for some reason, the CBW 
> is sent with bCBWCBLENGTH == 12, while the spec indicates command 0x03 
> is a 6 byte command.  I confirmed this is really happening with a CATC 
> trace.  Of course 12 != 6 so the device reports a phase error, resets, 
> and this repeats forever.  My driver simply didn't check if the lengths 
> were sane so I never encountered this problem, but it looks to me like 
> Windows isn't following the spec, although I haven't seen anyone else 
> mention this problem.  Disabling the cmnd_size == fsg->cmnd_size in 
> check_command gets around that (temporarily for testing purposes anyway)

I'll put in a test to allow for this special case.  See below.

>  From there I can partition the drive just fine and its state is 
> remembered when the device is disconnected.  Unfortunately, the 
> partitions won't format for me.  Odd, since the partition is created 
> just fine.  I'm not entirely sure why this is.  A trace show no obvious 
> errors (no stalling, resets, etc.).  And I can see a successful CSW 
> returned for the last CBW sent out.  But CBWs just stop coming for some 
> reason.
> 
> I tried formatting from Linux, but mkfs.msdos appeared to have hung.  
> Eventually I pulled the plug and switched it to a Windows host and saw 
> that it had formatted fine.  The last commands I see are disk reads, so 
> I have a feeling that the drive is getting formatted more or less 
> correctly, but something's failing when it's verifying the filesystem.  
> If I try to format it as ext2, it makes it past "writing inode tables" 
> but hangs on "writing superblocks and filesystem accounting information".

I'll try doing this with the dummy_hcd driver.  Up to now I've only tried 
ordinary filesystem reads and write, not format operations.

Later: it worked.  Of course, plenty of things that work okay with 
dummy_hcd can still fail with other drivers.

> Additionally, and I don't know if this is related or not, just after 
> enumeration I see a MODE SENSE requested with a page code of 0x1c.  This 
> stalls since it's an unhandled page code, and is followed by a REQUEST 
> SENSE.  Then a MODE SENSE with page_code=0x3f is sent.  It returns the 
> 16 bytes that it should and I see them on the USB.  But a CSW is never 
> sent and the device resets.  Here's a little except from syslog (it has 
> a few extra printks I put in to see what was going on, since I don't 
> know your code that well):

I wonder if the problem could be related to the size of the reply.  When a 
reply message is shorter than the host expects (which doesn't happen too 
often -- MODE-SENSE is one of the few cases where it does occur) the 
gadget driver sets the request->zero flag, telling the controller to send 
an extra 0-length packet if the reply is an exact multiple of the bulk-in 
endpoint's maxsize.  That's the only place the zero flag is set; maybe 
it's causing your problem?  You could try commenting out the line near the 
end of decode_scsi_cmnd() that says

                bh->inreq->zero = 1;

It might make a difference.

> file-storage gadget: SCSI command length = 10: 25 00 00 00 00 00 00 00 00 00
> file-storage gadget: SCSI command length = 6: 1a 00 1c 00 c0 00
> valid_page=0, page_code=0x1c
> !valid_page (0) || len (4) > limit (255), page_code=0x1c
> file-storage gadget: phase-error=0, reply=-22, stalling
> file-storage gadget: sending command-failure status 336896
> file-storage gadget: SCSI command length = 12: 03 00 00 00 12 00 00 00 
> 00 00 00 00
> SC_REQUEST_SENSE
> file-storage gadget: SCSI command length = 6: 1a 00 3f 00 c0 00
> valid_page=1, page_code=0x3f
> file-storage gadget: Returning 16
> net2280 0000:00:0e.0: disconnect file-storage
> file-storage gadget: bulk_out_complete --> -108, 0/31
> file-storage gadget: invalid CBW: status -108 len 0 sig f cmdlen 255
> file-storage gadget: reset config
> file-storage gadget: reset interface
> net2280 0000:00:0e.0: high speed
> net2280 0000:00:0e.0: disconnect file-storage
> net2280 0000:00:0e.0: high speed
> file-storage gadget: set interface 0
> net2280 0000:00:0e.0: enabled ep-a (ep1in-bulk) dma max 0200
> net2280 0000:00:0e.0: enabled ep-b (ep2out-bulk) dma max 0200

Given what you described, this looks about right -- except for the 
unwanted disconnect.  That could be the result of the controller driver 
getting confused somehow.

> Right now the disk file is pointed to a 100MB file dd'd from /dev/zero 
> (I don't have a spare drive to try in there).
> 
> I can provide you with a CATC trace of an attempted format, if you have 
> a way to view it (there is a free viewer for Windows available from 
> http://www.catc.com, but I don't know if there's a way to do it from Linux).
> 
> Anyway, I'll keep looking into these problems, but I've got several 
> things on my plate right now so I don't know how much help I can be, but 
> it'd be great if we can get this up and running.  It looks like it's 
> almost there.  Not bad at all, considering you've been doing this 
> without hardware!
> 
> regards,
> Alex Sanks
> NetChip Technology, Inc.

If my suggestion doesn't help, send the CATC trace.  I can use the free 
viewer, and maybe looking at it will help.

Thanks for your efforts on this!

Alan Stern


--- gadget-2.6/drivers/usb/gadget/file_storage.c.old    Tue Sep  2 11:47:43 2003
+++ gadget-2.6/drivers/usb/gadget/file_storage.c        Wed Sep  3 16:22:17 2003
@@ -1862,8 +1862,14 @@
        int     i;
        int     lun = fsg->cmnd[1] >> 5;
 
-       if (cmnd_size != fsg->cmnd_size)
-               goto illegal_command;
+       if (cmnd_size != fsg->cmnd_size) {
+
+               /* Special case workaround: MS-Windows issues REQUEST-SENSE
+                * with cbw->Length == 12 (it should be 6). */
+               if (!(fsg->cmnd[0] == SC_REQUEST_SENSE &&
+                               fsg->cmnd_size == 12))
+                       goto illegal_command;
+       }
 
        if (fsg->data_dir == DATA_DIR_UNKNOWN) {
                fsg->data_dir = data_dir;



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to