Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 2 Feb 2020 14:13:40 +0100
From:      Warner Losh <imp@bsdimp.com>
To:        denverh@comcast.net
Cc:        Hans Petter Selasky <hps@selasky.org>, "freebsd-usb@FreeBSD.org" <freebsd-usb@freebsd.org>
Subject:   Re: Timeouts during initial Mode Sense commands
Message-ID:  <CANCZdfpCKvRQx4-h61zEVeSUV3fu2n1hoCiM=VySgGCqEgQiJA@mail.gmail.com>
In-Reply-To: <079c989a-5d45-df1f-ed48-15cdd8c8f194@comcast.net>
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> <079c989a-5d45-df1f-ed48-15cdd8c8f194@comcast.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Feb 2, 2020 at 12:32 PM Denver Hull <denverh@comcast.net> wrote:

> 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.
>

There's a DA_Q_NO_6_BYTE quirk, but that does rather the opposite of what I
think is needed here.

and we use it here:

         * RBC devices don't have to support READ(6), only READ(10).
         */
        if (softc->quirks & DA_Q_NO_6_BYTE || SID_TYPE(&cgd->inq_data) ==
T_RBC)
                softc->minimum_cmd_size = 10;
        else
                softc->minimum_cmd_size = 6;

but there's a way  to override:

         * Load the user's default, if any.
         */
        snprintf(tmpstr, sizeof(tmpstr), "kern.cam.da.%d.minimum_cmd_size",
                 periph->unit_number);
        TUNABLE_INT_FETCH(tmpstr, &softc->minimum_cmd_size);

so you could try setting the tunable kern.cam.da.X.minimum_cmd_size="6" in
/boot/loader.conf (where X is the drive the system assigns) and see if that
changes the wireshark output  to be closer to Linux or not...

I'm unsure if we have a direct way to ask if it's RBC or not...

Warner



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CANCZdfpCKvRQx4-h61zEVeSUV3fu2n1hoCiM=VySgGCqEgQiJA>