Re: [PATCH v2] usb: musb: gadget: Fix big-endian arch issue
Hi, On Fri, Aug 03, 2018 at 09:03:36AM +, 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 > --- > 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.
RE: [PATCH v2] usb: musb: gadget: Fix big-endian arch issue
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 Sent: Friday, August 3, 2018 12:17 PM To: Alexey Spirkov Cc: Bin Liu ; Greg Kroah-Hartman ; linux-usb@vger.kernel.org; and...@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 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
Re: [PATCH v2] usb: musb: gadget: Fix big-endian arch issue
On Fri, Aug 3, 2018 at 12:03 PM, 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. > - 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 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v2] usb: musb: gadget: Fix big-endian arch issue
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 --- 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 u8epnum = - ctrlrequest->wIndex & 0x0f; + const u8epnum = 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_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 u8epnum = - ctrlrequest->wIndex & 0x0f; +