Alan Cox wrote:
> 
> Wait on the poll one. Manfred has a patch that allows multiple poll_wait()
> calls which is a lot less ugly for some drivers

Ok, but can you apply this one? These are SELECTOR (mixer) fixes,
otherwise
the driver could oops...

Tom
--- /usr/ife/t3/sailer/tmp4/linux/drivers/usb/audio.c   Thu May 25 15:31:22 2000
+++ audio.c     Thu May 25 14:54:26 2000
@@ -1788,7 +1795,7 @@
                               dev->devnum, ms->iface, ms->ch[i].slctunitid & 0xff);
                        continue;
                }
-               for (j = i; j < ms->numch; i++) {
+               for (j = i; j < ms->numch; j++) {
                        if ((ms->ch[i].slctunitid ^ ms->ch[j].slctunitid) & 0xff)
                                continue;
                        mask |= 1 << j;
@@ -1821,7 +1828,7 @@
                }
                /* first generate smask */
                smask = bmask = 0;
-               for (j = i; j < ms->numch; i++) {
+               for (j = i; j < ms->numch; j++) {
                        if ((ms->ch[i].slctunitid ^ ms->ch[j].slctunitid) & 0xff)
                                continue;
                        smask |= 1 << ms->ch[j].osschannel;
@@ -1835,7 +1842,7 @@
                        continue;
                if (j > 1)
                        srcmask &= ~bmask;
-               for (j = i; j < ms->numch; i++) {
+               for (j = i; j < ms->numch; j++) {
                        if ((ms->ch[i].slctunitid ^ ms->ch[j].slctunitid) & 0xff)
                                continue;
                        if (!(srcmask & (1 << ms->ch[j].osschannel)))
@@ -3193,6 +3196,16 @@
        state->termtype = 0;
 }
 
+static struct mixerchannel *slctsrc_findunit(struct consmixstate *state, __u8 unitid)
+{
+       unsigned int i;
+       
+       for (i = 0; i < state->nrmixch; i++)
+               if (state->mixch[i].unitid == unitid)
+                       return &state->mixch[i];
+       return NULL;
+}
+
 static void usb_audio_selectorunit(struct consmixstate *state, unsigned char 
*selector)
 {
        unsigned int chnum, i, mixch;
@@ -3206,7 +3219,9 @@
        usb_audio_recurseunit(state, selector[5]);
        if (state->nrmixch != mixch) {
                mch = &state->mixch[state->nrmixch-1];
-               mch->slctunitid = selector[5] | (1 << 8);
+               mch->slctunitid = selector[3] | (1 << 8);
+       } else if ((mch = slctsrc_findunit(state, selector[5]))) {
+               mch->slctunitid = selector[3] | (1 << 8);
        } else {
                printk(KERN_INFO "usbaudio: selector unit %u: ignoring channel 1\n", 
selector[3]);
        }
@@ -3223,7 +3238,9 @@
                }
                if (state->nrmixch != mixch) {
                        mch = &state->mixch[state->nrmixch-1];
-                       mch->slctunitid = selector[5] | ((i + 1) << 8);
+                       mch->slctunitid = selector[3] | ((i + 1) << 8);
+               } else if ((mch = slctsrc_findunit(state, selector[5+i]))) {
+                       mch->slctunitid = selector[3] | ((i + 1) << 8);
                } else {
                        printk(KERN_INFO "usbaudio: selector unit %u: ignoring channel 
%u\n", selector[3], i+1);
                }

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to