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

2018-08-27 Thread Bin Liu
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

2018-08-03 Thread Alexey Spirkov
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

2018-08-03 Thread Andy Shevchenko
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

2018-08-03 Thread Alexey Spirkov
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;
+