Merge branch 'master' of git://git.denx.de/u-boot-usb
This commit is contained in:
commit
2aa4c57a10
@ -387,7 +387,7 @@ int do_usbboot(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
|
||||
dev = simple_strtoul(boot_device, &ep, 16);
|
||||
stor_dev = usb_stor_get_dev(dev);
|
||||
if (stor_dev->type == DEV_TYPE_UNKNOWN) {
|
||||
if (stor_dev == NULL || stor_dev->type == DEV_TYPE_UNKNOWN) {
|
||||
printf("\n** Device %d not available\n", dev);
|
||||
return 1;
|
||||
}
|
||||
@ -595,8 +595,10 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
if (strncmp(argv[1], "part", 4) == 0) {
|
||||
int devno, ok = 0;
|
||||
if (argc == 2) {
|
||||
for (devno = 0; devno < USB_MAX_STOR_DEV; ++devno) {
|
||||
for (devno = 0; ; ++devno) {
|
||||
stor_dev = usb_stor_get_dev(devno);
|
||||
if (stor_dev == NULL)
|
||||
break;
|
||||
if (stor_dev->type != DEV_TYPE_UNKNOWN) {
|
||||
ok++;
|
||||
if (devno)
|
||||
@ -608,7 +610,8 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
} else {
|
||||
devno = simple_strtoul(argv[2], NULL, 16);
|
||||
stor_dev = usb_stor_get_dev(devno);
|
||||
if (stor_dev->type != DEV_TYPE_UNKNOWN) {
|
||||
if (stor_dev != NULL &&
|
||||
stor_dev->type != DEV_TYPE_UNKNOWN) {
|
||||
ok++;
|
||||
debug("print_part of %x\n", devno);
|
||||
print_part(stor_dev);
|
||||
@ -668,12 +671,12 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
if (argc == 3) {
|
||||
int dev = (int)simple_strtoul(argv[2], NULL, 10);
|
||||
printf("\nUSB device %d: ", dev);
|
||||
if (dev >= USB_MAX_STOR_DEV) {
|
||||
stor_dev = usb_stor_get_dev(dev);
|
||||
if (stor_dev == NULL) {
|
||||
printf("unknown device\n");
|
||||
return 1;
|
||||
}
|
||||
printf("\n Device %d: ", dev);
|
||||
stor_dev = usb_stor_get_dev(dev);
|
||||
dev_print(stor_dev);
|
||||
if (stor_dev->type == DEV_TYPE_UNKNOWN)
|
||||
return 1;
|
||||
|
@ -175,7 +175,7 @@ void uhci_show_temp_int_td(void);
|
||||
|
||||
block_dev_desc_t *usb_stor_get_dev(int index)
|
||||
{
|
||||
return (index < USB_MAX_STOR_DEV) ? &usb_dev_desc[index] : NULL;
|
||||
return (index < usb_max_devs) ? &usb_dev_desc[index] : NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -244,7 +244,7 @@ int usb_stor_scan(int mode)
|
||||
* get info and fill it in
|
||||
*/
|
||||
if (usb_stor_get_info(dev, &usb_stor[usb_max_devs],
|
||||
&usb_dev_desc[usb_max_devs]))
|
||||
&usb_dev_desc[usb_max_devs]) == 1)
|
||||
usb_max_devs++;
|
||||
}
|
||||
/* if storage device */
|
||||
@ -888,7 +888,7 @@ static int usb_inquiry(ccb *srb, struct us_data *ss)
|
||||
USB_STOR_PRINTF("inquiry returns %d\n", i);
|
||||
if (i == 0)
|
||||
break;
|
||||
} while (retry--);
|
||||
} while (--retry);
|
||||
|
||||
if (!retry) {
|
||||
printf("error in inquiry\n");
|
||||
|
@ -55,14 +55,14 @@ static struct descriptor {
|
||||
{
|
||||
0x12, /* bLength */
|
||||
1, /* bDescriptorType: UDESC_DEVICE */
|
||||
0x0002, /* bcdUSB: v2.0 */
|
||||
cpu_to_le16(0x0200), /* bcdUSB: v2.0 */
|
||||
9, /* bDeviceClass: UDCLASS_HUB */
|
||||
0, /* bDeviceSubClass: UDSUBCLASS_HUB */
|
||||
1, /* bDeviceProtocol: UDPROTO_HSHUBSTT */
|
||||
64, /* bMaxPacketSize: 64 bytes */
|
||||
0x0000, /* idVendor */
|
||||
0x0000, /* idProduct */
|
||||
0x0001, /* bcdDevice */
|
||||
cpu_to_le16(0x0100), /* bcdDevice */
|
||||
1, /* iManufacturer */
|
||||
2, /* iProduct */
|
||||
0, /* iSerialNumber */
|
||||
@ -536,7 +536,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
|
||||
uint32_t reg;
|
||||
uint32_t *status_reg;
|
||||
|
||||
if (le16_to_cpu(req->index) >= CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) {
|
||||
if (le16_to_cpu(req->index) > CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) {
|
||||
printf("The request port(%d) is not configured\n",
|
||||
le16_to_cpu(req->index) - 1);
|
||||
return -1;
|
||||
@ -630,19 +630,8 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
|
||||
tmpbuf[0] |= USB_PORT_STAT_SUSPEND;
|
||||
if (reg & EHCI_PS_OCA)
|
||||
tmpbuf[0] |= USB_PORT_STAT_OVERCURRENT;
|
||||
if (reg & EHCI_PS_PR &&
|
||||
(portreset & (1 << le16_to_cpu(req->index)))) {
|
||||
int ret;
|
||||
/* force reset to complete */
|
||||
reg = reg & ~(EHCI_PS_PR | EHCI_PS_CLEAR);
|
||||
ehci_writel(status_reg, reg);
|
||||
ret = handshake(status_reg, EHCI_PS_PR, 0, 2 * 1000);
|
||||
if (!ret)
|
||||
tmpbuf[0] |= USB_PORT_STAT_RESET;
|
||||
else
|
||||
printf("port(%d) reset error\n",
|
||||
le16_to_cpu(req->index) - 1);
|
||||
}
|
||||
if (reg & EHCI_PS_PR)
|
||||
tmpbuf[0] |= USB_PORT_STAT_RESET;
|
||||
if (reg & EHCI_PS_PP)
|
||||
tmpbuf[1] |= USB_PORT_STAT_POWER >> 8;
|
||||
|
||||
@ -699,6 +688,8 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
|
||||
ehci_writel(status_reg, reg);
|
||||
break;
|
||||
} else {
|
||||
int ret;
|
||||
|
||||
reg |= EHCI_PS_PR;
|
||||
reg &= ~EHCI_PS_PE;
|
||||
ehci_writel(status_reg, reg);
|
||||
@ -710,8 +701,19 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
|
||||
wait_ms(50);
|
||||
/* terminate the reset */
|
||||
ehci_writel(status_reg, reg & ~EHCI_PS_PR);
|
||||
wait_ms(2);
|
||||
portreset |= 1 << le16_to_cpu(req->index);
|
||||
/*
|
||||
* A host controller must terminate the reset
|
||||
* and stabilize the state of the port within
|
||||
* 2 milliseconds
|
||||
*/
|
||||
ret = handshake(status_reg, EHCI_PS_PR, 0,
|
||||
2 * 1000);
|
||||
if (!ret)
|
||||
portreset |=
|
||||
1 << le16_to_cpu(req->index);
|
||||
else
|
||||
printf("port(%d) reset error\n",
|
||||
le16_to_cpu(req->index) - 1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -28,6 +28,7 @@
|
||||
#ifdef CONFIG_PCI_EHCI_DEVICE
|
||||
static struct pci_device_id ehci_pci_ids[] = {
|
||||
/* Please add supported PCI EHCI controller ids here */
|
||||
{0x1033, 0x00E0},
|
||||
{0, 0}
|
||||
};
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user