[U-Boot] "usb storage" command issues

Simon Glass sjg at chromium.org
Wed Nov 29 13:08:12 UTC 2017


Hi Stefan,

On 28 November 2017 at 02:40, Stefan Roese <sr at denx.de> wrote:
> Hi Bin, Hi Simon,
>
> On 20.11.2017 16:38, Simon Glass wrote:
>>
>> On 20 November 2017 at 00:07, Bin Meng <bmeng.cn at gmail.com> wrote:
>>>
>>>
>>> Hi Stefan,
>>>
>>> On Wed, Sep 27, 2017 at 1:03 AM, Stefan Roese <sr at denx.de> wrote:
>>>>
>>>> Hi,
>>>>
>>>> I'm currently testing USB on my x86 platform. And noticed, that
>>>> the "usb storage" command does not work as expected:
>>>>
>>>> => usb reset
>>>> resetting USB...
>>>> USB0:   Register 7000820 NbrPorts 7
>>>> Starting the controller
>>>> USB XHCI 1.00
>>>> scanning bus 0 for devices... 5 USB Device(s) found
>>>>         scanning usb for storage devices... 1 Storage Device(s) found
>>>> => usb tree
>>>> USB device tree:
>>>>    1  Hub (5 Gb/s, 0mA)
>>>>    |  U-Boot XHCI Host Controller
>>>>    |
>>>>    +-2  Mass Storage (480 Mb/s, 224mA)
>>>>    |    SanDisk Ultra 4C530001010620110505
>>>>    |
>>>>    +-3  Hub (480 Mb/s, 0mA)
>>>>      |
>>>>      +-4  Hub (480 Mb/s, 100mA)
>>>>        |
>>>>        +-5  Hub (12 Mb/s, 100mA)
>>>>
>>>> => usb storage
>>>> Card did not respond to voltage select!
>>>> mmc_init: -95, time 28
>>>> No storage devices, perhaps not 'usb start'ed..?
>>>>
>>>>
>>>> While debugging I found, that usb_stor_info() calls
>>>> blk_first_device(IF_TYPE_USB, &dev)
>>>> which calls uclass_first_device(UCLASS_BLK, devp). With my current DM
>>>> tree:
>>>>
>>>> => dm tree
>>>>   Class       Probed   Name
>>>> ----------------------------------------
>>>>   root        [ + ]    root_driver
>>>> ...
>>>>   mmc         [ + ]    |   |-- pci_mmc
>>>>   blk         [   ]    |   |   `-- pci_mmc.blk
>>>>   mmc         [ + ]    |   |-- pci_mmc
>>>>   blk         [   ]    |   |   `-- pci_mmc.blk
>>>>
>>>>
>>>> the first BLK device is a MMC device. With uclass_first_device() its
>>>> probe function is called here, which fails in this case. Resulting in
>>>> an abort for the loop over all BLK devices.
>>>>
>>>> How should this be handled for the "usb storage" command. Probing
>>>> all BLK devices while running this command seems a bit too much.
>>>>
>>>> Any suggestions on how to fix this?
>>>>
>>>
>>> Sorry I missed this before. Is it still broken in current mainline?
>
>
> Finally I'm getting back to this issue. And yes, its still broken in
> mainline.
>
>> Me too.
>>
>> Probing the block device should call mmc_blk_probe() which should call
>> mmc_init(), etc. I'm not sure what is going wrong there?
>
>
> The problem is, that *all* block devices are probed with the "usb
> storage" command, including MMC devices, which come first in my DM tree.
> As the first MMC device is not available, this command stops here with
> the error listed above.
>
> IMHO, "usb storage" should only list the USB block devices. Not sure,
> if this ever worked with DM USB enabled.

I think there is a problem in blk_first_device() and
blk_next_device(). They use uclass_first/next_device() to iterate
through the block devices, but those functions probe each device they
find, even if not a USB device.

The fix is to adjust blk_first/next_device() to use
uclass_find_first/next_device() instead, and then only probe the ones
that need to be returned.

Regards,
Simon


More information about the U-Boot mailing list