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]