Message ID | HE1PR0301MB2442B6BC8AF7851D11AF2902C9230@HE1PR0301MB2442.eurprd03.prod.outlook.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] usb: musb: gadget: Fix big-endian arch issue | expand |
On Fri, Aug 3, 2018 at 12:03 PM, Alexey Spirkov <AlexeiS@astrosoft.ru> wrote: > 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. > - epnum = (u8) ctrlrequest->wIndex; > + epnum = (u8) le16_to_cpu(ctrlrequest->wIndex); > + u16 reqval = le16_to_cpu(ctrlrequest->wValue); > + u16 reqidx = le16_to_cpu(ctrlrequest->wIndex); I'm wondering, if you run make with C=1 CF=-D__CHECK_ENDIAN__ before and after your change.
Hi Andy, Before my change: CHECK drivers/usb/musb/musb_gadget_ep0.c drivers/usb/musb/musb_gadget_ep0.c:85:26: warning: cast from restricted __le16 drivers/usb/musb/musb_gadget_ep0.c:220:58: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:227:48: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:237:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:251:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:310:56: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:313:60: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:303:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:303:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:303:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:303:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:303:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:303:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:402:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:415:52: warning: restricted __le16 degrades to integer drivers/usb/musb/musb_gadget_ep0.c:540:22: warning: expression using sizeof(void) After my change: CHECK drivers/usb/musb/musb_gadget_ep0.c drivers/usb/musb/musb_gadget_ep0.c:539:22: warning: expression using sizeof(void) PS: Thanks for hint about endian issues check! Best regards, Alexey Spirkov -----Original Message----- From: Andy Shevchenko <andy.shevchenko@gmail.com> Sent: Friday, August 3, 2018 12:17 PM To: Alexey Spirkov <AlexeiS@astrosoft.ru> Cc: Bin Liu <b-liu@ti.com>; Greg Kroah-Hartman <gregkh@linuxfoundation.org>; linux-usb@vger.kernel.org; andrew@ncrmnt.org Subject: Re: [PATCH v2] usb: musb: gadget: Fix big-endian arch issue On Fri, Aug 3, 2018 at 12:03 PM, Alexey Spirkov <AlexeiS@astrosoft.ru> wrote: > 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. > - epnum = (u8) ctrlrequest->wIndex; > + epnum = (u8) le16_to_cpu(ctrlrequest->wIndex); > + u16 reqval = le16_to_cpu(ctrlrequest->wValue); > + u16 reqidx = le16_to_cpu(ctrlrequest->wIndex); I'm wondering, if you run make with C=1 CF=-D__CHECK_ENDIAN__ before and after your change. -- With Best Regards, Andy Shevchenko
Hi, On Fri, Aug 03, 2018 at 09:03:36AM +0000, Alexey Spirkov wrote: > 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@astrosoft.ru> > --- > 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; ^^^^^^^^^^^^^ The patch cannot be applied. All the tabs are converted to whitespaces. Regards, -Bin.
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
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@astrosoft.ru> --- 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