mirror of
https://github.com/linux-sunxi/u-boot-sunxi.git
synced 2024-02-12 11:16:03 +08:00
cmd: usb: ignore blk, emulation devices in usb tree/info display
Usb tree/info commands iterate over all usb uclass devices recursively. Blk uclass devices based on struct blk_desc are created for mass storage device, treating them as usb uclass devices based on struct usb_device and referencing usb config interface descriptors cause crash. To fix, ignore blk and usb_emul uclass devices in usb_show_info and usb_tree_graph. Also avoid addition of preamble for blk uclass child devices, otherwise tree dump gets messed up. Signed-off-by: Suneel Garapati <suneelglinux@gmail.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:

committed by
Marek Vasut

parent
93a51d301a
commit
abd7cedb19
22
cmd/usb.c
22
cmd/usb.c
@ -349,6 +349,16 @@ static void usb_show_tree_graph(struct usb_device *dev, char *pre)
|
|||||||
printf(" %s", pre);
|
printf(" %s", pre);
|
||||||
#ifdef CONFIG_DM_USB
|
#ifdef CONFIG_DM_USB
|
||||||
has_child = device_has_active_children(dev->dev);
|
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
|
#else
|
||||||
/* check if the device has connected children */
|
/* check if the device has connected children */
|
||||||
int i;
|
int i;
|
||||||
@ -414,8 +424,12 @@ static void usb_show_tree_graph(struct usb_device *dev, char *pre)
|
|||||||
|
|
||||||
udev = dev_get_parent_priv(child);
|
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);
|
usb_show_tree_graph(udev, pre);
|
||||||
pre[index] = 0;
|
pre[index] = 0;
|
||||||
}
|
}
|
||||||
@ -605,7 +619,9 @@ static void usb_show_info(struct usb_device *udev)
|
|||||||
for (device_find_first_child(udev->dev, &child);
|
for (device_find_first_child(udev->dev, &child);
|
||||||
child;
|
child;
|
||||||
device_find_next_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);
|
udev = dev_get_parent_priv(child);
|
||||||
usb_show_info(udev);
|
usb_show_info(udev);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user