Re: [PATCH] USB: EHCI: fix HUB TT scheduling issue with iso transfer

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

 



On Thu, 27 Oct 2011, Matthieu CASTET wrote:

> From: Thomas Poussevin <thomas.poussevin@xxxxxxxxxx>
> 
> The current TT scheduling doesn't allow to play and then record on a
> full-speed device connected to a high speed hub.
> 
> The IN iso stream can only start on the first uframe (0-2 for a 165 us)
> because of CSPLIT transactions.
> For the OUT iso stream there no such restriction. uframe 0-5 are possible.
> 
> The idea of this patch is that the first uframe are precious (for IN TT iso
> stream) and we should allocate the last uframes first if possible.
> 
> For that we reverse the order of uframe allocation (last uframe first).
> 
> Here an example :
> 
> hid interrupt stream
> ----------------------------------------------------------------------
> uframe                |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
> ----------------------------------------------------------------------
> max_tt_usecs          | 125 | 125 | 125 | 125 | 125 | 125 | 30  |  0  |
> ----------------------------------------------------------------------
> used usecs on a frame | 13  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
> ----------------------------------------------------------------------
> 
> iso OUT stream
> ----------------------------------------------------------------------
> uframe                |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
> ----------------------------------------------------------------------
> max_tt_usecs          | 125 | 125 | 125 | 125 | 125 | 125 | 30  |  0  |
> ----------------------------------------------------------------------
> used usecs on a frame | 13  | 125 |  39 |  0  |  0  |  0  |  0  |  0  |
> ----------------------------------------------------------------------
> 
> There no place for iso IN stream  (uframe 0-2 are used) and we got "cannot
> submit datapipe for urb 0, error -28: not enough bandwidth" error.
> 
> With the patch this become.
> 
> iso OUT stream
> ----------------------------------------------------------------------
> uframe                |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
> ----------------------------------------------------------------------
> max_tt_usecs          | 125 | 125 | 125 | 125 | 125 | 125 | 30  |  0  |
> ----------------------------------------------------------------------
> used usecs on a frame |  13 |  0  |  0  |  0  | 125 |  39 |  0  |  0  |
> ----------------------------------------------------------------------
> 
> iso IN stream
> ----------------------------------------------------------------------
> uframe                |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
> ----------------------------------------------------------------------
> max_tt_usecs          | 125 | 125 | 125 | 125 | 125 | 125 | 30  |  0  |
> ----------------------------------------------------------------------
> used usecs on a frame |  13 |  0  | 125 | 40  | 125 |  39 |  0  |  0  |
> ----------------------------------------------------------------------
> 
> Signed-off-by: Matthieu Castet <matthieu.castet@xxxxxxxxxx>
> Signed-off-by: Thomas Poussevin <thomas.poussevin@xxxxxxxxxx>
> ---
>  drivers/usb/host/ehci-sched.c |   15 ++++++++++-----
>  1 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
> index 2e829fa..56a3203 100644
> --- a/drivers/usb/host/ehci-sched.c
> +++ b/drivers/usb/host/ehci-sched.c
> @@ -1479,10 +1479,15 @@ iso_stream_schedule (
>  
>  		/* NOTE:  assumes URB_ISO_ASAP, to limit complexity/bugs */
>  
> -		/* find a uframe slot with enough bandwidth */
> -		next = start + period;
> -		for (; start < next; start++) {
> -
> +		/* find a uframe slot with enough bandwidth.
> +		 * Early uframes are more precious because full-speed
> +		 * iso IN transfers can't use late uframes,
> +		 * and therefore they should be allocated last.
> +		 */
> +		next = start;
> +		start += period;
> +		do {
> +			start--;
>  			/* check schedule: enough space? */
>  			if (stream->highspeed) {
>  				if (itd_slot_ok(ehci, mod, start,
> @@ -1495,7 +1500,7 @@ iso_stream_schedule (
>  						start, sched, period))
>  					break;
>  			}
> -		}
> +		} while (start > next);
>  
>  		/* no room in the schedule */
>  		if (start == next) {
> 

Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>

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