Re: [RESEND v2 05/11] usb:hsotg:samsung: Sending ZLP packet for IN EP0 transfers

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

 



On Wed, Mar 21, 2012 at 12:59:43PM +0100, Lukasz Majewski wrote:
> When sent data lenght is a multiple size of maximum packet size (MPS
> = 64B for EP0), then sent a ZLP pbacket to indicate end of the
> transfer to a USB host.
> 
> The above condition only applies, when requested data from host is NOT
> equal to multiplied value of MPS (e.g. host requested 4096B from device).
> In this case no ZLP shall be sent.
> 
> Tested with:
> - DFU gadget (various size of the sent data - also packet = MPS)
> - Ethernet gadget (CDC and RNDIS)
> - Multi Function Gadget (g_multi)
> 
> HW:
> - Samsung's C210 Universal rev.0
> 
> Signed-off-by: Lukasz Majewski <l.majewski@xxxxxxxxxxx>
> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx>
> ---
>  drivers/usb/gadget/s3c-hsotg.c |   32 ++++++++++++++++++++++++++++++--
>  1 files changed, 30 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c
> index 24e8e1d..ff6ee01 100644
> --- a/drivers/usb/gadget/s3c-hsotg.c
> +++ b/drivers/usb/gadget/s3c-hsotg.c
> @@ -1556,8 +1556,11 @@ static void s3c_hsotg_handle_outdone(struct s3c_hsotg *hsotg,
>  	}
>  
>  	if (epnum == 0) {
> +		/* Condition req->complete != s3c_hsotg_complete_setup says:
> +		 * send ZLP when we have an asynchronous request from gadget */

multi-line comment style is wrong.

>  		if (!was_setup && req->complete != s3c_hsotg_complete_setup)
>  			s3c_hsotg_send_zlp(hsotg, hs_req);
> +

trailing change, please remove it.

>  	}
>  
>  	s3c_hsotg_complete_request_lock(hsotg, hs_ep, hs_req, result);
> @@ -1808,6 +1811,13 @@ static void s3c_hsotg_complete_in(struct s3c_hsotg *hsotg,
>  		return;
>  	}
>  
> +	/* Finish ZLP handling for IN EP0 transactions */
> +	if (hsotg->eps[0].sent_zlp) {
> +		dev_dbg(hsotg->dev, "zlp packet received\n");
> +		s3c_hsotg_complete_request_lock(hsotg, hs_ep, hs_req, 0);
> +		return;
> +	}
> +
>  	/* Calculate the size of the transfer by checking how much is left
>  	 * in the endpoint size register and then working it out from
>  	 * the amount we loaded for the transfer.
> @@ -1827,9 +1837,27 @@ static void s3c_hsotg_complete_in(struct s3c_hsotg *hsotg,
>  			__func__, hs_req->req.actual, size_done);
>  
>  	hs_req->req.actual = size_done;
> +	dev_dbg(hsotg->dev, "req->length:%d req->actual:%d req->zero:%d\n",
> +		hs_req->req.length, hs_req->req.actual, hs_req->req.zero);
> +
> +	/* Check if dealing with Maximum Packet Size(MPS) IN transfer at EP0
> +	 * When sent data is a multiple MPS size (e.g. 64B ,128B ,192B
> +	 * ,256B ... ), after last MPS sized packet send IN ZLP packet to
> +	 * inform the host that no more data is available.
> +	 * The state of req.zero member is checked to be sure that the value to
> +	 * send is smaller than wValue expected from host.
> +	 * Check req.length to NOT send another ZLP when the current one is
> +	 * under completion (the one for which this completion has been called).
> +	 */

multi-line comment style is wrong here too.

> +	if (hs_req->req.length && hs_ep->index == 0 && hs_req->req.zero
> +	    && hs_req->req.length == hs_req->req.actual
> +	    && !(hs_req->req.length % hs_ep->ep.maxpacket)) {
> +
> +		dev_dbg(hsotg->dev, "ep0 zlp IN packet sent\n");
> +		s3c_hsotg_send_zlp(hsotg, hs_req);
>  
> -	/* if we did all of the transfer, and there is more data left
> -	 * around, then try restarting the rest of the request */

and here.

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