On Thu, Jun 07, 2007 at 01:14:45PM +0200, Clemens Ladisch wrote:
> Try the attached patch.

It seems to work well, at least in my limited tests. I've been using it
together with this patch to make usbaudio.c understand low-speed devices:

diff -ur linux-2.6.22-rc4/sound/usb/usbaudio.c 
linux-2.6.22-rc4.patched/sound/usb/usbaudio.c
--- linux-2.6.22-rc4/sound/usb/usbaudio.c       2007-06-05 02:57:25.000000000 
+0200
+++ linux-2.6.22-rc4.patched/sound/usb/usbaudio.c       2007-06-07 
13:56:08.000000000 +0200
@@ -1012,10 +1012,10 @@
        unsigned int npacks[MAX_URBS], urb_packs, total_packs, packs_per_ms;
        
        /* calculate the frequency in 16.16 format */
-       if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL)
-               subs->freqn = get_usb_full_speed_rate(rate);
-       else        
+       if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH)
                subs->freqn = get_usb_high_speed_rate(rate);
+       else    
+               subs->freqn = get_usb_full_speed_rate(rate);
        subs->freqm = subs->freqn;
        /* calculate max. frequency */
        if (subs->maxpacksize) {
@@ -1379,7 +1379,7 @@
                    get_endpoint(alts, 1)->bRefresh >= 1 &&
                    get_endpoint(alts, 1)->bRefresh <= 9)
                        subs->syncinterval = get_endpoint(alts, 1)->bRefresh;
-               else if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL)
+               else if (snd_usb_get_speed(subs->dev) != USB_SPEED_HIGH)
                        subs->syncinterval = 1;
                else if (get_endpoint(alts, 1)->bInterval >= 1 &&
                         get_endpoint(alts, 1)->bInterval <= 16)
@@ -2207,10 +2207,10 @@
        subs->stream = as;
        subs->direction = stream;
        subs->dev = as->chip->dev;
-       if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL)
-               subs->ops = audio_urb_ops[stream];
-       else
+       if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH)
                subs->ops = audio_urb_ops_high_speed[stream];
+       else
+               subs->ops = audio_urb_ops[stream];
        snd_pcm_set_ops(as->pcm, stream,
                        stream == SNDRV_PCM_STREAM_PLAYBACK ?
                        &snd_usb_playback_ops : &snd_usb_capture_ops);
@@ -3381,7 +3381,8 @@
        
        *rchip = NULL;
        
-       if (snd_usb_get_speed(dev) != USB_SPEED_FULL &&
+       if (snd_usb_get_speed(dev) != USB_SPEED_LOW &&
+           snd_usb_get_speed(dev) != USB_SPEED_FULL &&
            snd_usb_get_speed(dev) != USB_SPEED_HIGH) {
                snd_printk(KERN_ERR "unknown device speed %d\n", 
snd_usb_get_speed(dev));
                return -ENXIO;

Is this reasonably sane, or is a more thorough fix (differentiating better
between low- and full-speed devices) needed for a final patch?

/* Steinar */
-- 
Homepage: http://www.sesse.net/

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to