RE: [PATCH] musb_gadget_ep0: avoid SetupEnd interrupt

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

 



Sergei Shtylyov wrote:
> Gadget stalling a zero-length SETUP request results in this error message:
> 
> SetupEnd came in a wrong ep0stage idle
> 
> In order to avoid it, always set the CSR0.DataEnd bit after detecting a zero-
> length request.  Add the missing '\n' to the error message itself as well...
> 
> Signed-off-by: Sergei Shtylyov <sshtylyov@xxxxxxxxxxxxx>
> Cc: stable@xxxxxxxxxx

Tested-by: Anand Gadiyar <gadiyar@xxxxxx>

on a 3430 SDP. An easy way to reproduce this is to run
`test.sh control` with the script and testusb.c program from [1]

- Anand

[1] www.linux-usb.org/usbtest

> 
> ---
> The patch is against the recent Linus' tree. 2.6.31.y needs it as well...
> 
>  drivers/usb/musb/musb_gadget_ep0.c |   14 ++++++++++----
>  1 files changed, 10 insertions(+), 4 deletions(-)
> 
> Index: linux-2.6/drivers/usb/musb/musb_gadget_ep0.c
> ===================================================================
> --- linux-2.6.orig/drivers/usb/musb/musb_gadget_ep0.c
> +++ linux-2.6/drivers/usb/musb/musb_gadget_ep0.c
> @@ -646,7 +646,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *
>  			musb->ep0_state = MUSB_EP0_STAGE_STATUSIN;
>  			break;
>  		default:
> -			ERR("SetupEnd came in a wrong ep0stage %s",
> +			ERR("SetupEnd came in a wrong ep0stage %s\n",
>  			    decode_ep0stage(musb->ep0_state));
>  		}
>  		csr = musb_readw(regs, MUSB_CSR0);
> @@ -769,12 +769,18 @@ setup:
>  				handled = service_zero_data_request(
>  						musb, &setup);
>  
> +				/*
> +				 * We're expecting no data in any case, so
> +				 * always set the DATAEND bit -- doing this
> +				 * here helps avoid SetupEnd interrupt coming
> +				 * in the idle stage when we're stalling...
> +				 */
> +				musb->ackpend |= MUSB_CSR0_P_DATAEND;
> +
>  				/* status stage might be immediate */
> -				if (handled > 0) {
> -					musb->ackpend |= MUSB_CSR0_P_DATAEND;
> +				if (handled > 0)
>  					musb->ep0_state =
>  						MUSB_EP0_STAGE_STATUSIN;
> -				}
>  				break;
>  
>  			/* sequence #1 (IN to host), includes GET_STATUS

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