Timeouts during initial Mode Sense commands

Hans Petter Selasky hps at selasky.org
Fri Dec 20 13:26:53 UTC 2019


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



More information about the freebsd-usb mailing list