mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-18 13:11:31 +00:00
Merge git://git.denx.de/u-boot-usb
This commit is contained in:
commit
8f005b3918
2 changed files with 25 additions and 5 deletions
11
common/usb.c
11
common/usb.c
|
@ -34,7 +34,7 @@
|
|||
#include <asm/byteorder.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <compiler.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <usb.h>
|
||||
#ifdef CONFIG_4xx
|
||||
#include <asm/4xx_pci.h>
|
||||
|
@ -60,6 +60,7 @@ int usb_init(void)
|
|||
void *ctrl;
|
||||
struct usb_device *dev;
|
||||
int i, start_index = 0;
|
||||
int ret;
|
||||
|
||||
dev_index = 0;
|
||||
asynch_allowed = 1;
|
||||
|
@ -75,7 +76,13 @@ int usb_init(void)
|
|||
for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++) {
|
||||
/* init low_level USB */
|
||||
printf("USB%d: ", i);
|
||||
if (usb_lowlevel_init(i, USB_INIT_HOST, &ctrl)) {
|
||||
ret = usb_lowlevel_init(i, USB_INIT_HOST, &ctrl);
|
||||
if (ret == -ENODEV) { /* No such device. */
|
||||
puts("Port not available.\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ret) { /* Other error. */
|
||||
puts("lowlevel init failed\n");
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -209,9 +209,22 @@ int hub_port_reset(struct usb_device *dev, int port,
|
|||
(portstatus & USB_PORT_STAT_CONNECTION) ? 1 : 0,
|
||||
(portstatus & USB_PORT_STAT_ENABLE) ? 1 : 0);
|
||||
|
||||
if ((portchange & USB_PORT_STAT_C_CONNECTION) ||
|
||||
!(portstatus & USB_PORT_STAT_CONNECTION))
|
||||
return -1;
|
||||
/*
|
||||
* Perhaps we should check for the following here:
|
||||
* - C_CONNECTION hasn't been set.
|
||||
* - CONNECTION is still set.
|
||||
*
|
||||
* Doing so would ensure that the device is still connected
|
||||
* to the bus, and hasn't been unplugged or replaced while the
|
||||
* USB bus reset was going on.
|
||||
*
|
||||
* However, if we do that, then (at least) a San Disk Ultra
|
||||
* USB 3.0 16GB device fails to reset on (at least) an NVIDIA
|
||||
* Tegra Jetson TK1 board. For some reason, the device appears
|
||||
* to briefly drop off the bus when this second bus reset is
|
||||
* executed, yet if we retry this loop, it'll eventually come
|
||||
* back after another reset or two.
|
||||
*/
|
||||
|
||||
if (portstatus & USB_PORT_STAT_ENABLE)
|
||||
break;
|
||||
|
|
Loading…
Add table
Reference in a new issue