Not yet tested. Cleanup code and fix rootdev GET_DESCRIPTOR request
Signed-off-by: Michael Trimarchi <mich...@panicking.kicks-ass.org> --- diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 324c308..3d495ca 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -317,16 +317,21 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer, uint32_t endpt, token, usbsts; uint32_t c, toggle; uint32_t cmd; + uint16_t wValue, wIndex, wLength; int ret = 0; + wIndex = le16_to_cpu(req->index); + wValue = le16_to_cpu(req->value); + wLength = le16_to_cpu(req->length); + debug("dev=%p, pipe=%lx, buffer=%p, length=%d, req=%p\n", dev, pipe, buffer, length, req); if (req != NULL) debug("req=%u (%#x), type=%u (%#x), value=%u (%#x), index=%u\n", req->request, req->request, req->requesttype, req->requesttype, - le16_to_cpu(req->value), le16_to_cpu(req->value), - le16_to_cpu(req->index)); + wValue, wValue, + wIndex); qh = ehci_alloc(sizeof(struct QH), 32); if (qh == NULL) { @@ -535,26 +540,34 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, int len, srclen; uint32_t reg; uint32_t *status_reg; + uint16_t wValue, wIndex, wLength; + + wIndex = le16_to_cpu(req->index); + wValue = le16_to_cpu(req->value); + wLength = le16_to_cpu(req->length); - if (le16_to_cpu(req->index) >= CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) { + if (wIndex >= CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) { printf("The request port(%d) is not configured\n", - le16_to_cpu(req->index) - 1); + wIndex - 1); return -1; } - status_reg = (uint32_t *)&hcor->or_portsc[ - le16_to_cpu(req->index) - 1]; + + /* We don't need the status reg for the rootdev */ + if (wIndex > 0) + status_reg = (uint32_t *)&hcor->or_portsc[wIndex - 1]; + srclen = 0; debug("req=%u (%#x), type=%u (%#x), value=%u, index=%u\n", req->request, req->request, req->requesttype, req->requesttype, - le16_to_cpu(req->value), le16_to_cpu(req->index)); + wValue, wIndex); typeReq = req->request | req->requesttype << 8; switch (typeReq) { case DeviceRequest | USB_REQ_GET_DESCRIPTOR: - switch (le16_to_cpu(req->value) >> 8) { + switch (wValue >> 8) { case USB_DT_DEVICE: debug("USB_DT_DEVICE request\n"); srcptr = &descriptor.device; @@ -567,7 +580,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, break; case USB_DT_STRING: debug("USB_DT_STRING config\n"); - switch (le16_to_cpu(req->value) & 0xff) { + switch (wValue & 0xff) { case 0: /* Language */ srcptr = "\4\3\1\0"; srclen = 4; @@ -584,30 +597,30 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, break; default: debug("unknown value DT_STRING %x\n", - le16_to_cpu(req->value)); + wValue); goto unknown; } break; default: - debug("unknown value %x\n", le16_to_cpu(req->value)); + debug("unknown value %x\n", wValue); goto unknown; } break; case USB_REQ_GET_DESCRIPTOR | ((USB_DIR_IN | USB_RT_HUB) << 8): - switch (le16_to_cpu(req->value) >> 8) { + switch (wValue >> 8) { case USB_DT_HUB: debug("USB_DT_HUB config\n"); srcptr = &descriptor.hub; srclen = 0x8; break; default: - debug("unknown value %x\n", le16_to_cpu(req->value)); + debug("unknown value %x\n", wValue); goto unknown; } break; case USB_REQ_SET_ADDRESS | (USB_RECIP_DEVICE << 8): debug("USB_REQ_SET_ADDRESS\n"); - rootdev = le16_to_cpu(req->value); + rootdev = wValue; break; case DeviceOutRequest | USB_REQ_SET_CONFIGURATION: debug("USB_REQ_SET_CONFIGURATION\n"); @@ -631,7 +644,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, if (reg & EHCI_PS_OCA) tmpbuf[0] |= USB_PORT_STAT_OVERCURRENT; if (reg & EHCI_PS_PR && - (portreset & (1 << le16_to_cpu(req->index)))) { + (portreset & (1 << wIndex))) { int ret; /* force reset to complete */ reg = reg & ~(EHCI_PS_PR | EHCI_PS_CLEAR); @@ -641,7 +654,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, tmpbuf[0] |= USB_PORT_STAT_RESET; else printf("port(%d) reset error\n", - le16_to_cpu(req->index) - 1); + wIndex - 1); } if (reg & EHCI_PS_PP) tmpbuf[1] |= USB_PORT_STAT_POWER >> 8; @@ -668,7 +681,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, tmpbuf[2] |= USB_PORT_STAT_C_ENABLE; if (reg & EHCI_PS_OCC) tmpbuf[2] |= USB_PORT_STAT_C_OVERCURRENT; - if (portreset & (1 << le16_to_cpu(req->index))) + if (portreset & (1 << wIndex)) tmpbuf[2] |= USB_PORT_STAT_C_RESET; srcptr = tmpbuf; @@ -677,7 +690,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, case USB_REQ_SET_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8): reg = ehci_readl(status_reg); reg &= ~EHCI_PS_CLEAR; - switch (le16_to_cpu(req->value)) { + switch (wValue) { case USB_PORT_FEAT_ENABLE: reg |= EHCI_PS_PE; ehci_writel(status_reg, reg); @@ -708,11 +721,11 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, * root */ wait_ms(50); - portreset |= 1 << le16_to_cpu(req->index); + portreset |= 1 << wIndex; } break; default: - debug("unknown feature %x\n", le16_to_cpu(req->value)); + debug("unknown feature %x\n", wValue); goto unknown; } /* unblock posted writes */ @@ -720,7 +733,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, break; case USB_REQ_CLEAR_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8): reg = ehci_readl(status_reg); - switch (le16_to_cpu(req->value)) { + switch (wValue) { case USB_PORT_FEAT_ENABLE: reg &= ~EHCI_PS_PE; break; @@ -737,10 +750,10 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_OCC; break; case USB_PORT_FEAT_C_RESET: - portreset &= ~(1 << le16_to_cpu(req->index)); + portreset &= ~(1 << wIndex); break; default: - debug("unknown feature %x\n", le16_to_cpu(req->value)); + debug("unknown feature %x\n", wValue); goto unknown; } ehci_writel(status_reg, reg); @@ -753,7 +766,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, } wait_ms(1); - len = min3(srclen, le16_to_cpu(req->length), length); + len = min3(srclen, wLength, length); if (srcptr != NULL && len > 0) memcpy(buffer, srcptr, len); else @@ -765,8 +778,8 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, unknown: debug("requesttype=%x, request=%x, value=%x, index=%x, length=%x\n", - req->requesttype, req->request, le16_to_cpu(req->value), - le16_to_cpu(req->index), le16_to_cpu(req->length)); + req->requesttype, req->request, wValue, + wIndex, wLength); dev->act_len = 0; dev->status = USB_ST_STALLED;
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot