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:
		
							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); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue