[U-Boot] [PATCH v6] cmd: usb: ignore blk, emulation devices in usb tree/info display

Marek Vasut marex at denx.de
Thu Oct 19 07:33:26 UTC 2017


On 10/19/2017 05:24 AM, Suneel Garapati wrote:
> On Wed, Oct 18, 2017 at 6:39 PM, Marek Vasut <marex at denx.de> wrote:
>> On 10/19/2017 03:22 AM, Suneel Garapati wrote:
>>> usb tree/info commands iterate over all usb uclass devices
>>> recursively. blk uclass child devices are created for mass storage,
>>> treating these as usb uclass devices and referencing usb config
>>> interface descriptors cause crash. To fix, ignore blk and usb_emul
>>> uclass devices(sandbox)
>>                  ^^^^^^^ what's this about ? USB_EMUL devices can be
>> enables elsewhere too, right ?
> Only disabled during the tree/info dump.

I don't understand this answer. Can USB_EMUL devices be enabled on any
other machine than sandbox or not ? I presume it can ...

>> Anyway, shouldn't you rather filter for positive matches (usb uclass
>> devices etc) , rather than filtering out a few negative matches (blk
>> etc) which might break in the future ?
> usb_for_each_root_dev does that but we dont have uclass_find_first_child_device
> to call on UCLASS_USB like uclass_find_first_device.
> So, device_find_first_child and check on uclass id is performed.

I mean, rather than doing
(device_get_uclass_id(child) != UCLASS_USB_xxx &&
device_get_uclass_id(child) != UCLASS_USB_yyy)
   dump

do

(device_get_uclass_id(child) == UCLASS_USB_nnn)
   dump

for nnn being only the relevant USB classes for which we actually want
to dump.

Does that work ?

>>> in usb_show_info and usb_tree_graph.
>>> also avoid addition of preamble for blk uclass child devices,
>>> otherwise tree dump gets messed up.
>>
>> Also, sentences start with capital letter. This should be in a separate
>> patch if it's a separate change ...
> Ignoring preamble and device should go together, hence cannot be
> separate change.
> 
> Regards,
> Suneel
>>
>>> Signed-off-by: Suneel Garapati <suneelglinux at gmail.com>
>>> Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
>>> Tested-by: Bin Meng <bmeng.cn at gmail.com>
>>> Reviewed-by: Simon Glass <sjg at chromium.org>
>>> ---
>>> Changes v6:
>>>  - re-write commit message with detail
>>> Changes v5:
>>>  - add usb_emul to ignore list in usb_show_info
>>>  - modify description
>>> Changes v4:
>>>  - do not set preamble if child is block device for mass storage
>>> Changes v3:
>>>  - remove 'check on parent uclass' in description
>>> Changes v2:
>>>  - remove check on parent uclass
>>> Changes v1:
>>>  - add separate check on blk uclass
>>>  - modify description
>>>  - add separate check on parent uclass as usb
>>>
>>>  cmd/usb.c | 22 +++++++++++++++++++---
>>>  1 file changed, 19 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/cmd/usb.c b/cmd/usb.c
>>> index d95bcf5..907debe 100644
>>> --- a/cmd/usb.c
>>> +++ b/cmd/usb.c
>>> @@ -349,6 +349,16 @@ static void usb_show_tree_graph(struct usb_device *dev, char *pre)
>>>       printf(" %s", pre);
>>>  #ifdef CONFIG_DM_USB
>>>       has_child = device_has_active_children(dev->dev);
>>> +     if (device_get_uclass_id(dev->dev) == UCLASS_MASS_STORAGE) {
>>> +             struct udevice *child;
>>> +
>>> +             for (device_find_first_child(dev->dev, &child);
>>> +                  child;
>>> +                  device_find_next_child(&child)) {
>>> +                     if (device_get_uclass_id(child) == UCLASS_BLK)
>>> +                             has_child = 0;
>>> +             }
>>> +     }
>>>  #else
>>>       /* check if the device has connected children */
>>>       int i;
>>> @@ -414,8 +424,12 @@ static void usb_show_tree_graph(struct usb_device *dev, char *pre)
>>>
>>>               udev = dev_get_parent_priv(child);
>>>
>>> -             /* Ignore emulators, we only want real devices */
>>> -             if (device_get_uclass_id(child) != UCLASS_USB_EMUL) {
>>> +             /*
>>> +              * Ignore emulators and block child devices, we only want
>>> +              * real devices
>>> +              */
>>> +             if ((device_get_uclass_id(child) != UCLASS_USB_EMUL) &&
>>> +                 (device_get_uclass_id(child) != UCLASS_BLK)) {
>>>                       usb_show_tree_graph(udev, pre);
>>>                       pre[index] = 0;
>>>               }
>>> @@ -605,7 +619,9 @@ static void usb_show_info(struct usb_device *udev)
>>>       for (device_find_first_child(udev->dev, &child);
>>>            child;
>>>            device_find_next_child(&child)) {
>>> -             if (device_active(child)) {
>>> +             if (device_active(child) &&
>>> +                 (device_get_uclass_id(child) != UCLASS_USB_EMUL) &&
>>> +                 (device_get_uclass_id(child) != UCLASS_BLK)) {
>>>                       udev = dev_get_parent_priv(child);
>>>                       usb_show_info(udev);
>>>               }
>>>
>>
>>
>> --
>> Best regards,
>> Marek Vasut


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list