--- a/sound/usb/midi.c +++ b/sound/usb/midi.c @@ -1145,7 +1145,18 @@ static int snd_usbmidi_output_open(struc static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream) { - return substream_open(substream, 0, 0); + struct snd_usb_midi *umidi = substream->rmidi->private_data; + int i; + int ret = substream_open(substream, 0, 0); + + for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) { + struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; + + /* cancel work for the individual runtime */ + if (ep->out) + cancel_work_sync(&ep->out->work); + } + return ret; } static void snd_usbmidi_output_trigger(struct snd_rawmidi_substream *substream,