You found it. I just got around to tinkering with it again since last weekend. Although I remember your e-mail, I forgot about your suggested patch. I came up with the same patch you did after adding some debugging that showed that the value for out_interval was all over the place, with the symptoms particularly bad for large values. The uninitialized state of out_interval only occurs with the midiman series of interfaces -- it looks like all others wil have out_interval initialized with the value from ep->bInterval in snd_usbmidi_detect_endpoints(). In any case, the patch works great! Thanks for the help everybody! David On Mon, Feb 09, 2009 at 11:43:57AM +0100, Clemens Ladisch wrote: > David wrote: > > I've isolated it to a patch made on the alsa side under commit: > > > > commit a6a712aeb17ff30206ae1bc827d50497d884602a > > Author: Clemens Ladisch <clemens@xxxxxxxxxx> > > Date: Tue Aug 21 08:56:08 2007 +0200 > > > > [ALSA] usb-audio: allow output interrupt transfers for MIDI > > > > Allow output interrupt transfers for some MIDI devices that require > > them. > > > > The patch effectively changed how alsa interfaces with my midi dongle, going > > from using the bulk endpoint to the interrupt one for output. > > This is because of an uninitialized variable in another part of the code, > which makes the snd_usbmidi_out_endpoint_create() function believe that > it has to use an interrupt pipe. > > Please try the (untested) patch below. > > > Why would interrupt transfers behave differently when using ehci and a hub's > > TT vice being native to the ohci hcd? > > Perhaps the OHCI HCD doesn't use interrupt transfers when the endpoint > is actually a bulk endpoint, or it doesn't use transfer intervals that > are as high as those used by EHCI, or the random stack contents are just > different. > > > Best regards, > Clemens > > > diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c > index 320641a..26bad37 100644 > --- a/sound/usb/usbmidi.c > +++ b/sound/usb/usbmidi.c > @@ -1625,6 +1625,7 @@ static int snd_usbmidi_create_endpoints_midiman(struct snd_usb_midi* umidi, > } > > ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; > + ep_info.out_interval = 0; > ep_info.out_cables = endpoint->out_cables & 0x5555; > err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]); > if (err < 0) > -- > 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 -- 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