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 | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 91a5027..5d5c933 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; @@ -217,14 +217,15 @@ __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) (le16_to_cpu(ctrlrequest->wValue) & + 0x7f); handled = 1; break; case USB_REQ_CLEAR_FEATURE: switch (recip) { case USB_RECIP_DEVICE: - if (ctrlrequest->wValue + if (le16_to_cpu(ctrlrequest->wValue) != USB_DEVICE_REMOTE_WAKEUP) break; musb->may_wakeup = 0; @@ -234,7 +235,7 @@ __acquires(musb->lock) break; case USB_RECIP_ENDPOINT:{ const u8 epnum = - ctrlrequest->wIndex & 0x0f; + le16_to_cpu(ctrlrequest->wIndex) & 0x0f; struct musb_ep *musb_ep; struct musb_hw_ep *ep; struct musb_request *request; @@ -243,12 +244,14 @@ __acquires(musb->lock) u16 csr; if (epnum == 0 || epnum >= MUSB_C_NUM_EPS || - ctrlrequest->wValue != USB_ENDPOINT_HALT) + le16_to_cpu(ctrlrequest->wValue) + != USB_ENDPOINT_HALT) break; ep = musb->endpoints + epnum; regs = ep->regs; - is_in = ctrlrequest->wIndex & USB_DIR_IN; + is_in = le16_to_cpu(ctrlrequest->wIndex) & + USB_DIR_IN; if (is_in) musb_ep = &ep->ep_in; else @@ -300,17 +303,19 @@ __acquires(musb->lock) switch (recip) { case USB_RECIP_DEVICE: handled = 1; - switch (ctrlrequest->wValue) { + switch (le16_to_cpu(ctrlrequest->wValue)) { 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 (le16_to_cpu(ctrlrequest->wIndex) & + 0xff) goto stall; - switch (ctrlrequest->wIndex >> 8) { + switch (le16_to_cpu(ctrlrequest->wIndex) + >> 8) { case 1: pr_debug("TEST_J\n"); /* TEST_J */ @@ -399,7 +404,7 @@ __acquires(musb->lock) case USB_RECIP_ENDPOINT:{ const u8 epnum = - ctrlrequest->wIndex & 0x0f; + le16_to_cpu(ctrlrequest->wIndex) & 0x0f; struct musb_ep *musb_ep; struct musb_hw_ep *ep; void __iomem *regs; @@ -407,12 +412,14 @@ __acquires(musb->lock) u16 csr; if (epnum == 0 || epnum >= MUSB_C_NUM_EPS || - ctrlrequest->wValue != USB_ENDPOINT_HALT) + le16_to_cpu(ctrlrequest->wValue) + != USB_ENDPOINT_HALT) break; ep = musb->endpoints + epnum; regs = ep->regs; - is_in = ctrlrequest->wIndex & USB_DIR_IN; + is_in = le16_to_cpu(ctrlrequest->wIndex) & + USB_DIR_IN; if (is_in) musb_ep = &ep->ep_in; else @@ -608,7 +615,7 @@ musb_read_setup(struct musb *musb, struct usb_ctrlrequest *req) */ musb->set_address = false; musb->ackpend = MUSB_CSR0_P_SVDRXPKTRDY; - if (req->wLength == 0) { + if (le16_to_cpu(req->wLength) == 0) { if (req->bRequestType & USB_DIR_IN) musb->ackpend |= MUSB_CSR0_TXPKTRDY; musb->ep0_state = MUSB_EP0_STAGE_ACKWAIT; -- 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