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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 | 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 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
--
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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux