diff mbox series

[v2] usb: musb: gadget: Fix big-endian arch issue

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

Commit Message

Alexey Spirkov Aug. 3, 2018, 9:03 a.m. UTC
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

Comments

Andy Shevchenko Aug. 3, 2018, 9:16 a.m. UTC | #1
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.
Alexey Spirkov Aug. 3, 2018, 9:41 a.m. UTC | #2
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
Bin Liu Aug. 27, 2018, 3:19 p.m. UTC | #3
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 mbox series

Patch

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