Re: [PATCH 2/2] usb: dwc3: ep0: fix SetFeature(TEST)

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

 



On Fri, Feb 10, 2012 at 12:36:30PM +0200, Felipe Balbi wrote:
> From: Gerard Cauvy <g-cauvy1@xxxxxx>
> 
> When host requests us to enter a test mode,
> we cannot directly enter the test mode before
> Status Phase is completed, otherwise the core
> will never be able to deliver the Status ZLP
> to host, because it has already entered the
> requested Test Mode.
> 
> In order to fix the error, we move the actual
> start of Test Mode right after we receive
> Transfer Complete event of the status phase.
> 
> Signed-off-by: Gerard Cauvy <g-cauvy1@xxxxxx>
> Signed-off-by: Felipe Balbi <balbi@xxxxxx>
> ---
>  drivers/usb/dwc3/core.h   |    3 +++
>  drivers/usb/dwc3/ep0.c    |   20 ++++++++++++--------
>  drivers/usb/dwc3/gadget.c |    1 +
>  3 files changed, 16 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index 71d958a..4dac982 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -684,6 +684,9 @@ struct dwc3 {
>  
>  	struct dwc3_hwparams	hwparams;
>  	struct dentry		*root;
> +
> +	u8			test_mode;
> +	u8			test_mode_nr;
>  };
>  
>  /* -------------------------------------------------------------------------- */
> diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
> index 5104dbf..e336f2a 100644
> --- a/drivers/usb/dwc3/ep0.c
> +++ b/drivers/usb/dwc3/ep0.c
> @@ -316,7 +316,6 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
>  	u32			wValue;
>  	u32			wIndex;
>  	int			ret;
> -	u32			mode;
>  
>  	wValue = le16_to_cpu(ctrl->wValue);
>  	wIndex = le16_to_cpu(ctrl->wIndex);
> @@ -355,13 +354,8 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
>  			if (!set)
>  				return -EINVAL;
>  
> -			mode = wIndex >> 8;
> -			ret = dwc3_gadget_set_test_mode(dwc, mode);
> -			if (ret < 0) {
> -				dev_dbg(dwc->dev, "Invalid Test #%d\n",
> -						mode);
> -				return ret;
> -			}
> +			dwc->test_mode_nr = wIndex >> 8;
> +			dwc->test_mode = true;
>  		}
>  		break;
>  
> @@ -604,6 +598,15 @@ static void dwc3_ep0_complete_req(struct dwc3 *dwc,
>  		dwc3_gadget_giveback(dep, r, 0);
>  	}
>  
> +	if (dwc->test_mode) {

I forgot to declare ret here. This was my fault not Gerard's... will
fix.

-- 
balbi

Attachment: signature.asc
Description: Digital signature


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

  Powered by Linux