1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <linux/gfp.h>
19#include <linux/init.h>
20#include <linux/usb.h>
21#include <linux/usb/audio.h>
22
23#include <sound/core.h>
24#include <sound/pcm.h>
25
26#include "usbaudio.h"
27#include "helper.h"
28#include "card.h"
29#include "urb.h"
30#include "pcm.h"
31
32
33
34
35
36static inline unsigned get_usb_full_speed_rate(unsigned int rate)
37{
38 return ((rate << 13) + 62) / 125;
39}
40
41
42
43
44
45static inline unsigned get_usb_high_speed_rate(unsigned int rate)
46{
47 return ((rate << 10) + 62) / 125;
48}
49
50
51
52
53static int deactivate_urbs(struct snd_usb_substream *subs, int force, int can_sleep)
54{
55 struct snd_usb_audio *chip = subs->stream->chip;
56 unsigned int i;
57 int async;
58
59 subs->running = 0;
60
61 if (!force && subs->stream->chip->shutdown)
62 return -EBADFD;
63
64 async = !can_sleep && chip->async_unlink;
65
66 if (!async && in_interrupt())
67 return 0;
68
69 for (i = 0; i < subs->nurbs; i++) {
70 if (test_bit(i, &subs->active_mask)) {
71 if (!test_and_set_bit(i, &subs->unlink_mask)) {
72 struct urb *u = subs->dataurb[i].urb;
73 if (async)
74 usb_unlink_urb(u);
75 else
76 usb_kill_urb(u);
77 }
78 }
79 }
80 if (subs->syncpipe) {
81 for (i = 0; i < SYNC_URBS; i++) {
82 if (test_bit(i+16, &subs->active_mask)) {
83 if (!test_and_set_bit(i+16, &subs->unlink_mask)) {
84 struct urb *u = subs->syncurb[i].urb;
85 if (async)
86 usb_unlink_urb(u);
87 else
88 usb_kill_urb(u);
89 }
90 }
91 }
92 }
93 return 0;
94}
95
96
97
98
99
100static void release_urb_ctx(struct snd_urb_ctx *u)
101{
102 if (u->urb) {
103 if (u->buffer_size)
104 usb_free_coherent(u->subs->dev, u->buffer_size,
105 u->urb->transfer_buffer,
106 u->urb->transfer_dma);
107 usb_free_urb(u->urb);
108 u->urb = NULL;
109 }
110}
111
112
113
114
115static int wait_clear_urbs(struct snd_usb_substream *subs)
116{
117 unsigned long end_time = jiffies + msecs_to_jiffies(1000);
118 unsigned int i;
119 int alive;
120
121 do {
122 alive = 0;
123 for (i = 0; i < subs->nurbs; i++) {
124 if (test_bit(i, &subs->active_mask))
125 alive++;
126 }
127 if (subs->syncpipe) {
128 for (i = 0; i < SYNC_URBS; i++) {
129 if (test_bit(i + 16, &subs->active_mask))
130 alive++;
131 }
132 }
133 if (! alive)
134 break;
135 schedule_timeout_uninterruptible(1);
136 } while (time_before(jiffies, end_time));
137 if (alive)
138 snd_printk(KERN_ERR "timeout: still %d active urbs..\n", alive);
139 return 0;
140}
141
142
143
144
145void snd_usb_release_substream_urbs(struct snd_usb_substream *subs, int force)
146{
147 int i;
148
149
150 deactivate_urbs(subs, force, 1);
151 wait_clear_urbs(subs);
152
153 for (i = 0; i < MAX_URBS; i++)
154 release_urb_ctx(&subs->dataurb[i]);
155 for (i = 0; i < SYNC_URBS; i++)
156 release_urb_ctx(&subs->syncurb[i]);
157 usb_free_coherent(subs->dev, SYNC_URBS * 4,
158 subs->syncbuf, subs->sync_dma);
159 subs->syncbuf = NULL;
160 subs->nurbs = 0;
161}
162
163
164
165
166static void snd_complete_urb(struct urb *urb)
167{
168 struct snd_urb_ctx *ctx = urb->context;
169 struct snd_usb_substream *subs = ctx->subs;
170 struct snd_pcm_substream *substream = ctx->subs->pcm_substream;
171 int err = 0;
172
173 if ((subs->running && subs->ops.retire(subs, substream->runtime, urb)) ||
174 !subs->running ||
175 (err = subs->ops.prepare(subs, substream->runtime, urb)) < 0 ||
176 (err = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
177 clear_bit(ctx->index, &subs->active_mask);
178 if (err < 0) {
179 snd_printd(KERN_ERR "cannot submit urb (err = %d)\n", err);
180 snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
181 }
182 }
183}
184
185
186
187
188
189static void snd_complete_sync_urb(struct urb *urb)
190{
191 struct snd_urb_ctx *ctx = urb->context;
192 struct snd_usb_substream *subs = ctx->subs;
193 struct snd_pcm_substream *substream = ctx->subs->pcm_substream;
194 int err = 0;
195
196 if ((subs->running && subs->ops.retire_sync(subs, substream->runtime, urb)) ||
197 !subs->running ||
198 (err = subs->ops.prepare_sync(subs, substream->runtime, urb)) < 0 ||
199 (err = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
200 clear_bit(ctx->index + 16, &subs->active_mask);
201 if (err < 0) {
202 snd_printd(KERN_ERR "cannot submit sync urb (err = %d)\n", err);
203 snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
204 }
205 }
206}
207
208
209
210
211
212int snd_usb_init_substream_urbs(struct snd_usb_substream *subs,
213 unsigned int period_bytes,
214 unsigned int rate,
215 unsigned int frame_bits)
216{
217 unsigned int maxsize, i;
218 int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
219 unsigned int urb_packs, total_packs, packs_per_ms;
220 struct snd_usb_audio *chip = subs->stream->chip;
221
222
223 if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL)
224 subs->freqn = get_usb_full_speed_rate(rate);
225 else
226 subs->freqn = get_usb_high_speed_rate(rate);
227 subs->freqm = subs->freqn;
228 subs->freqshift = INT_MIN;
229
230 if (subs->maxpacksize) {
231
232 maxsize = subs->maxpacksize;
233 subs->freqmax = (maxsize / (frame_bits >> 3))
234 << (16 - subs->datainterval);
235 } else {
236
237 subs->freqmax = subs->freqn + (subs->freqn >> 2);
238 maxsize = ((subs->freqmax + 0xffff) * (frame_bits >> 3))
239 >> (16 - subs->datainterval);
240 }
241 subs->phase = 0;
242
243 if (subs->fill_max)
244 subs->curpacksize = subs->maxpacksize;
245 else
246 subs->curpacksize = maxsize;
247
248 if (snd_usb_get_speed(subs->dev) != USB_SPEED_FULL)
249 packs_per_ms = 8 >> subs->datainterval;
250 else
251 packs_per_ms = 1;
252
253 if (is_playback) {
254 urb_packs = max(chip->nrpacks, 1);
255 urb_packs = min(urb_packs, (unsigned int)MAX_PACKS);
256 } else
257 urb_packs = 1;
258 urb_packs *= packs_per_ms;
259 if (subs->syncpipe)
260 urb_packs = min(urb_packs, 1U << subs->syncinterval);
261
262
263 if (is_playback) {
264 unsigned int minsize, maxpacks;
265
266 minsize = (subs->freqn >> (16 - subs->datainterval))
267 * (frame_bits >> 3);
268
269 if (subs->syncpipe)
270 minsize -= minsize >> 3;
271 minsize = max(minsize, 1u);
272 total_packs = (period_bytes + minsize - 1) / minsize;
273
274 if (total_packs < 2) {
275 total_packs = 2;
276 } else {
277
278 maxpacks = max(MAX_QUEUE * packs_per_ms, urb_packs * 2);
279 total_packs = min(total_packs, maxpacks);
280 }
281 } else {
282 while (urb_packs > 1 && urb_packs * maxsize >= period_bytes)
283 urb_packs >>= 1;
284 total_packs = MAX_URBS * urb_packs;
285 }
286 subs->nurbs = (total_packs + urb_packs - 1) / urb_packs;
287 if (subs->nurbs > MAX_URBS) {
288
289 subs->nurbs = MAX_URBS;
290 total_packs = MAX_URBS * urb_packs;
291 } else if (subs->nurbs < 2) {
292
293
294
295 subs->nurbs = 2;
296 }
297
298
299 for (i = 0; i < subs->nurbs; i++) {
300 struct snd_urb_ctx *u = &subs->dataurb[i];
301 u->index = i;
302 u->subs = subs;
303 u->packets = (i + 1) * total_packs / subs->nurbs
304 - i * total_packs / subs->nurbs;
305 u->buffer_size = maxsize * u->packets;
306 if (subs->fmt_type == UAC_FORMAT_TYPE_II)
307 u->packets++;
308 u->urb = usb_alloc_urb(u->packets, GFP_KERNEL);
309 if (!u->urb)
310 goto out_of_memory;
311 u->urb->transfer_buffer =
312 usb_alloc_coherent(subs->dev, u->buffer_size,
313 GFP_KERNEL, &u->urb->transfer_dma);
314 if (!u->urb->transfer_buffer)
315 goto out_of_memory;
316 u->urb->pipe = subs->datapipe;
317 u->urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
318 u->urb->interval = 1 << subs->datainterval;
319 u->urb->context = u;
320 u->urb->complete = snd_complete_urb;
321 }
322
323 if (subs->syncpipe) {
324
325 subs->syncbuf = usb_alloc_coherent(subs->dev, SYNC_URBS * 4,
326 GFP_KERNEL, &subs->sync_dma);
327 if (!subs->syncbuf)
328 goto out_of_memory;
329 for (i = 0; i < SYNC_URBS; i++) {
330 struct snd_urb_ctx *u = &subs->syncurb[i];
331 u->index = i;
332 u->subs = subs;
333 u->packets = 1;
334 u->urb = usb_alloc_urb(1, GFP_KERNEL);
335 if (!u->urb)
336 goto out_of_memory;
337 u->urb->transfer_buffer = subs->syncbuf + i * 4;
338 u->urb->transfer_dma = subs->sync_dma + i * 4;
339 u->urb->transfer_buffer_length = 4;
340 u->urb->pipe = subs->syncpipe;
341 u->urb->transfer_flags = URB_ISO_ASAP |
342 URB_NO_TRANSFER_DMA_MAP;
343 u->urb->number_of_packets = 1;
344 u->urb->interval = 1 << subs->syncinterval;
345 u->urb->context = u;
346 u->urb->complete = snd_complete_sync_urb;
347 }
348 }
349 return 0;
350
351out_of_memory:
352 snd_usb_release_substream_urbs(subs, 0);
353 return -ENOMEM;
354}
355
356
357
358
359
360
361
362static int prepare_capture_sync_urb(struct snd_usb_substream *subs,
363 struct snd_pcm_runtime *runtime,
364 struct urb *urb)
365{
366 unsigned char *cp = urb->transfer_buffer;
367 struct snd_urb_ctx *ctx = urb->context;
368
369 urb->dev = ctx->subs->dev;
370 urb->iso_frame_desc[0].length = 3;
371 urb->iso_frame_desc[0].offset = 0;
372 cp[0] = subs->freqn >> 2;
373 cp[1] = subs->freqn >> 10;
374 cp[2] = subs->freqn >> 18;
375 return 0;
376}
377
378
379
380
381
382
383
384static int prepare_capture_sync_urb_hs(struct snd_usb_substream *subs,
385 struct snd_pcm_runtime *runtime,
386 struct urb *urb)
387{
388 unsigned char *cp = urb->transfer_buffer;
389 struct snd_urb_ctx *ctx = urb->context;
390
391 urb->dev = ctx->subs->dev;
392 urb->iso_frame_desc[0].length = 4;
393 urb->iso_frame_desc[0].offset = 0;
394 cp[0] = subs->freqn;
395 cp[1] = subs->freqn >> 8;
396 cp[2] = subs->freqn >> 16;
397 cp[3] = subs->freqn >> 24;
398 return 0;
399}
400
401
402
403
404
405static int retire_capture_sync_urb(struct snd_usb_substream *subs,
406 struct snd_pcm_runtime *runtime,
407 struct urb *urb)
408{
409 return 0;
410}
411
412
413
414
415
416
417
418
419
420
421
422static int prepare_capture_urb(struct snd_usb_substream *subs,
423 struct snd_pcm_runtime *runtime,
424 struct urb *urb)
425{
426 int i, offs;
427 struct snd_urb_ctx *ctx = urb->context;
428
429 offs = 0;
430 urb->dev = ctx->subs->dev;
431 for (i = 0; i < ctx->packets; i++) {
432 urb->iso_frame_desc[i].offset = offs;
433 urb->iso_frame_desc[i].length = subs->curpacksize;
434 offs += subs->curpacksize;
435 }
436 urb->transfer_buffer_length = offs;
437 urb->number_of_packets = ctx->packets;
438 return 0;
439}
440
441
442
443
444
445
446
447static int retire_capture_urb(struct snd_usb_substream *subs,
448 struct snd_pcm_runtime *runtime,
449 struct urb *urb)
450{
451 unsigned long flags;
452 unsigned char *cp;
453 int i;
454 unsigned int stride, frames, bytes, oldptr;
455 int period_elapsed = 0;
456
457 stride = runtime->frame_bits >> 3;
458
459 for (i = 0; i < urb->number_of_packets; i++) {
460 cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset;
461 if (urb->iso_frame_desc[i].status) {
462 snd_printd(KERN_ERR "frame %d active: %d\n", i, urb->iso_frame_desc[i].status);
463
464 }
465 bytes = urb->iso_frame_desc[i].actual_length;
466 frames = bytes / stride;
467 if (!subs->txfr_quirk)
468 bytes = frames * stride;
469 if (bytes % (runtime->sample_bits >> 3) != 0) {
470#ifdef CONFIG_SND_DEBUG_VERBOSE
471 int oldbytes = bytes;
472#endif
473 bytes = frames * stride;
474 snd_printdd(KERN_ERR "Corrected urb data len. %d->%d\n",
475 oldbytes, bytes);
476 }
477
478 spin_lock_irqsave(&subs->lock, flags);
479 oldptr = subs->hwptr_done;
480 subs->hwptr_done += bytes;
481 if (subs->hwptr_done >= runtime->buffer_size * stride)
482 subs->hwptr_done -= runtime->buffer_size * stride;
483 frames = (bytes + (oldptr % stride)) / stride;
484 subs->transfer_done += frames;
485 if (subs->transfer_done >= runtime->period_size) {
486 subs->transfer_done -= runtime->period_size;
487 period_elapsed = 1;
488 }
489 spin_unlock_irqrestore(&subs->lock, flags);
490
491 if (oldptr + bytes > runtime->buffer_size * stride) {
492 unsigned int bytes1 =
493 runtime->buffer_size * stride - oldptr;
494 memcpy(runtime->dma_area + oldptr, cp, bytes1);
495 memcpy(runtime->dma_area, cp + bytes1, bytes - bytes1);
496 } else {
497 memcpy(runtime->dma_area + oldptr, cp, bytes);
498 }
499 }
500 if (period_elapsed)
501 snd_pcm_period_elapsed(subs->pcm_substream);
502 return 0;
503}
504
505
506
507
508static int retire_paused_capture_urb(struct snd_usb_substream *subs,
509 struct snd_pcm_runtime *runtime,
510 struct urb *urb)
511{
512 return 0;
513}
514
515
516
517
518
519
520
521static int prepare_playback_sync_urb(struct snd_usb_substream *subs,
522 struct snd_pcm_runtime *runtime,
523 struct urb *urb)
524{
525 struct snd_urb_ctx *ctx = urb->context;
526
527 urb->dev = ctx->subs->dev;
528 urb->iso_frame_desc[0].length = min(4u, ctx->subs->syncmaxsize);
529 urb->iso_frame_desc[0].offset = 0;
530 return 0;
531}
532
533
534
535
536
537
538
539
540
541
542
543static int retire_playback_sync_urb(struct snd_usb_substream *subs,
544 struct snd_pcm_runtime *runtime,
545 struct urb *urb)
546{
547 unsigned int f;
548 int shift;
549 unsigned long flags;
550
551 if (urb->iso_frame_desc[0].status != 0 ||
552 urb->iso_frame_desc[0].actual_length < 3)
553 return 0;
554
555 f = le32_to_cpup(urb->transfer_buffer);
556 if (urb->iso_frame_desc[0].actual_length == 3)
557 f &= 0x00ffffff;
558 else
559 f &= 0x0fffffff;
560 if (f == 0)
561 return 0;
562
563 if (unlikely(subs->freqshift == INT_MIN)) {
564
565
566
567
568
569
570 shift = 0;
571 while (f < subs->freqn - subs->freqn / 4) {
572 f <<= 1;
573 shift++;
574 }
575 while (f > subs->freqn + subs->freqn / 2) {
576 f >>= 1;
577 shift--;
578 }
579 subs->freqshift = shift;
580 }
581 else if (subs->freqshift >= 0)
582 f <<= subs->freqshift;
583 else
584 f >>= -subs->freqshift;
585
586 if (likely(f >= subs->freqn - subs->freqn / 8 && f <= subs->freqmax)) {
587
588
589
590
591 spin_lock_irqsave(&subs->lock, flags);
592 subs->freqm = f;
593 spin_unlock_irqrestore(&subs->lock, flags);
594 } else {
595
596
597
598
599 subs->freqshift = INT_MIN;
600 }
601
602 return 0;
603}
604
605
606static int snd_usb_audio_next_packet_size(struct snd_usb_substream *subs)
607{
608 if (subs->fill_max)
609 return subs->maxframesize;
610 else {
611 subs->phase = (subs->phase & 0xffff)
612 + (subs->freqm << subs->datainterval);
613 return min(subs->phase >> 16, subs->maxframesize);
614 }
615}
616
617
618
619
620
621
622static int prepare_nodata_playback_urb(struct snd_usb_substream *subs,
623 struct snd_pcm_runtime *runtime,
624 struct urb *urb)
625{
626 unsigned int i, offs, counts;
627 struct snd_urb_ctx *ctx = urb->context;
628 int stride = runtime->frame_bits >> 3;
629
630 offs = 0;
631 urb->dev = ctx->subs->dev;
632 for (i = 0; i < ctx->packets; ++i) {
633 counts = snd_usb_audio_next_packet_size(subs);
634 urb->iso_frame_desc[i].offset = offs * stride;
635 urb->iso_frame_desc[i].length = counts * stride;
636 offs += counts;
637 }
638 urb->number_of_packets = ctx->packets;
639 urb->transfer_buffer_length = offs * stride;
640 memset(urb->transfer_buffer,
641 runtime->format == SNDRV_PCM_FORMAT_U8 ? 0x80 : 0,
642 offs * stride);
643 return 0;
644}
645
646
647
648
649
650
651
652
653
654static int prepare_playback_urb(struct snd_usb_substream *subs,
655 struct snd_pcm_runtime *runtime,
656 struct urb *urb)
657{
658 int i, stride;
659 unsigned int counts, frames, bytes;
660 unsigned long flags;
661 int period_elapsed = 0;
662 struct snd_urb_ctx *ctx = urb->context;
663
664 stride = runtime->frame_bits >> 3;
665
666 frames = 0;
667 urb->dev = ctx->subs->dev;
668 urb->number_of_packets = 0;
669 spin_lock_irqsave(&subs->lock, flags);
670 for (i = 0; i < ctx->packets; i++) {
671 counts = snd_usb_audio_next_packet_size(subs);
672
673 urb->iso_frame_desc[i].offset = frames * stride;
674 urb->iso_frame_desc[i].length = counts * stride;
675 frames += counts;
676 urb->number_of_packets++;
677 subs->transfer_done += counts;
678 if (subs->transfer_done >= runtime->period_size) {
679 subs->transfer_done -= runtime->period_size;
680 period_elapsed = 1;
681 if (subs->fmt_type == UAC_FORMAT_TYPE_II) {
682 if (subs->transfer_done > 0) {
683
684
685 frames -= subs->transfer_done;
686 counts -= subs->transfer_done;
687 urb->iso_frame_desc[i].length =
688 counts * stride;
689 subs->transfer_done = 0;
690 }
691 i++;
692 if (i < ctx->packets) {
693
694 urb->iso_frame_desc[i].offset =
695 frames * stride;
696 urb->iso_frame_desc[i].length = 0;
697 urb->number_of_packets++;
698 }
699 break;
700 }
701 }
702 if (period_elapsed)
703 break;
704 }
705 bytes = frames * stride;
706 if (subs->hwptr_done + bytes > runtime->buffer_size * stride) {
707
708 unsigned int bytes1 =
709 runtime->buffer_size * stride - subs->hwptr_done;
710 memcpy(urb->transfer_buffer,
711 runtime->dma_area + subs->hwptr_done, bytes1);
712 memcpy(urb->transfer_buffer + bytes1,
713 runtime->dma_area, bytes - bytes1);
714 } else {
715 memcpy(urb->transfer_buffer,
716 runtime->dma_area + subs->hwptr_done, bytes);
717 }
718 subs->hwptr_done += bytes;
719 if (subs->hwptr_done >= runtime->buffer_size * stride)
720 subs->hwptr_done -= runtime->buffer_size * stride;
721 runtime->delay += frames;
722 spin_unlock_irqrestore(&subs->lock, flags);
723 urb->transfer_buffer_length = bytes;
724 if (period_elapsed)
725 snd_pcm_period_elapsed(subs->pcm_substream);
726 return 0;
727}
728
729
730
731
732
733static int retire_playback_urb(struct snd_usb_substream *subs,
734 struct snd_pcm_runtime *runtime,
735 struct urb *urb)
736{
737 unsigned long flags;
738 int stride = runtime->frame_bits >> 3;
739 int processed = urb->transfer_buffer_length / stride;
740
741 spin_lock_irqsave(&subs->lock, flags);
742 if (processed > runtime->delay)
743 runtime->delay = 0;
744 else
745 runtime->delay -= processed;
746 spin_unlock_irqrestore(&subs->lock, flags);
747 return 0;
748}
749
750static const char *usb_error_string(int err)
751{
752 switch (err) {
753 case -ENODEV:
754 return "no device";
755 case -ENOENT:
756 return "endpoint not enabled";
757 case -EPIPE:
758 return "endpoint stalled";
759 case -ENOSPC:
760 return "not enough bandwidth";
761 case -ESHUTDOWN:
762 return "device disabled";
763 case -EHOSTUNREACH:
764 return "device suspended";
765 case -EINVAL:
766 case -EAGAIN:
767 case -EFBIG:
768 case -EMSGSIZE:
769 return "internal error";
770 default:
771 return "unknown error";
772 }
773}
774
775
776
777
778static int start_urbs(struct snd_usb_substream *subs, struct snd_pcm_runtime *runtime)
779{
780 unsigned int i;
781 int err;
782
783 if (subs->stream->chip->shutdown)
784 return -EBADFD;
785
786 for (i = 0; i < subs->nurbs; i++) {
787 if (snd_BUG_ON(!subs->dataurb[i].urb))
788 return -EINVAL;
789 if (subs->ops.prepare(subs, runtime, subs->dataurb[i].urb) < 0) {
790 snd_printk(KERN_ERR "cannot prepare datapipe for urb %d\n", i);
791 goto __error;
792 }
793 }
794 if (subs->syncpipe) {
795 for (i = 0; i < SYNC_URBS; i++) {
796 if (snd_BUG_ON(!subs->syncurb[i].urb))
797 return -EINVAL;
798 if (subs->ops.prepare_sync(subs, runtime, subs->syncurb[i].urb) < 0) {
799 snd_printk(KERN_ERR "cannot prepare syncpipe for urb %d\n", i);
800 goto __error;
801 }
802 }
803 }
804
805 subs->active_mask = 0;
806 subs->unlink_mask = 0;
807 subs->running = 1;
808 for (i = 0; i < subs->nurbs; i++) {
809 err = usb_submit_urb(subs->dataurb[i].urb, GFP_ATOMIC);
810 if (err < 0) {
811 snd_printk(KERN_ERR "cannot submit datapipe "
812 "for urb %d, error %d: %s\n",
813 i, err, usb_error_string(err));
814 goto __error;
815 }
816 set_bit(i, &subs->active_mask);
817 }
818 if (subs->syncpipe) {
819 for (i = 0; i < SYNC_URBS; i++) {
820 err = usb_submit_urb(subs->syncurb[i].urb, GFP_ATOMIC);
821 if (err < 0) {
822 snd_printk(KERN_ERR "cannot submit syncpipe "
823 "for urb %d, error %d: %s\n",
824 i, err, usb_error_string(err));
825 goto __error;
826 }
827 set_bit(i + 16, &subs->active_mask);
828 }
829 }
830 return 0;
831
832 __error:
833
834 deactivate_urbs(subs, 0, 0);
835 return -EPIPE;
836}
837
838
839
840
841static struct snd_urb_ops audio_urb_ops[2] = {
842 {
843 .prepare = prepare_nodata_playback_urb,
844 .retire = retire_playback_urb,
845 .prepare_sync = prepare_playback_sync_urb,
846 .retire_sync = retire_playback_sync_urb,
847 },
848 {
849 .prepare = prepare_capture_urb,
850 .retire = retire_capture_urb,
851 .prepare_sync = prepare_capture_sync_urb,
852 .retire_sync = retire_capture_sync_urb,
853 },
854};
855
856
857
858
859
860void snd_usb_init_substream(struct snd_usb_stream *as,
861 int stream, struct audioformat *fp)
862{
863 struct snd_usb_substream *subs = &as->substream[stream];
864
865 INIT_LIST_HEAD(&subs->fmt_list);
866 spin_lock_init(&subs->lock);
867
868 subs->stream = as;
869 subs->direction = stream;
870 subs->dev = as->chip->dev;
871 subs->txfr_quirk = as->chip->txfr_quirk;
872 subs->ops = audio_urb_ops[stream];
873 if (snd_usb_get_speed(subs->dev) >= USB_SPEED_HIGH)
874 subs->ops.prepare_sync = prepare_capture_sync_urb_hs;
875
876 snd_usb_set_pcm_ops(as->pcm, stream);
877
878 list_add_tail(&fp->list, &subs->fmt_list);
879 subs->formats |= fp->formats;
880 subs->endpoint = fp->endpoint;
881 subs->num_formats++;
882 subs->fmt_type = fp->fmt_type;
883}
884
885int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substream, int cmd)
886{
887 struct snd_usb_substream *subs = substream->runtime->private_data;
888
889 switch (cmd) {
890 case SNDRV_PCM_TRIGGER_START:
891 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
892 subs->ops.prepare = prepare_playback_urb;
893 return 0;
894 case SNDRV_PCM_TRIGGER_STOP:
895 return deactivate_urbs(subs, 0, 0);
896 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
897 subs->ops.prepare = prepare_nodata_playback_urb;
898 return 0;
899 }
900
901 return -EINVAL;
902}
903
904int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream, int cmd)
905{
906 struct snd_usb_substream *subs = substream->runtime->private_data;
907
908 switch (cmd) {
909 case SNDRV_PCM_TRIGGER_START:
910 subs->ops.retire = retire_capture_urb;
911 return start_urbs(subs, substream->runtime);
912 case SNDRV_PCM_TRIGGER_STOP:
913 return deactivate_urbs(subs, 0, 0);
914 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
915 subs->ops.retire = retire_paused_capture_urb;
916 return 0;
917 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
918 subs->ops.retire = retire_capture_urb;
919 return 0;
920 }
921
922 return -EINVAL;
923}
924
925int snd_usb_substream_prepare(struct snd_usb_substream *subs,
926 struct snd_pcm_runtime *runtime)
927{
928
929 deactivate_urbs(subs, 0, 1);
930 wait_clear_urbs(subs);
931
932
933
934 if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) {
935 subs->ops.prepare = prepare_nodata_playback_urb;
936 return start_urbs(subs, runtime);
937 }
938
939 return 0;
940}
941
942