[U-Boot] [PATCH v6] cmd: usb: ignore blk, emulation devices in usb tree/info display
Suneel Garapati
suneelglinux at gmail.com
Thu Oct 19 08:03:01 UTC 2017
On Thu, Oct 19, 2017 at 12:33 AM, Marek Vasut <marex at denx.de> wrote:
> 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 ...
drivers/usb/emul/Kconfig - usb_emul depends on sandbox.
I dont see any machine config using it.
I believe USB_EMUL devices were being ignored before this patch, not sure if
the expectation has changed now.
Anyway, with the change to call only usb_xxx classes this should go
away in description.
>
>>> 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 ?
May work, I will test and send v7
Regards,
Suneel
>
>>>> 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