On Thu, Aug 02, 2018 at 11:44:00AM -0500, Bin Liu wrote:
> 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 <[email protected]>
> > ---
> >  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;

Please also fix the patch subject to "usb: musb: gadget: ..." in your
v2.

Regards,
-Bin.
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to