Re: [PATCH] usb: gadget: dummy_hcd: fix status in transfer

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

 



Hi Alan,
On Wed, Jul 08, 2015 at 10:43:48AM -0400, Alan Stern wrote:
On Wed, 8 Jul 2015, Rui Miguel Silva wrote:

>> --- a/drivers/usb/gadget/udc/dummy_hcd.c
>> +++ b/drivers/usb/gadget/udc/dummy_hcd.c
>> @@ -1367,8 +1367,10 @@ top:
>>  		/* many requests terminate without a short packet */
>>  		} else {
>>  			if (req->req.length == req->req.actual
>> -					&& !req->req.zero)
>> +					&& !req->req.zero) {
>>  				req->req.status = 0;
>> +				*status = 0;
>> +			}
>>  			if (urb->transfer_buffer_length == urb->actual_length
>>  					&& !(urb->transfer_flags
>>  						& URB_ZERO_PACKET))
>
>This patch is wrong.  *status should indeed remain -EINPROGRESS and the
>transfer should remain incomplete.
>
>Here's an example to illustrate what I mean.  Let's say the endpoint's
>maxpacket value is 512, and suppose the host queues a 1024-byte IN URB.
>In response, suppose the gadget queues two 512-byte requests, each with
>req->req.zero clear.  Consider what happens when the first request is
>processed.
>
>len, req->req.length and req->req.actual are all equal to 512, and
>is_short is false.  req therefore completes with req->req.status set to
>0.  But the URB is still in progress!  It still has 512 bytes left to
>transfer, and it won't complete until the second request finishes.
>Therefore *status (which is the URB's status) should remain set to
>-EINPROGRESS.

Yes, in this case the patch breaks the flow and remove the URB status
of -EINPROGRESS to soon. But what about, and taken your example above,
the gadget queues only one 512-byte request? is_short is false, and
urb->transfer_buffer_length != urb->actual_length and so the URB
status is never changed.

Yes, the status never changes.  And in fact, that is exactly what would
happen if you used a real UDC and a separate host computer instead of
dummy-hcd -- the URB would not complete.  (In practice the URB would
eventually time out or be unlinked for some other reason.)

Understood.

Since we want dummy-hcd to behave as much as possible like a real UDC,
we should keep the current code.

Make sense.
Thank for the info.

Cheers,
   Rui
Alan Stern

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