Merge tag 'drm-misc-fixes-2022-12-08' of git://anongit.freedesktop.org/drm/drm-misc...
[platform/kernel/linux-starfive.git] / sound / core / rawmidi.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *  Abstract layer for MIDI v1.0 stream
4  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
5  */
6
7 #include <sound/core.h>
8 #include <linux/major.h>
9 #include <linux/init.h>
10 #include <linux/sched/signal.h>
11 #include <linux/slab.h>
12 #include <linux/time.h>
13 #include <linux/wait.h>
14 #include <linux/mutex.h>
15 #include <linux/module.h>
16 #include <linux/delay.h>
17 #include <linux/mm.h>
18 #include <linux/nospec.h>
19 #include <sound/rawmidi.h>
20 #include <sound/info.h>
21 #include <sound/control.h>
22 #include <sound/minors.h>
23 #include <sound/initval.h>
24
25 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
26 MODULE_DESCRIPTION("Midlevel RawMidi code for ALSA.");
27 MODULE_LICENSE("GPL");
28
29 #ifdef CONFIG_SND_OSSEMUL
30 static int midi_map[SNDRV_CARDS];
31 static int amidi_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1};
32 module_param_array(midi_map, int, NULL, 0444);
33 MODULE_PARM_DESC(midi_map, "Raw MIDI device number assigned to 1st OSS device.");
34 module_param_array(amidi_map, int, NULL, 0444);
35 MODULE_PARM_DESC(amidi_map, "Raw MIDI device number assigned to 2nd OSS device.");
36 #endif /* CONFIG_SND_OSSEMUL */
37
38 static int snd_rawmidi_free(struct snd_rawmidi *rmidi);
39 static int snd_rawmidi_dev_free(struct snd_device *device);
40 static int snd_rawmidi_dev_register(struct snd_device *device);
41 static int snd_rawmidi_dev_disconnect(struct snd_device *device);
42
43 static LIST_HEAD(snd_rawmidi_devices);
44 static DEFINE_MUTEX(register_mutex);
45
46 #define rmidi_err(rmidi, fmt, args...) \
47         dev_err(&(rmidi)->dev, fmt, ##args)
48 #define rmidi_warn(rmidi, fmt, args...) \
49         dev_warn(&(rmidi)->dev, fmt, ##args)
50 #define rmidi_dbg(rmidi, fmt, args...) \
51         dev_dbg(&(rmidi)->dev, fmt, ##args)
52
53 struct snd_rawmidi_status32 {
54         s32 stream;
55         s32 tstamp_sec;                 /* Timestamp */
56         s32 tstamp_nsec;
57         u32 avail;                      /* available bytes */
58         u32 xruns;                      /* count of overruns since last status (in bytes) */
59         unsigned char reserved[16];     /* reserved for future use */
60 };
61
62 #define SNDRV_RAWMIDI_IOCTL_STATUS32    _IOWR('W', 0x20, struct snd_rawmidi_status32)
63
64 struct snd_rawmidi_status64 {
65         int stream;
66         u8 rsvd[4];                     /* alignment */
67         s64 tstamp_sec;                 /* Timestamp */
68         s64 tstamp_nsec;
69         size_t avail;                   /* available bytes */
70         size_t xruns;                   /* count of overruns since last status (in bytes) */
71         unsigned char reserved[16];     /* reserved for future use */
72 };
73
74 #define SNDRV_RAWMIDI_IOCTL_STATUS64    _IOWR('W', 0x20, struct snd_rawmidi_status64)
75
76 static struct snd_rawmidi *snd_rawmidi_search(struct snd_card *card, int device)
77 {
78         struct snd_rawmidi *rawmidi;
79
80         list_for_each_entry(rawmidi, &snd_rawmidi_devices, list)
81                 if (rawmidi->card == card && rawmidi->device == device)
82                         return rawmidi;
83         return NULL;
84 }
85
86 static inline unsigned short snd_rawmidi_file_flags(struct file *file)
87 {
88         switch (file->f_mode & (FMODE_READ | FMODE_WRITE)) {
89         case FMODE_WRITE:
90                 return SNDRV_RAWMIDI_LFLG_OUTPUT;
91         case FMODE_READ:
92                 return SNDRV_RAWMIDI_LFLG_INPUT;
93         default:
94                 return SNDRV_RAWMIDI_LFLG_OPEN;
95         }
96 }
97
98 static inline bool __snd_rawmidi_ready(struct snd_rawmidi_runtime *runtime)
99 {
100         return runtime->avail >= runtime->avail_min;
101 }
102
103 static bool snd_rawmidi_ready(struct snd_rawmidi_substream *substream)
104 {
105         unsigned long flags;
106         bool ready;
107
108         spin_lock_irqsave(&substream->lock, flags);
109         ready = __snd_rawmidi_ready(substream->runtime);
110         spin_unlock_irqrestore(&substream->lock, flags);
111         return ready;
112 }
113
114 static inline int snd_rawmidi_ready_append(struct snd_rawmidi_substream *substream,
115                                            size_t count)
116 {
117         struct snd_rawmidi_runtime *runtime = substream->runtime;
118
119         return runtime->avail >= runtime->avail_min &&
120                (!substream->append || runtime->avail >= count);
121 }
122
123 static void snd_rawmidi_input_event_work(struct work_struct *work)
124 {
125         struct snd_rawmidi_runtime *runtime =
126                 container_of(work, struct snd_rawmidi_runtime, event_work);
127
128         if (runtime->event)
129                 runtime->event(runtime->substream);
130 }
131
132 /* buffer refcount management: call with substream->lock held */
133 static inline void snd_rawmidi_buffer_ref(struct snd_rawmidi_runtime *runtime)
134 {
135         runtime->buffer_ref++;
136 }
137
138 static inline void snd_rawmidi_buffer_unref(struct snd_rawmidi_runtime *runtime)
139 {
140         runtime->buffer_ref--;
141 }
142
143 static void snd_rawmidi_buffer_ref_sync(struct snd_rawmidi_substream *substream)
144 {
145         int loop = HZ;
146
147         spin_lock_irq(&substream->lock);
148         while (substream->runtime->buffer_ref) {
149                 spin_unlock_irq(&substream->lock);
150                 if (!--loop) {
151                         rmidi_err(substream->rmidi, "Buffer ref sync timeout\n");
152                         return;
153                 }
154                 schedule_timeout_uninterruptible(1);
155                 spin_lock_irq(&substream->lock);
156         }
157         spin_unlock_irq(&substream->lock);
158 }
159
160 static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream)
161 {
162         struct snd_rawmidi_runtime *runtime;
163
164         runtime = kzalloc(sizeof(*runtime), GFP_KERNEL);
165         if (!runtime)
166                 return -ENOMEM;
167         runtime->substream = substream;
168         init_waitqueue_head(&runtime->sleep);
169         INIT_WORK(&runtime->event_work, snd_rawmidi_input_event_work);
170         runtime->event = NULL;
171         runtime->buffer_size = PAGE_SIZE;
172         runtime->avail_min = 1;
173         if (substream->stream == SNDRV_RAWMIDI_STREAM_INPUT)
174                 runtime->avail = 0;
175         else
176                 runtime->avail = runtime->buffer_size;
177         runtime->buffer = kvzalloc(runtime->buffer_size, GFP_KERNEL);
178         if (!runtime->buffer) {
179                 kfree(runtime);
180                 return -ENOMEM;
181         }
182         runtime->appl_ptr = runtime->hw_ptr = 0;
183         substream->runtime = runtime;
184         return 0;
185 }
186
187 static int snd_rawmidi_runtime_free(struct snd_rawmidi_substream *substream)
188 {
189         struct snd_rawmidi_runtime *runtime = substream->runtime;
190
191         kvfree(runtime->buffer);
192         kfree(runtime);
193         substream->runtime = NULL;
194         return 0;
195 }
196
197 static inline void snd_rawmidi_output_trigger(struct snd_rawmidi_substream *substream, int up)
198 {
199         if (!substream->opened)
200                 return;
201         substream->ops->trigger(substream, up);
202 }
203
204 static void snd_rawmidi_input_trigger(struct snd_rawmidi_substream *substream, int up)
205 {
206         if (!substream->opened)
207                 return;
208         substream->ops->trigger(substream, up);
209         if (!up)
210                 cancel_work_sync(&substream->runtime->event_work);
211 }
212
213 static void __reset_runtime_ptrs(struct snd_rawmidi_runtime *runtime,
214                                  bool is_input)
215 {
216         runtime->drain = 0;
217         runtime->appl_ptr = runtime->hw_ptr = 0;
218         runtime->avail = is_input ? 0 : runtime->buffer_size;
219 }
220
221 static void reset_runtime_ptrs(struct snd_rawmidi_substream *substream,
222                                bool is_input)
223 {
224         unsigned long flags;
225
226         spin_lock_irqsave(&substream->lock, flags);
227         if (substream->opened && substream->runtime)
228                 __reset_runtime_ptrs(substream->runtime, is_input);
229         spin_unlock_irqrestore(&substream->lock, flags);
230 }
231
232 int snd_rawmidi_drop_output(struct snd_rawmidi_substream *substream)
233 {
234         snd_rawmidi_output_trigger(substream, 0);
235         reset_runtime_ptrs(substream, false);
236         return 0;
237 }
238 EXPORT_SYMBOL(snd_rawmidi_drop_output);
239
240 int snd_rawmidi_drain_output(struct snd_rawmidi_substream *substream)
241 {
242         int err = 0;
243         long timeout;
244         struct snd_rawmidi_runtime *runtime;
245
246         spin_lock_irq(&substream->lock);
247         runtime = substream->runtime;
248         if (!substream->opened || !runtime || !runtime->buffer) {
249                 err = -EINVAL;
250         } else {
251                 snd_rawmidi_buffer_ref(runtime);
252                 runtime->drain = 1;
253         }
254         spin_unlock_irq(&substream->lock);
255         if (err < 0)
256                 return err;
257
258         timeout = wait_event_interruptible_timeout(runtime->sleep,
259                                 (runtime->avail >= runtime->buffer_size),
260                                 10*HZ);
261
262         spin_lock_irq(&substream->lock);
263         if (signal_pending(current))
264                 err = -ERESTARTSYS;
265         if (runtime->avail < runtime->buffer_size && !timeout) {
266                 rmidi_warn(substream->rmidi,
267                            "rawmidi drain error (avail = %li, buffer_size = %li)\n",
268                            (long)runtime->avail, (long)runtime->buffer_size);
269                 err = -EIO;
270         }
271         runtime->drain = 0;
272         spin_unlock_irq(&substream->lock);
273
274         if (err != -ERESTARTSYS) {
275                 /* we need wait a while to make sure that Tx FIFOs are empty */
276                 if (substream->ops->drain)
277                         substream->ops->drain(substream);
278                 else
279                         msleep(50);
280                 snd_rawmidi_drop_output(substream);
281         }
282
283         spin_lock_irq(&substream->lock);
284         snd_rawmidi_buffer_unref(runtime);
285         spin_unlock_irq(&substream->lock);
286
287         return err;
288 }
289 EXPORT_SYMBOL(snd_rawmidi_drain_output);
290
291 int snd_rawmidi_drain_input(struct snd_rawmidi_substream *substream)
292 {
293         snd_rawmidi_input_trigger(substream, 0);
294         reset_runtime_ptrs(substream, true);
295         return 0;
296 }
297 EXPORT_SYMBOL(snd_rawmidi_drain_input);
298
299 /* look for an available substream for the given stream direction;
300  * if a specific subdevice is given, try to assign it
301  */
302 static int assign_substream(struct snd_rawmidi *rmidi, int subdevice,
303                             int stream, int mode,
304                             struct snd_rawmidi_substream **sub_ret)
305 {
306         struct snd_rawmidi_substream *substream;
307         struct snd_rawmidi_str *s = &rmidi->streams[stream];
308         static const unsigned int info_flags[2] = {
309                 [SNDRV_RAWMIDI_STREAM_OUTPUT] = SNDRV_RAWMIDI_INFO_OUTPUT,
310                 [SNDRV_RAWMIDI_STREAM_INPUT] = SNDRV_RAWMIDI_INFO_INPUT,
311         };
312
313         if (!(rmidi->info_flags & info_flags[stream]))
314                 return -ENXIO;
315         if (subdevice >= 0 && subdevice >= s->substream_count)
316                 return -ENODEV;
317
318         list_for_each_entry(substream, &s->substreams, list) {
319                 if (substream->opened) {
320                         if (stream == SNDRV_RAWMIDI_STREAM_INPUT ||
321                             !(mode & SNDRV_RAWMIDI_LFLG_APPEND) ||
322                             !substream->append)
323                                 continue;
324                 }
325                 if (subdevice < 0 || subdevice == substream->number) {
326                         *sub_ret = substream;
327                         return 0;
328                 }
329         }
330         return -EAGAIN;
331 }
332
333 /* open and do ref-counting for the given substream */
334 static int open_substream(struct snd_rawmidi *rmidi,
335                           struct snd_rawmidi_substream *substream,
336                           int mode)
337 {
338         int err;
339
340         if (substream->use_count == 0) {
341                 err = snd_rawmidi_runtime_create(substream);
342                 if (err < 0)
343                         return err;
344                 err = substream->ops->open(substream);
345                 if (err < 0) {
346                         snd_rawmidi_runtime_free(substream);
347                         return err;
348                 }
349                 spin_lock_irq(&substream->lock);
350                 substream->opened = 1;
351                 substream->active_sensing = 0;
352                 if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
353                         substream->append = 1;
354                 substream->pid = get_pid(task_pid(current));
355                 rmidi->streams[substream->stream].substream_opened++;
356                 spin_unlock_irq(&substream->lock);
357         }
358         substream->use_count++;
359         return 0;
360 }
361
362 static void close_substream(struct snd_rawmidi *rmidi,
363                             struct snd_rawmidi_substream *substream,
364                             int cleanup);
365
366 static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode,
367                              struct snd_rawmidi_file *rfile)
368 {
369         struct snd_rawmidi_substream *sinput = NULL, *soutput = NULL;
370         int err;
371
372         rfile->input = rfile->output = NULL;
373         if (mode & SNDRV_RAWMIDI_LFLG_INPUT) {
374                 err = assign_substream(rmidi, subdevice,
375                                        SNDRV_RAWMIDI_STREAM_INPUT,
376                                        mode, &sinput);
377                 if (err < 0)
378                         return err;
379         }
380         if (mode & SNDRV_RAWMIDI_LFLG_OUTPUT) {
381                 err = assign_substream(rmidi, subdevice,
382                                        SNDRV_RAWMIDI_STREAM_OUTPUT,
383                                        mode, &soutput);
384                 if (err < 0)
385                         return err;
386         }
387
388         if (sinput) {
389                 err = open_substream(rmidi, sinput, mode);
390                 if (err < 0)
391                         return err;
392         }
393         if (soutput) {
394                 err = open_substream(rmidi, soutput, mode);
395                 if (err < 0) {
396                         if (sinput)
397                                 close_substream(rmidi, sinput, 0);
398                         return err;
399                 }
400         }
401
402         rfile->rmidi = rmidi;
403         rfile->input = sinput;
404         rfile->output = soutput;
405         return 0;
406 }
407
408 /* called from sound/core/seq/seq_midi.c */
409 int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice,
410                             int mode, struct snd_rawmidi_file *rfile)
411 {
412         struct snd_rawmidi *rmidi;
413         int err = 0;
414
415         if (snd_BUG_ON(!rfile))
416                 return -EINVAL;
417
418         mutex_lock(&register_mutex);
419         rmidi = snd_rawmidi_search(card, device);
420         if (!rmidi)
421                 err = -ENODEV;
422         else if (!try_module_get(rmidi->card->module))
423                 err = -ENXIO;
424         mutex_unlock(&register_mutex);
425         if (err < 0)
426                 return err;
427
428         mutex_lock(&rmidi->open_mutex);
429         err = rawmidi_open_priv(rmidi, subdevice, mode, rfile);
430         mutex_unlock(&rmidi->open_mutex);
431         if (err < 0)
432                 module_put(rmidi->card->module);
433         return err;
434 }
435 EXPORT_SYMBOL(snd_rawmidi_kernel_open);
436
437 static int snd_rawmidi_open(struct inode *inode, struct file *file)
438 {
439         int maj = imajor(inode);
440         struct snd_card *card;
441         int subdevice;
442         unsigned short fflags;
443         int err;
444         struct snd_rawmidi *rmidi;
445         struct snd_rawmidi_file *rawmidi_file = NULL;
446         wait_queue_entry_t wait;
447
448         if ((file->f_flags & O_APPEND) && !(file->f_flags & O_NONBLOCK))
449                 return -EINVAL;         /* invalid combination */
450
451         err = stream_open(inode, file);
452         if (err < 0)
453                 return err;
454
455         if (maj == snd_major) {
456                 rmidi = snd_lookup_minor_data(iminor(inode),
457                                               SNDRV_DEVICE_TYPE_RAWMIDI);
458 #ifdef CONFIG_SND_OSSEMUL
459         } else if (maj == SOUND_MAJOR) {
460                 rmidi = snd_lookup_oss_minor_data(iminor(inode),
461                                                   SNDRV_OSS_DEVICE_TYPE_MIDI);
462 #endif
463         } else
464                 return -ENXIO;
465
466         if (rmidi == NULL)
467                 return -ENODEV;
468
469         if (!try_module_get(rmidi->card->module)) {
470                 snd_card_unref(rmidi->card);
471                 return -ENXIO;
472         }
473
474         mutex_lock(&rmidi->open_mutex);
475         card = rmidi->card;
476         err = snd_card_file_add(card, file);
477         if (err < 0)
478                 goto __error_card;
479         fflags = snd_rawmidi_file_flags(file);
480         if ((file->f_flags & O_APPEND) || maj == SOUND_MAJOR) /* OSS emul? */
481                 fflags |= SNDRV_RAWMIDI_LFLG_APPEND;
482         rawmidi_file = kmalloc(sizeof(*rawmidi_file), GFP_KERNEL);
483         if (rawmidi_file == NULL) {
484                 err = -ENOMEM;
485                 goto __error;
486         }
487         rawmidi_file->user_pversion = 0;
488         init_waitqueue_entry(&wait, current);
489         add_wait_queue(&rmidi->open_wait, &wait);
490         while (1) {
491                 subdevice = snd_ctl_get_preferred_subdevice(card, SND_CTL_SUBDEV_RAWMIDI);
492                 err = rawmidi_open_priv(rmidi, subdevice, fflags, rawmidi_file);
493                 if (err >= 0)
494                         break;
495                 if (err == -EAGAIN) {
496                         if (file->f_flags & O_NONBLOCK) {
497                                 err = -EBUSY;
498                                 break;
499                         }
500                 } else
501                         break;
502                 set_current_state(TASK_INTERRUPTIBLE);
503                 mutex_unlock(&rmidi->open_mutex);
504                 schedule();
505                 mutex_lock(&rmidi->open_mutex);
506                 if (rmidi->card->shutdown) {
507                         err = -ENODEV;
508                         break;
509                 }
510                 if (signal_pending(current)) {
511                         err = -ERESTARTSYS;
512                         break;
513                 }
514         }
515         remove_wait_queue(&rmidi->open_wait, &wait);
516         if (err < 0) {
517                 kfree(rawmidi_file);
518                 goto __error;
519         }
520 #ifdef CONFIG_SND_OSSEMUL
521         if (rawmidi_file->input && rawmidi_file->input->runtime)
522                 rawmidi_file->input->runtime->oss = (maj == SOUND_MAJOR);
523         if (rawmidi_file->output && rawmidi_file->output->runtime)
524                 rawmidi_file->output->runtime->oss = (maj == SOUND_MAJOR);
525 #endif
526         file->private_data = rawmidi_file;
527         mutex_unlock(&rmidi->open_mutex);
528         snd_card_unref(rmidi->card);
529         return 0;
530
531  __error:
532         snd_card_file_remove(card, file);
533  __error_card:
534         mutex_unlock(&rmidi->open_mutex);
535         module_put(rmidi->card->module);
536         snd_card_unref(rmidi->card);
537         return err;
538 }
539
540 static void close_substream(struct snd_rawmidi *rmidi,
541                             struct snd_rawmidi_substream *substream,
542                             int cleanup)
543 {
544         if (--substream->use_count)
545                 return;
546
547         if (cleanup) {
548                 if (substream->stream == SNDRV_RAWMIDI_STREAM_INPUT)
549                         snd_rawmidi_input_trigger(substream, 0);
550                 else {
551                         if (substream->active_sensing) {
552                                 unsigned char buf = 0xfe;
553                                 /* sending single active sensing message
554                                  * to shut the device up
555                                  */
556                                 snd_rawmidi_kernel_write(substream, &buf, 1);
557                         }
558                         if (snd_rawmidi_drain_output(substream) == -ERESTARTSYS)
559                                 snd_rawmidi_output_trigger(substream, 0);
560                 }
561                 snd_rawmidi_buffer_ref_sync(substream);
562         }
563         spin_lock_irq(&substream->lock);
564         substream->opened = 0;
565         substream->append = 0;
566         spin_unlock_irq(&substream->lock);
567         substream->ops->close(substream);
568         if (substream->runtime->private_free)
569                 substream->runtime->private_free(substream);
570         snd_rawmidi_runtime_free(substream);
571         put_pid(substream->pid);
572         substream->pid = NULL;
573         rmidi->streams[substream->stream].substream_opened--;
574 }
575
576 static void rawmidi_release_priv(struct snd_rawmidi_file *rfile)
577 {
578         struct snd_rawmidi *rmidi;
579
580         rmidi = rfile->rmidi;
581         mutex_lock(&rmidi->open_mutex);
582         if (rfile->input) {
583                 close_substream(rmidi, rfile->input, 1);
584                 rfile->input = NULL;
585         }
586         if (rfile->output) {
587                 close_substream(rmidi, rfile->output, 1);
588                 rfile->output = NULL;
589         }
590         rfile->rmidi = NULL;
591         mutex_unlock(&rmidi->open_mutex);
592         wake_up(&rmidi->open_wait);
593 }
594
595 /* called from sound/core/seq/seq_midi.c */
596 int snd_rawmidi_kernel_release(struct snd_rawmidi_file *rfile)
597 {
598         struct snd_rawmidi *rmidi;
599
600         if (snd_BUG_ON(!rfile))
601                 return -ENXIO;
602
603         rmidi = rfile->rmidi;
604         rawmidi_release_priv(rfile);
605         module_put(rmidi->card->module);
606         return 0;
607 }
608 EXPORT_SYMBOL(snd_rawmidi_kernel_release);
609
610 static int snd_rawmidi_release(struct inode *inode, struct file *file)
611 {
612         struct snd_rawmidi_file *rfile;
613         struct snd_rawmidi *rmidi;
614         struct module *module;
615
616         rfile = file->private_data;
617         rmidi = rfile->rmidi;
618         rawmidi_release_priv(rfile);
619         kfree(rfile);
620         module = rmidi->card->module;
621         snd_card_file_remove(rmidi->card, file);
622         module_put(module);
623         return 0;
624 }
625
626 static int snd_rawmidi_info(struct snd_rawmidi_substream *substream,
627                             struct snd_rawmidi_info *info)
628 {
629         struct snd_rawmidi *rmidi;
630
631         if (substream == NULL)
632                 return -ENODEV;
633         rmidi = substream->rmidi;
634         memset(info, 0, sizeof(*info));
635         info->card = rmidi->card->number;
636         info->device = rmidi->device;
637         info->subdevice = substream->number;
638         info->stream = substream->stream;
639         info->flags = rmidi->info_flags;
640         strcpy(info->id, rmidi->id);
641         strcpy(info->name, rmidi->name);
642         strcpy(info->subname, substream->name);
643         info->subdevices_count = substream->pstr->substream_count;
644         info->subdevices_avail = (substream->pstr->substream_count -
645                                   substream->pstr->substream_opened);
646         return 0;
647 }
648
649 static int snd_rawmidi_info_user(struct snd_rawmidi_substream *substream,
650                                  struct snd_rawmidi_info __user *_info)
651 {
652         struct snd_rawmidi_info info;
653         int err;
654
655         err = snd_rawmidi_info(substream, &info);
656         if (err < 0)
657                 return err;
658         if (copy_to_user(_info, &info, sizeof(struct snd_rawmidi_info)))
659                 return -EFAULT;
660         return 0;
661 }
662
663 static int __snd_rawmidi_info_select(struct snd_card *card,
664                                      struct snd_rawmidi_info *info)
665 {
666         struct snd_rawmidi *rmidi;
667         struct snd_rawmidi_str *pstr;
668         struct snd_rawmidi_substream *substream;
669
670         rmidi = snd_rawmidi_search(card, info->device);
671         if (!rmidi)
672                 return -ENXIO;
673         if (info->stream < 0 || info->stream > 1)
674                 return -EINVAL;
675         info->stream = array_index_nospec(info->stream, 2);
676         pstr = &rmidi->streams[info->stream];
677         if (pstr->substream_count == 0)
678                 return -ENOENT;
679         if (info->subdevice >= pstr->substream_count)
680                 return -ENXIO;
681         list_for_each_entry(substream, &pstr->substreams, list) {
682                 if ((unsigned int)substream->number == info->subdevice)
683                         return snd_rawmidi_info(substream, info);
684         }
685         return -ENXIO;
686 }
687
688 int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info)
689 {
690         int ret;
691
692         mutex_lock(&register_mutex);
693         ret = __snd_rawmidi_info_select(card, info);
694         mutex_unlock(&register_mutex);
695         return ret;
696 }
697 EXPORT_SYMBOL(snd_rawmidi_info_select);
698
699 static int snd_rawmidi_info_select_user(struct snd_card *card,
700                                         struct snd_rawmidi_info __user *_info)
701 {
702         int err;
703         struct snd_rawmidi_info info;
704
705         if (get_user(info.device, &_info->device))
706                 return -EFAULT;
707         if (get_user(info.stream, &_info->stream))
708                 return -EFAULT;
709         if (get_user(info.subdevice, &_info->subdevice))
710                 return -EFAULT;
711         err = snd_rawmidi_info_select(card, &info);
712         if (err < 0)
713                 return err;
714         if (copy_to_user(_info, &info, sizeof(struct snd_rawmidi_info)))
715                 return -EFAULT;
716         return 0;
717 }
718
719 static int resize_runtime_buffer(struct snd_rawmidi_substream *substream,
720                                  struct snd_rawmidi_params *params,
721                                  bool is_input)
722 {
723         struct snd_rawmidi_runtime *runtime = substream->runtime;
724         char *newbuf, *oldbuf;
725         unsigned int framing = params->mode & SNDRV_RAWMIDI_MODE_FRAMING_MASK;
726
727         if (params->buffer_size < 32 || params->buffer_size > 1024L * 1024L)
728                 return -EINVAL;
729         if (framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP && (params->buffer_size & 0x1f) != 0)
730                 return -EINVAL;
731         if (params->avail_min < 1 || params->avail_min > params->buffer_size)
732                 return -EINVAL;
733         if (params->buffer_size != runtime->buffer_size) {
734                 newbuf = kvzalloc(params->buffer_size, GFP_KERNEL);
735                 if (!newbuf)
736                         return -ENOMEM;
737                 spin_lock_irq(&substream->lock);
738                 if (runtime->buffer_ref) {
739                         spin_unlock_irq(&substream->lock);
740                         kvfree(newbuf);
741                         return -EBUSY;
742                 }
743                 oldbuf = runtime->buffer;
744                 runtime->buffer = newbuf;
745                 runtime->buffer_size = params->buffer_size;
746                 __reset_runtime_ptrs(runtime, is_input);
747                 spin_unlock_irq(&substream->lock);
748                 kvfree(oldbuf);
749         }
750         runtime->avail_min = params->avail_min;
751         return 0;
752 }
753
754 int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream,
755                               struct snd_rawmidi_params *params)
756 {
757         int err;
758
759         snd_rawmidi_drain_output(substream);
760         mutex_lock(&substream->rmidi->open_mutex);
761         if (substream->append && substream->use_count > 1)
762                 err = -EBUSY;
763         else
764                 err = resize_runtime_buffer(substream, params, false);
765
766         if (!err)
767                 substream->active_sensing = !params->no_active_sensing;
768         mutex_unlock(&substream->rmidi->open_mutex);
769         return err;
770 }
771 EXPORT_SYMBOL(snd_rawmidi_output_params);
772
773 int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream,
774                              struct snd_rawmidi_params *params)
775 {
776         unsigned int framing = params->mode & SNDRV_RAWMIDI_MODE_FRAMING_MASK;
777         unsigned int clock_type = params->mode & SNDRV_RAWMIDI_MODE_CLOCK_MASK;
778         int err;
779
780         snd_rawmidi_drain_input(substream);
781         mutex_lock(&substream->rmidi->open_mutex);
782         if (framing == SNDRV_RAWMIDI_MODE_FRAMING_NONE && clock_type != SNDRV_RAWMIDI_MODE_CLOCK_NONE)
783                 err = -EINVAL;
784         else if (clock_type > SNDRV_RAWMIDI_MODE_CLOCK_MONOTONIC_RAW)
785                 err = -EINVAL;
786         else if (framing > SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP)
787                 err = -EINVAL;
788         else
789                 err = resize_runtime_buffer(substream, params, true);
790
791         if (!err) {
792                 substream->framing = framing;
793                 substream->clock_type = clock_type;
794         }
795         mutex_unlock(&substream->rmidi->open_mutex);
796         return 0;
797 }
798 EXPORT_SYMBOL(snd_rawmidi_input_params);
799
800 static int snd_rawmidi_output_status(struct snd_rawmidi_substream *substream,
801                                      struct snd_rawmidi_status64 *status)
802 {
803         struct snd_rawmidi_runtime *runtime = substream->runtime;
804
805         memset(status, 0, sizeof(*status));
806         status->stream = SNDRV_RAWMIDI_STREAM_OUTPUT;
807         spin_lock_irq(&substream->lock);
808         status->avail = runtime->avail;
809         spin_unlock_irq(&substream->lock);
810         return 0;
811 }
812
813 static int snd_rawmidi_input_status(struct snd_rawmidi_substream *substream,
814                                     struct snd_rawmidi_status64 *status)
815 {
816         struct snd_rawmidi_runtime *runtime = substream->runtime;
817
818         memset(status, 0, sizeof(*status));
819         status->stream = SNDRV_RAWMIDI_STREAM_INPUT;
820         spin_lock_irq(&substream->lock);
821         status->avail = runtime->avail;
822         status->xruns = runtime->xruns;
823         runtime->xruns = 0;
824         spin_unlock_irq(&substream->lock);
825         return 0;
826 }
827
828 static int snd_rawmidi_ioctl_status32(struct snd_rawmidi_file *rfile,
829                                       struct snd_rawmidi_status32 __user *argp)
830 {
831         int err = 0;
832         struct snd_rawmidi_status32 __user *status = argp;
833         struct snd_rawmidi_status32 status32;
834         struct snd_rawmidi_status64 status64;
835
836         if (copy_from_user(&status32, argp,
837                            sizeof(struct snd_rawmidi_status32)))
838                 return -EFAULT;
839
840         switch (status32.stream) {
841         case SNDRV_RAWMIDI_STREAM_OUTPUT:
842                 if (rfile->output == NULL)
843                         return -EINVAL;
844                 err = snd_rawmidi_output_status(rfile->output, &status64);
845                 break;
846         case SNDRV_RAWMIDI_STREAM_INPUT:
847                 if (rfile->input == NULL)
848                         return -EINVAL;
849                 err = snd_rawmidi_input_status(rfile->input, &status64);
850                 break;
851         default:
852                 return -EINVAL;
853         }
854         if (err < 0)
855                 return err;
856
857         status32 = (struct snd_rawmidi_status32) {
858                 .stream = status64.stream,
859                 .tstamp_sec = status64.tstamp_sec,
860                 .tstamp_nsec = status64.tstamp_nsec,
861                 .avail = status64.avail,
862                 .xruns = status64.xruns,
863         };
864
865         if (copy_to_user(status, &status32, sizeof(*status)))
866                 return -EFAULT;
867
868         return 0;
869 }
870
871 static int snd_rawmidi_ioctl_status64(struct snd_rawmidi_file *rfile,
872                                       struct snd_rawmidi_status64 __user *argp)
873 {
874         int err = 0;
875         struct snd_rawmidi_status64 status;
876
877         if (copy_from_user(&status, argp, sizeof(struct snd_rawmidi_status64)))
878                 return -EFAULT;
879
880         switch (status.stream) {
881         case SNDRV_RAWMIDI_STREAM_OUTPUT:
882                 if (rfile->output == NULL)
883                         return -EINVAL;
884                 err = snd_rawmidi_output_status(rfile->output, &status);
885                 break;
886         case SNDRV_RAWMIDI_STREAM_INPUT:
887                 if (rfile->input == NULL)
888                         return -EINVAL;
889                 err = snd_rawmidi_input_status(rfile->input, &status);
890                 break;
891         default:
892                 return -EINVAL;
893         }
894         if (err < 0)
895                 return err;
896         if (copy_to_user(argp, &status,
897                          sizeof(struct snd_rawmidi_status64)))
898                 return -EFAULT;
899         return 0;
900 }
901
902 static long snd_rawmidi_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
903 {
904         struct snd_rawmidi_file *rfile;
905         void __user *argp = (void __user *)arg;
906
907         rfile = file->private_data;
908         if (((cmd >> 8) & 0xff) != 'W')
909                 return -ENOTTY;
910         switch (cmd) {
911         case SNDRV_RAWMIDI_IOCTL_PVERSION:
912                 return put_user(SNDRV_RAWMIDI_VERSION, (int __user *)argp) ? -EFAULT : 0;
913         case SNDRV_RAWMIDI_IOCTL_INFO:
914         {
915                 int stream;
916                 struct snd_rawmidi_info __user *info = argp;
917
918                 if (get_user(stream, &info->stream))
919                         return -EFAULT;
920                 switch (stream) {
921                 case SNDRV_RAWMIDI_STREAM_INPUT:
922                         return snd_rawmidi_info_user(rfile->input, info);
923                 case SNDRV_RAWMIDI_STREAM_OUTPUT:
924                         return snd_rawmidi_info_user(rfile->output, info);
925                 default:
926                         return -EINVAL;
927                 }
928         }
929         case SNDRV_RAWMIDI_IOCTL_USER_PVERSION:
930                 if (get_user(rfile->user_pversion, (unsigned int __user *)arg))
931                         return -EFAULT;
932                 return 0;
933
934         case SNDRV_RAWMIDI_IOCTL_PARAMS:
935         {
936                 struct snd_rawmidi_params params;
937
938                 if (copy_from_user(&params, argp, sizeof(struct snd_rawmidi_params)))
939                         return -EFAULT;
940                 if (rfile->user_pversion < SNDRV_PROTOCOL_VERSION(2, 0, 2)) {
941                         params.mode = 0;
942                         memset(params.reserved, 0, sizeof(params.reserved));
943                 }
944                 switch (params.stream) {
945                 case SNDRV_RAWMIDI_STREAM_OUTPUT:
946                         if (rfile->output == NULL)
947                                 return -EINVAL;
948                         return snd_rawmidi_output_params(rfile->output, &params);
949                 case SNDRV_RAWMIDI_STREAM_INPUT:
950                         if (rfile->input == NULL)
951                                 return -EINVAL;
952                         return snd_rawmidi_input_params(rfile->input, &params);
953                 default:
954                         return -EINVAL;
955                 }
956         }
957         case SNDRV_RAWMIDI_IOCTL_STATUS32:
958                 return snd_rawmidi_ioctl_status32(rfile, argp);
959         case SNDRV_RAWMIDI_IOCTL_STATUS64:
960                 return snd_rawmidi_ioctl_status64(rfile, argp);
961         case SNDRV_RAWMIDI_IOCTL_DROP:
962         {
963                 int val;
964
965                 if (get_user(val, (int __user *) argp))
966                         return -EFAULT;
967                 switch (val) {
968                 case SNDRV_RAWMIDI_STREAM_OUTPUT:
969                         if (rfile->output == NULL)
970                                 return -EINVAL;
971                         return snd_rawmidi_drop_output(rfile->output);
972                 default:
973                         return -EINVAL;
974                 }
975         }
976         case SNDRV_RAWMIDI_IOCTL_DRAIN:
977         {
978                 int val;
979
980                 if (get_user(val, (int __user *) argp))
981                         return -EFAULT;
982                 switch (val) {
983                 case SNDRV_RAWMIDI_STREAM_OUTPUT:
984                         if (rfile->output == NULL)
985                                 return -EINVAL;
986                         return snd_rawmidi_drain_output(rfile->output);
987                 case SNDRV_RAWMIDI_STREAM_INPUT:
988                         if (rfile->input == NULL)
989                                 return -EINVAL;
990                         return snd_rawmidi_drain_input(rfile->input);
991                 default:
992                         return -EINVAL;
993                 }
994         }
995         default:
996                 rmidi_dbg(rfile->rmidi,
997                           "rawmidi: unknown command = 0x%x\n", cmd);
998         }
999         return -ENOTTY;
1000 }
1001
1002 static int snd_rawmidi_control_ioctl(struct snd_card *card,
1003                                      struct snd_ctl_file *control,
1004                                      unsigned int cmd,
1005                                      unsigned long arg)
1006 {
1007         void __user *argp = (void __user *)arg;
1008
1009         switch (cmd) {
1010         case SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE:
1011         {
1012                 int device;
1013
1014                 if (get_user(device, (int __user *)argp))
1015                         return -EFAULT;
1016                 if (device >= SNDRV_RAWMIDI_DEVICES) /* next device is -1 */
1017                         device = SNDRV_RAWMIDI_DEVICES - 1;
1018                 mutex_lock(&register_mutex);
1019                 device = device < 0 ? 0 : device + 1;
1020                 while (device < SNDRV_RAWMIDI_DEVICES) {
1021                         if (snd_rawmidi_search(card, device))
1022                                 break;
1023                         device++;
1024                 }
1025                 if (device == SNDRV_RAWMIDI_DEVICES)
1026                         device = -1;
1027                 mutex_unlock(&register_mutex);
1028                 if (put_user(device, (int __user *)argp))
1029                         return -EFAULT;
1030                 return 0;
1031         }
1032         case SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE:
1033         {
1034                 int val;
1035
1036                 if (get_user(val, (int __user *)argp))
1037                         return -EFAULT;
1038                 control->preferred_subdevice[SND_CTL_SUBDEV_RAWMIDI] = val;
1039                 return 0;
1040         }
1041         case SNDRV_CTL_IOCTL_RAWMIDI_INFO:
1042                 return snd_rawmidi_info_select_user(card, argp);
1043         }
1044         return -ENOIOCTLCMD;
1045 }
1046
1047 static int receive_with_tstamp_framing(struct snd_rawmidi_substream *substream,
1048                         const unsigned char *buffer, int src_count, const struct timespec64 *tstamp)
1049 {
1050         struct snd_rawmidi_runtime *runtime = substream->runtime;
1051         struct snd_rawmidi_framing_tstamp *dest_ptr;
1052         struct snd_rawmidi_framing_tstamp frame = { .tv_sec = tstamp->tv_sec, .tv_nsec = tstamp->tv_nsec };
1053         int dest_frames = 0;
1054         int orig_count = src_count;
1055         int frame_size = sizeof(struct snd_rawmidi_framing_tstamp);
1056
1057         BUILD_BUG_ON(frame_size != 0x20);
1058         if (snd_BUG_ON((runtime->hw_ptr & 0x1f) != 0))
1059                 return -EINVAL;
1060
1061         while (src_count > 0) {
1062                 if ((int)(runtime->buffer_size - runtime->avail) < frame_size) {
1063                         runtime->xruns += src_count;
1064                         break;
1065                 }
1066                 if (src_count >= SNDRV_RAWMIDI_FRAMING_DATA_LENGTH)
1067                         frame.length = SNDRV_RAWMIDI_FRAMING_DATA_LENGTH;
1068                 else {
1069                         frame.length = src_count;
1070                         memset(frame.data, 0, SNDRV_RAWMIDI_FRAMING_DATA_LENGTH);
1071                 }
1072                 memcpy(frame.data, buffer, frame.length);
1073                 buffer += frame.length;
1074                 src_count -= frame.length;
1075                 dest_ptr = (struct snd_rawmidi_framing_tstamp *) (runtime->buffer + runtime->hw_ptr);
1076                 *dest_ptr = frame;
1077                 runtime->avail += frame_size;
1078                 runtime->hw_ptr += frame_size;
1079                 runtime->hw_ptr %= runtime->buffer_size;
1080                 dest_frames++;
1081         }
1082         return orig_count - src_count;
1083 }
1084
1085 static struct timespec64 get_framing_tstamp(struct snd_rawmidi_substream *substream)
1086 {
1087         struct timespec64 ts64 = {0, 0};
1088
1089         switch (substream->clock_type) {
1090         case SNDRV_RAWMIDI_MODE_CLOCK_MONOTONIC_RAW:
1091                 ktime_get_raw_ts64(&ts64);
1092                 break;
1093         case SNDRV_RAWMIDI_MODE_CLOCK_MONOTONIC:
1094                 ktime_get_ts64(&ts64);
1095                 break;
1096         case SNDRV_RAWMIDI_MODE_CLOCK_REALTIME:
1097                 ktime_get_real_ts64(&ts64);
1098                 break;
1099         }
1100         return ts64;
1101 }
1102
1103 /**
1104  * snd_rawmidi_receive - receive the input data from the device
1105  * @substream: the rawmidi substream
1106  * @buffer: the buffer pointer
1107  * @count: the data size to read
1108  *
1109  * Reads the data from the internal buffer.
1110  *
1111  * Return: The size of read data, or a negative error code on failure.
1112  */
1113 int snd_rawmidi_receive(struct snd_rawmidi_substream *substream,
1114                         const unsigned char *buffer, int count)
1115 {
1116         unsigned long flags;
1117         struct timespec64 ts64 = get_framing_tstamp(substream);
1118         int result = 0, count1;
1119         struct snd_rawmidi_runtime *runtime;
1120
1121         spin_lock_irqsave(&substream->lock, flags);
1122         if (!substream->opened) {
1123                 result = -EBADFD;
1124                 goto unlock;
1125         }
1126         runtime = substream->runtime;
1127         if (!runtime || !runtime->buffer) {
1128                 rmidi_dbg(substream->rmidi,
1129                           "snd_rawmidi_receive: input is not active!!!\n");
1130                 result = -EINVAL;
1131                 goto unlock;
1132         }
1133
1134         if (substream->framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP) {
1135                 result = receive_with_tstamp_framing(substream, buffer, count, &ts64);
1136         } else if (count == 1) {        /* special case, faster code */
1137                 substream->bytes++;
1138                 if (runtime->avail < runtime->buffer_size) {
1139                         runtime->buffer[runtime->hw_ptr++] = buffer[0];
1140                         runtime->hw_ptr %= runtime->buffer_size;
1141                         runtime->avail++;
1142                         result++;
1143                 } else {
1144                         runtime->xruns++;
1145                 }
1146         } else {
1147                 substream->bytes += count;
1148                 count1 = runtime->buffer_size - runtime->hw_ptr;
1149                 if (count1 > count)
1150                         count1 = count;
1151                 if (count1 > (int)(runtime->buffer_size - runtime->avail))
1152                         count1 = runtime->buffer_size - runtime->avail;
1153                 memcpy(runtime->buffer + runtime->hw_ptr, buffer, count1);
1154                 runtime->hw_ptr += count1;
1155                 runtime->hw_ptr %= runtime->buffer_size;
1156                 runtime->avail += count1;
1157                 count -= count1;
1158                 result += count1;
1159                 if (count > 0) {
1160                         buffer += count1;
1161                         count1 = count;
1162                         if (count1 > (int)(runtime->buffer_size - runtime->avail)) {
1163                                 count1 = runtime->buffer_size - runtime->avail;
1164                                 runtime->xruns += count - count1;
1165                         }
1166                         if (count1 > 0) {
1167                                 memcpy(runtime->buffer, buffer, count1);
1168                                 runtime->hw_ptr = count1;
1169                                 runtime->avail += count1;
1170                                 result += count1;
1171                         }
1172                 }
1173         }
1174         if (result > 0) {
1175                 if (runtime->event)
1176                         schedule_work(&runtime->event_work);
1177                 else if (__snd_rawmidi_ready(runtime))
1178                         wake_up(&runtime->sleep);
1179         }
1180  unlock:
1181         spin_unlock_irqrestore(&substream->lock, flags);
1182         return result;
1183 }
1184 EXPORT_SYMBOL(snd_rawmidi_receive);
1185
1186 static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream,
1187                                      unsigned char __user *userbuf,
1188                                      unsigned char *kernelbuf, long count)
1189 {
1190         unsigned long flags;
1191         long result = 0, count1;
1192         struct snd_rawmidi_runtime *runtime = substream->runtime;
1193         unsigned long appl_ptr;
1194         int err = 0;
1195
1196         spin_lock_irqsave(&substream->lock, flags);
1197         snd_rawmidi_buffer_ref(runtime);
1198         while (count > 0 && runtime->avail) {
1199                 count1 = runtime->buffer_size - runtime->appl_ptr;
1200                 if (count1 > count)
1201                         count1 = count;
1202                 if (count1 > (int)runtime->avail)
1203                         count1 = runtime->avail;
1204
1205                 /* update runtime->appl_ptr before unlocking for userbuf */
1206                 appl_ptr = runtime->appl_ptr;
1207                 runtime->appl_ptr += count1;
1208                 runtime->appl_ptr %= runtime->buffer_size;
1209                 runtime->avail -= count1;
1210
1211                 if (kernelbuf)
1212                         memcpy(kernelbuf + result, runtime->buffer + appl_ptr, count1);
1213                 if (userbuf) {
1214                         spin_unlock_irqrestore(&substream->lock, flags);
1215                         if (copy_to_user(userbuf + result,
1216                                          runtime->buffer + appl_ptr, count1))
1217                                 err = -EFAULT;
1218                         spin_lock_irqsave(&substream->lock, flags);
1219                         if (err)
1220                                 goto out;
1221                 }
1222                 result += count1;
1223                 count -= count1;
1224         }
1225  out:
1226         snd_rawmidi_buffer_unref(runtime);
1227         spin_unlock_irqrestore(&substream->lock, flags);
1228         return result > 0 ? result : err;
1229 }
1230
1231 long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
1232                              unsigned char *buf, long count)
1233 {
1234         snd_rawmidi_input_trigger(substream, 1);
1235         return snd_rawmidi_kernel_read1(substream, NULL/*userbuf*/, buf, count);
1236 }
1237 EXPORT_SYMBOL(snd_rawmidi_kernel_read);
1238
1239 static ssize_t snd_rawmidi_read(struct file *file, char __user *buf, size_t count,
1240                                 loff_t *offset)
1241 {
1242         long result;
1243         int count1;
1244         struct snd_rawmidi_file *rfile;
1245         struct snd_rawmidi_substream *substream;
1246         struct snd_rawmidi_runtime *runtime;
1247
1248         rfile = file->private_data;
1249         substream = rfile->input;
1250         if (substream == NULL)
1251                 return -EIO;
1252         runtime = substream->runtime;
1253         snd_rawmidi_input_trigger(substream, 1);
1254         result = 0;
1255         while (count > 0) {
1256                 spin_lock_irq(&substream->lock);
1257                 while (!__snd_rawmidi_ready(runtime)) {
1258                         wait_queue_entry_t wait;
1259
1260                         if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) {
1261                                 spin_unlock_irq(&substream->lock);
1262                                 return result > 0 ? result : -EAGAIN;
1263                         }
1264                         init_waitqueue_entry(&wait, current);
1265                         add_wait_queue(&runtime->sleep, &wait);
1266                         set_current_state(TASK_INTERRUPTIBLE);
1267                         spin_unlock_irq(&substream->lock);
1268                         schedule();
1269                         remove_wait_queue(&runtime->sleep, &wait);
1270                         if (rfile->rmidi->card->shutdown)
1271                                 return -ENODEV;
1272                         if (signal_pending(current))
1273                                 return result > 0 ? result : -ERESTARTSYS;
1274                         spin_lock_irq(&substream->lock);
1275                         if (!runtime->avail) {
1276                                 spin_unlock_irq(&substream->lock);
1277                                 return result > 0 ? result : -EIO;
1278                         }
1279                 }
1280                 spin_unlock_irq(&substream->lock);
1281                 count1 = snd_rawmidi_kernel_read1(substream,
1282                                                   (unsigned char __user *)buf,
1283                                                   NULL/*kernelbuf*/,
1284                                                   count);
1285                 if (count1 < 0)
1286                         return result > 0 ? result : count1;
1287                 result += count1;
1288                 buf += count1;
1289                 count -= count1;
1290         }
1291         return result;
1292 }
1293
1294 /**
1295  * snd_rawmidi_transmit_empty - check whether the output buffer is empty
1296  * @substream: the rawmidi substream
1297  *
1298  * Return: 1 if the internal output buffer is empty, 0 if not.
1299  */
1300 int snd_rawmidi_transmit_empty(struct snd_rawmidi_substream *substream)
1301 {
1302         struct snd_rawmidi_runtime *runtime;
1303         int result;
1304         unsigned long flags;
1305
1306         spin_lock_irqsave(&substream->lock, flags);
1307         runtime = substream->runtime;
1308         if (!substream->opened || !runtime || !runtime->buffer) {
1309                 rmidi_dbg(substream->rmidi,
1310                           "snd_rawmidi_transmit_empty: output is not active!!!\n");
1311                 result = 1;
1312         } else {
1313                 result = runtime->avail >= runtime->buffer_size;
1314         }
1315         spin_unlock_irqrestore(&substream->lock, flags);
1316         return result;
1317 }
1318 EXPORT_SYMBOL(snd_rawmidi_transmit_empty);
1319
1320 /*
1321  * __snd_rawmidi_transmit_peek - copy data from the internal buffer
1322  * @substream: the rawmidi substream
1323  * @buffer: the buffer pointer
1324  * @count: data size to transfer
1325  *
1326  * This is a variant of snd_rawmidi_transmit_peek() without spinlock.
1327  */
1328 static int __snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
1329                                        unsigned char *buffer, int count)
1330 {
1331         int result, count1;
1332         struct snd_rawmidi_runtime *runtime = substream->runtime;
1333
1334         if (runtime->buffer == NULL) {
1335                 rmidi_dbg(substream->rmidi,
1336                           "snd_rawmidi_transmit_peek: output is not active!!!\n");
1337                 return -EINVAL;
1338         }
1339         result = 0;
1340         if (runtime->avail >= runtime->buffer_size) {
1341                 /* warning: lowlevel layer MUST trigger down the hardware */
1342                 goto __skip;
1343         }
1344         if (count == 1) {       /* special case, faster code */
1345                 *buffer = runtime->buffer[runtime->hw_ptr];
1346                 result++;
1347         } else {
1348                 count1 = runtime->buffer_size - runtime->hw_ptr;
1349                 if (count1 > count)
1350                         count1 = count;
1351                 if (count1 > (int)(runtime->buffer_size - runtime->avail))
1352                         count1 = runtime->buffer_size - runtime->avail;
1353                 memcpy(buffer, runtime->buffer + runtime->hw_ptr, count1);
1354                 count -= count1;
1355                 result += count1;
1356                 if (count > 0) {
1357                         if (count > (int)(runtime->buffer_size - runtime->avail - count1))
1358                                 count = runtime->buffer_size - runtime->avail - count1;
1359                         memcpy(buffer + count1, runtime->buffer, count);
1360                         result += count;
1361                 }
1362         }
1363       __skip:
1364         return result;
1365 }
1366
1367 /**
1368  * snd_rawmidi_transmit_peek - copy data from the internal buffer
1369  * @substream: the rawmidi substream
1370  * @buffer: the buffer pointer
1371  * @count: data size to transfer
1372  *
1373  * Copies data from the internal output buffer to the given buffer.
1374  *
1375  * Call this in the interrupt handler when the midi output is ready,
1376  * and call snd_rawmidi_transmit_ack() after the transmission is
1377  * finished.
1378  *
1379  * Return: The size of copied data, or a negative error code on failure.
1380  */
1381 int snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
1382                               unsigned char *buffer, int count)
1383 {
1384         int result;
1385         unsigned long flags;
1386
1387         spin_lock_irqsave(&substream->lock, flags);
1388         if (!substream->opened || !substream->runtime)
1389                 result = -EBADFD;
1390         else
1391                 result = __snd_rawmidi_transmit_peek(substream, buffer, count);
1392         spin_unlock_irqrestore(&substream->lock, flags);
1393         return result;
1394 }
1395 EXPORT_SYMBOL(snd_rawmidi_transmit_peek);
1396
1397 /*
1398  * __snd_rawmidi_transmit_ack - acknowledge the transmission
1399  * @substream: the rawmidi substream
1400  * @count: the transferred count
1401  *
1402  * This is a variant of __snd_rawmidi_transmit_ack() without spinlock.
1403  */
1404 static int __snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream,
1405                                       int count)
1406 {
1407         struct snd_rawmidi_runtime *runtime = substream->runtime;
1408
1409         if (runtime->buffer == NULL) {
1410                 rmidi_dbg(substream->rmidi,
1411                           "snd_rawmidi_transmit_ack: output is not active!!!\n");
1412                 return -EINVAL;
1413         }
1414         snd_BUG_ON(runtime->avail + count > runtime->buffer_size);
1415         runtime->hw_ptr += count;
1416         runtime->hw_ptr %= runtime->buffer_size;
1417         runtime->avail += count;
1418         substream->bytes += count;
1419         if (count > 0) {
1420                 if (runtime->drain || __snd_rawmidi_ready(runtime))
1421                         wake_up(&runtime->sleep);
1422         }
1423         return count;
1424 }
1425
1426 /**
1427  * snd_rawmidi_transmit_ack - acknowledge the transmission
1428  * @substream: the rawmidi substream
1429  * @count: the transferred count
1430  *
1431  * Advances the hardware pointer for the internal output buffer with
1432  * the given size and updates the condition.
1433  * Call after the transmission is finished.
1434  *
1435  * Return: The advanced size if successful, or a negative error code on failure.
1436  */
1437 int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count)
1438 {
1439         int result;
1440         unsigned long flags;
1441
1442         spin_lock_irqsave(&substream->lock, flags);
1443         if (!substream->opened || !substream->runtime)
1444                 result = -EBADFD;
1445         else
1446                 result = __snd_rawmidi_transmit_ack(substream, count);
1447         spin_unlock_irqrestore(&substream->lock, flags);
1448         return result;
1449 }
1450 EXPORT_SYMBOL(snd_rawmidi_transmit_ack);
1451
1452 /**
1453  * snd_rawmidi_transmit - copy from the buffer to the device
1454  * @substream: the rawmidi substream
1455  * @buffer: the buffer pointer
1456  * @count: the data size to transfer
1457  *
1458  * Copies data from the buffer to the device and advances the pointer.
1459  *
1460  * Return: The copied size if successful, or a negative error code on failure.
1461  */
1462 int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream,
1463                          unsigned char *buffer, int count)
1464 {
1465         int result;
1466         unsigned long flags;
1467
1468         spin_lock_irqsave(&substream->lock, flags);
1469         if (!substream->opened)
1470                 result = -EBADFD;
1471         else {
1472                 count = __snd_rawmidi_transmit_peek(substream, buffer, count);
1473                 if (count <= 0)
1474                         result = count;
1475                 else
1476                         result = __snd_rawmidi_transmit_ack(substream, count);
1477         }
1478         spin_unlock_irqrestore(&substream->lock, flags);
1479         return result;
1480 }
1481 EXPORT_SYMBOL(snd_rawmidi_transmit);
1482
1483 /**
1484  * snd_rawmidi_proceed - Discard the all pending bytes and proceed
1485  * @substream: rawmidi substream
1486  *
1487  * Return: the number of discarded bytes
1488  */
1489 int snd_rawmidi_proceed(struct snd_rawmidi_substream *substream)
1490 {
1491         struct snd_rawmidi_runtime *runtime;
1492         unsigned long flags;
1493         int count = 0;
1494
1495         spin_lock_irqsave(&substream->lock, flags);
1496         runtime = substream->runtime;
1497         if (substream->opened && runtime &&
1498             runtime->avail < runtime->buffer_size) {
1499                 count = runtime->buffer_size - runtime->avail;
1500                 __snd_rawmidi_transmit_ack(substream, count);
1501         }
1502         spin_unlock_irqrestore(&substream->lock, flags);
1503         return count;
1504 }
1505 EXPORT_SYMBOL(snd_rawmidi_proceed);
1506
1507 static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream,
1508                                       const unsigned char __user *userbuf,
1509                                       const unsigned char *kernelbuf,
1510                                       long count)
1511 {
1512         unsigned long flags;
1513         long count1, result;
1514         struct snd_rawmidi_runtime *runtime = substream->runtime;
1515         unsigned long appl_ptr;
1516
1517         if (!kernelbuf && !userbuf)
1518                 return -EINVAL;
1519         if (snd_BUG_ON(!runtime->buffer))
1520                 return -EINVAL;
1521
1522         result = 0;
1523         spin_lock_irqsave(&substream->lock, flags);
1524         if (substream->append) {
1525                 if ((long)runtime->avail < count) {
1526                         spin_unlock_irqrestore(&substream->lock, flags);
1527                         return -EAGAIN;
1528                 }
1529         }
1530         snd_rawmidi_buffer_ref(runtime);
1531         while (count > 0 && runtime->avail > 0) {
1532                 count1 = runtime->buffer_size - runtime->appl_ptr;
1533                 if (count1 > count)
1534                         count1 = count;
1535                 if (count1 > (long)runtime->avail)
1536                         count1 = runtime->avail;
1537
1538                 /* update runtime->appl_ptr before unlocking for userbuf */
1539                 appl_ptr = runtime->appl_ptr;
1540                 runtime->appl_ptr += count1;
1541                 runtime->appl_ptr %= runtime->buffer_size;
1542                 runtime->avail -= count1;
1543
1544                 if (kernelbuf)
1545                         memcpy(runtime->buffer + appl_ptr,
1546                                kernelbuf + result, count1);
1547                 else if (userbuf) {
1548                         spin_unlock_irqrestore(&substream->lock, flags);
1549                         if (copy_from_user(runtime->buffer + appl_ptr,
1550                                            userbuf + result, count1)) {
1551                                 spin_lock_irqsave(&substream->lock, flags);
1552                                 result = result > 0 ? result : -EFAULT;
1553                                 goto __end;
1554                         }
1555                         spin_lock_irqsave(&substream->lock, flags);
1556                 }
1557                 result += count1;
1558                 count -= count1;
1559         }
1560       __end:
1561         count1 = runtime->avail < runtime->buffer_size;
1562         snd_rawmidi_buffer_unref(runtime);
1563         spin_unlock_irqrestore(&substream->lock, flags);
1564         if (count1)
1565                 snd_rawmidi_output_trigger(substream, 1);
1566         return result;
1567 }
1568
1569 long snd_rawmidi_kernel_write(struct snd_rawmidi_substream *substream,
1570                               const unsigned char *buf, long count)
1571 {
1572         return snd_rawmidi_kernel_write1(substream, NULL, buf, count);
1573 }
1574 EXPORT_SYMBOL(snd_rawmidi_kernel_write);
1575
1576 static ssize_t snd_rawmidi_write(struct file *file, const char __user *buf,
1577                                  size_t count, loff_t *offset)
1578 {
1579         long result, timeout;
1580         int count1;
1581         struct snd_rawmidi_file *rfile;
1582         struct snd_rawmidi_runtime *runtime;
1583         struct snd_rawmidi_substream *substream;
1584
1585         rfile = file->private_data;
1586         substream = rfile->output;
1587         runtime = substream->runtime;
1588         /* we cannot put an atomic message to our buffer */
1589         if (substream->append && count > runtime->buffer_size)
1590                 return -EIO;
1591         result = 0;
1592         while (count > 0) {
1593                 spin_lock_irq(&substream->lock);
1594                 while (!snd_rawmidi_ready_append(substream, count)) {
1595                         wait_queue_entry_t wait;
1596
1597                         if (file->f_flags & O_NONBLOCK) {
1598                                 spin_unlock_irq(&substream->lock);
1599                                 return result > 0 ? result : -EAGAIN;
1600                         }
1601                         init_waitqueue_entry(&wait, current);
1602                         add_wait_queue(&runtime->sleep, &wait);
1603                         set_current_state(TASK_INTERRUPTIBLE);
1604                         spin_unlock_irq(&substream->lock);
1605                         timeout = schedule_timeout(30 * HZ);
1606                         remove_wait_queue(&runtime->sleep, &wait);
1607                         if (rfile->rmidi->card->shutdown)
1608                                 return -ENODEV;
1609                         if (signal_pending(current))
1610                                 return result > 0 ? result : -ERESTARTSYS;
1611                         spin_lock_irq(&substream->lock);
1612                         if (!runtime->avail && !timeout) {
1613                                 spin_unlock_irq(&substream->lock);
1614                                 return result > 0 ? result : -EIO;
1615                         }
1616                 }
1617                 spin_unlock_irq(&substream->lock);
1618                 count1 = snd_rawmidi_kernel_write1(substream, buf, NULL, count);
1619                 if (count1 < 0)
1620                         return result > 0 ? result : count1;
1621                 result += count1;
1622                 buf += count1;
1623                 if ((size_t)count1 < count && (file->f_flags & O_NONBLOCK))
1624                         break;
1625                 count -= count1;
1626         }
1627         if (file->f_flags & O_DSYNC) {
1628                 spin_lock_irq(&substream->lock);
1629                 while (runtime->avail != runtime->buffer_size) {
1630                         wait_queue_entry_t wait;
1631                         unsigned int last_avail = runtime->avail;
1632
1633                         init_waitqueue_entry(&wait, current);
1634                         add_wait_queue(&runtime->sleep, &wait);
1635                         set_current_state(TASK_INTERRUPTIBLE);
1636                         spin_unlock_irq(&substream->lock);
1637                         timeout = schedule_timeout(30 * HZ);
1638                         remove_wait_queue(&runtime->sleep, &wait);
1639                         if (signal_pending(current))
1640                                 return result > 0 ? result : -ERESTARTSYS;
1641                         if (runtime->avail == last_avail && !timeout)
1642                                 return result > 0 ? result : -EIO;
1643                         spin_lock_irq(&substream->lock);
1644                 }
1645                 spin_unlock_irq(&substream->lock);
1646         }
1647         return result;
1648 }
1649
1650 static __poll_t snd_rawmidi_poll(struct file *file, poll_table *wait)
1651 {
1652         struct snd_rawmidi_file *rfile;
1653         struct snd_rawmidi_runtime *runtime;
1654         __poll_t mask;
1655
1656         rfile = file->private_data;
1657         if (rfile->input != NULL) {
1658                 runtime = rfile->input->runtime;
1659                 snd_rawmidi_input_trigger(rfile->input, 1);
1660                 poll_wait(file, &runtime->sleep, wait);
1661         }
1662         if (rfile->output != NULL) {
1663                 runtime = rfile->output->runtime;
1664                 poll_wait(file, &runtime->sleep, wait);
1665         }
1666         mask = 0;
1667         if (rfile->input != NULL) {
1668                 if (snd_rawmidi_ready(rfile->input))
1669                         mask |= EPOLLIN | EPOLLRDNORM;
1670         }
1671         if (rfile->output != NULL) {
1672                 if (snd_rawmidi_ready(rfile->output))
1673                         mask |= EPOLLOUT | EPOLLWRNORM;
1674         }
1675         return mask;
1676 }
1677
1678 /*
1679  */
1680 #ifdef CONFIG_COMPAT
1681 #include "rawmidi_compat.c"
1682 #else
1683 #define snd_rawmidi_ioctl_compat        NULL
1684 #endif
1685
1686 /*
1687  */
1688
1689 static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry,
1690                                        struct snd_info_buffer *buffer)
1691 {
1692         struct snd_rawmidi *rmidi;
1693         struct snd_rawmidi_substream *substream;
1694         struct snd_rawmidi_runtime *runtime;
1695         unsigned long buffer_size, avail, xruns;
1696         unsigned int clock_type;
1697         static const char *clock_names[4] = { "none", "realtime", "monotonic", "monotonic raw" };
1698
1699         rmidi = entry->private_data;
1700         snd_iprintf(buffer, "%s\n\n", rmidi->name);
1701         mutex_lock(&rmidi->open_mutex);
1702         if (rmidi->info_flags & SNDRV_RAWMIDI_INFO_OUTPUT) {
1703                 list_for_each_entry(substream,
1704                                     &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams,
1705                                     list) {
1706                         snd_iprintf(buffer,
1707                                     "Output %d\n"
1708                                     "  Tx bytes     : %lu\n",
1709                                     substream->number,
1710                                     (unsigned long) substream->bytes);
1711                         if (substream->opened) {
1712                                 snd_iprintf(buffer,
1713                                     "  Owner PID    : %d\n",
1714                                     pid_vnr(substream->pid));
1715                                 runtime = substream->runtime;
1716                                 spin_lock_irq(&substream->lock);
1717                                 buffer_size = runtime->buffer_size;
1718                                 avail = runtime->avail;
1719                                 spin_unlock_irq(&substream->lock);
1720                                 snd_iprintf(buffer,
1721                                     "  Mode         : %s\n"
1722                                     "  Buffer size  : %lu\n"
1723                                     "  Avail        : %lu\n",
1724                                     runtime->oss ? "OSS compatible" : "native",
1725                                     buffer_size, avail);
1726                         }
1727                 }
1728         }
1729         if (rmidi->info_flags & SNDRV_RAWMIDI_INFO_INPUT) {
1730                 list_for_each_entry(substream,
1731                                     &rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams,
1732                                     list) {
1733                         snd_iprintf(buffer,
1734                                     "Input %d\n"
1735                                     "  Rx bytes     : %lu\n",
1736                                     substream->number,
1737                                     (unsigned long) substream->bytes);
1738                         if (substream->opened) {
1739                                 snd_iprintf(buffer,
1740                                             "  Owner PID    : %d\n",
1741                                             pid_vnr(substream->pid));
1742                                 runtime = substream->runtime;
1743                                 spin_lock_irq(&substream->lock);
1744                                 buffer_size = runtime->buffer_size;
1745                                 avail = runtime->avail;
1746                                 xruns = runtime->xruns;
1747                                 spin_unlock_irq(&substream->lock);
1748                                 snd_iprintf(buffer,
1749                                             "  Buffer size  : %lu\n"
1750                                             "  Avail        : %lu\n"
1751                                             "  Overruns     : %lu\n",
1752                                             buffer_size, avail, xruns);
1753                                 if (substream->framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP) {
1754                                         clock_type = substream->clock_type >> SNDRV_RAWMIDI_MODE_CLOCK_SHIFT;
1755                                         if (!snd_BUG_ON(clock_type >= ARRAY_SIZE(clock_names)))
1756                                                 snd_iprintf(buffer,
1757                                                             "  Framing      : tstamp\n"
1758                                                             "  Clock type   : %s\n",
1759                                                             clock_names[clock_type]);
1760                                 }
1761                         }
1762                 }
1763         }
1764         mutex_unlock(&rmidi->open_mutex);
1765 }
1766
1767 /*
1768  *  Register functions
1769  */
1770
1771 static const struct file_operations snd_rawmidi_f_ops = {
1772         .owner =        THIS_MODULE,
1773         .read =         snd_rawmidi_read,
1774         .write =        snd_rawmidi_write,
1775         .open =         snd_rawmidi_open,
1776         .release =      snd_rawmidi_release,
1777         .llseek =       no_llseek,
1778         .poll =         snd_rawmidi_poll,
1779         .unlocked_ioctl =       snd_rawmidi_ioctl,
1780         .compat_ioctl = snd_rawmidi_ioctl_compat,
1781 };
1782
1783 static int snd_rawmidi_alloc_substreams(struct snd_rawmidi *rmidi,
1784                                         struct snd_rawmidi_str *stream,
1785                                         int direction,
1786                                         int count)
1787 {
1788         struct snd_rawmidi_substream *substream;
1789         int idx;
1790
1791         for (idx = 0; idx < count; idx++) {
1792                 substream = kzalloc(sizeof(*substream), GFP_KERNEL);
1793                 if (!substream)
1794                         return -ENOMEM;
1795                 substream->stream = direction;
1796                 substream->number = idx;
1797                 substream->rmidi = rmidi;
1798                 substream->pstr = stream;
1799                 spin_lock_init(&substream->lock);
1800                 list_add_tail(&substream->list, &stream->substreams);
1801                 stream->substream_count++;
1802         }
1803         return 0;
1804 }
1805
1806 static void release_rawmidi_device(struct device *dev)
1807 {
1808         kfree(container_of(dev, struct snd_rawmidi, dev));
1809 }
1810
1811 /**
1812  * snd_rawmidi_new - create a rawmidi instance
1813  * @card: the card instance
1814  * @id: the id string
1815  * @device: the device index
1816  * @output_count: the number of output streams
1817  * @input_count: the number of input streams
1818  * @rrawmidi: the pointer to store the new rawmidi instance
1819  *
1820  * Creates a new rawmidi instance.
1821  * Use snd_rawmidi_set_ops() to set the operators to the new instance.
1822  *
1823  * Return: Zero if successful, or a negative error code on failure.
1824  */
1825 int snd_rawmidi_new(struct snd_card *card, char *id, int device,
1826                     int output_count, int input_count,
1827                     struct snd_rawmidi **rrawmidi)
1828 {
1829         struct snd_rawmidi *rmidi;
1830         int err;
1831         static const struct snd_device_ops ops = {
1832                 .dev_free = snd_rawmidi_dev_free,
1833                 .dev_register = snd_rawmidi_dev_register,
1834                 .dev_disconnect = snd_rawmidi_dev_disconnect,
1835         };
1836
1837         if (snd_BUG_ON(!card))
1838                 return -ENXIO;
1839         if (rrawmidi)
1840                 *rrawmidi = NULL;
1841         rmidi = kzalloc(sizeof(*rmidi), GFP_KERNEL);
1842         if (!rmidi)
1843                 return -ENOMEM;
1844         rmidi->card = card;
1845         rmidi->device = device;
1846         mutex_init(&rmidi->open_mutex);
1847         init_waitqueue_head(&rmidi->open_wait);
1848         INIT_LIST_HEAD(&rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams);
1849         INIT_LIST_HEAD(&rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams);
1850
1851         if (id != NULL)
1852                 strscpy(rmidi->id, id, sizeof(rmidi->id));
1853
1854         snd_device_initialize(&rmidi->dev, card);
1855         rmidi->dev.release = release_rawmidi_device;
1856         dev_set_name(&rmidi->dev, "midiC%iD%i", card->number, device);
1857
1858         err = snd_rawmidi_alloc_substreams(rmidi,
1859                                            &rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT],
1860                                            SNDRV_RAWMIDI_STREAM_INPUT,
1861                                            input_count);
1862         if (err < 0)
1863                 goto error;
1864         err = snd_rawmidi_alloc_substreams(rmidi,
1865                                            &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT],
1866                                            SNDRV_RAWMIDI_STREAM_OUTPUT,
1867                                            output_count);
1868         if (err < 0)
1869                 goto error;
1870         err = snd_device_new(card, SNDRV_DEV_RAWMIDI, rmidi, &ops);
1871         if (err < 0)
1872                 goto error;
1873
1874         if (rrawmidi)
1875                 *rrawmidi = rmidi;
1876         return 0;
1877
1878  error:
1879         snd_rawmidi_free(rmidi);
1880         return err;
1881 }
1882 EXPORT_SYMBOL(snd_rawmidi_new);
1883
1884 static void snd_rawmidi_free_substreams(struct snd_rawmidi_str *stream)
1885 {
1886         struct snd_rawmidi_substream *substream;
1887
1888         while (!list_empty(&stream->substreams)) {
1889                 substream = list_entry(stream->substreams.next, struct snd_rawmidi_substream, list);
1890                 list_del(&substream->list);
1891                 kfree(substream);
1892         }
1893 }
1894
1895 static int snd_rawmidi_free(struct snd_rawmidi *rmidi)
1896 {
1897         if (!rmidi)
1898                 return 0;
1899
1900         snd_info_free_entry(rmidi->proc_entry);
1901         rmidi->proc_entry = NULL;
1902         if (rmidi->ops && rmidi->ops->dev_unregister)
1903                 rmidi->ops->dev_unregister(rmidi);
1904
1905         snd_rawmidi_free_substreams(&rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT]);
1906         snd_rawmidi_free_substreams(&rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT]);
1907         if (rmidi->private_free)
1908                 rmidi->private_free(rmidi);
1909         put_device(&rmidi->dev);
1910         return 0;
1911 }
1912
1913 static int snd_rawmidi_dev_free(struct snd_device *device)
1914 {
1915         struct snd_rawmidi *rmidi = device->device_data;
1916
1917         return snd_rawmidi_free(rmidi);
1918 }
1919
1920 #if IS_ENABLED(CONFIG_SND_SEQUENCER)
1921 static void snd_rawmidi_dev_seq_free(struct snd_seq_device *device)
1922 {
1923         struct snd_rawmidi *rmidi = device->private_data;
1924
1925         rmidi->seq_dev = NULL;
1926 }
1927 #endif
1928
1929 static int snd_rawmidi_dev_register(struct snd_device *device)
1930 {
1931         int err;
1932         struct snd_info_entry *entry;
1933         char name[16];
1934         struct snd_rawmidi *rmidi = device->device_data;
1935
1936         if (rmidi->device >= SNDRV_RAWMIDI_DEVICES)
1937                 return -ENOMEM;
1938         err = 0;
1939         mutex_lock(&register_mutex);
1940         if (snd_rawmidi_search(rmidi->card, rmidi->device))
1941                 err = -EBUSY;
1942         else
1943                 list_add_tail(&rmidi->list, &snd_rawmidi_devices);
1944         mutex_unlock(&register_mutex);
1945         if (err < 0)
1946                 return err;
1947
1948         err = snd_register_device(SNDRV_DEVICE_TYPE_RAWMIDI,
1949                                   rmidi->card, rmidi->device,
1950                                   &snd_rawmidi_f_ops, rmidi, &rmidi->dev);
1951         if (err < 0) {
1952                 rmidi_err(rmidi, "unable to register\n");
1953                 goto error;
1954         }
1955         if (rmidi->ops && rmidi->ops->dev_register) {
1956                 err = rmidi->ops->dev_register(rmidi);
1957                 if (err < 0)
1958                         goto error_unregister;
1959         }
1960 #ifdef CONFIG_SND_OSSEMUL
1961         rmidi->ossreg = 0;
1962         if ((int)rmidi->device == midi_map[rmidi->card->number]) {
1963                 if (snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI,
1964                                             rmidi->card, 0, &snd_rawmidi_f_ops,
1965                                             rmidi) < 0) {
1966                         rmidi_err(rmidi,
1967                                   "unable to register OSS rawmidi device %i:%i\n",
1968                                   rmidi->card->number, 0);
1969                 } else {
1970                         rmidi->ossreg++;
1971 #ifdef SNDRV_OSS_INFO_DEV_MIDI
1972                         snd_oss_info_register(SNDRV_OSS_INFO_DEV_MIDI, rmidi->card->number, rmidi->name);
1973 #endif
1974                 }
1975         }
1976         if ((int)rmidi->device == amidi_map[rmidi->card->number]) {
1977                 if (snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI,
1978                                             rmidi->card, 1, &snd_rawmidi_f_ops,
1979                                             rmidi) < 0) {
1980                         rmidi_err(rmidi,
1981                                   "unable to register OSS rawmidi device %i:%i\n",
1982                                   rmidi->card->number, 1);
1983                 } else {
1984                         rmidi->ossreg++;
1985                 }
1986         }
1987 #endif /* CONFIG_SND_OSSEMUL */
1988         sprintf(name, "midi%d", rmidi->device);
1989         entry = snd_info_create_card_entry(rmidi->card, name, rmidi->card->proc_root);
1990         if (entry) {
1991                 entry->private_data = rmidi;
1992                 entry->c.text.read = snd_rawmidi_proc_info_read;
1993                 if (snd_info_register(entry) < 0) {
1994                         snd_info_free_entry(entry);
1995                         entry = NULL;
1996                 }
1997         }
1998         rmidi->proc_entry = entry;
1999 #if IS_ENABLED(CONFIG_SND_SEQUENCER)
2000         if (!rmidi->ops || !rmidi->ops->dev_register) { /* own registration mechanism */
2001                 if (snd_seq_device_new(rmidi->card, rmidi->device, SNDRV_SEQ_DEV_ID_MIDISYNTH, 0, &rmidi->seq_dev) >= 0) {
2002                         rmidi->seq_dev->private_data = rmidi;
2003                         rmidi->seq_dev->private_free = snd_rawmidi_dev_seq_free;
2004                         sprintf(rmidi->seq_dev->name, "MIDI %d-%d", rmidi->card->number, rmidi->device);
2005                         snd_device_register(rmidi->card, rmidi->seq_dev);
2006                 }
2007         }
2008 #endif
2009         return 0;
2010
2011  error_unregister:
2012         snd_unregister_device(&rmidi->dev);
2013  error:
2014         mutex_lock(&register_mutex);
2015         list_del(&rmidi->list);
2016         mutex_unlock(&register_mutex);
2017         return err;
2018 }
2019
2020 static int snd_rawmidi_dev_disconnect(struct snd_device *device)
2021 {
2022         struct snd_rawmidi *rmidi = device->device_data;
2023         int dir;
2024
2025         mutex_lock(&register_mutex);
2026         mutex_lock(&rmidi->open_mutex);
2027         wake_up(&rmidi->open_wait);
2028         list_del_init(&rmidi->list);
2029         for (dir = 0; dir < 2; dir++) {
2030                 struct snd_rawmidi_substream *s;
2031
2032                 list_for_each_entry(s, &rmidi->streams[dir].substreams, list) {
2033                         if (s->runtime)
2034                                 wake_up(&s->runtime->sleep);
2035                 }
2036         }
2037
2038 #ifdef CONFIG_SND_OSSEMUL
2039         if (rmidi->ossreg) {
2040                 if ((int)rmidi->device == midi_map[rmidi->card->number]) {
2041                         snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI, rmidi->card, 0);
2042 #ifdef SNDRV_OSS_INFO_DEV_MIDI
2043                         snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_MIDI, rmidi->card->number);
2044 #endif
2045                 }
2046                 if ((int)rmidi->device == amidi_map[rmidi->card->number])
2047                         snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI, rmidi->card, 1);
2048                 rmidi->ossreg = 0;
2049         }
2050 #endif /* CONFIG_SND_OSSEMUL */
2051         snd_unregister_device(&rmidi->dev);
2052         mutex_unlock(&rmidi->open_mutex);
2053         mutex_unlock(&register_mutex);
2054         return 0;
2055 }
2056
2057 /**
2058  * snd_rawmidi_set_ops - set the rawmidi operators
2059  * @rmidi: the rawmidi instance
2060  * @stream: the stream direction, SNDRV_RAWMIDI_STREAM_XXX
2061  * @ops: the operator table
2062  *
2063  * Sets the rawmidi operators for the given stream direction.
2064  */
2065 void snd_rawmidi_set_ops(struct snd_rawmidi *rmidi, int stream,
2066                          const struct snd_rawmidi_ops *ops)
2067 {
2068         struct snd_rawmidi_substream *substream;
2069
2070         list_for_each_entry(substream, &rmidi->streams[stream].substreams, list)
2071                 substream->ops = ops;
2072 }
2073 EXPORT_SYMBOL(snd_rawmidi_set_ops);
2074
2075 /*
2076  *  ENTRY functions
2077  */
2078
2079 static int __init alsa_rawmidi_init(void)
2080 {
2081
2082         snd_ctl_register_ioctl(snd_rawmidi_control_ioctl);
2083         snd_ctl_register_ioctl_compat(snd_rawmidi_control_ioctl);
2084 #ifdef CONFIG_SND_OSSEMUL
2085         { int i;
2086         /* check device map table */
2087         for (i = 0; i < SNDRV_CARDS; i++) {
2088                 if (midi_map[i] < 0 || midi_map[i] >= SNDRV_RAWMIDI_DEVICES) {
2089                         pr_err("ALSA: rawmidi: invalid midi_map[%d] = %d\n",
2090                                i, midi_map[i]);
2091                         midi_map[i] = 0;
2092                 }
2093                 if (amidi_map[i] < 0 || amidi_map[i] >= SNDRV_RAWMIDI_DEVICES) {
2094                         pr_err("ALSA: rawmidi: invalid amidi_map[%d] = %d\n",
2095                                i, amidi_map[i]);
2096                         amidi_map[i] = 1;
2097                 }
2098         }
2099         }
2100 #endif /* CONFIG_SND_OSSEMUL */
2101         return 0;
2102 }
2103
2104 static void __exit alsa_rawmidi_exit(void)
2105 {
2106         snd_ctl_unregister_ioctl(snd_rawmidi_control_ioctl);
2107         snd_ctl_unregister_ioctl_compat(snd_rawmidi_control_ioctl);
2108 }
2109
2110 module_init(alsa_rawmidi_init)
2111 module_exit(alsa_rawmidi_exit)