mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 16:52:14 +02:00
usb: sandbox: Fix emulator device select logic in usb_emul_find_devnum()
Current emulator select logic in usb_emul_find_devnum() is to test the USB address. The USB address of the device being enumerated is initialized to zero at the beginning of the enumeration process in usb_setup_device(). At this point, the saved USB address in the platform data has not been assigned to any valid USB address either. This means: the logic will select an emulator device according to its sequence of declaring order in the device tree. Take test.dts for example, flash-stick@0 will be selected before flash-stick@1. But unfortunately such logic is wrong. In fact USB devices show up in a random order during the enumeration which means usb_emul_find_devnum() may be called on port 3 for keyb@3 before on port 0 for flash-stick@0. To fix this, we introduce a new emulator uclass specific platdata to store the USB device's port number on its parent hub, and update the logic to test the port number instead. Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
@@ -652,6 +652,18 @@ struct usb_bus_priv {
|
||||
bool companion;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct usb_emul_platdata - platform data about the USB emulator
|
||||
*
|
||||
* Given a USB emulator (UCLASS_USB_EMUL) 'dev', this is
|
||||
* dev_get_uclass_platdata(dev).
|
||||
*
|
||||
* @port1: USB emulator device port number on the parent hub
|
||||
*/
|
||||
struct usb_emul_platdata {
|
||||
int port1; /* Port number (numbered from 1) */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dm_usb_ops - USB controller operations
|
||||
*
|
||||
@@ -1023,14 +1035,16 @@ int usb_emul_int(struct udevice *emul, struct usb_device *udev,
|
||||
/**
|
||||
* usb_emul_find() - Find an emulator for a particular device
|
||||
*
|
||||
* Check @pipe to find a device number on bus @bus and return it.
|
||||
* Check @pipe and @port1 to find a device number on bus @bus and return it.
|
||||
*
|
||||
* @bus: USB bus (controller)
|
||||
* @pipe: Describes pipe being used, and includes the device number
|
||||
* @port1: Describes port number on the parent hub
|
||||
* @emulp: Returns pointer to emulator, or NULL if not found
|
||||
* @return 0 if found, -ve on error
|
||||
*/
|
||||
int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp);
|
||||
int usb_emul_find(struct udevice *bus, ulong pipe, int port1,
|
||||
struct udevice **emulp);
|
||||
|
||||
/**
|
||||
* usb_emul_find_for_dev() - Find an emulator for a particular device
|
||||
|
Reference in New Issue
Block a user