unsigned int active_urbs;
        unsigned int drain_urbs;
        int max_transfer;               /* size of urb buffer */
-       struct tasklet_struct tasklet;
+       struct work_struct work;
        unsigned int next_urb;
        spinlock_t buffer_lock;
 
        spin_unlock_irqrestore(&ep->buffer_lock, flags);
 }
 
-static void snd_usbmidi_out_tasklet(struct tasklet_struct *t)
+static void snd_usbmidi_out_work(struct work_struct *work)
 {
-       struct snd_usb_midi_out_endpoint *ep = from_tasklet(ep, t, tasklet);
+       struct snd_usb_midi_out_endpoint *ep =
+               container_of(work, struct snd_usb_midi_out_endpoint, work);
 
        snd_usbmidi_do_output(ep);
 }
                        snd_rawmidi_proceed(substream);
                        return;
                }
-               tasklet_schedule(&port->ep->tasklet);
+               queue_work(system_highpri_wq, &port->ep->work);
        }
 }
 
        }
 
        spin_lock_init(&ep->buffer_lock);
-       tasklet_setup(&ep->tasklet, snd_usbmidi_out_tasklet);
+       INIT_WORK(&ep->work, snd_usbmidi_out_work);
        init_waitqueue_head(&ep->drain_wait);
 
        for (i = 0; i < 0x10; ++i)
        for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) {
                struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i];
                if (ep->out)
-                       tasklet_kill(&ep->out->tasklet);
+                       cancel_work_sync(&ep->out->work);
                if (ep->out) {
                        for (j = 0; j < OUTPUT_URBS; ++j)
                                usb_kill_urb(ep->out->urbs[j].urb);