Hi,

On Thu, Jul 26, 2018 at 12:52:53PM +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 <alex...@astrosoft.ru>
> ---
>  drivers/usb/musb/musb_gadget_ep0.c | 33 ++++++++++++++++++++-------------
>  1 file changed, 20 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/usb/musb/musb_gadget_ep0.c 
> b/drivers/usb/musb/musb_gadget_ep0.c
> index 91a5027..5d5c933 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;
> @@ -217,14 +217,15 @@ __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) (le16_to_cpu(ctrlrequest->wValue) &
> +                                                                     0x7f);
>                       handled = 1;
>                       break;
>  
>               case USB_REQ_CLEAR_FEATURE:
>                       switch (recip) {
>                       case USB_RECIP_DEVICE:
> -                             if (ctrlrequest->wValue
> +                             if (le16_to_cpu(ctrlrequest->wValue)
>                                               != USB_DEVICE_REMOTE_WAKEUP)
>                                       break;
>                               musb->may_wakeup = 0;
> @@ -234,7 +235,7 @@ __acquires(musb->lock)
>                               break;
>                       case USB_RECIP_ENDPOINT:{
>                               const u8                epnum =
> -                                     ctrlrequest->wIndex & 0x0f;
> +                                     le16_to_cpu(ctrlrequest->wIndex) & 0x0f;
>                               struct musb_ep          *musb_ep;
>                               struct musb_hw_ep       *ep;
>                               struct musb_request     *request;
> @@ -243,12 +244,14 @@ __acquires(musb->lock)
>                               u16                     csr;
>  
>                               if (epnum == 0 || epnum >= MUSB_C_NUM_EPS ||
> -                                 ctrlrequest->wValue != USB_ENDPOINT_HALT)
> +                                 le16_to_cpu(ctrlrequest->wValue)
> +                                             != USB_ENDPOINT_HALT)
>                                       break;
>  
>                               ep = musb->endpoints + epnum;
>                               regs = ep->regs;
> -                             is_in = ctrlrequest->wIndex & USB_DIR_IN;
> +                             is_in = le16_to_cpu(ctrlrequest->wIndex) &
> +                                                             USB_DIR_IN;
>                               if (is_in)
>                                       musb_ep = &ep->ep_in;
>                               else
> @@ -300,17 +303,19 @@ __acquires(musb->lock)
>                       switch (recip) {
>                       case USB_RECIP_DEVICE:
>                               handled = 1;
> -                             switch (ctrlrequest->wValue) {
> +                             switch (le16_to_cpu(ctrlrequest->wValue)) {
>                               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 (le16_to_cpu(ctrlrequest->wIndex) &
> +                                                                     0xff)
>                                               goto stall;
>  
> -                                     switch (ctrlrequest->wIndex >> 8) {
> +                                     switch (le16_to_cpu(ctrlrequest->wIndex)
> +                                                                      >> 8) {
>                                       case 1:
>                                               pr_debug("TEST_J\n");
>                                               /* TEST_J */
> @@ -399,7 +404,7 @@ __acquires(musb->lock)
>  
>                       case USB_RECIP_ENDPOINT:{
>                               const u8                epnum =
> -                                     ctrlrequest->wIndex & 0x0f;
> +                                     le16_to_cpu(ctrlrequest->wIndex) & 0x0f;
>                               struct musb_ep          *musb_ep;
>                               struct musb_hw_ep       *ep;
>                               void __iomem            *regs;
> @@ -407,12 +412,14 @@ __acquires(musb->lock)
>                               u16                     csr;
>  
>                               if (epnum == 0 || epnum >= MUSB_C_NUM_EPS ||
> -                                 ctrlrequest->wValue != USB_ENDPOINT_HALT)
> +                                 le16_to_cpu(ctrlrequest->wValue)
> +                                             != USB_ENDPOINT_HALT)
>                                       break;
>  
>                               ep = musb->endpoints + epnum;
>                               regs = ep->regs;
> -                             is_in = ctrlrequest->wIndex & USB_DIR_IN;
> +                             is_in = le16_to_cpu(ctrlrequest->wIndex) &
> +                                                             USB_DIR_IN;
>                               if (is_in)
>                                       musb_ep = &ep->ep_in;
>                               else

Since this function uses ctrlrequest->wIndex and ctrlrequest->wValue
many times, can you please create local vars for them, then we don't
have to call le16_to_cpu() on them in every instance?

> @@ -608,7 +615,7 @@ musb_read_setup(struct musb *musb, struct usb_ctrlrequest 
> *req)
>        */
>       musb->set_address = false;
>       musb->ackpend = MUSB_CSR0_P_SVDRXPKTRDY;
> -     if (req->wLength == 0) {
> +     if (le16_to_cpu(req->wLength) == 0) {
>               if (req->bRequestType & USB_DIR_IN)
>                       musb->ackpend |= MUSB_CSR0_TXPKTRDY;
>               musb->ep0_state = MUSB_EP0_STAGE_ACKWAIT;

Regards,
-Bin.
--
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

Reply via email to