summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorStefan Brüns <stefan.bruens@rwth-aachen.de>2015-12-22 01:21:04 +0100
committerMarek Vasut <marex@denx.de>2015-12-31 16:16:30 +0100
commitac3abf0b7d3a0c59a8a6697efbe9187692f199f0 (patch)
tree4246cad490dd372a3c84d4fa0b6dbe45ae7b45e8 /drivers/usb
parentfaa7db24a4b6c1b645dec312a16574442d5adde2 (diff)
downloadu-boot-imx-ac3abf0b7d3a0c59a8a6697efbe9187692f199f0.zip
u-boot-imx-ac3abf0b7d3a0c59a8a6697efbe9187692f199f0.tar.gz
u-boot-imx-ac3abf0b7d3a0c59a8a6697efbe9187692f199f0.tar.bz2
usb: musb: Fix hub port setting for SPLIT transactions
The ifdef'ed Linux kernel code uses the 1 based port number, whereas U-Boot puts a 0 based port number into the register. The reason the 0 based port number apparently works can probably be taken from the USB 2.0 spec: 8.4.2.2 Start-Split Transaction Token ... The host must correctly set the port field for single and multiple TT hub implementations. A single TT hub implementation *may ignore* the port field. Actually, as far as I understand, a multi TT hub defaults to single TT (bAlternateSetting: 0) until switched via SetInterface, so even "port 42" would work. The change was verified by hardcoding the port number to a wrong value, SPLIT transactions kept working (although using a DWC2 instead of MUSB). Tested hubs are the RPi onboard SMC9514 and an external "05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB". The former is a multi TT hub, the latter single TT only. Addendum: Tested on sunxi/MUSB by Hans de Goede Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Tested-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/musb-new/musb_host.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/usb/musb-new/musb_host.c b/drivers/usb/musb-new/musb_host.c
index 70f8a99..2515447 100644
--- a/drivers/usb/musb-new/musb_host.c
+++ b/drivers/usb/musb-new/musb_host.c
@@ -2098,7 +2098,7 @@ int musb_urb_enqueue(
&hubaddr,
&portnr);
qh->h_addr_reg = hubaddr;
- qh->h_port_reg = portnr - 1;
+ qh->h_port_reg = portnr;
}
#endif
}