Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 Dec 2019 23:46:18 -0000
From:      Denver Hull <denverh@comcast.net>
To:        Hans Petter Selasky <hps@selasky.org>, freebsd-usb@freebsd.org
Subject:   Re: Timeouts during initial Mode Sense commands
Message-ID:  <079c989a-5d45-df1f-ed48-15cdd8c8f194@comcast.net>
In-Reply-To: <b8915704-fb28-662f-197c-923bd632f35e@selasky.org>
References:  <d842e49b-8f40-f5af-b8c3-3e23349be7ab@comcast.net> <be235eb1-d78f-0fb7-a3b9-23e82f9096a1@selasky.org> <98b6599e-5027-48c9-4230-47bc0f087180@comcast.net> <b8915704-fb28-662f-197c-923bd632f35e@selasky.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hans Petter Selasky wrote:
> On 2019-12-20 13:54, Denver Hull wrote:
>> Hans Petter Selasky wrote:
>>> On 2019-12-19 01:11, Denver Hull wrote:
>>>> Hello,
>>>>
>>>> I have several different microcontroller boards that are supposed 
>>>> to appear as storage devices when plugged in.  They work fine on 
>>>> Linux systems, but on FreeBSD 11.3 and 12.1 they don't show up at 
>>>> all. Here's what dmesg shows for one of them:
>>>>
>>>> ugen1.3: <Adafruit Industries LLC PyPortal> at usbus1
>>>> umodem0 on uhub1
>>>> umodem0: <CircuitPython CDC control> on usbus1
>>>> umodem0: data interface 1, has no CM over data, has no break
>>>> umass3 on uhub1
>>>> umass3: <CircuitPython Mass Storage> on usbus1
>>>> umass3:  SCSI over Bulk-Only; quirks = 0x0000
>>>> umass3:5:3: Attached to scbus5
>>>> uaudio0 on uhub1
>>>> uaudio0: <CircuitPython Audio> on usbus1
>>>> uaudio0: No playback.
>>>> uaudio0: No recording.
>>>> uaudio0: MIDI sequencer.
>>>> uaudio0: No HID volume keys found.
>>>> ums2 on uhub1
>>>> ums2: <CircuitPython HID> on usbus1
>>>> ums2: 16 buttons and [XYZ] coordinates ID=2
>>>> (da3:umass-sim3:3:0:0): got CAM status 0x44
>>>> (da3:umass-sim3:3:0:0): fatal error, failed to attach to device
>>>> g_access(944): provider da3 has error 6 set
>>>> g_access(944): provider da3 has error 6 set
>>>> g_access(944): provider da3 has error 6 set
>>>> g_access(944): provider da3 has error 6 set
>>>> g_access(944): provider da3 has error 6 set
>>>>
>>>> There's a definite delay after the last ums message.  I used 
>>>> camcontrol debug in single user mode on a bare 12.1 system to get a 
>>>> little more information about what was happening. It looks like the 
>>>> initial Inquiry and Test Unit Ready commands succeed, but the next 
>>>> Mode Sense command times out, as well as all subsequent commands. 
>>>> There are several seconds of inactivity between retries, and 
>>>> there's no sense data, so I'm assuming that indicates timeout.
>>>>
>>>> At this point I'm not sure how best to proceed to get these devices 
>>>> to work, so any help will be appreciated.
>>>>
>>>
>>> Did you try setting one or more quirks for these devices using 
>>> usbconfig?
>>>
>>> UQ_MSC_NO_TEST_UNIT_READY
>>> UQ_MSC_NO_RS_CLEAR_UA
>>> UQ_MSC_NO_START_STOP
>>> UQ_MSC_NO_GETMAXLUN
>>> UQ_MSC_NO_INQUIRY
>>> UQ_MSC_NO_INQUIRY_EVPD
>>> UQ_MSC_NO_PREVENT_ALLOW
>>> UQ_MSC_NO_SYNC_CACHE
>>> UQ_MSC_SHUTTLE_INIT
>>> UQ_MSC_ALT_IFACE_1
>>> UQ_MSC_FLOPPY_SPEED
>>> UQ_MSC_IGNORE_RESIDUE
>>> UQ_MSC_WRONG_CSWSIG
>>> UQ_MSC_RBC_PAD_TO_12
>>> UQ_MSC_READ_CAP_OFFBY1
>>> UQ_MSC_FORCE_SHORT_INQ
>>>
>>> If you run "usbdump -i usbusX -f Y -s 65536 -vvv" you might see the 
>>> last failing SCSI command. X.Y are numbers after ugen for your device.
>>>
>>> Likely your device has a software bug in its USB/SCSI 
>>> implementation, which is quite common unfortunately.
>>>
>>> --HPS
>>>
>> After I sent the previous message I did try 
>> UQ_MSC_NO_TEST_UNIT_READY. Although the system reports "quirks = 
>> 0001", the initial TUR is still being issued during the probe 
>> sequence.  I tried the usbdump command you suggested, and I can 
>> clearly see where the timeouts are, and frames that begin with "USBC" 
>> seem to contain a SCSI CDB.  But there's a lot of other stuff in 
>> between that I haven't been able to figure out, so I've attached a 
>> sample.  Hopefully it will help.
>>
>
> Hi,
>
> All the USBC's are raw SCSI commands, which use the following layout:
>
>> /* Command Block Wrapper */
>> typedef struct {
>>         uDWord  dCBWSignature;
>> #define CBWSIGNATURE    0x43425355
>>         uDWord  dCBWTag;
>>         uDWord  dCBWDataTransferLength;
>>         uByte   bCBWFlags;
>> #define CBWFLAGS_OUT    0x00
>> #define CBWFLAGS_IN     0x80
>>         uByte   bCBWLUN;
>>         uByte   bCDBLength;
>> #define CBWCDBLENGTH    16
>>         uByte   CBWCDB[CBWCDBLENGTH];
>> } __packed umass_bbb_cbw_t;
>
> We had a SoC to add support for the usbdump format to wireshark:
>
> https://wiki.freebsd.org/SummerOfCode2017/usbdump-wireshark
>
> You might find that useful.
>
> My first suspicion is that your device is not fully USB class 
> compliant, and that's why it is STALLING and failing to recover.
>
> --HPS
>
>
I checked on a Linux system, and the negotiation follows a slightly 
different pattern, but as far as I can see, the biggest difference is 
that Linux uses 6 byte Mode Sense commands instead of 10 byte.  I wonder 
if that's all that's making the device choke?  How hard would it be to 
change things to use 0x1a instead of 0x5a temporarily? Alternatively, I 
could see if I can figure out how to issue arbitrary SCSI commands on 
Linux.  I used to have something for that purpose that worked on a 
variety of platforms, but it's been ages since I needed it.  In any 
case, I'll attach the Linux wireshark trace.  The negotiation seems to 
begin at frame 2331.

Thanks,

Denver




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?079c989a-5d45-df1f-ed48-15cdd8c8f194>