Existing code is not applicable to big-endian machines ctrlrequest fields received in USB endian - i.e. in little-endian and should be converted to cpu endianness before usage. Signed-off-by: Alexey Spirkov <alexeis@xxxxxxxxxxxx> --- drivers/usb/musb/musb_gadget_ep0.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 91a5027..90abacb 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c @@ -82,7 +82,7 @@ static int service_tx_status_request( u16 tmp; void __iomem *regs; - epnum = (u8) ctrlrequest->wIndex; + epnum = (u8) le16_to_cpu(ctrlrequest->wIndex); if (!epnum) { result[0] = 0; break; @@ -209,6 +209,8 @@ __acquires(musb->lock) int handled = -EINVAL; void __iomem *mbase = musb->mregs; const u8 recip = ctrlrequest->bRequestType & USB_RECIP_MASK; + u16 reqval = le16_to_cpu(ctrlrequest->wValue); + u16 reqidx = le16_to_cpu(ctrlrequest->wIndex); /* the gadget driver handles everything except what we MUST handle */ if ((ctrlrequest->bRequestType & USB_TYPE_MASK) @@ -217,15 +219,14 @@ __acquires(musb->lock) case USB_REQ_SET_ADDRESS: /* change it after the status stage */ musb->set_address = true; - musb->address = (u8) (ctrlrequest->wValue & 0x7f); + musb->address = (u8) (reqval & 0x7f); handled = 1; break; case USB_REQ_CLEAR_FEATURE: switch (recip) { case USB_RECIP_DEVICE: - if (ctrlrequest->wValue - != USB_DEVICE_REMOTE_WAKEUP) + if (reqval != USB_DEVICE_REMOTE_WAKEUP) break; musb->may_wakeup = 0; handled = 1; @@ -233,8 +234,7 @@ __acquires(musb->lock) case USB_RECIP_INTERFACE: break; case USB_RECIP_ENDPOINT:{ - const u8 epnum = - ctrlrequest->wIndex & 0x0f; + const u8 epnum = reqidx & 0x0f; struct musb_ep *musb_ep; struct musb_hw_ep *ep; struct musb_request *request; @@ -243,12 +243,12 @@ __acquires(musb->lock) u16 csr; if (epnum == 0 || epnum >= MUSB_C_NUM_EPS || - ctrlrequest->wValue != USB_ENDPOINT_HALT) + reqval != USB_ENDPOINT_HALT) break; ep = musb->endpoints + epnum; regs = ep->regs; - is_in = ctrlrequest->wIndex & USB_DIR_IN; + is_in = reqidx & USB_DIR_IN; if (is_in) musb_ep = &ep->ep_in; else @@ -300,17 +300,17 @@ __acquires(musb->lock) switch (recip) { case USB_RECIP_DEVICE: handled = 1; - switch (ctrlrequest->wValue) { + switch (reqval) { case USB_DEVICE_REMOTE_WAKEUP: musb->may_wakeup = 1; break; case USB_DEVICE_TEST_MODE: if (musb->g.speed != USB_SPEED_HIGH) goto stall; - if (ctrlrequest->wIndex & 0xff) + if (reqidx & 0xff) goto stall; - switch (ctrlrequest->wIndex >> 8) { + switch (reqidx >> 8) { case 1: pr_debug("TEST_J\n"); /* TEST_J */ @@ -398,8 +398,7 @@ __acquires(musb->lock) break; case USB_RECIP_ENDPOINT:{ - const u8 epnum = - ctrlrequest->wIndex & 0x0f; + const u8 epnum = reqidx & 0x0f; struct musb_ep *musb_ep; struct musb_hw_ep *ep; void __iomem *regs; @@ -407,12 +406,12 @@ __acquires(musb->lock) u16 csr; if (epnum == 0 || epnum >= MUSB_C_NUM_EPS || - ctrlrequest->wValue != USB_ENDPOINT_HALT) + reqval != USB_ENDPOINT_HALT) break; ep = musb->endpoints + epnum; regs = ep->regs; - is_in = ctrlrequest->wIndex & USB_DIR_IN; + is_in = reqidx & USB_DIR_IN; if (is_in) musb_ep = &ep->ep_in; else -- 2.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html