midi2.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * MIDI 2.0 support
  4. */
  5. #include <linux/bitops.h>
  6. #include <linux/string.h>
  7. #include <linux/init.h>
  8. #include <linux/slab.h>
  9. #include <linux/usb.h>
  10. #include <linux/wait.h>
  11. #include <linux/module.h>
  12. #include <linux/moduleparam.h>
  13. #include <linux/usb/audio.h>
  14. #include <linux/usb/midi.h>
  15. #include <linux/usb/midi-v2.h>
  16. #include <sound/core.h>
  17. #include <sound/control.h>
  18. #include <sound/ump.h>
  19. #include "usbaudio.h"
  20. #include "midi.h"
  21. #include "midi2.h"
  22. #include "helper.h"
  23. static bool midi2_enable = true;
  24. module_param(midi2_enable, bool, 0444);
  25. MODULE_PARM_DESC(midi2_enable, "Enable MIDI 2.0 support.");
  26. static bool midi2_ump_probe = true;
  27. module_param(midi2_ump_probe, bool, 0444);
  28. MODULE_PARM_DESC(midi2_ump_probe, "Probe UMP v1.1 support at first.");
  29. /* stream direction; just shorter names */
  30. enum {
  31. STR_OUT = SNDRV_RAWMIDI_STREAM_OUTPUT,
  32. STR_IN = SNDRV_RAWMIDI_STREAM_INPUT
  33. };
  34. #define NUM_URBS 8
  35. struct snd_usb_midi2_urb;
  36. struct snd_usb_midi2_endpoint;
  37. struct snd_usb_midi2_ump;
  38. struct snd_usb_midi2_interface;
  39. /* URB context */
  40. struct snd_usb_midi2_urb {
  41. struct urb *urb;
  42. struct snd_usb_midi2_endpoint *ep;
  43. unsigned int index; /* array index */
  44. };
  45. /* A USB MIDI input/output endpoint */
  46. struct snd_usb_midi2_endpoint {
  47. struct usb_device *dev;
  48. const struct usb_ms20_endpoint_descriptor *ms_ep; /* reference to EP descriptor */
  49. struct snd_usb_midi2_endpoint *pair; /* bidirectional pair EP */
  50. struct snd_usb_midi2_ump *rmidi; /* assigned UMP EP pair */
  51. struct snd_ump_endpoint *ump; /* assigned UMP EP */
  52. int direction; /* direction (STR_IN/OUT) */
  53. unsigned int endpoint; /* EP number */
  54. unsigned int pipe; /* URB pipe */
  55. unsigned int packets; /* packet buffer size in bytes */
  56. unsigned int interval; /* interval for INT EP */
  57. wait_queue_head_t wait; /* URB waiter */
  58. spinlock_t lock; /* URB locking */
  59. struct snd_rawmidi_substream *substream; /* NULL when closed */
  60. unsigned int num_urbs; /* number of allocated URBs */
  61. unsigned long urb_free; /* bitmap for free URBs */
  62. unsigned long urb_free_mask; /* bitmask for free URBs */
  63. atomic_t running; /* running status */
  64. atomic_t suspended; /* saved running status for suspend */
  65. bool disconnected; /* shadow of umidi->disconnected */
  66. struct list_head list; /* list to umidi->ep_list */
  67. struct snd_usb_midi2_urb urbs[NUM_URBS];
  68. };
  69. /* A UMP endpoint - one or two USB MIDI endpoints are assigned */
  70. struct snd_usb_midi2_ump {
  71. struct usb_device *dev;
  72. struct snd_usb_midi2_interface *umidi; /* reference to MIDI iface */
  73. struct snd_ump_endpoint *ump; /* assigned UMP EP object */
  74. struct snd_usb_midi2_endpoint *eps[2]; /* USB MIDI endpoints */
  75. int index; /* rawmidi device index */
  76. unsigned char usb_block_id; /* USB GTB id used for finding a pair */
  77. bool ump_parsed; /* Parsed UMP 1.1 EP/FB info*/
  78. struct list_head list; /* list to umidi->rawmidi_list */
  79. };
  80. /* top-level instance per USB MIDI interface */
  81. struct snd_usb_midi2_interface {
  82. struct snd_usb_audio *chip; /* assigned USB-audio card */
  83. struct usb_interface *iface; /* assigned USB interface */
  84. struct usb_host_interface *hostif;
  85. const char *blk_descs; /* group terminal block descriptors */
  86. unsigned int blk_desc_size; /* size of GTB descriptors */
  87. bool disconnected;
  88. struct list_head ep_list; /* list of endpoints */
  89. struct list_head rawmidi_list; /* list of UMP rawmidis */
  90. struct list_head list; /* list to chip->midi_v2_list */
  91. };
  92. /* submit URBs as much as possible; used for both input and output */
  93. static void do_submit_urbs_locked(struct snd_usb_midi2_endpoint *ep,
  94. int (*prepare)(struct snd_usb_midi2_endpoint *,
  95. struct urb *))
  96. {
  97. struct snd_usb_midi2_urb *ctx;
  98. int index, err = 0;
  99. if (ep->disconnected)
  100. return;
  101. while (ep->urb_free) {
  102. index = find_first_bit(&ep->urb_free, ep->num_urbs);
  103. if (index >= ep->num_urbs)
  104. return;
  105. ctx = &ep->urbs[index];
  106. err = prepare(ep, ctx->urb);
  107. if (err < 0)
  108. return;
  109. if (!ctx->urb->transfer_buffer_length)
  110. return;
  111. ctx->urb->dev = ep->dev;
  112. err = usb_submit_urb(ctx->urb, GFP_ATOMIC);
  113. if (err < 0) {
  114. dev_dbg(&ep->dev->dev,
  115. "usb_submit_urb error %d\n", err);
  116. return;
  117. }
  118. clear_bit(index, &ep->urb_free);
  119. }
  120. }
  121. /* prepare for output submission: copy from rawmidi buffer to urb packet */
  122. static int prepare_output_urb(struct snd_usb_midi2_endpoint *ep,
  123. struct urb *urb)
  124. {
  125. int count;
  126. count = snd_ump_transmit(ep->ump, urb->transfer_buffer,
  127. ep->packets);
  128. if (count < 0) {
  129. dev_dbg(&ep->dev->dev, "rawmidi transmit error %d\n", count);
  130. return count;
  131. }
  132. cpu_to_le32_array((u32 *)urb->transfer_buffer, count >> 2);
  133. urb->transfer_buffer_length = count;
  134. return 0;
  135. }
  136. static void submit_output_urbs_locked(struct snd_usb_midi2_endpoint *ep)
  137. {
  138. do_submit_urbs_locked(ep, prepare_output_urb);
  139. }
  140. /* URB completion for output; re-filling and re-submit */
  141. static void output_urb_complete(struct urb *urb)
  142. {
  143. struct snd_usb_midi2_urb *ctx = urb->context;
  144. struct snd_usb_midi2_endpoint *ep = ctx->ep;
  145. guard(spinlock_irqsave)(&ep->lock);
  146. set_bit(ctx->index, &ep->urb_free);
  147. if (urb->status >= 0 && atomic_read(&ep->running))
  148. submit_output_urbs_locked(ep);
  149. if (ep->urb_free == ep->urb_free_mask)
  150. wake_up(&ep->wait);
  151. }
  152. /* prepare for input submission: just set the buffer length */
  153. static int prepare_input_urb(struct snd_usb_midi2_endpoint *ep,
  154. struct urb *urb)
  155. {
  156. urb->transfer_buffer_length = ep->packets;
  157. return 0;
  158. }
  159. static void submit_input_urbs_locked(struct snd_usb_midi2_endpoint *ep)
  160. {
  161. do_submit_urbs_locked(ep, prepare_input_urb);
  162. }
  163. /* URB completion for input; copy into rawmidi buffer and resubmit */
  164. static void input_urb_complete(struct urb *urb)
  165. {
  166. struct snd_usb_midi2_urb *ctx = urb->context;
  167. struct snd_usb_midi2_endpoint *ep = ctx->ep;
  168. int len;
  169. guard(spinlock_irqsave)(&ep->lock);
  170. if (ep->disconnected || urb->status < 0)
  171. goto dequeue;
  172. len = urb->actual_length;
  173. len &= ~3; /* align UMP */
  174. if (len > ep->packets)
  175. len = ep->packets;
  176. if (len > 0) {
  177. le32_to_cpu_array((u32 *)urb->transfer_buffer, len >> 2);
  178. snd_ump_receive(ep->ump, (u32 *)urb->transfer_buffer, len);
  179. }
  180. dequeue:
  181. set_bit(ctx->index, &ep->urb_free);
  182. submit_input_urbs_locked(ep);
  183. if (ep->urb_free == ep->urb_free_mask)
  184. wake_up(&ep->wait);
  185. }
  186. /* URB submission helper; for both direction */
  187. static void submit_io_urbs(struct snd_usb_midi2_endpoint *ep)
  188. {
  189. if (!ep)
  190. return;
  191. guard(spinlock_irqsave)(&ep->lock);
  192. if (ep->direction == STR_IN)
  193. submit_input_urbs_locked(ep);
  194. else
  195. submit_output_urbs_locked(ep);
  196. }
  197. /* kill URBs for close, suspend and disconnect */
  198. static void kill_midi_urbs(struct snd_usb_midi2_endpoint *ep, bool suspending)
  199. {
  200. int i;
  201. if (!ep)
  202. return;
  203. if (suspending)
  204. ep->suspended = ep->running;
  205. atomic_set(&ep->running, 0);
  206. for (i = 0; i < ep->num_urbs; i++) {
  207. if (!ep->urbs[i].urb)
  208. break;
  209. usb_kill_urb(ep->urbs[i].urb);
  210. }
  211. }
  212. /* wait until all URBs get freed */
  213. static void drain_urb_queue(struct snd_usb_midi2_endpoint *ep)
  214. {
  215. if (!ep)
  216. return;
  217. guard(spinlock_irq)(&ep->lock);
  218. atomic_set(&ep->running, 0);
  219. wait_event_lock_irq_timeout(ep->wait,
  220. ep->disconnected ||
  221. ep->urb_free == ep->urb_free_mask,
  222. ep->lock, msecs_to_jiffies(500));
  223. }
  224. /* release URBs for an EP */
  225. static void free_midi_urbs(struct snd_usb_midi2_endpoint *ep)
  226. {
  227. struct snd_usb_midi2_urb *ctx;
  228. int i;
  229. if (!ep)
  230. return;
  231. for (i = 0; i < NUM_URBS; ++i) {
  232. ctx = &ep->urbs[i];
  233. if (!ctx->urb)
  234. break;
  235. usb_free_coherent(ep->dev, ep->packets,
  236. ctx->urb->transfer_buffer,
  237. ctx->urb->transfer_dma);
  238. usb_free_urb(ctx->urb);
  239. ctx->urb = NULL;
  240. }
  241. ep->num_urbs = 0;
  242. }
  243. /* allocate URBs for an EP */
  244. /* the callers should handle allocation errors via free_midi_urbs() */
  245. static int alloc_midi_urbs(struct snd_usb_midi2_endpoint *ep)
  246. {
  247. struct snd_usb_midi2_urb *ctx;
  248. void (*comp)(struct urb *urb);
  249. void *buffer;
  250. int i, err;
  251. int endpoint, len;
  252. endpoint = ep->endpoint;
  253. len = ep->packets;
  254. if (ep->direction == STR_IN)
  255. comp = input_urb_complete;
  256. else
  257. comp = output_urb_complete;
  258. ep->num_urbs = 0;
  259. ep->urb_free = ep->urb_free_mask = 0;
  260. for (i = 0; i < NUM_URBS; i++) {
  261. ctx = &ep->urbs[i];
  262. ctx->index = i;
  263. ctx->urb = usb_alloc_urb(0, GFP_KERNEL);
  264. if (!ctx->urb) {
  265. dev_err(&ep->dev->dev, "URB alloc failed\n");
  266. return -ENOMEM;
  267. }
  268. ctx->ep = ep;
  269. buffer = usb_alloc_coherent(ep->dev, len, GFP_KERNEL,
  270. &ctx->urb->transfer_dma);
  271. if (!buffer) {
  272. dev_err(&ep->dev->dev,
  273. "URB buffer alloc failed (size %d)\n", len);
  274. return -ENOMEM;
  275. }
  276. if (ep->interval)
  277. usb_fill_int_urb(ctx->urb, ep->dev, ep->pipe,
  278. buffer, len, comp, ctx, ep->interval);
  279. else
  280. usb_fill_bulk_urb(ctx->urb, ep->dev, ep->pipe,
  281. buffer, len, comp, ctx);
  282. err = usb_urb_ep_type_check(ctx->urb);
  283. if (err < 0) {
  284. dev_err(&ep->dev->dev, "invalid MIDI EP %x\n",
  285. endpoint);
  286. return err;
  287. }
  288. ctx->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
  289. ep->num_urbs++;
  290. }
  291. ep->urb_free = ep->urb_free_mask = GENMASK(ep->num_urbs - 1, 0);
  292. return 0;
  293. }
  294. static struct snd_usb_midi2_endpoint *
  295. ump_to_endpoint(struct snd_ump_endpoint *ump, int dir)
  296. {
  297. struct snd_usb_midi2_ump *rmidi = ump->private_data;
  298. return rmidi->eps[dir];
  299. }
  300. /* ump open callback */
  301. static int snd_usb_midi_v2_open(struct snd_ump_endpoint *ump, int dir)
  302. {
  303. struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
  304. int err = 0;
  305. if (!ep || !ep->endpoint)
  306. return -ENODEV;
  307. if (ep->disconnected)
  308. return -EIO;
  309. if (ep->direction == STR_OUT) {
  310. err = alloc_midi_urbs(ep);
  311. if (err) {
  312. free_midi_urbs(ep);
  313. return err;
  314. }
  315. }
  316. return 0;
  317. }
  318. /* ump close callback */
  319. static void snd_usb_midi_v2_close(struct snd_ump_endpoint *ump, int dir)
  320. {
  321. struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
  322. if (ep->direction == STR_OUT) {
  323. kill_midi_urbs(ep, false);
  324. drain_urb_queue(ep);
  325. free_midi_urbs(ep);
  326. }
  327. }
  328. /* ump trigger callback */
  329. static void snd_usb_midi_v2_trigger(struct snd_ump_endpoint *ump, int dir,
  330. int up)
  331. {
  332. struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
  333. atomic_set(&ep->running, up);
  334. if (up && ep->direction == STR_OUT && !ep->disconnected)
  335. submit_io_urbs(ep);
  336. }
  337. /* ump drain callback */
  338. static void snd_usb_midi_v2_drain(struct snd_ump_endpoint *ump, int dir)
  339. {
  340. struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
  341. drain_urb_queue(ep);
  342. }
  343. /* allocate and start all input streams */
  344. static int start_input_streams(struct snd_usb_midi2_interface *umidi)
  345. {
  346. struct snd_usb_midi2_endpoint *ep;
  347. int err;
  348. list_for_each_entry(ep, &umidi->ep_list, list) {
  349. if (ep->direction == STR_IN) {
  350. err = alloc_midi_urbs(ep);
  351. if (err < 0)
  352. goto error;
  353. }
  354. }
  355. list_for_each_entry(ep, &umidi->ep_list, list) {
  356. if (ep->direction == STR_IN)
  357. submit_io_urbs(ep);
  358. }
  359. return 0;
  360. error:
  361. list_for_each_entry(ep, &umidi->ep_list, list) {
  362. if (ep->direction == STR_IN)
  363. free_midi_urbs(ep);
  364. }
  365. return err;
  366. }
  367. static const struct snd_ump_ops snd_usb_midi_v2_ump_ops = {
  368. .open = snd_usb_midi_v2_open,
  369. .close = snd_usb_midi_v2_close,
  370. .trigger = snd_usb_midi_v2_trigger,
  371. .drain = snd_usb_midi_v2_drain,
  372. };
  373. /* create a USB MIDI 2.0 endpoint object */
  374. static int create_midi2_endpoint(struct snd_usb_midi2_interface *umidi,
  375. struct usb_host_endpoint *hostep,
  376. const struct usb_ms20_endpoint_descriptor *ms_ep)
  377. {
  378. struct snd_usb_midi2_endpoint *ep;
  379. int endpoint, dir;
  380. usb_audio_dbg(umidi->chip, "Creating an EP 0x%02x, #GTB=%d\n",
  381. hostep->desc.bEndpointAddress,
  382. ms_ep->bNumGrpTrmBlock);
  383. ep = kzalloc_obj(*ep);
  384. if (!ep)
  385. return -ENOMEM;
  386. spin_lock_init(&ep->lock);
  387. init_waitqueue_head(&ep->wait);
  388. ep->dev = umidi->chip->dev;
  389. endpoint = hostep->desc.bEndpointAddress;
  390. dir = (endpoint & USB_DIR_IN) ? STR_IN : STR_OUT;
  391. ep->endpoint = endpoint;
  392. ep->direction = dir;
  393. ep->ms_ep = ms_ep;
  394. if (usb_endpoint_xfer_int(&hostep->desc))
  395. ep->interval = hostep->desc.bInterval;
  396. else
  397. ep->interval = 0;
  398. if (dir == STR_IN) {
  399. if (ep->interval)
  400. ep->pipe = usb_rcvintpipe(ep->dev, endpoint);
  401. else
  402. ep->pipe = usb_rcvbulkpipe(ep->dev, endpoint);
  403. } else {
  404. if (ep->interval)
  405. ep->pipe = usb_sndintpipe(ep->dev, endpoint);
  406. else
  407. ep->pipe = usb_sndbulkpipe(ep->dev, endpoint);
  408. }
  409. ep->packets = usb_maxpacket(ep->dev, ep->pipe);
  410. list_add_tail(&ep->list, &umidi->ep_list);
  411. return 0;
  412. }
  413. /* destructor for endpoint; from snd_usb_midi_v2_free() */
  414. static void free_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
  415. {
  416. list_del(&ep->list);
  417. free_midi_urbs(ep);
  418. kfree(ep);
  419. }
  420. /* call all endpoint destructors */
  421. static void free_all_midi2_endpoints(struct snd_usb_midi2_interface *umidi)
  422. {
  423. struct snd_usb_midi2_endpoint *ep;
  424. while (!list_empty(&umidi->ep_list)) {
  425. ep = list_first_entry(&umidi->ep_list,
  426. struct snd_usb_midi2_endpoint, list);
  427. free_midi2_endpoint(ep);
  428. }
  429. }
  430. /* find a MIDI STREAMING descriptor with a given subtype */
  431. static void *find_usb_ms_endpoint_descriptor(struct usb_host_endpoint *hostep,
  432. unsigned char subtype)
  433. {
  434. unsigned char *extra = hostep->extra;
  435. int extralen = hostep->extralen;
  436. while (extralen > 3) {
  437. struct usb_ms_endpoint_descriptor *ms_ep =
  438. (struct usb_ms_endpoint_descriptor *)extra;
  439. if (ms_ep->bLength > 3 &&
  440. ms_ep->bDescriptorType == USB_DT_CS_ENDPOINT &&
  441. ms_ep->bDescriptorSubtype == subtype)
  442. return ms_ep;
  443. if (!extra[0])
  444. break;
  445. extralen -= extra[0];
  446. extra += extra[0];
  447. }
  448. return NULL;
  449. }
  450. /* get the full group terminal block descriptors and return the size */
  451. static int get_group_terminal_block_descs(struct snd_usb_midi2_interface *umidi)
  452. {
  453. struct usb_host_interface *hostif = umidi->hostif;
  454. struct usb_device *dev = umidi->chip->dev;
  455. struct usb_ms20_gr_trm_block_header_descriptor header = { 0 };
  456. unsigned char *data;
  457. int err, size;
  458. err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
  459. USB_REQ_GET_DESCRIPTOR,
  460. USB_RECIP_INTERFACE | USB_TYPE_STANDARD | USB_DIR_IN,
  461. USB_DT_CS_GR_TRM_BLOCK << 8 | hostif->desc.bAlternateSetting,
  462. hostif->desc.bInterfaceNumber,
  463. &header, sizeof(header));
  464. if (err < 0)
  465. return err;
  466. size = __le16_to_cpu(header.wTotalLength);
  467. if (!size) {
  468. dev_err(&dev->dev, "Failed to get GTB descriptors for %d:%d\n",
  469. hostif->desc.bInterfaceNumber, hostif->desc.bAlternateSetting);
  470. return -EINVAL;
  471. }
  472. data = kzalloc(size, GFP_KERNEL);
  473. if (!data)
  474. return -ENOMEM;
  475. err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
  476. USB_REQ_GET_DESCRIPTOR,
  477. USB_RECIP_INTERFACE | USB_TYPE_STANDARD | USB_DIR_IN,
  478. USB_DT_CS_GR_TRM_BLOCK << 8 | hostif->desc.bAlternateSetting,
  479. hostif->desc.bInterfaceNumber, data, size);
  480. if (err < 0) {
  481. kfree(data);
  482. return err;
  483. }
  484. umidi->blk_descs = data;
  485. umidi->blk_desc_size = size;
  486. return 0;
  487. }
  488. /* find the corresponding group terminal block descriptor */
  489. static const struct usb_ms20_gr_trm_block_descriptor *
  490. find_group_terminal_block(struct snd_usb_midi2_interface *umidi, int id)
  491. {
  492. const unsigned char *data = umidi->blk_descs;
  493. int size = umidi->blk_desc_size;
  494. const struct usb_ms20_gr_trm_block_descriptor *desc;
  495. size -= sizeof(struct usb_ms20_gr_trm_block_header_descriptor);
  496. data += sizeof(struct usb_ms20_gr_trm_block_header_descriptor);
  497. while (size > 0 && *data && *data <= size) {
  498. desc = (const struct usb_ms20_gr_trm_block_descriptor *)data;
  499. if (desc->bLength >= sizeof(*desc) &&
  500. desc->bDescriptorType == USB_DT_CS_GR_TRM_BLOCK &&
  501. desc->bDescriptorSubtype == USB_MS_GR_TRM_BLOCK &&
  502. desc->bGrpTrmBlkID == id)
  503. return desc;
  504. size -= *data;
  505. data += *data;
  506. }
  507. return NULL;
  508. }
  509. /* fill up the information from GTB */
  510. static int parse_group_terminal_block(struct snd_usb_midi2_ump *rmidi,
  511. const struct usb_ms20_gr_trm_block_descriptor *desc)
  512. {
  513. struct snd_ump_endpoint *ump = rmidi->ump;
  514. unsigned int protocol, protocol_caps;
  515. /* set default protocol */
  516. switch (desc->bMIDIProtocol) {
  517. case USB_MS_MIDI_PROTO_1_0_64:
  518. case USB_MS_MIDI_PROTO_1_0_64_JRTS:
  519. case USB_MS_MIDI_PROTO_1_0_128:
  520. case USB_MS_MIDI_PROTO_1_0_128_JRTS:
  521. protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI1;
  522. break;
  523. case USB_MS_MIDI_PROTO_2_0:
  524. case USB_MS_MIDI_PROTO_2_0_JRTS:
  525. protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI2;
  526. break;
  527. default:
  528. return 0;
  529. }
  530. if (!ump->info.protocol)
  531. ump->info.protocol = protocol;
  532. protocol_caps = protocol;
  533. switch (desc->bMIDIProtocol) {
  534. case USB_MS_MIDI_PROTO_1_0_64_JRTS:
  535. case USB_MS_MIDI_PROTO_1_0_128_JRTS:
  536. case USB_MS_MIDI_PROTO_2_0_JRTS:
  537. protocol_caps |= SNDRV_UMP_EP_INFO_PROTO_JRTS_TX |
  538. SNDRV_UMP_EP_INFO_PROTO_JRTS_RX;
  539. break;
  540. }
  541. ump->info.protocol_caps |= protocol_caps;
  542. return 0;
  543. }
  544. /* allocate and parse for each assigned group terminal block */
  545. static int parse_group_terminal_blocks(struct snd_usb_midi2_interface *umidi)
  546. {
  547. struct snd_usb_midi2_ump *rmidi;
  548. const struct usb_ms20_gr_trm_block_descriptor *desc;
  549. int err;
  550. err = get_group_terminal_block_descs(umidi);
  551. if (err < 0)
  552. return err;
  553. if (!umidi->blk_descs)
  554. return 0;
  555. list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
  556. desc = find_group_terminal_block(umidi, rmidi->usb_block_id);
  557. if (!desc)
  558. continue;
  559. err = parse_group_terminal_block(rmidi, desc);
  560. if (err < 0)
  561. return err;
  562. }
  563. return 0;
  564. }
  565. /* parse endpoints included in the given interface and create objects */
  566. static int parse_midi_2_0_endpoints(struct snd_usb_midi2_interface *umidi)
  567. {
  568. struct usb_host_interface *hostif = umidi->hostif;
  569. struct usb_host_endpoint *hostep;
  570. struct usb_ms20_endpoint_descriptor *ms_ep;
  571. int i, err;
  572. for (i = 0; i < hostif->desc.bNumEndpoints; i++) {
  573. hostep = &hostif->endpoint[i];
  574. if (!usb_endpoint_xfer_bulk(&hostep->desc) &&
  575. !usb_endpoint_xfer_int(&hostep->desc))
  576. continue;
  577. ms_ep = find_usb_ms_endpoint_descriptor(hostep, USB_MS_GENERAL_2_0);
  578. if (!ms_ep)
  579. continue;
  580. if (ms_ep->bLength <= sizeof(*ms_ep))
  581. continue;
  582. if (!ms_ep->bNumGrpTrmBlock)
  583. continue;
  584. if (ms_ep->bLength < sizeof(*ms_ep) + ms_ep->bNumGrpTrmBlock)
  585. continue;
  586. err = create_midi2_endpoint(umidi, hostep, ms_ep);
  587. if (err < 0)
  588. return err;
  589. }
  590. return 0;
  591. }
  592. static void free_all_midi2_umps(struct snd_usb_midi2_interface *umidi)
  593. {
  594. struct snd_usb_midi2_ump *rmidi;
  595. while (!list_empty(&umidi->rawmidi_list)) {
  596. rmidi = list_first_entry(&umidi->rawmidi_list,
  597. struct snd_usb_midi2_ump, list);
  598. list_del(&rmidi->list);
  599. kfree(rmidi);
  600. }
  601. }
  602. static int create_midi2_ump(struct snd_usb_midi2_interface *umidi,
  603. struct snd_usb_midi2_endpoint *ep_in,
  604. struct snd_usb_midi2_endpoint *ep_out,
  605. int blk_id)
  606. {
  607. struct snd_usb_midi2_ump *rmidi;
  608. struct snd_ump_endpoint *ump;
  609. int input, output;
  610. char idstr[16];
  611. int err;
  612. rmidi = kzalloc_obj(*rmidi);
  613. if (!rmidi)
  614. return -ENOMEM;
  615. INIT_LIST_HEAD(&rmidi->list);
  616. rmidi->dev = umidi->chip->dev;
  617. rmidi->umidi = umidi;
  618. rmidi->usb_block_id = blk_id;
  619. rmidi->index = umidi->chip->num_rawmidis;
  620. snprintf(idstr, sizeof(idstr), "UMP %d", rmidi->index);
  621. input = ep_in ? 1 : 0;
  622. output = ep_out ? 1 : 0;
  623. err = snd_ump_endpoint_new(umidi->chip->card, idstr, rmidi->index,
  624. output, input, &ump);
  625. if (err < 0) {
  626. usb_audio_dbg(umidi->chip, "Failed to create a UMP object\n");
  627. kfree(rmidi);
  628. return err;
  629. }
  630. rmidi->ump = ump;
  631. umidi->chip->num_rawmidis++;
  632. ump->private_data = rmidi;
  633. ump->ops = &snd_usb_midi_v2_ump_ops;
  634. rmidi->eps[STR_IN] = ep_in;
  635. rmidi->eps[STR_OUT] = ep_out;
  636. if (ep_in) {
  637. ep_in->pair = ep_out;
  638. ep_in->rmidi = rmidi;
  639. ep_in->ump = ump;
  640. }
  641. if (ep_out) {
  642. ep_out->pair = ep_in;
  643. ep_out->rmidi = rmidi;
  644. ep_out->ump = ump;
  645. }
  646. list_add_tail(&rmidi->list, &umidi->rawmidi_list);
  647. return 0;
  648. }
  649. /* find the UMP EP with the given USB block id */
  650. static struct snd_usb_midi2_ump *
  651. find_midi2_ump(struct snd_usb_midi2_interface *umidi, int blk_id)
  652. {
  653. struct snd_usb_midi2_ump *rmidi;
  654. list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
  655. if (rmidi->usb_block_id == blk_id)
  656. return rmidi;
  657. }
  658. return NULL;
  659. }
  660. /* look for the matching output endpoint and create UMP object if found */
  661. static int find_matching_ep_partner(struct snd_usb_midi2_interface *umidi,
  662. struct snd_usb_midi2_endpoint *ep,
  663. int blk_id)
  664. {
  665. struct snd_usb_midi2_endpoint *pair_ep;
  666. int blk;
  667. usb_audio_dbg(umidi->chip, "Looking for a pair for EP-in 0x%02x\n",
  668. ep->endpoint);
  669. list_for_each_entry(pair_ep, &umidi->ep_list, list) {
  670. if (pair_ep->direction != STR_OUT)
  671. continue;
  672. if (pair_ep->pair)
  673. continue; /* already paired */
  674. for (blk = 0; blk < pair_ep->ms_ep->bNumGrpTrmBlock; blk++) {
  675. if (pair_ep->ms_ep->baAssoGrpTrmBlkID[blk] == blk_id) {
  676. usb_audio_dbg(umidi->chip,
  677. "Found a match with EP-out 0x%02x blk %d\n",
  678. pair_ep->endpoint, blk);
  679. return create_midi2_ump(umidi, ep, pair_ep, blk_id);
  680. }
  681. }
  682. }
  683. return 0;
  684. }
  685. /* Call UMP helper to parse UMP endpoints;
  686. * this needs to be called after starting the input streams for bi-directional
  687. * communications
  688. */
  689. static int parse_ump_endpoints(struct snd_usb_midi2_interface *umidi)
  690. {
  691. struct snd_usb_midi2_ump *rmidi;
  692. int err;
  693. list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
  694. if (!rmidi->ump ||
  695. !(rmidi->ump->core.info_flags & SNDRV_RAWMIDI_INFO_DUPLEX))
  696. continue;
  697. err = snd_ump_parse_endpoint(rmidi->ump);
  698. if (!err) {
  699. rmidi->ump_parsed = true;
  700. } else {
  701. if (err == -ENOMEM)
  702. return err;
  703. /* fall back to GTB later */
  704. }
  705. }
  706. return 0;
  707. }
  708. /* create a UMP block from a GTB entry */
  709. static int create_gtb_block(struct snd_usb_midi2_ump *rmidi, int dir, int blk)
  710. {
  711. struct snd_usb_midi2_interface *umidi = rmidi->umidi;
  712. const struct usb_ms20_gr_trm_block_descriptor *desc;
  713. struct snd_ump_block *fb;
  714. int type, err;
  715. desc = find_group_terminal_block(umidi, blk);
  716. if (!desc)
  717. return 0;
  718. usb_audio_dbg(umidi->chip,
  719. "GTB %d: type=%d, group=%d/%d, protocol=%d, in bw=%d, out bw=%d\n",
  720. blk, desc->bGrpTrmBlkType, desc->nGroupTrm,
  721. desc->nNumGroupTrm, desc->bMIDIProtocol,
  722. __le16_to_cpu(desc->wMaxInputBandwidth),
  723. __le16_to_cpu(desc->wMaxOutputBandwidth));
  724. /* assign the direction */
  725. switch (desc->bGrpTrmBlkType) {
  726. case USB_MS_GR_TRM_BLOCK_TYPE_BIDIRECTIONAL:
  727. type = SNDRV_UMP_DIR_BIDIRECTION;
  728. break;
  729. case USB_MS_GR_TRM_BLOCK_TYPE_INPUT_ONLY:
  730. type = SNDRV_UMP_DIR_INPUT;
  731. break;
  732. case USB_MS_GR_TRM_BLOCK_TYPE_OUTPUT_ONLY:
  733. type = SNDRV_UMP_DIR_OUTPUT;
  734. break;
  735. default:
  736. usb_audio_dbg(umidi->chip, "Unsupported GTB type %d\n",
  737. desc->bGrpTrmBlkType);
  738. return 0; /* unsupported */
  739. }
  740. /* guess work: set blk-1 as the (0-based) block ID */
  741. err = snd_ump_block_new(rmidi->ump, blk - 1, type,
  742. desc->nGroupTrm, desc->nNumGroupTrm,
  743. &fb);
  744. if (err == -EBUSY)
  745. return 0; /* already present */
  746. else if (err)
  747. return err;
  748. if (desc->iBlockItem)
  749. usb_string(rmidi->dev, desc->iBlockItem,
  750. fb->info.name, sizeof(fb->info.name));
  751. if (__le16_to_cpu(desc->wMaxInputBandwidth) == 1 ||
  752. __le16_to_cpu(desc->wMaxOutputBandwidth) == 1)
  753. fb->info.flags |= SNDRV_UMP_BLOCK_IS_MIDI1 |
  754. SNDRV_UMP_BLOCK_IS_LOWSPEED;
  755. /* if MIDI 2.0 protocol is supported and yet the GTB shows MIDI 1.0,
  756. * treat it as a MIDI 1.0-specific block
  757. */
  758. if (rmidi->ump->info.protocol_caps & SNDRV_UMP_EP_INFO_PROTO_MIDI2) {
  759. switch (desc->bMIDIProtocol) {
  760. case USB_MS_MIDI_PROTO_1_0_64:
  761. case USB_MS_MIDI_PROTO_1_0_64_JRTS:
  762. case USB_MS_MIDI_PROTO_1_0_128:
  763. case USB_MS_MIDI_PROTO_1_0_128_JRTS:
  764. fb->info.flags |= SNDRV_UMP_BLOCK_IS_MIDI1;
  765. break;
  766. }
  767. }
  768. snd_ump_update_group_attrs(rmidi->ump);
  769. usb_audio_dbg(umidi->chip,
  770. "Created a UMP block %d from GTB, name=%s, flags=0x%x\n",
  771. blk, fb->info.name, fb->info.flags);
  772. return 0;
  773. }
  774. /* Create UMP blocks for each UMP EP */
  775. static int create_blocks_from_gtb(struct snd_usb_midi2_interface *umidi)
  776. {
  777. struct snd_usb_midi2_ump *rmidi;
  778. int i, blk, err, dir;
  779. list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
  780. if (!rmidi->ump)
  781. continue;
  782. /* Blocks have been already created? */
  783. if (rmidi->ump_parsed || rmidi->ump->info.num_blocks)
  784. continue;
  785. /* GTB is static-only */
  786. rmidi->ump->info.flags |= SNDRV_UMP_EP_INFO_STATIC_BLOCKS;
  787. /* loop over GTBs */
  788. for (dir = 0; dir < 2; dir++) {
  789. if (!rmidi->eps[dir])
  790. continue;
  791. for (i = 0; i < rmidi->eps[dir]->ms_ep->bNumGrpTrmBlock; i++) {
  792. blk = rmidi->eps[dir]->ms_ep->baAssoGrpTrmBlkID[i];
  793. err = create_gtb_block(rmidi, dir, blk);
  794. if (err < 0)
  795. return err;
  796. }
  797. }
  798. }
  799. return 0;
  800. }
  801. /* attach legacy rawmidis */
  802. static int attach_legacy_rawmidi(struct snd_usb_midi2_interface *umidi)
  803. {
  804. #if IS_ENABLED(CONFIG_SND_UMP_LEGACY_RAWMIDI)
  805. struct snd_usb_midi2_ump *rmidi;
  806. int err;
  807. list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
  808. err = snd_ump_attach_legacy_rawmidi(rmidi->ump,
  809. "Legacy MIDI",
  810. umidi->chip->num_rawmidis);
  811. if (err < 0)
  812. return err;
  813. umidi->chip->num_rawmidis++;
  814. }
  815. #endif
  816. return 0;
  817. }
  818. static void snd_usb_midi_v2_free(struct snd_usb_midi2_interface *umidi)
  819. {
  820. free_all_midi2_endpoints(umidi);
  821. free_all_midi2_umps(umidi);
  822. list_del(&umidi->list);
  823. kfree(umidi->blk_descs);
  824. kfree(umidi);
  825. }
  826. /* parse the interface for MIDI 2.0 */
  827. static int parse_midi_2_0(struct snd_usb_midi2_interface *umidi)
  828. {
  829. struct snd_usb_midi2_endpoint *ep;
  830. int blk, id, err;
  831. /* First, create an object for each USB MIDI Endpoint */
  832. err = parse_midi_2_0_endpoints(umidi);
  833. if (err < 0)
  834. return err;
  835. if (list_empty(&umidi->ep_list)) {
  836. usb_audio_warn(umidi->chip, "No MIDI endpoints found\n");
  837. return -ENODEV;
  838. }
  839. /*
  840. * Next, look for EP I/O pairs that are found in group terminal blocks
  841. * A UMP object is created for each EP I/O pair as bidirecitonal
  842. * UMP EP
  843. */
  844. list_for_each_entry(ep, &umidi->ep_list, list) {
  845. /* only input in this loop; output is matched in find_midi_ump() */
  846. if (ep->direction != STR_IN)
  847. continue;
  848. for (blk = 0; blk < ep->ms_ep->bNumGrpTrmBlock; blk++) {
  849. id = ep->ms_ep->baAssoGrpTrmBlkID[blk];
  850. err = find_matching_ep_partner(umidi, ep, id);
  851. if (err < 0)
  852. return err;
  853. }
  854. }
  855. /*
  856. * For the remaining EPs, treat as singles, create a UMP object with
  857. * unidirectional EP
  858. */
  859. list_for_each_entry(ep, &umidi->ep_list, list) {
  860. if (ep->rmidi)
  861. continue; /* already paired */
  862. for (blk = 0; blk < ep->ms_ep->bNumGrpTrmBlock; blk++) {
  863. id = ep->ms_ep->baAssoGrpTrmBlkID[blk];
  864. if (find_midi2_ump(umidi, id))
  865. continue;
  866. usb_audio_dbg(umidi->chip,
  867. "Creating a unidirection UMP for EP=0x%02x, blk=%d\n",
  868. ep->endpoint, id);
  869. if (ep->direction == STR_IN)
  870. err = create_midi2_ump(umidi, ep, NULL, id);
  871. else
  872. err = create_midi2_ump(umidi, NULL, ep, id);
  873. if (err < 0)
  874. return err;
  875. break;
  876. }
  877. }
  878. return 0;
  879. }
  880. /* is the given interface for MIDI 2.0? */
  881. static bool is_midi2_altset(struct usb_host_interface *hostif)
  882. {
  883. struct usb_ms_header_descriptor *ms_header =
  884. (struct usb_ms_header_descriptor *)hostif->extra;
  885. if (hostif->extralen < 7 ||
  886. ms_header->bLength < 7 ||
  887. ms_header->bDescriptorType != USB_DT_CS_INTERFACE ||
  888. ms_header->bDescriptorSubtype != UAC_HEADER)
  889. return false;
  890. return le16_to_cpu(ms_header->bcdMSC) == USB_MS_REV_MIDI_2_0;
  891. }
  892. /* change the altsetting */
  893. static int set_altset(struct snd_usb_midi2_interface *umidi)
  894. {
  895. usb_audio_dbg(umidi->chip, "Setting host iface %d:%d\n",
  896. umidi->hostif->desc.bInterfaceNumber,
  897. umidi->hostif->desc.bAlternateSetting);
  898. return usb_set_interface(umidi->chip->dev,
  899. umidi->hostif->desc.bInterfaceNumber,
  900. umidi->hostif->desc.bAlternateSetting);
  901. }
  902. /* fill UMP Endpoint name string from USB descriptor */
  903. static void fill_ump_ep_name(struct snd_ump_endpoint *ump,
  904. struct usb_device *dev, int id)
  905. {
  906. int len;
  907. usb_string(dev, id, ump->info.name, sizeof(ump->info.name));
  908. /* trim superfluous "MIDI" suffix */
  909. len = strlen(ump->info.name);
  910. if (len > 5 && !strcmp(ump->info.name + len - 5, " MIDI"))
  911. ump->info.name[len - 5] = 0;
  912. }
  913. /* fill the fallback name string for each rawmidi instance */
  914. static void set_fallback_rawmidi_names(struct snd_usb_midi2_interface *umidi)
  915. {
  916. struct usb_device *dev = umidi->chip->dev;
  917. struct snd_usb_midi2_ump *rmidi;
  918. struct snd_ump_endpoint *ump;
  919. list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
  920. ump = rmidi->ump;
  921. /* fill UMP EP name from USB descriptors */
  922. if (!*ump->info.name && umidi->hostif->desc.iInterface)
  923. fill_ump_ep_name(ump, dev, umidi->hostif->desc.iInterface);
  924. else if (!*ump->info.name && dev->descriptor.iProduct)
  925. fill_ump_ep_name(ump, dev, dev->descriptor.iProduct);
  926. /* fill fallback name */
  927. if (!*ump->info.name)
  928. scnprintf(ump->info.name, sizeof(ump->info.name),
  929. "USB MIDI %d", rmidi->index);
  930. /* copy as rawmidi name if not set */
  931. if (!*ump->core.name)
  932. strscpy(ump->core.name, ump->info.name,
  933. sizeof(ump->core.name));
  934. /* use serial number string as unique UMP product id */
  935. if (!*ump->info.product_id && dev->descriptor.iSerialNumber)
  936. usb_string(dev, dev->descriptor.iSerialNumber,
  937. ump->info.product_id,
  938. sizeof(ump->info.product_id));
  939. }
  940. }
  941. /* create MIDI interface; fallback to MIDI 1.0 if needed */
  942. int snd_usb_midi_v2_create(struct snd_usb_audio *chip,
  943. struct usb_interface *iface,
  944. const struct snd_usb_audio_quirk *quirk,
  945. unsigned int usb_id)
  946. {
  947. struct snd_usb_midi2_interface *umidi;
  948. struct usb_host_interface *hostif;
  949. int err;
  950. usb_audio_dbg(chip, "Parsing interface %d...\n",
  951. iface->altsetting[0].desc.bInterfaceNumber);
  952. /* fallback to MIDI 1.0? */
  953. if (!midi2_enable) {
  954. usb_audio_info(chip, "Falling back to MIDI 1.0 by module option\n");
  955. goto fallback_to_midi1;
  956. }
  957. if ((quirk && quirk->type != QUIRK_MIDI_STANDARD_INTERFACE) ||
  958. iface->num_altsetting < 2) {
  959. usb_audio_info(chip, "Quirk or no altset; falling back to MIDI 1.0\n");
  960. goto fallback_to_midi1;
  961. }
  962. hostif = &iface->altsetting[1];
  963. if (!is_midi2_altset(hostif)) {
  964. usb_audio_info(chip, "No MIDI 2.0 at altset 1, falling back to MIDI 1.0\n");
  965. goto fallback_to_midi1;
  966. }
  967. if (!hostif->desc.bNumEndpoints) {
  968. usb_audio_info(chip, "No endpoint at altset 1, falling back to MIDI 1.0\n");
  969. goto fallback_to_midi1;
  970. }
  971. usb_audio_dbg(chip, "Creating a MIDI 2.0 instance for %d:%d\n",
  972. hostif->desc.bInterfaceNumber,
  973. hostif->desc.bAlternateSetting);
  974. umidi = kzalloc_obj(*umidi);
  975. if (!umidi)
  976. return -ENOMEM;
  977. umidi->chip = chip;
  978. umidi->iface = iface;
  979. umidi->hostif = hostif;
  980. INIT_LIST_HEAD(&umidi->rawmidi_list);
  981. INIT_LIST_HEAD(&umidi->ep_list);
  982. list_add_tail(&umidi->list, &chip->midi_v2_list);
  983. err = set_altset(umidi);
  984. if (err < 0) {
  985. usb_audio_err(chip, "Failed to set altset\n");
  986. goto error;
  987. }
  988. /* assume only altset 1 corresponding to MIDI 2.0 interface */
  989. err = parse_midi_2_0(umidi);
  990. if (err < 0) {
  991. usb_audio_err(chip, "Failed to parse MIDI 2.0 interface\n");
  992. goto error;
  993. }
  994. /* parse USB group terminal blocks */
  995. err = parse_group_terminal_blocks(umidi);
  996. if (err < 0) {
  997. usb_audio_err(chip, "Failed to parse GTB\n");
  998. goto error;
  999. }
  1000. err = start_input_streams(umidi);
  1001. if (err < 0) {
  1002. usb_audio_err(chip, "Failed to start input streams\n");
  1003. goto error;
  1004. }
  1005. if (midi2_ump_probe) {
  1006. err = parse_ump_endpoints(umidi);
  1007. if (err < 0) {
  1008. usb_audio_err(chip, "Failed to parse UMP endpoint\n");
  1009. goto error;
  1010. }
  1011. }
  1012. err = create_blocks_from_gtb(umidi);
  1013. if (err < 0) {
  1014. usb_audio_err(chip, "Failed to create GTB blocks\n");
  1015. goto error;
  1016. }
  1017. set_fallback_rawmidi_names(umidi);
  1018. err = attach_legacy_rawmidi(umidi);
  1019. if (err < 0) {
  1020. usb_audio_err(chip, "Failed to create legacy rawmidi\n");
  1021. goto error;
  1022. }
  1023. return 0;
  1024. error:
  1025. snd_usb_midi_v2_free(umidi);
  1026. return err;
  1027. fallback_to_midi1:
  1028. return __snd_usbmidi_create(chip->card, iface, &chip->midi_list,
  1029. quirk, usb_id, &chip->num_rawmidis);
  1030. }
  1031. static void suspend_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
  1032. {
  1033. kill_midi_urbs(ep, true);
  1034. drain_urb_queue(ep);
  1035. }
  1036. void snd_usb_midi_v2_suspend_all(struct snd_usb_audio *chip)
  1037. {
  1038. struct snd_usb_midi2_interface *umidi;
  1039. struct snd_usb_midi2_endpoint *ep;
  1040. list_for_each_entry(umidi, &chip->midi_v2_list, list) {
  1041. list_for_each_entry(ep, &umidi->ep_list, list)
  1042. suspend_midi2_endpoint(ep);
  1043. }
  1044. }
  1045. static void resume_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
  1046. {
  1047. ep->running = ep->suspended;
  1048. if (ep->direction == STR_IN)
  1049. submit_io_urbs(ep);
  1050. /* FIXME: does it all? */
  1051. }
  1052. void snd_usb_midi_v2_resume_all(struct snd_usb_audio *chip)
  1053. {
  1054. struct snd_usb_midi2_interface *umidi;
  1055. struct snd_usb_midi2_endpoint *ep;
  1056. list_for_each_entry(umidi, &chip->midi_v2_list, list) {
  1057. set_altset(umidi);
  1058. list_for_each_entry(ep, &umidi->ep_list, list)
  1059. resume_midi2_endpoint(ep);
  1060. }
  1061. }
  1062. void snd_usb_midi_v2_disconnect_all(struct snd_usb_audio *chip)
  1063. {
  1064. struct snd_usb_midi2_interface *umidi;
  1065. struct snd_usb_midi2_endpoint *ep;
  1066. list_for_each_entry(umidi, &chip->midi_v2_list, list) {
  1067. umidi->disconnected = 1;
  1068. list_for_each_entry(ep, &umidi->ep_list, list) {
  1069. ep->disconnected = 1;
  1070. kill_midi_urbs(ep, false);
  1071. drain_urb_queue(ep);
  1072. }
  1073. }
  1074. }
  1075. /* release the MIDI instance */
  1076. void snd_usb_midi_v2_free_all(struct snd_usb_audio *chip)
  1077. {
  1078. struct snd_usb_midi2_interface *umidi, *next;
  1079. list_for_each_entry_safe(umidi, next, &chip->midi_v2_list, list)
  1080. snd_usb_midi_v2_free(umidi);
  1081. }