[v2] usb: musb: gadget: Fix big-endian arch issue
From: Alexey Spirkov <hidden>
Date: 2018-08-03 09:03:36
Subsystem:
musb multipoint high speed dual-role controller, the rest, usb subsystem · Maintainers:
Bin Liu, Linus Torvalds, Greg Kroah-Hartman
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 <redacted>
---
drivers/usb/musb/musb_gadget_ep0.c | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
--
2.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
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