Warner Losh wrote:


On Sun, Feb 2, 2020 at 12:32 PM Denver Hull <[email protected] <mailto:[email protected]>> 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

Sorry about the long delay.  This sounded promising and I had high hopes for it, but it didn't help.  The difficulty begins before the da device is created.  It looks like once the initial 10 byte Mode Sense is issued the device becomes unresponsive and everything goes downhill from there.  That's clearly a problem with the device, but I'm pretty sure that on Linux it recovers if I send it a 10 byte Mode Sense.  When I get a chance I'll see if I can capture what Linux is doing to recover from that.

I've started looking at the boot code for these boards, which appears to be derived from Atmel's SAM-BA.  Two of the boards I have work fine, but they have a very old version of the bootloader.  I updated all the other boards with the latest version, but that didn't change anything.  At this point I'm still setting up something to be able to build that code.

Thanks,

Denver

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to "[email protected]"

Reply via email to