static void snd_usbmidi_out_urb_complete(struct urb* urb, struct pt_regs *regs) { snd_usb_midi_out_endpoint_t* ep = urb->context; if (urb->status < 0) { if (snd_usbmidi_urb_error(urb->status) < 0) return; } snd_usbmidi_do_output(ep); }
/* called after transfers had been interrupted due to some USB error */ static void snd_usbmidi_error_timer(unsigned long data) { snd_usb_midi_t *umidi = (snd_usb_midi_t *)data; int i; for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) { snd_usb_midi_in_endpoint_t *in = umidi->endpoints[i].in; if (in && in->error_resubmit) { in->error_resubmit = 0; in->urb->dev = umidi->chip->dev; snd_usbmidi_submit_urb(in->urb, GFP_ATOMIC); } if (umidi->endpoints[i].out) snd_usbmidi_do_output(umidi->endpoints[i].out); } }
static void snd_usbmidi_out_urb_complete(struct urb* urb, struct pt_regs *regs) { snd_usb_midi_out_endpoint_t* ep = urb->context; spin_lock(&ep->buffer_lock); ep->urb_active = 0; spin_unlock(&ep->buffer_lock); if (urb->status < 0) { int err = snd_usbmidi_urb_error(urb->status); if (err < 0) { if (err != -ENODEV) mod_timer(&ep->umidi->error_timer, jiffies + ERROR_DELAY_JIFFIES); return; } } snd_usbmidi_do_output(ep); }
static void snd_usbmidi_out_tasklet(unsigned long data) { snd_usb_midi_out_endpoint_t* ep = (snd_usb_midi_out_endpoint_t *) data; snd_usbmidi_do_output(ep); }