Alan Stern wrote:
> On Mon, 12 Aug 2013, Takashi Iwai wrote:
>> So... Clemens, Daniel, Eldad, could you guys review the latest version
>> of Alan's patch?  I'd love to sort this out for 3.12.
>
> Here's a revised version of the patch (still untested).

> -     maxsize = ((ep->freqmax + 0xffff) * (frame_bits >> 3))
> -                             >> (16 - ep->datainterval);
> +     maxsize = ((ep->freqmax + 0xffff) >> (16 - ep->datainterval))
> +                     * (frame_bits >> 3);

What do you assume prevents firmware writers from splitting frames
across packages?  The specification?  Sanity?  :)  (see txfr_quirk)

> The difference is that this version tries always to keep a period's
> worth of bytes in the USB hardware queue.

Having truncated URBs is possible only when URBs are shorter than one
period, so I think that a queue length of at least two periods, together
with a minimum period size, should ensure the isochrounous scheduling
threshold.

This isn't tested either.


Regards,
Clemens


 sound/usb/endpoint.c |    3 ++-
 sound/usb/pcm.c      |   16 ++++++++++++++--
 2 files changed, 16 insertions(+), 3 deletions(-)

--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -638,7 +638,8 @@ static int data_ep_set_params(struct snd_usb_endpoint *ep,
                if (sync_ep)
                        minsize -= minsize >> 3;
                minsize = max(minsize, 1u);
-               total_packs = (period_bytes + minsize - 1) / minsize;
+               /* try to make the queue length the same as two periods */
+               total_packs = (2 * period_bytes + minsize - 1) / minsize;
                /* we need at least two URBs for queueing */
                if (total_packs < 2) {
                        total_packs = 2;
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -1131,10 +1131,22 @@ static int setup_hw_info(struct snd_pcm_runtime 
*runtime, struct snd_usb_substre
                return err;

        param_period_time_if_needed = SNDRV_PCM_HW_PARAM_PERIOD_TIME;
-       if (subs->speed == USB_SPEED_FULL)
+       switch (subs->speed) {
+       case USB_SPEED_FULL:
                /* full speed devices have fixed data packet interval */
                ptmin = 1000;
-       if (ptmin == 1000)
+               break;
+       case USB_SPEED_HIGH:
+               /*
+                * Assume we have an EHCI controller with an Isochronous
+                * Scheduling Threshold of one frame (8 microframes), and
+                * add 2 microframes for boundary cases.  Increase by 4%
+                * to have a margin for clock inaccuracies.
+                */
+               ptmin = max(ptmin, (8 + 2) * 130u);
+               break;
+       }
+       if (ptmin >= 1000)
                /* if period time doesn't go below 1 ms, no rules needed */
                param_period_time_if_needed = -1;
        snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_TIME,
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to