11a59d1b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2e5779998SDaniel Mack /*
3e5779998SDaniel Mack */
4e5779998SDaniel Mack
5c731bc96SDaniel Mack #include <linux/gfp.h>
6c731bc96SDaniel Mack #include <linux/init.h>
780c8a2a3STakashi Iwai #include <linux/ratelimit.h>
8c731bc96SDaniel Mack #include <linux/usb.h>
9c731bc96SDaniel Mack #include <linux/usb/audio.h>
108fdff6a3SDaniel Mack #include <linux/slab.h>
11c731bc96SDaniel Mack
12c731bc96SDaniel Mack #include <sound/core.h>
13c731bc96SDaniel Mack #include <sound/pcm.h>
148fdff6a3SDaniel Mack #include <sound/pcm_params.h>
15c731bc96SDaniel Mack
16c731bc96SDaniel Mack #include "usbaudio.h"
17c731bc96SDaniel Mack #include "helper.h"
18c731bc96SDaniel Mack #include "card.h"
19c731bc96SDaniel Mack #include "endpoint.h"
20c731bc96SDaniel Mack #include "pcm.h"
21bf6313a0STakashi Iwai #include "clock.h"
222b58fd5bSDaniel Mack #include "quirks.h"
23c731bc96SDaniel Mack
245c2b3014STakashi Iwai enum {
255c2b3014STakashi Iwai EP_STATE_STOPPED,
265c2b3014STakashi Iwai EP_STATE_RUNNING,
275c2b3014STakashi Iwai EP_STATE_STOPPING,
285c2b3014STakashi Iwai };
298fdff6a3SDaniel Mack
3000272c61STakashi Iwai /* interface refcounting */
3100272c61STakashi Iwai struct snd_usb_iface_ref {
3200272c61STakashi Iwai unsigned char iface;
3300272c61STakashi Iwai bool need_setup;
3400272c61STakashi Iwai int opened;
359902b303STakashi Iwai int altset;
3600272c61STakashi Iwai struct list_head list;
3700272c61STakashi Iwai };
3800272c61STakashi Iwai
39c11117b6STakashi Iwai /* clock refcounting */
40c11117b6STakashi Iwai struct snd_usb_clock_ref {
41c11117b6STakashi Iwai unsigned char clock;
42c11117b6STakashi Iwai atomic_t locked;
439a737e7fSTakashi Iwai int opened;
44c11117b6STakashi Iwai int rate;
452be79d58STakashi Iwai bool need_setup;
46c11117b6STakashi Iwai struct list_head list;
47c11117b6STakashi Iwai };
48c11117b6STakashi Iwai
49c731bc96SDaniel Mack /*
5094c27215SDaniel Mack * snd_usb_endpoint is a model that abstracts everything related to an
5194c27215SDaniel Mack * USB endpoint and its streaming.
5294c27215SDaniel Mack *
5394c27215SDaniel Mack * There are functions to activate and deactivate the streaming URBs and
5407a5e9d4SDaniel Mack * optional callbacks to let the pcm logic handle the actual content of the
5594c27215SDaniel Mack * packets for playback and record. Thus, the bus streaming and the audio
5694c27215SDaniel Mack * handlers are fully decoupled.
5794c27215SDaniel Mack *
5807a5e9d4SDaniel Mack * There are two different types of endpoints in audio applications.
5994c27215SDaniel Mack *
6094c27215SDaniel Mack * SND_USB_ENDPOINT_TYPE_DATA handles full audio data payload for both
6194c27215SDaniel Mack * inbound and outbound traffic.
6294c27215SDaniel Mack *
6307a5e9d4SDaniel Mack * SND_USB_ENDPOINT_TYPE_SYNC endpoints are for inbound traffic only and
6407a5e9d4SDaniel Mack * expect the payload to carry Q10.14 / Q16.16 formatted sync information
6507a5e9d4SDaniel Mack * (3 or 4 bytes).
6694c27215SDaniel Mack *
6707a5e9d4SDaniel Mack * Each endpoint has to be configured prior to being used by calling
6807a5e9d4SDaniel Mack * snd_usb_endpoint_set_params().
6994c27215SDaniel Mack *
7094c27215SDaniel Mack * The model incorporates a reference counting, so that multiple users
7194c27215SDaniel Mack * can call snd_usb_endpoint_start() and snd_usb_endpoint_stop(), and
7294c27215SDaniel Mack * only the first user will effectively start the URBs, and only the last
7307a5e9d4SDaniel Mack * one to stop it will tear the URBs down again.
7494c27215SDaniel Mack */
7594c27215SDaniel Mack
7694c27215SDaniel Mack /*
77c731bc96SDaniel Mack * convert a sampling rate into our full speed format (fs/1000 in Q16.16)
78c731bc96SDaniel Mack * this will overflow at approx 524 kHz
79c731bc96SDaniel Mack */
get_usb_full_speed_rate(unsigned int rate)80c731bc96SDaniel Mack static inline unsigned get_usb_full_speed_rate(unsigned int rate)
81c731bc96SDaniel Mack {
82c731bc96SDaniel Mack return ((rate << 13) + 62) / 125;
83c731bc96SDaniel Mack }
84c731bc96SDaniel Mack
85c731bc96SDaniel Mack /*
86c731bc96SDaniel Mack * convert a sampling rate into USB high speed format (fs/8000 in Q16.16)
87c731bc96SDaniel Mack * this will overflow at approx 4 MHz
88c731bc96SDaniel Mack */
get_usb_high_speed_rate(unsigned int rate)89c731bc96SDaniel Mack static inline unsigned get_usb_high_speed_rate(unsigned int rate)
90c731bc96SDaniel Mack {
91c731bc96SDaniel Mack return ((rate << 10) + 62) / 125;
92c731bc96SDaniel Mack }
93c731bc96SDaniel Mack
94c731bc96SDaniel Mack /*
95c731bc96SDaniel Mack * release a urb data
96c731bc96SDaniel Mack */
release_urb_ctx(struct snd_urb_ctx * u)97c731bc96SDaniel Mack static void release_urb_ctx(struct snd_urb_ctx *u)
98c731bc96SDaniel Mack {
99568be8aaSTakashi Iwai if (u->urb && u->buffer_size)
100d399ff95SDaniel Mack usb_free_coherent(u->ep->chip->dev, u->buffer_size,
101c731bc96SDaniel Mack u->urb->transfer_buffer,
102c731bc96SDaniel Mack u->urb->transfer_dma);
103c731bc96SDaniel Mack usb_free_urb(u->urb);
104c731bc96SDaniel Mack u->urb = NULL;
105568be8aaSTakashi Iwai u->buffer_size = 0;
106c731bc96SDaniel Mack }
107c731bc96SDaniel Mack
usb_error_string(int err)108c731bc96SDaniel Mack static const char *usb_error_string(int err)
109c731bc96SDaniel Mack {
110c731bc96SDaniel Mack switch (err) {
111c731bc96SDaniel Mack case -ENODEV:
112c731bc96SDaniel Mack return "no device";
113c731bc96SDaniel Mack case -ENOENT:
114c731bc96SDaniel Mack return "endpoint not enabled";
115c731bc96SDaniel Mack case -EPIPE:
116c731bc96SDaniel Mack return "endpoint stalled";
117c731bc96SDaniel Mack case -ENOSPC:
118c731bc96SDaniel Mack return "not enough bandwidth";
119c731bc96SDaniel Mack case -ESHUTDOWN:
120c731bc96SDaniel Mack return "device disabled";
121c731bc96SDaniel Mack case -EHOSTUNREACH:
122c731bc96SDaniel Mack return "device suspended";
123c731bc96SDaniel Mack case -EINVAL:
124c731bc96SDaniel Mack case -EAGAIN:
125c731bc96SDaniel Mack case -EFBIG:
126c731bc96SDaniel Mack case -EMSGSIZE:
127c731bc96SDaniel Mack return "internal error";
128c731bc96SDaniel Mack default:
129c731bc96SDaniel Mack return "unknown error";
130c731bc96SDaniel Mack }
131c731bc96SDaniel Mack }
132c731bc96SDaniel Mack
ep_state_running(struct snd_usb_endpoint * ep)1335c2b3014STakashi Iwai static inline bool ep_state_running(struct snd_usb_endpoint *ep)
1345c2b3014STakashi Iwai {
1355c2b3014STakashi Iwai return atomic_read(&ep->state) == EP_STATE_RUNNING;
1365c2b3014STakashi Iwai }
1375c2b3014STakashi Iwai
ep_state_update(struct snd_usb_endpoint * ep,int old,int new)1385c2b3014STakashi Iwai static inline bool ep_state_update(struct snd_usb_endpoint *ep, int old, int new)
1395c2b3014STakashi Iwai {
14089422df9SUros Bizjak return atomic_try_cmpxchg(&ep->state, &old, new);
1415c2b3014STakashi Iwai }
1425c2b3014STakashi Iwai
14394c27215SDaniel Mack /**
14494c27215SDaniel Mack * snd_usb_endpoint_implicit_feedback_sink: Report endpoint usage type
14594c27215SDaniel Mack *
14607a5e9d4SDaniel Mack * @ep: The snd_usb_endpoint
14794c27215SDaniel Mack *
14894c27215SDaniel Mack * Determine whether an endpoint is driven by an implicit feedback
14994c27215SDaniel Mack * data endpoint source.
15094c27215SDaniel Mack */
snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint * ep)15198ae472bSEldad Zack int snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep)
1528fdff6a3SDaniel Mack {
153bf6313a0STakashi Iwai return ep->implicit_fb_sync && usb_pipeout(ep->pipe);
1548fdff6a3SDaniel Mack }
1558fdff6a3SDaniel Mack
15694c27215SDaniel Mack /*
1573d58760fSTakashi Iwai * Return the number of samples to be sent in the next packet
1583d58760fSTakashi Iwai * for streaming based on information derived from sync endpoints
15994c27215SDaniel Mack *
1603d58760fSTakashi Iwai * This won't be used for implicit feedback which takes the packet size
1613d58760fSTakashi Iwai * returned from the sync source
16294c27215SDaniel Mack */
slave_next_packet_size(struct snd_usb_endpoint * ep,unsigned int avail)163d215f63dSTakashi Iwai static int slave_next_packet_size(struct snd_usb_endpoint *ep,
164d215f63dSTakashi Iwai unsigned int avail)
1658fdff6a3SDaniel Mack {
1668fdff6a3SDaniel Mack unsigned long flags;
167d215f63dSTakashi Iwai unsigned int phase;
1688fdff6a3SDaniel Mack int ret;
1698fdff6a3SDaniel Mack
1708fdff6a3SDaniel Mack if (ep->fill_max)
1718fdff6a3SDaniel Mack return ep->maxframesize;
1728fdff6a3SDaniel Mack
1738fdff6a3SDaniel Mack spin_lock_irqsave(&ep->lock, flags);
174d215f63dSTakashi Iwai phase = (ep->phase & 0xffff) + (ep->freqm << ep->datainterval);
175d215f63dSTakashi Iwai ret = min(phase >> 16, ep->maxframesize);
176d215f63dSTakashi Iwai if (avail && ret >= avail)
177d215f63dSTakashi Iwai ret = -EAGAIN;
178d215f63dSTakashi Iwai else
179d215f63dSTakashi Iwai ep->phase = phase;
1808fdff6a3SDaniel Mack spin_unlock_irqrestore(&ep->lock, flags);
1818fdff6a3SDaniel Mack
1828fdff6a3SDaniel Mack return ret;
1838fdff6a3SDaniel Mack }
1848fdff6a3SDaniel Mack
185f0bd62b6SAlexander Tsoy /*
1863d58760fSTakashi Iwai * Return the number of samples to be sent in the next packet
1873d58760fSTakashi Iwai * for adaptive and synchronous endpoints
188f0bd62b6SAlexander Tsoy */
next_packet_size(struct snd_usb_endpoint * ep,unsigned int avail)189d215f63dSTakashi Iwai static int next_packet_size(struct snd_usb_endpoint *ep, unsigned int avail)
190f0bd62b6SAlexander Tsoy {
191d215f63dSTakashi Iwai unsigned int sample_accum;
192f0bd62b6SAlexander Tsoy int ret;
193f0bd62b6SAlexander Tsoy
194f0bd62b6SAlexander Tsoy if (ep->fill_max)
195f0bd62b6SAlexander Tsoy return ep->maxframesize;
196f0bd62b6SAlexander Tsoy
19723939115STakashi Iwai sample_accum = ep->sample_accum + ep->sample_rem;
198d215f63dSTakashi Iwai if (sample_accum >= ep->pps) {
199d215f63dSTakashi Iwai sample_accum -= ep->pps;
200b9fd2007SAlexander Tsoy ret = ep->packsize[1];
201f0bd62b6SAlexander Tsoy } else {
202b9fd2007SAlexander Tsoy ret = ep->packsize[0];
203f0bd62b6SAlexander Tsoy }
204d215f63dSTakashi Iwai if (avail && ret >= avail)
205d215f63dSTakashi Iwai ret = -EAGAIN;
206d215f63dSTakashi Iwai else
207d215f63dSTakashi Iwai ep->sample_accum = sample_accum;
208f0bd62b6SAlexander Tsoy
209f0bd62b6SAlexander Tsoy return ret;
210f0bd62b6SAlexander Tsoy }
211f0bd62b6SAlexander Tsoy
2123d58760fSTakashi Iwai /*
2133d58760fSTakashi Iwai * snd_usb_endpoint_next_packet_size: Return the number of samples to be sent
2143d58760fSTakashi Iwai * in the next packet
215d215f63dSTakashi Iwai *
216d215f63dSTakashi Iwai * If the size is equal or exceeds @avail, don't proceed but return -EAGAIN
217d215f63dSTakashi Iwai * Exception: @avail = 0 for skipping the check.
2183d58760fSTakashi Iwai */
snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint * ep,struct snd_urb_ctx * ctx,int idx,unsigned int avail)2193d58760fSTakashi Iwai int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep,
220d215f63dSTakashi Iwai struct snd_urb_ctx *ctx, int idx,
221d215f63dSTakashi Iwai unsigned int avail)
2223d58760fSTakashi Iwai {
223d215f63dSTakashi Iwai unsigned int packet;
224d215f63dSTakashi Iwai
225d215f63dSTakashi Iwai packet = ctx->packet_size[idx];
226d215f63dSTakashi Iwai if (packet) {
227d215f63dSTakashi Iwai if (avail && packet >= avail)
228d215f63dSTakashi Iwai return -EAGAIN;
229d215f63dSTakashi Iwai return packet;
230d215f63dSTakashi Iwai }
231d215f63dSTakashi Iwai
232d215f63dSTakashi Iwai if (ep->sync_source)
233d215f63dSTakashi Iwai return slave_next_packet_size(ep, avail);
2343d58760fSTakashi Iwai else
235d215f63dSTakashi Iwai return next_packet_size(ep, avail);
2363d58760fSTakashi Iwai }
2373d58760fSTakashi Iwai
call_retire_callback(struct snd_usb_endpoint * ep,struct urb * urb)23896e221f3STakashi Iwai static void call_retire_callback(struct snd_usb_endpoint *ep,
23996e221f3STakashi Iwai struct urb *urb)
24096e221f3STakashi Iwai {
24196e221f3STakashi Iwai struct snd_usb_substream *data_subs;
24296e221f3STakashi Iwai
24396e221f3STakashi Iwai data_subs = READ_ONCE(ep->data_subs);
24496e221f3STakashi Iwai if (data_subs && ep->retire_data_urb)
24596e221f3STakashi Iwai ep->retire_data_urb(data_subs, urb);
24696e221f3STakashi Iwai }
24796e221f3STakashi Iwai
retire_outbound_urb(struct snd_usb_endpoint * ep,struct snd_urb_ctx * urb_ctx)2488fdff6a3SDaniel Mack static void retire_outbound_urb(struct snd_usb_endpoint *ep,
2498fdff6a3SDaniel Mack struct snd_urb_ctx *urb_ctx)
2508fdff6a3SDaniel Mack {
25196e221f3STakashi Iwai call_retire_callback(ep, urb_ctx->urb);
2528fdff6a3SDaniel Mack }
2538fdff6a3SDaniel Mack
254bf6313a0STakashi Iwai static void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
255bf6313a0STakashi Iwai struct snd_usb_endpoint *sender,
256bf6313a0STakashi Iwai const struct urb *urb);
257bf6313a0STakashi Iwai
retire_inbound_urb(struct snd_usb_endpoint * ep,struct snd_urb_ctx * urb_ctx)2588fdff6a3SDaniel Mack static void retire_inbound_urb(struct snd_usb_endpoint *ep,
2598fdff6a3SDaniel Mack struct snd_urb_ctx *urb_ctx)
2608fdff6a3SDaniel Mack {
2618fdff6a3SDaniel Mack struct urb *urb = urb_ctx->urb;
26253837b4aSTakashi Iwai struct snd_usb_endpoint *sync_sink;
2638fdff6a3SDaniel Mack
2642b58fd5bSDaniel Mack if (unlikely(ep->skip_packets > 0)) {
2652b58fd5bSDaniel Mack ep->skip_packets--;
2662b58fd5bSDaniel Mack return;
2672b58fd5bSDaniel Mack }
2682b58fd5bSDaniel Mack
26953837b4aSTakashi Iwai sync_sink = READ_ONCE(ep->sync_sink);
27053837b4aSTakashi Iwai if (sync_sink)
27153837b4aSTakashi Iwai snd_usb_handle_sync_urb(sync_sink, ep, urb);
2728fdff6a3SDaniel Mack
27396e221f3STakashi Iwai call_retire_callback(ep, urb);
2748fdff6a3SDaniel Mack }
2758fdff6a3SDaniel Mack
has_tx_length_quirk(struct snd_usb_audio * chip)276c1b034a4STakashi Iwai static inline bool has_tx_length_quirk(struct snd_usb_audio *chip)
277c1b034a4STakashi Iwai {
278c1b034a4STakashi Iwai return chip->quirk_flags & QUIRK_FLAG_TX_LENGTH;
279c1b034a4STakashi Iwai }
280c1b034a4STakashi Iwai
prepare_silent_urb(struct snd_usb_endpoint * ep,struct snd_urb_ctx * ctx)2815cf310e9SRicard Wanderlof static void prepare_silent_urb(struct snd_usb_endpoint *ep,
2828fdff6a3SDaniel Mack struct snd_urb_ctx *ctx)
2838fdff6a3SDaniel Mack {
2848fdff6a3SDaniel Mack struct urb *urb = ctx->urb;
2858fdff6a3SDaniel Mack unsigned int offs = 0;
286e0570446SRicard Wanderlof unsigned int extra = 0;
287e0570446SRicard Wanderlof __le32 packet_length;
2885cf310e9SRicard Wanderlof int i;
2895cf310e9SRicard Wanderlof
290e0570446SRicard Wanderlof /* For tx_length_quirk, put packet length at start of packet */
291c1b034a4STakashi Iwai if (has_tx_length_quirk(ep->chip))
292e0570446SRicard Wanderlof extra = sizeof(packet_length);
293e0570446SRicard Wanderlof
2948fdff6a3SDaniel Mack for (i = 0; i < ctx->packets; ++i) {
295e0570446SRicard Wanderlof unsigned int offset;
296e0570446SRicard Wanderlof unsigned int length;
2978dce30c8SDaniel Mack int counts;
2988dce30c8SDaniel Mack
299d215f63dSTakashi Iwai counts = snd_usb_endpoint_next_packet_size(ep, ctx, i, 0);
300e0570446SRicard Wanderlof length = counts * ep->stride; /* number of silent bytes */
301e0570446SRicard Wanderlof offset = offs * ep->stride + extra * i;
302e0570446SRicard Wanderlof urb->iso_frame_desc[i].offset = offset;
303e0570446SRicard Wanderlof urb->iso_frame_desc[i].length = length + extra;
304e0570446SRicard Wanderlof if (extra) {
305e0570446SRicard Wanderlof packet_length = cpu_to_le32(length);
306e0570446SRicard Wanderlof memcpy(urb->transfer_buffer + offset,
307e0570446SRicard Wanderlof &packet_length, sizeof(packet_length));
308e0570446SRicard Wanderlof }
309e0570446SRicard Wanderlof memset(urb->transfer_buffer + offset + extra,
310e0570446SRicard Wanderlof ep->silence_value, length);
3118fdff6a3SDaniel Mack offs += counts;
3128fdff6a3SDaniel Mack }
3138fdff6a3SDaniel Mack
3148fdff6a3SDaniel Mack urb->number_of_packets = ctx->packets;
315e0570446SRicard Wanderlof urb->transfer_buffer_length = offs * ep->stride + ctx->packets * extra;
316e8a8f09cSTakashi Iwai ctx->queued = 0;
3178fdff6a3SDaniel Mack }
3185cf310e9SRicard Wanderlof
3195cf310e9SRicard Wanderlof /*
3205cf310e9SRicard Wanderlof * Prepare a PLAYBACK urb for submission to the bus.
3215cf310e9SRicard Wanderlof */
prepare_outbound_urb(struct snd_usb_endpoint * ep,struct snd_urb_ctx * ctx,bool in_stream_lock)322d5f871f8STakashi Iwai static int prepare_outbound_urb(struct snd_usb_endpoint *ep,
323d5f871f8STakashi Iwai struct snd_urb_ctx *ctx,
324d5f871f8STakashi Iwai bool in_stream_lock)
3255cf310e9SRicard Wanderlof {
3265cf310e9SRicard Wanderlof struct urb *urb = ctx->urb;
3275cf310e9SRicard Wanderlof unsigned char *cp = urb->transfer_buffer;
32896e221f3STakashi Iwai struct snd_usb_substream *data_subs;
3295cf310e9SRicard Wanderlof
3305cf310e9SRicard Wanderlof urb->dev = ep->chip->dev; /* we need to set this at each time */
3315cf310e9SRicard Wanderlof
3325cf310e9SRicard Wanderlof switch (ep->type) {
3335cf310e9SRicard Wanderlof case SND_USB_ENDPOINT_TYPE_DATA:
33496e221f3STakashi Iwai data_subs = READ_ONCE(ep->data_subs);
33596e221f3STakashi Iwai if (data_subs && ep->prepare_data_urb)
336d5f871f8STakashi Iwai return ep->prepare_data_urb(data_subs, urb, in_stream_lock);
337d5f871f8STakashi Iwai /* no data provider, so send silence */
3385cf310e9SRicard Wanderlof prepare_silent_urb(ep, ctx);
3398fdff6a3SDaniel Mack break;
3408fdff6a3SDaniel Mack
3418fdff6a3SDaniel Mack case SND_USB_ENDPOINT_TYPE_SYNC:
3428fdff6a3SDaniel Mack if (snd_usb_get_speed(ep->chip->dev) >= USB_SPEED_HIGH) {
3438fdff6a3SDaniel Mack /*
3448fdff6a3SDaniel Mack * fill the length and offset of each urb descriptor.
3458fdff6a3SDaniel Mack * the fixed 12.13 frequency is passed as 16.16 through the pipe.
3468fdff6a3SDaniel Mack */
3478fdff6a3SDaniel Mack urb->iso_frame_desc[0].length = 4;
3488fdff6a3SDaniel Mack urb->iso_frame_desc[0].offset = 0;
3498fdff6a3SDaniel Mack cp[0] = ep->freqn;
3508fdff6a3SDaniel Mack cp[1] = ep->freqn >> 8;
3518fdff6a3SDaniel Mack cp[2] = ep->freqn >> 16;
3528fdff6a3SDaniel Mack cp[3] = ep->freqn >> 24;
3538fdff6a3SDaniel Mack } else {
3548fdff6a3SDaniel Mack /*
3558fdff6a3SDaniel Mack * fill the length and offset of each urb descriptor.
3568fdff6a3SDaniel Mack * the fixed 10.14 frequency is passed through the pipe.
3578fdff6a3SDaniel Mack */
3588fdff6a3SDaniel Mack urb->iso_frame_desc[0].length = 3;
3598fdff6a3SDaniel Mack urb->iso_frame_desc[0].offset = 0;
3608fdff6a3SDaniel Mack cp[0] = ep->freqn >> 2;
3618fdff6a3SDaniel Mack cp[1] = ep->freqn >> 10;
3628fdff6a3SDaniel Mack cp[2] = ep->freqn >> 18;
3638fdff6a3SDaniel Mack }
3648fdff6a3SDaniel Mack
3658fdff6a3SDaniel Mack break;
3668fdff6a3SDaniel Mack }
367d5f871f8STakashi Iwai return 0;
3688fdff6a3SDaniel Mack }
3698fdff6a3SDaniel Mack
3708fdff6a3SDaniel Mack /*
3718fdff6a3SDaniel Mack * Prepare a CAPTURE or SYNC urb for submission to the bus.
3728fdff6a3SDaniel Mack */
prepare_inbound_urb(struct snd_usb_endpoint * ep,struct snd_urb_ctx * urb_ctx)373d5f871f8STakashi Iwai static int prepare_inbound_urb(struct snd_usb_endpoint *ep,
3748fdff6a3SDaniel Mack struct snd_urb_ctx *urb_ctx)
3758fdff6a3SDaniel Mack {
3768fdff6a3SDaniel Mack int i, offs;
3778fdff6a3SDaniel Mack struct urb *urb = urb_ctx->urb;
3788fdff6a3SDaniel Mack
3798fdff6a3SDaniel Mack urb->dev = ep->chip->dev; /* we need to set this at each time */
3808fdff6a3SDaniel Mack
3818fdff6a3SDaniel Mack switch (ep->type) {
3828fdff6a3SDaniel Mack case SND_USB_ENDPOINT_TYPE_DATA:
3838fdff6a3SDaniel Mack offs = 0;
3848fdff6a3SDaniel Mack for (i = 0; i < urb_ctx->packets; i++) {
3858fdff6a3SDaniel Mack urb->iso_frame_desc[i].offset = offs;
3868fdff6a3SDaniel Mack urb->iso_frame_desc[i].length = ep->curpacksize;
3878fdff6a3SDaniel Mack offs += ep->curpacksize;
3888fdff6a3SDaniel Mack }
3898fdff6a3SDaniel Mack
3908fdff6a3SDaniel Mack urb->transfer_buffer_length = offs;
3918fdff6a3SDaniel Mack urb->number_of_packets = urb_ctx->packets;
3928fdff6a3SDaniel Mack break;
3938fdff6a3SDaniel Mack
3948fdff6a3SDaniel Mack case SND_USB_ENDPOINT_TYPE_SYNC:
3958fdff6a3SDaniel Mack urb->iso_frame_desc[0].length = min(4u, ep->syncmaxsize);
3968fdff6a3SDaniel Mack urb->iso_frame_desc[0].offset = 0;
3978fdff6a3SDaniel Mack break;
3988fdff6a3SDaniel Mack }
399d5f871f8STakashi Iwai return 0;
4008fdff6a3SDaniel Mack }
4018fdff6a3SDaniel Mack
402c15871e1STakashi Iwai /* notify an error as XRUN to the assigned PCM data substream */
notify_xrun(struct snd_usb_endpoint * ep)403c15871e1STakashi Iwai static void notify_xrun(struct snd_usb_endpoint *ep)
404c15871e1STakashi Iwai {
405c15871e1STakashi Iwai struct snd_usb_substream *data_subs;
406*8a2d8958STakashi Iwai struct snd_pcm_substream *psubs;
407c15871e1STakashi Iwai
408c15871e1STakashi Iwai data_subs = READ_ONCE(ep->data_subs);
409*8a2d8958STakashi Iwai if (!data_subs)
410*8a2d8958STakashi Iwai return;
411*8a2d8958STakashi Iwai psubs = data_subs->pcm_substream;
412*8a2d8958STakashi Iwai if (psubs && psubs->runtime &&
413*8a2d8958STakashi Iwai psubs->runtime->state == SNDRV_PCM_STATE_RUNNING)
414*8a2d8958STakashi Iwai snd_pcm_stop_xrun(psubs);
415c15871e1STakashi Iwai }
416c15871e1STakashi Iwai
417c15871e1STakashi Iwai static struct snd_usb_packet_info *
next_packet_fifo_enqueue(struct snd_usb_endpoint * ep)418c15871e1STakashi Iwai next_packet_fifo_enqueue(struct snd_usb_endpoint *ep)
419c15871e1STakashi Iwai {
420c15871e1STakashi Iwai struct snd_usb_packet_info *p;
421c15871e1STakashi Iwai
422c15871e1STakashi Iwai p = ep->next_packet + (ep->next_packet_head + ep->next_packet_queued) %
423c15871e1STakashi Iwai ARRAY_SIZE(ep->next_packet);
424c15871e1STakashi Iwai ep->next_packet_queued++;
425c15871e1STakashi Iwai return p;
426c15871e1STakashi Iwai }
427c15871e1STakashi Iwai
428c15871e1STakashi Iwai static struct snd_usb_packet_info *
next_packet_fifo_dequeue(struct snd_usb_endpoint * ep)429c15871e1STakashi Iwai next_packet_fifo_dequeue(struct snd_usb_endpoint *ep)
430c15871e1STakashi Iwai {
431c15871e1STakashi Iwai struct snd_usb_packet_info *p;
432c15871e1STakashi Iwai
433c15871e1STakashi Iwai p = ep->next_packet + ep->next_packet_head;
434c15871e1STakashi Iwai ep->next_packet_head++;
435c15871e1STakashi Iwai ep->next_packet_head %= ARRAY_SIZE(ep->next_packet);
436c15871e1STakashi Iwai ep->next_packet_queued--;
437c15871e1STakashi Iwai return p;
438c15871e1STakashi Iwai }
439c15871e1STakashi Iwai
push_back_to_ready_list(struct snd_usb_endpoint * ep,struct snd_urb_ctx * ctx)440d5f871f8STakashi Iwai static void push_back_to_ready_list(struct snd_usb_endpoint *ep,
441d5f871f8STakashi Iwai struct snd_urb_ctx *ctx)
442d5f871f8STakashi Iwai {
443d5f871f8STakashi Iwai unsigned long flags;
444d5f871f8STakashi Iwai
445d5f871f8STakashi Iwai spin_lock_irqsave(&ep->lock, flags);
446d5f871f8STakashi Iwai list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs);
447d5f871f8STakashi Iwai spin_unlock_irqrestore(&ep->lock, flags);
448d5f871f8STakashi Iwai }
449d5f871f8STakashi Iwai
45094c27215SDaniel Mack /*
45107a5e9d4SDaniel Mack * Send output urbs that have been prepared previously. URBs are dequeued
4520569b3d8SRandy Dunlap * from ep->ready_playback_urbs and in case there aren't any available
45394c27215SDaniel Mack * or there are no packets that have been prepared, this function does
45494c27215SDaniel Mack * nothing.
45594c27215SDaniel Mack *
45607a5e9d4SDaniel Mack * The reason why the functionality of sending and preparing URBs is separated
45707a5e9d4SDaniel Mack * is that host controllers don't guarantee the order in which they return
45807a5e9d4SDaniel Mack * inbound and outbound packets to their submitters.
45994c27215SDaniel Mack *
460d5f871f8STakashi Iwai * This function is used both for implicit feedback endpoints and in low-
461d5f871f8STakashi Iwai * latency playback mode.
46294c27215SDaniel Mack */
snd_usb_queue_pending_output_urbs(struct snd_usb_endpoint * ep,bool in_stream_lock)4638c721c53STakashi Iwai int snd_usb_queue_pending_output_urbs(struct snd_usb_endpoint *ep,
464d5f871f8STakashi Iwai bool in_stream_lock)
4658fdff6a3SDaniel Mack {
466d5f871f8STakashi Iwai bool implicit_fb = snd_usb_endpoint_implicit_feedback_sink(ep);
467d5f871f8STakashi Iwai
4685c2b3014STakashi Iwai while (ep_state_running(ep)) {
4698fdff6a3SDaniel Mack
4708fdff6a3SDaniel Mack unsigned long flags;
4713f649ab7SKees Cook struct snd_usb_packet_info *packet;
4728fdff6a3SDaniel Mack struct snd_urb_ctx *ctx = NULL;
4738fdff6a3SDaniel Mack int err, i;
4748fdff6a3SDaniel Mack
4758fdff6a3SDaniel Mack spin_lock_irqsave(&ep->lock, flags);
476d5f871f8STakashi Iwai if ((!implicit_fb || ep->next_packet_queued > 0) &&
477c15871e1STakashi Iwai !list_empty(&ep->ready_playback_urbs)) {
4788fdff6a3SDaniel Mack /* take URB out of FIFO */
4798fdff6a3SDaniel Mack ctx = list_first_entry(&ep->ready_playback_urbs,
4808fdff6a3SDaniel Mack struct snd_urb_ctx, ready_list);
4815b6cc38fSTakashi Iwai list_del_init(&ctx->ready_list);
482d5f871f8STakashi Iwai if (implicit_fb)
483c15871e1STakashi Iwai packet = next_packet_fifo_dequeue(ep);
4848fdff6a3SDaniel Mack }
4858fdff6a3SDaniel Mack spin_unlock_irqrestore(&ep->lock, flags);
4868fdff6a3SDaniel Mack
4878fdff6a3SDaniel Mack if (ctx == NULL)
4888c721c53STakashi Iwai break;
4898fdff6a3SDaniel Mack
4908fdff6a3SDaniel Mack /* copy over the length information */
491d5f871f8STakashi Iwai if (implicit_fb) {
4928fdff6a3SDaniel Mack for (i = 0; i < packet->packets; i++)
4938fdff6a3SDaniel Mack ctx->packet_size[i] = packet->packet_size[i];
494d5f871f8STakashi Iwai }
4958fdff6a3SDaniel Mack
49694c27215SDaniel Mack /* call the data handler to fill in playback data */
497d5f871f8STakashi Iwai err = prepare_outbound_urb(ep, ctx, in_stream_lock);
498d5f871f8STakashi Iwai /* can be stopped during prepare callback */
499d5f871f8STakashi Iwai if (unlikely(!ep_state_running(ep)))
500d5f871f8STakashi Iwai break;
501d5f871f8STakashi Iwai if (err < 0) {
502d5f871f8STakashi Iwai /* push back to ready list again for -EAGAIN */
5038c721c53STakashi Iwai if (err == -EAGAIN) {
504d5f871f8STakashi Iwai push_back_to_ready_list(ep, ctx);
5058c721c53STakashi Iwai break;
5068c721c53STakashi Iwai }
5078c721c53STakashi Iwai
5088c721c53STakashi Iwai if (!in_stream_lock)
509d5f871f8STakashi Iwai notify_xrun(ep);
5108c721c53STakashi Iwai return -EPIPE;
511d5f871f8STakashi Iwai }
5128fdff6a3SDaniel Mack
513ab574d16STakashi Iwai if (!atomic_read(&ep->chip->shutdown))
5148fdff6a3SDaniel Mack err = usb_submit_urb(ctx->urb, GFP_ATOMIC);
515ab574d16STakashi Iwai else
516ab574d16STakashi Iwai err = -ENODEV;
517c15871e1STakashi Iwai if (err < 0) {
518ab574d16STakashi Iwai if (!atomic_read(&ep->chip->shutdown)) {
5190ba41d91STakashi Iwai usb_audio_err(ep->chip,
520e93e890eSTakashi Iwai "Unable to submit urb #%d: %d at %s\n",
521e93e890eSTakashi Iwai ctx->index, err, __func__);
5228c721c53STakashi Iwai if (!in_stream_lock)
523c15871e1STakashi Iwai notify_xrun(ep);
524ab574d16STakashi Iwai }
5258c721c53STakashi Iwai return -EPIPE;
526c15871e1STakashi Iwai }
527c15871e1STakashi Iwai
5288fdff6a3SDaniel Mack set_bit(ctx->index, &ep->active_mask);
52986a42ad0STakashi Iwai atomic_inc(&ep->submitted_urbs);
5308fdff6a3SDaniel Mack }
5318c721c53STakashi Iwai
5328c721c53STakashi Iwai return 0;
5338fdff6a3SDaniel Mack }
5348fdff6a3SDaniel Mack
5358fdff6a3SDaniel Mack /*
5368fdff6a3SDaniel Mack * complete callback for urbs
5378fdff6a3SDaniel Mack */
snd_complete_urb(struct urb * urb)5388fdff6a3SDaniel Mack static void snd_complete_urb(struct urb *urb)
5398fdff6a3SDaniel Mack {
5408fdff6a3SDaniel Mack struct snd_urb_ctx *ctx = urb->context;
5418fdff6a3SDaniel Mack struct snd_usb_endpoint *ep = ctx->ep;
5428fdff6a3SDaniel Mack int err;
5438fdff6a3SDaniel Mack
5448fdff6a3SDaniel Mack if (unlikely(urb->status == -ENOENT || /* unlinked */
5458fdff6a3SDaniel Mack urb->status == -ENODEV || /* device removed */
5468fdff6a3SDaniel Mack urb->status == -ECONNRESET || /* unlinked */
54747ab1545STakashi Iwai urb->status == -ESHUTDOWN)) /* device disabled */
54847ab1545STakashi Iwai goto exit_clear;
54947ab1545STakashi Iwai /* device disconnected */
55047ab1545STakashi Iwai if (unlikely(atomic_read(&ep->chip->shutdown)))
5518fdff6a3SDaniel Mack goto exit_clear;
5528fdff6a3SDaniel Mack
5535c2b3014STakashi Iwai if (unlikely(!ep_state_running(ep)))
55413a6c832SIoan-Adrian Ratiu goto exit_clear;
55513a6c832SIoan-Adrian Ratiu
5568fdff6a3SDaniel Mack if (usb_pipeout(ep->pipe)) {
5578fdff6a3SDaniel Mack retire_outbound_urb(ep, ctx);
5588fdff6a3SDaniel Mack /* can be stopped during retire callback */
5595c2b3014STakashi Iwai if (unlikely(!ep_state_running(ep)))
5608fdff6a3SDaniel Mack goto exit_clear;
5618fdff6a3SDaniel Mack
562d5f871f8STakashi Iwai /* in low-latency and implicit-feedback modes, push back the
563d5f871f8STakashi Iwai * URB to ready list at first, then process as much as possible
564d5f871f8STakashi Iwai */
565d5f871f8STakashi Iwai if (ep->lowlatency_playback ||
566d5f871f8STakashi Iwai snd_usb_endpoint_implicit_feedback_sink(ep)) {
567d5f871f8STakashi Iwai push_back_to_ready_list(ep, ctx);
568c15871e1STakashi Iwai clear_bit(ctx->index, &ep->active_mask);
569d5f871f8STakashi Iwai snd_usb_queue_pending_output_urbs(ep, false);
570*8a2d8958STakashi Iwai /* decrement at last, and check xrun */
571*8a2d8958STakashi Iwai if (atomic_dec_and_test(&ep->submitted_urbs) &&
572*8a2d8958STakashi Iwai !snd_usb_endpoint_implicit_feedback_sink(ep))
573*8a2d8958STakashi Iwai notify_xrun(ep);
574c15871e1STakashi Iwai return;
5758fdff6a3SDaniel Mack }
5768fdff6a3SDaniel Mack
577d5f871f8STakashi Iwai /* in non-lowlatency mode, no error handling for prepare */
578d5f871f8STakashi Iwai prepare_outbound_urb(ep, ctx, false);
57952869931SHenry Lin /* can be stopped during prepare callback */
5805c2b3014STakashi Iwai if (unlikely(!ep_state_running(ep)))
58152869931SHenry Lin goto exit_clear;
5828fdff6a3SDaniel Mack } else {
5838fdff6a3SDaniel Mack retire_inbound_urb(ep, ctx);
5848fdff6a3SDaniel Mack /* can be stopped during retire callback */
5855c2b3014STakashi Iwai if (unlikely(!ep_state_running(ep)))
5868fdff6a3SDaniel Mack goto exit_clear;
5878fdff6a3SDaniel Mack
5888fdff6a3SDaniel Mack prepare_inbound_urb(ep, ctx);
5898fdff6a3SDaniel Mack }
5908fdff6a3SDaniel Mack
591ab574d16STakashi Iwai if (!atomic_read(&ep->chip->shutdown))
5928fdff6a3SDaniel Mack err = usb_submit_urb(urb, GFP_ATOMIC);
593ab574d16STakashi Iwai else
594ab574d16STakashi Iwai err = -ENODEV;
5958fdff6a3SDaniel Mack if (err == 0)
5968fdff6a3SDaniel Mack return;
5978fdff6a3SDaniel Mack
598ab574d16STakashi Iwai if (!atomic_read(&ep->chip->shutdown)) {
5990ba41d91STakashi Iwai usb_audio_err(ep->chip, "cannot submit urb (err = %d)\n", err);
600c15871e1STakashi Iwai notify_xrun(ep);
601ab574d16STakashi Iwai }
6028fdff6a3SDaniel Mack
6038fdff6a3SDaniel Mack exit_clear:
6048fdff6a3SDaniel Mack clear_bit(ctx->index, &ep->active_mask);
60586a42ad0STakashi Iwai atomic_dec(&ep->submitted_urbs);
6068fdff6a3SDaniel Mack }
6078fdff6a3SDaniel Mack
608c7474d09STakashi Iwai /*
60900272c61STakashi Iwai * Find or create a refcount object for the given interface
61000272c61STakashi Iwai *
61100272c61STakashi Iwai * The objects are released altogether in snd_usb_endpoint_free_all()
61200272c61STakashi Iwai */
61300272c61STakashi Iwai static struct snd_usb_iface_ref *
iface_ref_find(struct snd_usb_audio * chip,int iface)61400272c61STakashi Iwai iface_ref_find(struct snd_usb_audio *chip, int iface)
61500272c61STakashi Iwai {
61600272c61STakashi Iwai struct snd_usb_iface_ref *ip;
61700272c61STakashi Iwai
61800272c61STakashi Iwai list_for_each_entry(ip, &chip->iface_ref_list, list)
61900272c61STakashi Iwai if (ip->iface == iface)
62000272c61STakashi Iwai return ip;
62100272c61STakashi Iwai
62200272c61STakashi Iwai ip = kzalloc(sizeof(*ip), GFP_KERNEL);
62300272c61STakashi Iwai if (!ip)
62400272c61STakashi Iwai return NULL;
62500272c61STakashi Iwai ip->iface = iface;
62600272c61STakashi Iwai list_add_tail(&ip->list, &chip->iface_ref_list);
62700272c61STakashi Iwai return ip;
62800272c61STakashi Iwai }
62900272c61STakashi Iwai
630c11117b6STakashi Iwai /* Similarly, a refcount object for clock */
631c11117b6STakashi Iwai static struct snd_usb_clock_ref *
clock_ref_find(struct snd_usb_audio * chip,int clock)632c11117b6STakashi Iwai clock_ref_find(struct snd_usb_audio *chip, int clock)
633c11117b6STakashi Iwai {
634c11117b6STakashi Iwai struct snd_usb_clock_ref *ref;
635c11117b6STakashi Iwai
636c11117b6STakashi Iwai list_for_each_entry(ref, &chip->clock_ref_list, list)
637c11117b6STakashi Iwai if (ref->clock == clock)
638c11117b6STakashi Iwai return ref;
639c11117b6STakashi Iwai
640c11117b6STakashi Iwai ref = kzalloc(sizeof(*ref), GFP_KERNEL);
641c11117b6STakashi Iwai if (!ref)
642c11117b6STakashi Iwai return NULL;
643c11117b6STakashi Iwai ref->clock = clock;
644c11117b6STakashi Iwai atomic_set(&ref->locked, 0);
645c11117b6STakashi Iwai list_add_tail(&ref->list, &chip->clock_ref_list);
646c11117b6STakashi Iwai return ref;
647c11117b6STakashi Iwai }
648c11117b6STakashi Iwai
64900272c61STakashi Iwai /*
65054cb3190STakashi Iwai * Get the existing endpoint object corresponding EP
651c7474d09STakashi Iwai * Returns NULL if not present.
652c7474d09STakashi Iwai */
653c7474d09STakashi Iwai struct snd_usb_endpoint *
snd_usb_get_endpoint(struct snd_usb_audio * chip,int ep_num)65454cb3190STakashi Iwai snd_usb_get_endpoint(struct snd_usb_audio *chip, int ep_num)
655c7474d09STakashi Iwai {
656c7474d09STakashi Iwai struct snd_usb_endpoint *ep;
657c7474d09STakashi Iwai
658c7474d09STakashi Iwai list_for_each_entry(ep, &chip->ep_list, list) {
65954cb3190STakashi Iwai if (ep->ep_num == ep_num)
660c7474d09STakashi Iwai return ep;
661c7474d09STakashi Iwai }
66254cb3190STakashi Iwai
663c7474d09STakashi Iwai return NULL;
664c7474d09STakashi Iwai }
665c7474d09STakashi Iwai
6665a6c3e11STakashi Iwai #define ep_type_name(type) \
6675a6c3e11STakashi Iwai (type == SND_USB_ENDPOINT_TYPE_DATA ? "data" : "sync")
6685a6c3e11STakashi Iwai
66994c27215SDaniel Mack /**
67007a5e9d4SDaniel Mack * snd_usb_add_endpoint: Add an endpoint to an USB audio chip
67194c27215SDaniel Mack *
67294c27215SDaniel Mack * @chip: The chip
67394c27215SDaniel Mack * @ep_num: The number of the endpoint to use
67494c27215SDaniel Mack * @type: SND_USB_ENDPOINT_TYPE_DATA or SND_USB_ENDPOINT_TYPE_SYNC
67594c27215SDaniel Mack *
67694c27215SDaniel Mack * If the requested endpoint has not been added to the given chip before,
67754cb3190STakashi Iwai * a new instance is created.
67854cb3190STakashi Iwai *
67954cb3190STakashi Iwai * Returns zero on success or a negative error code.
68094c27215SDaniel Mack *
68100272c61STakashi Iwai * New endpoints will be added to chip->ep_list and freed by
68200272c61STakashi Iwai * calling snd_usb_endpoint_free_all().
683447d6275STakashi Iwai *
684447d6275STakashi Iwai * For SND_USB_ENDPOINT_TYPE_SYNC, the caller needs to guarantee that
685447d6275STakashi Iwai * bNumEndpoints > 1 beforehand.
68694c27215SDaniel Mack */
snd_usb_add_endpoint(struct snd_usb_audio * chip,int ep_num,int type)68754cb3190STakashi Iwai int snd_usb_add_endpoint(struct snd_usb_audio *chip, int ep_num, int type)
6888fdff6a3SDaniel Mack {
6898fdff6a3SDaniel Mack struct snd_usb_endpoint *ep;
69054cb3190STakashi Iwai bool is_playback;
6918fdff6a3SDaniel Mack
69254cb3190STakashi Iwai ep = snd_usb_get_endpoint(chip, ep_num);
69354cb3190STakashi Iwai if (ep)
69454cb3190STakashi Iwai return 0;
695e7e58df8SEldad Zack
69654cb3190STakashi Iwai usb_audio_dbg(chip, "Creating new %s endpoint #%x\n",
6975a6c3e11STakashi Iwai ep_type_name(type),
6988fdff6a3SDaniel Mack ep_num);
6998fdff6a3SDaniel Mack ep = kzalloc(sizeof(*ep), GFP_KERNEL);
7008fdff6a3SDaniel Mack if (!ep)
70154cb3190STakashi Iwai return -ENOMEM;
7028fdff6a3SDaniel Mack
7038fdff6a3SDaniel Mack ep->chip = chip;
7048fdff6a3SDaniel Mack spin_lock_init(&ep->lock);
7058fdff6a3SDaniel Mack ep->type = type;
7068fdff6a3SDaniel Mack ep->ep_num = ep_num;
7078fdff6a3SDaniel Mack INIT_LIST_HEAD(&ep->ready_playback_urbs);
70886a42ad0STakashi Iwai atomic_set(&ep->submitted_urbs, 0);
7098fdff6a3SDaniel Mack
71054cb3190STakashi Iwai is_playback = ((ep_num & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
71154cb3190STakashi Iwai ep_num &= USB_ENDPOINT_NUMBER_MASK;
7128fdff6a3SDaniel Mack if (is_playback)
7138fdff6a3SDaniel Mack ep->pipe = usb_sndisocpipe(chip->dev, ep_num);
7148fdff6a3SDaniel Mack else
7158fdff6a3SDaniel Mack ep->pipe = usb_rcvisocpipe(chip->dev, ep_num);
7168fdff6a3SDaniel Mack
71754cb3190STakashi Iwai list_add_tail(&ep->list, &chip->ep_list);
71854cb3190STakashi Iwai return 0;
71954cb3190STakashi Iwai }
72054cb3190STakashi Iwai
72154cb3190STakashi Iwai /* Set up syncinterval and maxsyncsize for a sync EP */
endpoint_set_syncinterval(struct snd_usb_audio * chip,struct snd_usb_endpoint * ep)722bf6313a0STakashi Iwai static void endpoint_set_syncinterval(struct snd_usb_audio *chip,
723bf6313a0STakashi Iwai struct snd_usb_endpoint *ep)
72454cb3190STakashi Iwai {
725bf6313a0STakashi Iwai struct usb_host_interface *alts;
726bf6313a0STakashi Iwai struct usb_endpoint_descriptor *desc;
72754cb3190STakashi Iwai
728bf6313a0STakashi Iwai alts = snd_usb_get_host_interface(chip, ep->iface, ep->altsetting);
729bf6313a0STakashi Iwai if (!alts)
730bf6313a0STakashi Iwai return;
731bf6313a0STakashi Iwai
732bf6313a0STakashi Iwai desc = get_endpoint(alts, ep->ep_idx);
73354cb3190STakashi Iwai if (desc->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&
73454cb3190STakashi Iwai desc->bRefresh >= 1 && desc->bRefresh <= 9)
73554cb3190STakashi Iwai ep->syncinterval = desc->bRefresh;
7368fdff6a3SDaniel Mack else if (snd_usb_get_speed(chip->dev) == USB_SPEED_FULL)
7378fdff6a3SDaniel Mack ep->syncinterval = 1;
73854cb3190STakashi Iwai else if (desc->bInterval >= 1 && desc->bInterval <= 16)
73954cb3190STakashi Iwai ep->syncinterval = desc->bInterval - 1;
7408fdff6a3SDaniel Mack else
7418fdff6a3SDaniel Mack ep->syncinterval = 3;
7428fdff6a3SDaniel Mack
74354cb3190STakashi Iwai ep->syncmaxsize = le16_to_cpu(desc->wMaxPacketSize);
7448fdff6a3SDaniel Mack }
745bf6313a0STakashi Iwai
endpoint_compatible(struct snd_usb_endpoint * ep,const struct audioformat * fp,const struct snd_pcm_hw_params * params)746bf6313a0STakashi Iwai static bool endpoint_compatible(struct snd_usb_endpoint *ep,
747bf6313a0STakashi Iwai const struct audioformat *fp,
748bf6313a0STakashi Iwai const struct snd_pcm_hw_params *params)
749bf6313a0STakashi Iwai {
750bf6313a0STakashi Iwai if (!ep->opened)
751bf6313a0STakashi Iwai return false;
752bf6313a0STakashi Iwai if (ep->cur_audiofmt != fp)
753bf6313a0STakashi Iwai return false;
754bf6313a0STakashi Iwai if (ep->cur_rate != params_rate(params) ||
755bf6313a0STakashi Iwai ep->cur_format != params_format(params) ||
756bf6313a0STakashi Iwai ep->cur_period_frames != params_period_size(params) ||
757bf6313a0STakashi Iwai ep->cur_buffer_periods != params_periods(params))
758bf6313a0STakashi Iwai return false;
759bf6313a0STakashi Iwai return true;
760bf6313a0STakashi Iwai }
761bf6313a0STakashi Iwai
762bf6313a0STakashi Iwai /*
763ff630b6aSgushengxian * Check whether the given fp and hw params are compatible with the current
764bf6313a0STakashi Iwai * setup of the target EP for implicit feedback sync
765bf6313a0STakashi Iwai */
snd_usb_endpoint_compatible(struct snd_usb_audio * chip,struct snd_usb_endpoint * ep,const struct audioformat * fp,const struct snd_pcm_hw_params * params)766bf6313a0STakashi Iwai bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip,
767bf6313a0STakashi Iwai struct snd_usb_endpoint *ep,
768bf6313a0STakashi Iwai const struct audioformat *fp,
769bf6313a0STakashi Iwai const struct snd_pcm_hw_params *params)
770bf6313a0STakashi Iwai {
771bf6313a0STakashi Iwai bool ret;
772bf6313a0STakashi Iwai
773bf6313a0STakashi Iwai mutex_lock(&chip->mutex);
774bf6313a0STakashi Iwai ret = endpoint_compatible(ep, fp, params);
775bf6313a0STakashi Iwai mutex_unlock(&chip->mutex);
776bf6313a0STakashi Iwai return ret;
777bf6313a0STakashi Iwai }
778bf6313a0STakashi Iwai
779bf6313a0STakashi Iwai /*
780bf6313a0STakashi Iwai * snd_usb_endpoint_open: Open the endpoint
781bf6313a0STakashi Iwai *
782bf6313a0STakashi Iwai * Called from hw_params to assign the endpoint to the substream.
783bf6313a0STakashi Iwai * It's reference-counted, and only the first opener is allowed to set up
784bf6313a0STakashi Iwai * arbitrary parameters. The later opener must be compatible with the
785bf6313a0STakashi Iwai * former opened parameters.
786bf6313a0STakashi Iwai * The endpoint needs to be closed via snd_usb_endpoint_close() later.
787bf6313a0STakashi Iwai *
788bf6313a0STakashi Iwai * Note that this function doesn't configure the endpoint. The substream
7892be79d58STakashi Iwai * needs to set it up later via snd_usb_endpoint_set_params() and
7902be79d58STakashi Iwai * snd_usb_endpoint_prepare().
791bf6313a0STakashi Iwai */
792bf6313a0STakashi Iwai struct snd_usb_endpoint *
snd_usb_endpoint_open(struct snd_usb_audio * chip,const struct audioformat * fp,const struct snd_pcm_hw_params * params,bool is_sync_ep,bool fixed_rate)793bf6313a0STakashi Iwai snd_usb_endpoint_open(struct snd_usb_audio *chip,
794cab941b7STakashi Iwai const struct audioformat *fp,
795bf6313a0STakashi Iwai const struct snd_pcm_hw_params *params,
796fd28941cSJaroslav Kysela bool is_sync_ep,
797fd28941cSJaroslav Kysela bool fixed_rate)
798bf6313a0STakashi Iwai {
799bf6313a0STakashi Iwai struct snd_usb_endpoint *ep;
800bf6313a0STakashi Iwai int ep_num = is_sync_ep ? fp->sync_ep : fp->endpoint;
801bf6313a0STakashi Iwai
802bf6313a0STakashi Iwai mutex_lock(&chip->mutex);
803bf6313a0STakashi Iwai ep = snd_usb_get_endpoint(chip, ep_num);
804bf6313a0STakashi Iwai if (!ep) {
805bf6313a0STakashi Iwai usb_audio_err(chip, "Cannot find EP 0x%x to open\n", ep_num);
806bf6313a0STakashi Iwai goto unlock;
807bf6313a0STakashi Iwai }
808bf6313a0STakashi Iwai
809bf6313a0STakashi Iwai if (!ep->opened) {
810bf6313a0STakashi Iwai if (is_sync_ep) {
811bf6313a0STakashi Iwai ep->iface = fp->sync_iface;
812bf6313a0STakashi Iwai ep->altsetting = fp->sync_altsetting;
813bf6313a0STakashi Iwai ep->ep_idx = fp->sync_ep_idx;
814bf6313a0STakashi Iwai } else {
815bf6313a0STakashi Iwai ep->iface = fp->iface;
816bf6313a0STakashi Iwai ep->altsetting = fp->altsetting;
817eae4d054STakashi Iwai ep->ep_idx = fp->ep_idx;
818bf6313a0STakashi Iwai }
819bf6313a0STakashi Iwai usb_audio_dbg(chip, "Open EP 0x%x, iface=%d:%d, idx=%d\n",
820bf6313a0STakashi Iwai ep_num, ep->iface, ep->altsetting, ep->ep_idx);
821bf6313a0STakashi Iwai
82200272c61STakashi Iwai ep->iface_ref = iface_ref_find(chip, ep->iface);
82300272c61STakashi Iwai if (!ep->iface_ref) {
82400272c61STakashi Iwai ep = NULL;
82500272c61STakashi Iwai goto unlock;
82600272c61STakashi Iwai }
82700272c61STakashi Iwai
828c11117b6STakashi Iwai if (fp->protocol != UAC_VERSION_1) {
829c11117b6STakashi Iwai ep->clock_ref = clock_ref_find(chip, fp->clock);
830c11117b6STakashi Iwai if (!ep->clock_ref) {
831c11117b6STakashi Iwai ep = NULL;
832c11117b6STakashi Iwai goto unlock;
833c11117b6STakashi Iwai }
8349a737e7fSTakashi Iwai ep->clock_ref->opened++;
835c11117b6STakashi Iwai }
836c11117b6STakashi Iwai
837bf6313a0STakashi Iwai ep->cur_audiofmt = fp;
838bf6313a0STakashi Iwai ep->cur_channels = fp->channels;
839bf6313a0STakashi Iwai ep->cur_rate = params_rate(params);
840bf6313a0STakashi Iwai ep->cur_format = params_format(params);
841bf6313a0STakashi Iwai ep->cur_frame_bytes = snd_pcm_format_physical_width(ep->cur_format) *
842bf6313a0STakashi Iwai ep->cur_channels / 8;
843bf6313a0STakashi Iwai ep->cur_period_frames = params_period_size(params);
844bf6313a0STakashi Iwai ep->cur_period_bytes = ep->cur_period_frames * ep->cur_frame_bytes;
845bf6313a0STakashi Iwai ep->cur_buffer_periods = params_periods(params);
846bf6313a0STakashi Iwai
847bf6313a0STakashi Iwai if (ep->type == SND_USB_ENDPOINT_TYPE_SYNC)
848bf6313a0STakashi Iwai endpoint_set_syncinterval(chip, ep);
849bf6313a0STakashi Iwai
850bf6313a0STakashi Iwai ep->implicit_fb_sync = fp->implicit_fb;
851bf6313a0STakashi Iwai ep->need_setup = true;
8521045f5f1STakashi Iwai ep->need_prepare = true;
853fd28941cSJaroslav Kysela ep->fixed_rate = fixed_rate;
854bf6313a0STakashi Iwai
855bf6313a0STakashi Iwai usb_audio_dbg(chip, " channels=%d, rate=%d, format=%s, period_bytes=%d, periods=%d, implicit_fb=%d\n",
856bf6313a0STakashi Iwai ep->cur_channels, ep->cur_rate,
857bf6313a0STakashi Iwai snd_pcm_format_name(ep->cur_format),
858bf6313a0STakashi Iwai ep->cur_period_bytes, ep->cur_buffer_periods,
859bf6313a0STakashi Iwai ep->implicit_fb_sync);
860bf6313a0STakashi Iwai
861bf6313a0STakashi Iwai } else {
86200272c61STakashi Iwai if (WARN_ON(!ep->iface_ref)) {
86300272c61STakashi Iwai ep = NULL;
86400272c61STakashi Iwai goto unlock;
86500272c61STakashi Iwai }
86600272c61STakashi Iwai
867bf6313a0STakashi Iwai if (!endpoint_compatible(ep, fp, params)) {
868bf6313a0STakashi Iwai usb_audio_err(chip, "Incompatible EP setup for 0x%x\n",
869bf6313a0STakashi Iwai ep_num);
870bf6313a0STakashi Iwai ep = NULL;
871bf6313a0STakashi Iwai goto unlock;
872bf6313a0STakashi Iwai }
873bf6313a0STakashi Iwai
874bf6313a0STakashi Iwai usb_audio_dbg(chip, "Reopened EP 0x%x (count %d)\n",
875bf6313a0STakashi Iwai ep_num, ep->opened);
876bf6313a0STakashi Iwai }
877bf6313a0STakashi Iwai
87800272c61STakashi Iwai if (!ep->iface_ref->opened++)
87900272c61STakashi Iwai ep->iface_ref->need_setup = true;
88000272c61STakashi Iwai
881bf6313a0STakashi Iwai ep->opened++;
882bf6313a0STakashi Iwai
883bf6313a0STakashi Iwai unlock:
884bf6313a0STakashi Iwai mutex_unlock(&chip->mutex);
885bf6313a0STakashi Iwai return ep;
886bf6313a0STakashi Iwai }
887bf6313a0STakashi Iwai
888bf6313a0STakashi Iwai /*
889bf6313a0STakashi Iwai * snd_usb_endpoint_set_sync: Link data and sync endpoints
890bf6313a0STakashi Iwai *
891bf6313a0STakashi Iwai * Pass NULL to sync_ep to unlink again
892bf6313a0STakashi Iwai */
snd_usb_endpoint_set_sync(struct snd_usb_audio * chip,struct snd_usb_endpoint * data_ep,struct snd_usb_endpoint * sync_ep)893bf6313a0STakashi Iwai void snd_usb_endpoint_set_sync(struct snd_usb_audio *chip,
894bf6313a0STakashi Iwai struct snd_usb_endpoint *data_ep,
895bf6313a0STakashi Iwai struct snd_usb_endpoint *sync_ep)
896bf6313a0STakashi Iwai {
89753837b4aSTakashi Iwai data_ep->sync_source = sync_ep;
8988fdff6a3SDaniel Mack }
8998fdff6a3SDaniel Mack
9008fdff6a3SDaniel Mack /*
90196e221f3STakashi Iwai * Set data endpoint callbacks and the assigned data stream
90296e221f3STakashi Iwai *
90396e221f3STakashi Iwai * Called at PCM trigger and cleanups.
90496e221f3STakashi Iwai * Pass NULL to deactivate each callback.
90596e221f3STakashi Iwai */
snd_usb_endpoint_set_callback(struct snd_usb_endpoint * ep,int (* prepare)(struct snd_usb_substream * subs,struct urb * urb,bool in_stream_lock),void (* retire)(struct snd_usb_substream * subs,struct urb * urb),struct snd_usb_substream * data_subs)90696e221f3STakashi Iwai void snd_usb_endpoint_set_callback(struct snd_usb_endpoint *ep,
907d5f871f8STakashi Iwai int (*prepare)(struct snd_usb_substream *subs,
908d5f871f8STakashi Iwai struct urb *urb,
909d5f871f8STakashi Iwai bool in_stream_lock),
91096e221f3STakashi Iwai void (*retire)(struct snd_usb_substream *subs,
91196e221f3STakashi Iwai struct urb *urb),
91296e221f3STakashi Iwai struct snd_usb_substream *data_subs)
91396e221f3STakashi Iwai {
91496e221f3STakashi Iwai ep->prepare_data_urb = prepare;
91596e221f3STakashi Iwai ep->retire_data_urb = retire;
9169c9a3b9dSTakashi Iwai if (data_subs)
9179c9a3b9dSTakashi Iwai ep->lowlatency_playback = data_subs->lowlatency_playback;
9189c9a3b9dSTakashi Iwai else
9199c9a3b9dSTakashi Iwai ep->lowlatency_playback = false;
92096e221f3STakashi Iwai WRITE_ONCE(ep->data_subs, data_subs);
92196e221f3STakashi Iwai }
92296e221f3STakashi Iwai
endpoint_set_interface(struct snd_usb_audio * chip,struct snd_usb_endpoint * ep,bool set)923bf6313a0STakashi Iwai static int endpoint_set_interface(struct snd_usb_audio *chip,
924bf6313a0STakashi Iwai struct snd_usb_endpoint *ep,
925bf6313a0STakashi Iwai bool set)
926bf6313a0STakashi Iwai {
927bf6313a0STakashi Iwai int altset = set ? ep->altsetting : 0;
928bf6313a0STakashi Iwai int err;
929bf6313a0STakashi Iwai
9309902b303STakashi Iwai if (ep->iface_ref->altset == altset)
9319902b303STakashi Iwai return 0;
9329902b303STakashi Iwai
933bf6313a0STakashi Iwai usb_audio_dbg(chip, "Setting usb interface %d:%d for EP 0x%x\n",
934bf6313a0STakashi Iwai ep->iface, altset, ep->ep_num);
935bf6313a0STakashi Iwai err = usb_set_interface(chip->dev, ep->iface, altset);
936bf6313a0STakashi Iwai if (err < 0) {
9372db2be56SChris Down usb_audio_err_ratelimited(
9382db2be56SChris Down chip, "%d:%d: usb_set_interface failed (%d)\n",
939bf6313a0STakashi Iwai ep->iface, altset, err);
940bf6313a0STakashi Iwai return err;
941bf6313a0STakashi Iwai }
942bf6313a0STakashi Iwai
9431f074fe5STakashi Iwai if (chip->quirk_flags & QUIRK_FLAG_IFACE_DELAY)
9441f074fe5STakashi Iwai msleep(50);
9459902b303STakashi Iwai ep->iface_ref->altset = altset;
946bf6313a0STakashi Iwai return 0;
947bf6313a0STakashi Iwai }
948bf6313a0STakashi Iwai
949bf6313a0STakashi Iwai /*
950bf6313a0STakashi Iwai * snd_usb_endpoint_close: Close the endpoint
951bf6313a0STakashi Iwai *
952bf6313a0STakashi Iwai * Unreference the already opened endpoint via snd_usb_endpoint_open().
953bf6313a0STakashi Iwai */
snd_usb_endpoint_close(struct snd_usb_audio * chip,struct snd_usb_endpoint * ep)954bf6313a0STakashi Iwai void snd_usb_endpoint_close(struct snd_usb_audio *chip,
955bf6313a0STakashi Iwai struct snd_usb_endpoint *ep)
956bf6313a0STakashi Iwai {
957bf6313a0STakashi Iwai mutex_lock(&chip->mutex);
958bf6313a0STakashi Iwai usb_audio_dbg(chip, "Closing EP 0x%x (count %d)\n",
959bf6313a0STakashi Iwai ep->ep_num, ep->opened);
96000272c61STakashi Iwai
961bf990c10SAi Chao if (!--ep->iface_ref->opened &&
962bf990c10SAi Chao !(chip->quirk_flags & QUIRK_FLAG_IFACE_SKIP_CLOSE))
963bf6313a0STakashi Iwai endpoint_set_interface(chip, ep, false);
96400272c61STakashi Iwai
96500272c61STakashi Iwai if (!--ep->opened) {
9669a737e7fSTakashi Iwai if (ep->clock_ref) {
9679a737e7fSTakashi Iwai if (!--ep->clock_ref->opened)
968809f44a0STakashi Iwai ep->clock_ref->rate = 0;
9699a737e7fSTakashi Iwai }
97089fa3f68STakashi Iwai ep->iface = 0;
971bf6313a0STakashi Iwai ep->altsetting = 0;
972bf6313a0STakashi Iwai ep->cur_audiofmt = NULL;
973bf6313a0STakashi Iwai ep->cur_rate = 0;
97400272c61STakashi Iwai ep->iface_ref = NULL;
975c11117b6STakashi Iwai ep->clock_ref = NULL;
976bf6313a0STakashi Iwai usb_audio_dbg(chip, "EP 0x%x closed\n", ep->ep_num);
977bf6313a0STakashi Iwai }
978bf6313a0STakashi Iwai mutex_unlock(&chip->mutex);
979bf6313a0STakashi Iwai }
980bf6313a0STakashi Iwai
981bf6313a0STakashi Iwai /* Prepare for suspening EP, called from the main suspend handler */
snd_usb_endpoint_suspend(struct snd_usb_endpoint * ep)982bf6313a0STakashi Iwai void snd_usb_endpoint_suspend(struct snd_usb_endpoint *ep)
983bf6313a0STakashi Iwai {
9841045f5f1STakashi Iwai ep->need_prepare = true;
98500272c61STakashi Iwai if (ep->iface_ref)
98600272c61STakashi Iwai ep->iface_ref->need_setup = true;
987c11117b6STakashi Iwai if (ep->clock_ref)
988c11117b6STakashi Iwai ep->clock_ref->rate = 0;
989bf6313a0STakashi Iwai }
990bf6313a0STakashi Iwai
99196e221f3STakashi Iwai /*
9928fdff6a3SDaniel Mack * wait until all urbs are processed.
9938fdff6a3SDaniel Mack */
wait_clear_urbs(struct snd_usb_endpoint * ep)9948fdff6a3SDaniel Mack static int wait_clear_urbs(struct snd_usb_endpoint *ep)
9958fdff6a3SDaniel Mack {
9968fdff6a3SDaniel Mack unsigned long end_time = jiffies + msecs_to_jiffies(1000);
9978fdff6a3SDaniel Mack int alive;
9988fdff6a3SDaniel Mack
9995c2b3014STakashi Iwai if (atomic_read(&ep->state) != EP_STATE_STOPPING)
1000d0f09d1eSTakashi Iwai return 0;
1001d0f09d1eSTakashi Iwai
10028fdff6a3SDaniel Mack do {
100386a42ad0STakashi Iwai alive = atomic_read(&ep->submitted_urbs);
10048fdff6a3SDaniel Mack if (!alive)
10058fdff6a3SDaniel Mack break;
10068fdff6a3SDaniel Mack
10078fdff6a3SDaniel Mack schedule_timeout_uninterruptible(1);
10088fdff6a3SDaniel Mack } while (time_before(jiffies, end_time));
10098fdff6a3SDaniel Mack
10108fdff6a3SDaniel Mack if (alive)
10110ba41d91STakashi Iwai usb_audio_err(ep->chip,
10120ba41d91STakashi Iwai "timeout: still %d active urbs on EP #%x\n",
10138fdff6a3SDaniel Mack alive, ep->ep_num);
10148fdff6a3SDaniel Mack
10155c2b3014STakashi Iwai if (ep_state_update(ep, EP_STATE_STOPPING, EP_STATE_STOPPED)) {
101653837b4aSTakashi Iwai ep->sync_sink = NULL;
101796e221f3STakashi Iwai snd_usb_endpoint_set_callback(ep, NULL, NULL, NULL);
10185c2b3014STakashi Iwai }
10191d0f9530SIoan-Adrian Ratiu
10208fdff6a3SDaniel Mack return 0;
10218fdff6a3SDaniel Mack }
10228fdff6a3SDaniel Mack
1023f58161baSTakashi Iwai /* sync the pending stop operation;
1024f58161baSTakashi Iwai * this function itself doesn't trigger the stop operation
1025f58161baSTakashi Iwai */
snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint * ep)1026f58161baSTakashi Iwai void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep)
1027f58161baSTakashi Iwai {
1028d0f09d1eSTakashi Iwai if (ep)
1029f58161baSTakashi Iwai wait_clear_urbs(ep);
1030f58161baSTakashi Iwai }
1031f58161baSTakashi Iwai
10328fdff6a3SDaniel Mack /*
1033d6cda465STakashi Iwai * Stop active urbs
1034d0f09d1eSTakashi Iwai *
1035d6cda465STakashi Iwai * This function moves the EP to STOPPING state if it's being RUNNING.
10368fdff6a3SDaniel Mack */
stop_urbs(struct snd_usb_endpoint * ep,bool force,bool keep_pending)1037813a17caSTakashi Iwai static int stop_urbs(struct snd_usb_endpoint *ep, bool force, bool keep_pending)
10388fdff6a3SDaniel Mack {
10398fdff6a3SDaniel Mack unsigned int i;
10400ef74366STakashi Iwai unsigned long flags;
10418fdff6a3SDaniel Mack
1042d6cda465STakashi Iwai if (!force && atomic_read(&ep->running))
1043d0f09d1eSTakashi Iwai return -EBUSY;
10448fdff6a3SDaniel Mack
10455c2b3014STakashi Iwai if (!ep_state_update(ep, EP_STATE_RUNNING, EP_STATE_STOPPING))
1046d6cda465STakashi Iwai return 0;
1047d0f09d1eSTakashi Iwai
10480ef74366STakashi Iwai spin_lock_irqsave(&ep->lock, flags);
10498fdff6a3SDaniel Mack INIT_LIST_HEAD(&ep->ready_playback_urbs);
1050c15871e1STakashi Iwai ep->next_packet_head = 0;
1051c15871e1STakashi Iwai ep->next_packet_queued = 0;
10520ef74366STakashi Iwai spin_unlock_irqrestore(&ep->lock, flags);
10538fdff6a3SDaniel Mack
1054813a17caSTakashi Iwai if (keep_pending)
1055813a17caSTakashi Iwai return 0;
1056813a17caSTakashi Iwai
10578fdff6a3SDaniel Mack for (i = 0; i < ep->nurbs; i++) {
10588fdff6a3SDaniel Mack if (test_bit(i, &ep->active_mask)) {
10598fdff6a3SDaniel Mack if (!test_and_set_bit(i, &ep->unlink_mask)) {
10608fdff6a3SDaniel Mack struct urb *u = ep->urb[i].urb;
10618fdff6a3SDaniel Mack usb_unlink_urb(u);
10628fdff6a3SDaniel Mack }
10638fdff6a3SDaniel Mack }
10648fdff6a3SDaniel Mack }
10658fdff6a3SDaniel Mack
10668fdff6a3SDaniel Mack return 0;
10678fdff6a3SDaniel Mack }
10688fdff6a3SDaniel Mack
10698fdff6a3SDaniel Mack /*
10708fdff6a3SDaniel Mack * release an endpoint's urbs
10718fdff6a3SDaniel Mack */
release_urbs(struct snd_usb_endpoint * ep,bool force)1072d6cda465STakashi Iwai static int release_urbs(struct snd_usb_endpoint *ep, bool force)
10738fdff6a3SDaniel Mack {
1074d6cda465STakashi Iwai int i, err;
10758fdff6a3SDaniel Mack
10768fdff6a3SDaniel Mack /* route incoming urbs to nirvana */
107796e221f3STakashi Iwai snd_usb_endpoint_set_callback(ep, NULL, NULL, NULL);
10788fdff6a3SDaniel Mack
1079d6cda465STakashi Iwai /* stop and unlink urbs */
1080813a17caSTakashi Iwai err = stop_urbs(ep, force, false);
1081d6cda465STakashi Iwai if (err)
1082d6cda465STakashi Iwai return err;
1083d6cda465STakashi Iwai
1084d6cda465STakashi Iwai wait_clear_urbs(ep);
10858fdff6a3SDaniel Mack
10868fdff6a3SDaniel Mack for (i = 0; i < ep->nurbs; i++)
10878fdff6a3SDaniel Mack release_urb_ctx(&ep->urb[i]);
10888fdff6a3SDaniel Mack
10898fdff6a3SDaniel Mack usb_free_coherent(ep->chip->dev, SYNC_URBS * 4,
10908fdff6a3SDaniel Mack ep->syncbuf, ep->sync_dma);
10918fdff6a3SDaniel Mack
10928fdff6a3SDaniel Mack ep->syncbuf = NULL;
10938fdff6a3SDaniel Mack ep->nurbs = 0;
1094d6cda465STakashi Iwai return 0;
10958fdff6a3SDaniel Mack }
10968fdff6a3SDaniel Mack
109794c27215SDaniel Mack /*
109894c27215SDaniel Mack * configure a data endpoint
109994c27215SDaniel Mack */
data_ep_set_params(struct snd_usb_endpoint * ep)1100bf6313a0STakashi Iwai static int data_ep_set_params(struct snd_usb_endpoint *ep)
11018fdff6a3SDaniel Mack {
1102bf6313a0STakashi Iwai struct snd_usb_audio *chip = ep->chip;
1103976b6c06SAlan Stern unsigned int maxsize, minsize, packs_per_ms, max_packs_per_urb;
1104976b6c06SAlan Stern unsigned int max_packs_per_period, urbs_per_period, urb_packs;
1105976b6c06SAlan Stern unsigned int max_urbs, i;
1106bf6313a0STakashi Iwai const struct audioformat *fmt = ep->cur_audiofmt;
1107bf6313a0STakashi Iwai int frame_bits = ep->cur_frame_bytes * 8;
1108c1b034a4STakashi Iwai int tx_length_quirk = (has_tx_length_quirk(chip) &&
1109759c90feSRicard Wanderlof usb_pipeout(ep->pipe));
11108fdff6a3SDaniel Mack
1111bf6313a0STakashi Iwai usb_audio_dbg(chip, "Setting params for data EP 0x%x, pipe 0x%x\n",
1112bf6313a0STakashi Iwai ep->ep_num, ep->pipe);
1113bf6313a0STakashi Iwai
1114bf6313a0STakashi Iwai if (ep->cur_format == SNDRV_PCM_FORMAT_DSD_U16_LE && fmt->dsd_dop) {
1115d24f5061SDaniel Mack /*
1116d24f5061SDaniel Mack * When operating in DSD DOP mode, the size of a sample frame
1117d24f5061SDaniel Mack * in hardware differs from the actual physical format width
1118d24f5061SDaniel Mack * because we need to make room for the DOP markers.
1119d24f5061SDaniel Mack */
1120bf6313a0STakashi Iwai frame_bits += ep->cur_channels << 3;
1121d24f5061SDaniel Mack }
1122d24f5061SDaniel Mack
11238fdff6a3SDaniel Mack ep->datainterval = fmt->datainterval;
11248fdff6a3SDaniel Mack ep->stride = frame_bits >> 3;
112501200730SNobutaka Okabe
1126bf6313a0STakashi Iwai switch (ep->cur_format) {
112701200730SNobutaka Okabe case SNDRV_PCM_FORMAT_U8:
112801200730SNobutaka Okabe ep->silence_value = 0x80;
112901200730SNobutaka Okabe break;
113001200730SNobutaka Okabe case SNDRV_PCM_FORMAT_DSD_U8:
113101200730SNobutaka Okabe case SNDRV_PCM_FORMAT_DSD_U16_LE:
113201200730SNobutaka Okabe case SNDRV_PCM_FORMAT_DSD_U32_LE:
113301200730SNobutaka Okabe case SNDRV_PCM_FORMAT_DSD_U16_BE:
113401200730SNobutaka Okabe case SNDRV_PCM_FORMAT_DSD_U32_BE:
113501200730SNobutaka Okabe ep->silence_value = 0x69;
113601200730SNobutaka Okabe break;
113701200730SNobutaka Okabe default:
113801200730SNobutaka Okabe ep->silence_value = 0;
113901200730SNobutaka Okabe }
11408fdff6a3SDaniel Mack
1141fd1a5059SAndreas Pape /* assume max. frequency is 50% higher than nominal */
1142fd1a5059SAndreas Pape ep->freqmax = ep->freqn + (ep->freqn >> 1);
1143ab30965dSRicard Wanderlof /* Round up freqmax to nearest integer in order to calculate maximum
1144ab30965dSRicard Wanderlof * packet size, which must represent a whole number of frames.
1145ab30965dSRicard Wanderlof * This is accomplished by adding 0x0.ffff before converting the
1146ab30965dSRicard Wanderlof * Q16.16 format into integer.
1147ab30965dSRicard Wanderlof * In order to accurately calculate the maximum packet size when
1148ab30965dSRicard Wanderlof * the data interval is more than 1 (i.e. ep->datainterval > 0),
1149ab30965dSRicard Wanderlof * multiply by the data interval prior to rounding. For instance,
1150ab30965dSRicard Wanderlof * a freqmax of 41 kHz will result in a max packet size of 6 (5.125)
1151ab30965dSRicard Wanderlof * frames with a data interval of 1, but 11 (10.25) frames with a
1152ab30965dSRicard Wanderlof * data interval of 2.
1153ab30965dSRicard Wanderlof * (ep->freqmax << ep->datainterval overflows at 8.192 MHz for the
1154ab30965dSRicard Wanderlof * maximum datainterval value of 3, at USB full speed, higher for
1155ab30965dSRicard Wanderlof * USB high speed, noting that ep->freqmax is in units of
1156ab30965dSRicard Wanderlof * frames per packet in Q16.16 format.)
1157ab30965dSRicard Wanderlof */
1158ab30965dSRicard Wanderlof maxsize = (((ep->freqmax << ep->datainterval) + 0xffff) >> 16) *
1159ab30965dSRicard Wanderlof (frame_bits >> 3);
1160759c90feSRicard Wanderlof if (tx_length_quirk)
1161759c90feSRicard Wanderlof maxsize += sizeof(__le32); /* Space for length descriptor */
116257e6dae1SClemens Ladisch /* but wMaxPacketSize might reduce this */
116357e6dae1SClemens Ladisch if (ep->maxpacksize && ep->maxpacksize < maxsize) {
11648fdff6a3SDaniel Mack /* whatever fits into a max. size packet */
1165759c90feSRicard Wanderlof unsigned int data_maxsize = maxsize = ep->maxpacksize;
1166759c90feSRicard Wanderlof
1167759c90feSRicard Wanderlof if (tx_length_quirk)
1168759c90feSRicard Wanderlof /* Need to remove the length descriptor to calc freq */
1169759c90feSRicard Wanderlof data_maxsize -= sizeof(__le32);
1170759c90feSRicard Wanderlof ep->freqmax = (data_maxsize / (frame_bits >> 3))
11718fdff6a3SDaniel Mack << (16 - ep->datainterval);
11728fdff6a3SDaniel Mack }
11738fdff6a3SDaniel Mack
11748fdff6a3SDaniel Mack if (ep->fill_max)
11758fdff6a3SDaniel Mack ep->curpacksize = ep->maxpacksize;
11768fdff6a3SDaniel Mack else
11778fdff6a3SDaniel Mack ep->curpacksize = maxsize;
11788fdff6a3SDaniel Mack
1179bf6313a0STakashi Iwai if (snd_usb_get_speed(chip->dev) != USB_SPEED_FULL) {
11808fdff6a3SDaniel Mack packs_per_ms = 8 >> ep->datainterval;
1181976b6c06SAlan Stern max_packs_per_urb = MAX_PACKS_HS;
11828fdff6a3SDaniel Mack } else {
1183976b6c06SAlan Stern packs_per_ms = 1;
1184976b6c06SAlan Stern max_packs_per_urb = MAX_PACKS;
11858fdff6a3SDaniel Mack }
118653837b4aSTakashi Iwai if (ep->sync_source && !ep->implicit_fb_sync)
1187976b6c06SAlan Stern max_packs_per_urb = min(max_packs_per_urb,
118853837b4aSTakashi Iwai 1U << ep->sync_source->syncinterval);
1189976b6c06SAlan Stern max_packs_per_urb = max(1u, max_packs_per_urb >> ep->datainterval);
11908fdff6a3SDaniel Mack
1191976b6c06SAlan Stern /*
1192976b6c06SAlan Stern * Capture endpoints need to use small URBs because there's no way
1193976b6c06SAlan Stern * to tell in advance where the next period will end, and we don't
1194976b6c06SAlan Stern * want the next URB to complete much after the period ends.
1195976b6c06SAlan Stern *
1196976b6c06SAlan Stern * Playback endpoints with implicit sync much use the same parameters
1197976b6c06SAlan Stern * as their corresponding capture endpoint.
1198976b6c06SAlan Stern */
1199bf6313a0STakashi Iwai if (usb_pipein(ep->pipe) || ep->implicit_fb_sync) {
1200976b6c06SAlan Stern
1201976b6c06SAlan Stern /* make capture URBs <= 1 ms and smaller than a period */
1202ce8e5f20SRuslan Bilovol urb_packs = min(max_packs_per_urb, packs_per_ms);
1203bf6313a0STakashi Iwai while (urb_packs > 1 && urb_packs * maxsize >= ep->cur_period_bytes)
1204976b6c06SAlan Stern urb_packs >>= 1;
1205976b6c06SAlan Stern ep->nurbs = MAX_URBS;
1206976b6c06SAlan Stern
1207976b6c06SAlan Stern /*
1208976b6c06SAlan Stern * Playback endpoints without implicit sync are adjusted so that
1209976b6c06SAlan Stern * a period fits as evenly as possible in the smallest number of
1210976b6c06SAlan Stern * URBs. The total number of URBs is adjusted to the size of the
1211976b6c06SAlan Stern * ALSA buffer, subject to the MAX_URBS and MAX_QUEUE limits.
1212976b6c06SAlan Stern */
1213976b6c06SAlan Stern } else {
12148fdff6a3SDaniel Mack /* determine how small a packet can be */
1215976b6c06SAlan Stern minsize = (ep->freqn >> (16 - ep->datainterval)) *
1216976b6c06SAlan Stern (frame_bits >> 3);
12178fdff6a3SDaniel Mack /* with sync from device, assume it can be 12% lower */
121853837b4aSTakashi Iwai if (ep->sync_source)
12198fdff6a3SDaniel Mack minsize -= minsize >> 3;
12208fdff6a3SDaniel Mack minsize = max(minsize, 1u);
12218fdff6a3SDaniel Mack
1222976b6c06SAlan Stern /* how many packets will contain an entire ALSA period? */
1223bf6313a0STakashi Iwai max_packs_per_period = DIV_ROUND_UP(ep->cur_period_bytes, minsize);
1224976b6c06SAlan Stern
1225976b6c06SAlan Stern /* how many URBs will contain a period? */
1226976b6c06SAlan Stern urbs_per_period = DIV_ROUND_UP(max_packs_per_period,
1227976b6c06SAlan Stern max_packs_per_urb);
1228976b6c06SAlan Stern /* how many packets are needed in each URB? */
1229976b6c06SAlan Stern urb_packs = DIV_ROUND_UP(max_packs_per_period, urbs_per_period);
1230976b6c06SAlan Stern
1231976b6c06SAlan Stern /* limit the number of frames in a single URB */
1232bf6313a0STakashi Iwai ep->max_urb_frames = DIV_ROUND_UP(ep->cur_period_frames,
1233976b6c06SAlan Stern urbs_per_period);
1234976b6c06SAlan Stern
1235976b6c06SAlan Stern /* try to use enough URBs to contain an entire ALSA buffer */
1236976b6c06SAlan Stern max_urbs = min((unsigned) MAX_URBS,
1237976b6c06SAlan Stern MAX_QUEUE * packs_per_ms / urb_packs);
1238bf6313a0STakashi Iwai ep->nurbs = min(max_urbs, urbs_per_period * ep->cur_buffer_periods);
12398fdff6a3SDaniel Mack }
12408fdff6a3SDaniel Mack
12418fdff6a3SDaniel Mack /* allocate and initialize data urbs */
12428fdff6a3SDaniel Mack for (i = 0; i < ep->nurbs; i++) {
12438fdff6a3SDaniel Mack struct snd_urb_ctx *u = &ep->urb[i];
12448fdff6a3SDaniel Mack u->index = i;
12458fdff6a3SDaniel Mack u->ep = ep;
1246976b6c06SAlan Stern u->packets = urb_packs;
12478fdff6a3SDaniel Mack u->buffer_size = maxsize * u->packets;
12488fdff6a3SDaniel Mack
12498fdff6a3SDaniel Mack if (fmt->fmt_type == UAC_FORMAT_TYPE_II)
12508fdff6a3SDaniel Mack u->packets++; /* for transfer delimiter */
12518fdff6a3SDaniel Mack u->urb = usb_alloc_urb(u->packets, GFP_KERNEL);
12528fdff6a3SDaniel Mack if (!u->urb)
12538fdff6a3SDaniel Mack goto out_of_memory;
12548fdff6a3SDaniel Mack
12558fdff6a3SDaniel Mack u->urb->transfer_buffer =
1256bf6313a0STakashi Iwai usb_alloc_coherent(chip->dev, u->buffer_size,
12578fdff6a3SDaniel Mack GFP_KERNEL, &u->urb->transfer_dma);
12588fdff6a3SDaniel Mack if (!u->urb->transfer_buffer)
12598fdff6a3SDaniel Mack goto out_of_memory;
12608fdff6a3SDaniel Mack u->urb->pipe = ep->pipe;
1261c75c5ab5SClemens Ladisch u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
12628fdff6a3SDaniel Mack u->urb->interval = 1 << ep->datainterval;
12638fdff6a3SDaniel Mack u->urb->context = u;
12648fdff6a3SDaniel Mack u->urb->complete = snd_complete_urb;
12658fdff6a3SDaniel Mack INIT_LIST_HEAD(&u->ready_list);
12668fdff6a3SDaniel Mack }
12678fdff6a3SDaniel Mack
12688fdff6a3SDaniel Mack return 0;
12698fdff6a3SDaniel Mack
12708fdff6a3SDaniel Mack out_of_memory:
1271d6cda465STakashi Iwai release_urbs(ep, false);
12728fdff6a3SDaniel Mack return -ENOMEM;
12738fdff6a3SDaniel Mack }
12748fdff6a3SDaniel Mack
127594c27215SDaniel Mack /*
127694c27215SDaniel Mack * configure a sync endpoint
127794c27215SDaniel Mack */
sync_ep_set_params(struct snd_usb_endpoint * ep)127893721039SEldad Zack static int sync_ep_set_params(struct snd_usb_endpoint *ep)
12798fdff6a3SDaniel Mack {
1280bf6313a0STakashi Iwai struct snd_usb_audio *chip = ep->chip;
12818fdff6a3SDaniel Mack int i;
12828fdff6a3SDaniel Mack
1283bf6313a0STakashi Iwai usb_audio_dbg(chip, "Setting params for sync EP 0x%x, pipe 0x%x\n",
1284bf6313a0STakashi Iwai ep->ep_num, ep->pipe);
1285bf6313a0STakashi Iwai
1286bf6313a0STakashi Iwai ep->syncbuf = usb_alloc_coherent(chip->dev, SYNC_URBS * 4,
12878fdff6a3SDaniel Mack GFP_KERNEL, &ep->sync_dma);
12888fdff6a3SDaniel Mack if (!ep->syncbuf)
12898fdff6a3SDaniel Mack return -ENOMEM;
12908fdff6a3SDaniel Mack
12916382da08STakashi Iwai ep->nurbs = SYNC_URBS;
12928fdff6a3SDaniel Mack for (i = 0; i < SYNC_URBS; i++) {
12938fdff6a3SDaniel Mack struct snd_urb_ctx *u = &ep->urb[i];
12948fdff6a3SDaniel Mack u->index = i;
12958fdff6a3SDaniel Mack u->ep = ep;
12968fdff6a3SDaniel Mack u->packets = 1;
12978fdff6a3SDaniel Mack u->urb = usb_alloc_urb(1, GFP_KERNEL);
12988fdff6a3SDaniel Mack if (!u->urb)
12998fdff6a3SDaniel Mack goto out_of_memory;
13008fdff6a3SDaniel Mack u->urb->transfer_buffer = ep->syncbuf + i * 4;
13018fdff6a3SDaniel Mack u->urb->transfer_dma = ep->sync_dma + i * 4;
13028fdff6a3SDaniel Mack u->urb->transfer_buffer_length = 4;
13038fdff6a3SDaniel Mack u->urb->pipe = ep->pipe;
1304c75c5ab5SClemens Ladisch u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
13058fdff6a3SDaniel Mack u->urb->number_of_packets = 1;
13068fdff6a3SDaniel Mack u->urb->interval = 1 << ep->syncinterval;
13078fdff6a3SDaniel Mack u->urb->context = u;
13088fdff6a3SDaniel Mack u->urb->complete = snd_complete_urb;
13098fdff6a3SDaniel Mack }
13108fdff6a3SDaniel Mack
13118fdff6a3SDaniel Mack return 0;
13128fdff6a3SDaniel Mack
13138fdff6a3SDaniel Mack out_of_memory:
1314d6cda465STakashi Iwai release_urbs(ep, false);
13158fdff6a3SDaniel Mack return -ENOMEM;
13168fdff6a3SDaniel Mack }
13178fdff6a3SDaniel Mack
13182be79d58STakashi Iwai /* update the rate of the referred clock; return the actual rate */
update_clock_ref_rate(struct snd_usb_audio * chip,struct snd_usb_endpoint * ep)13192be79d58STakashi Iwai static int update_clock_ref_rate(struct snd_usb_audio *chip,
13202be79d58STakashi Iwai struct snd_usb_endpoint *ep)
13212be79d58STakashi Iwai {
13222be79d58STakashi Iwai struct snd_usb_clock_ref *clock = ep->clock_ref;
13232be79d58STakashi Iwai int rate = ep->cur_rate;
13242be79d58STakashi Iwai
13252be79d58STakashi Iwai if (!clock || clock->rate == rate)
13262be79d58STakashi Iwai return rate;
13272be79d58STakashi Iwai if (clock->rate) {
13282be79d58STakashi Iwai if (atomic_read(&clock->locked))
13292be79d58STakashi Iwai return clock->rate;
13302be79d58STakashi Iwai if (clock->rate != rate) {
13312be79d58STakashi Iwai usb_audio_err(chip, "Mismatched sample rate %d vs %d for EP 0x%x\n",
13322be79d58STakashi Iwai clock->rate, rate, ep->ep_num);
13332be79d58STakashi Iwai return clock->rate;
13342be79d58STakashi Iwai }
13352be79d58STakashi Iwai }
13362be79d58STakashi Iwai clock->rate = rate;
13372be79d58STakashi Iwai clock->need_setup = true;
13382be79d58STakashi Iwai return rate;
13392be79d58STakashi Iwai }
13402be79d58STakashi Iwai
1341bf6313a0STakashi Iwai /*
134207a5e9d4SDaniel Mack * snd_usb_endpoint_set_params: configure an snd_usb_endpoint
134394c27215SDaniel Mack *
13442be79d58STakashi Iwai * It's called either from hw_params callback.
134507a5e9d4SDaniel Mack * Determine the number of URBs to be used on this endpoint.
134694c27215SDaniel Mack * An endpoint must be configured before it can be started.
134794c27215SDaniel Mack * An endpoint that is already running can not be reconfigured.
134894c27215SDaniel Mack */
snd_usb_endpoint_set_params(struct snd_usb_audio * chip,struct snd_usb_endpoint * ep)13492be79d58STakashi Iwai int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
1350bf6313a0STakashi Iwai struct snd_usb_endpoint *ep)
13518fdff6a3SDaniel Mack {
1352bf6313a0STakashi Iwai const struct audioformat *fmt = ep->cur_audiofmt;
13531045f5f1STakashi Iwai int err = 0;
13548fdff6a3SDaniel Mack
1355a74f8d0aSTakashi Iwai mutex_lock(&chip->mutex);
13561045f5f1STakashi Iwai if (!ep->need_setup)
13571045f5f1STakashi Iwai goto unlock;
13581045f5f1STakashi Iwai
13598fdff6a3SDaniel Mack /* release old buffers, if any */
1360d6cda465STakashi Iwai err = release_urbs(ep, false);
1361d6cda465STakashi Iwai if (err < 0)
1362a74f8d0aSTakashi Iwai goto unlock;
13638fdff6a3SDaniel Mack
13648fdff6a3SDaniel Mack ep->datainterval = fmt->datainterval;
13658fdff6a3SDaniel Mack ep->maxpacksize = fmt->maxpacksize;
136685f71932STakashi Iwai ep->fill_max = !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX);
13678fdff6a3SDaniel Mack
1368bf6313a0STakashi Iwai if (snd_usb_get_speed(chip->dev) == USB_SPEED_FULL) {
1369bf6313a0STakashi Iwai ep->freqn = get_usb_full_speed_rate(ep->cur_rate);
1370b9fd2007SAlexander Tsoy ep->pps = 1000 >> ep->datainterval;
1371f0bd62b6SAlexander Tsoy } else {
1372bf6313a0STakashi Iwai ep->freqn = get_usb_high_speed_rate(ep->cur_rate);
1373b9fd2007SAlexander Tsoy ep->pps = 8000 >> ep->datainterval;
1374f0bd62b6SAlexander Tsoy }
1375f0bd62b6SAlexander Tsoy
1376bf6313a0STakashi Iwai ep->sample_rem = ep->cur_rate % ep->pps;
1377bf6313a0STakashi Iwai ep->packsize[0] = ep->cur_rate / ep->pps;
1378bf6313a0STakashi Iwai ep->packsize[1] = (ep->cur_rate + (ep->pps - 1)) / ep->pps;
13798fdff6a3SDaniel Mack
13808fdff6a3SDaniel Mack /* calculate the frequency in 16.16 format */
13818fdff6a3SDaniel Mack ep->freqm = ep->freqn;
13828fdff6a3SDaniel Mack ep->freqshift = INT_MIN;
13838fdff6a3SDaniel Mack
13848fdff6a3SDaniel Mack ep->phase = 0;
13858fdff6a3SDaniel Mack
13868fdff6a3SDaniel Mack switch (ep->type) {
13878fdff6a3SDaniel Mack case SND_USB_ENDPOINT_TYPE_DATA:
1388bf6313a0STakashi Iwai err = data_ep_set_params(ep);
13898fdff6a3SDaniel Mack break;
13908fdff6a3SDaniel Mack case SND_USB_ENDPOINT_TYPE_SYNC:
139193721039SEldad Zack err = sync_ep_set_params(ep);
13928fdff6a3SDaniel Mack break;
13938fdff6a3SDaniel Mack default:
13948fdff6a3SDaniel Mack err = -EINVAL;
13958fdff6a3SDaniel Mack }
13968fdff6a3SDaniel Mack
1397bf6313a0STakashi Iwai usb_audio_dbg(chip, "Set up %d URBS, ret=%d\n", ep->nurbs, err);
13988fdff6a3SDaniel Mack
13995a6c3e11STakashi Iwai if (err < 0)
1400a74f8d0aSTakashi Iwai goto unlock;
14015a6c3e11STakashi Iwai
1402bf6313a0STakashi Iwai /* some unit conversions in runtime */
1403bf6313a0STakashi Iwai ep->maxframesize = ep->maxpacksize / ep->cur_frame_bytes;
1404bf6313a0STakashi Iwai ep->curframesize = ep->curpacksize / ep->cur_frame_bytes;
14055a6c3e11STakashi Iwai
1406a74f8d0aSTakashi Iwai err = update_clock_ref_rate(chip, ep);
14071045f5f1STakashi Iwai if (err >= 0) {
14081045f5f1STakashi Iwai ep->need_setup = false;
14099355b60eSTakashi Iwai err = 0;
14101045f5f1STakashi Iwai }
14111045f5f1STakashi Iwai
1412a74f8d0aSTakashi Iwai unlock:
1413a74f8d0aSTakashi Iwai mutex_unlock(&chip->mutex);
1414a74f8d0aSTakashi Iwai return err;
14158fdff6a3SDaniel Mack }
14168fdff6a3SDaniel Mack
init_sample_rate(struct snd_usb_audio * chip,struct snd_usb_endpoint * ep)1417c11117b6STakashi Iwai static int init_sample_rate(struct snd_usb_audio *chip,
1418c11117b6STakashi Iwai struct snd_usb_endpoint *ep)
1419c11117b6STakashi Iwai {
1420c11117b6STakashi Iwai struct snd_usb_clock_ref *clock = ep->clock_ref;
14212be79d58STakashi Iwai int rate, err;
1422c11117b6STakashi Iwai
14232be79d58STakashi Iwai rate = update_clock_ref_rate(chip, ep);
14242be79d58STakashi Iwai if (rate < 0)
14252be79d58STakashi Iwai return rate;
14262be79d58STakashi Iwai if (clock && !clock->need_setup)
1427c11117b6STakashi Iwai return 0;
1428c11117b6STakashi Iwai
1429fd28941cSJaroslav Kysela if (!ep->fixed_rate) {
14302be79d58STakashi Iwai err = snd_usb_init_sample_rate(chip, ep->cur_audiofmt, rate);
14312be79d58STakashi Iwai if (err < 0) {
14322be79d58STakashi Iwai if (clock)
14332be79d58STakashi Iwai clock->rate = 0; /* reset rate */
1434c11117b6STakashi Iwai return err;
14352be79d58STakashi Iwai }
1436fd28941cSJaroslav Kysela }
1437c11117b6STakashi Iwai
1438c11117b6STakashi Iwai if (clock)
14392be79d58STakashi Iwai clock->need_setup = false;
1440c11117b6STakashi Iwai return 0;
1441c11117b6STakashi Iwai }
1442c11117b6STakashi Iwai
1443bf6313a0STakashi Iwai /*
14442be79d58STakashi Iwai * snd_usb_endpoint_prepare: Prepare the endpoint
1445bf6313a0STakashi Iwai *
1446bf6313a0STakashi Iwai * This function sets up the EP to be fully usable state.
14472be79d58STakashi Iwai * It's called either from prepare callback.
1448ff630b6aSgushengxian * The function checks need_setup flag, and performs nothing unless needed,
1449bf6313a0STakashi Iwai * so it's safe to call this multiple times.
1450bf6313a0STakashi Iwai *
1451bf6313a0STakashi Iwai * This returns zero if unchanged, 1 if the configuration has changed,
1452bf6313a0STakashi Iwai * or a negative error code.
1453bf6313a0STakashi Iwai */
snd_usb_endpoint_prepare(struct snd_usb_audio * chip,struct snd_usb_endpoint * ep)14542be79d58STakashi Iwai int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
1455bf6313a0STakashi Iwai struct snd_usb_endpoint *ep)
1456bf6313a0STakashi Iwai {
1457bf6313a0STakashi Iwai bool iface_first;
1458bf6313a0STakashi Iwai int err = 0;
1459bf6313a0STakashi Iwai
1460bf6313a0STakashi Iwai mutex_lock(&chip->mutex);
146100272c61STakashi Iwai if (WARN_ON(!ep->iface_ref))
146200272c61STakashi Iwai goto unlock;
14631045f5f1STakashi Iwai if (!ep->need_prepare)
1464bf6313a0STakashi Iwai goto unlock;
1465bf6313a0STakashi Iwai
146600272c61STakashi Iwai /* If the interface has been already set up, just set EP parameters */
146700272c61STakashi Iwai if (!ep->iface_ref->need_setup) {
14683784d449STakashi Iwai /* sample rate setup of UAC1 is per endpoint, and we need
14693784d449STakashi Iwai * to update at each EP configuration
14703784d449STakashi Iwai */
14713784d449STakashi Iwai if (ep->cur_audiofmt->protocol == UAC_VERSION_1) {
1472c11117b6STakashi Iwai err = init_sample_rate(chip, ep);
14733784d449STakashi Iwai if (err < 0)
14743784d449STakashi Iwai goto unlock;
14753784d449STakashi Iwai }
1476bf6313a0STakashi Iwai goto done;
1477bf6313a0STakashi Iwai }
1478bf6313a0STakashi Iwai
1479bf6313a0STakashi Iwai /* Need to deselect altsetting at first */
1480bf6313a0STakashi Iwai endpoint_set_interface(chip, ep, false);
1481bf6313a0STakashi Iwai
1482bf6313a0STakashi Iwai /* Some UAC1 devices (e.g. Yamaha THR10) need the host interface
1483bf6313a0STakashi Iwai * to be set up before parameter setups
1484bf6313a0STakashi Iwai */
1485bf6313a0STakashi Iwai iface_first = ep->cur_audiofmt->protocol == UAC_VERSION_1;
14866e413409STakashi Iwai /* Workaround for devices that require the interface setup at first like UAC1 */
14876e413409STakashi Iwai if (chip->quirk_flags & QUIRK_FLAG_SET_IFACE_FIRST)
14887af5a143STakashi Iwai iface_first = true;
1489bf6313a0STakashi Iwai if (iface_first) {
1490bf6313a0STakashi Iwai err = endpoint_set_interface(chip, ep, true);
1491bf6313a0STakashi Iwai if (err < 0)
1492bf6313a0STakashi Iwai goto unlock;
1493bf6313a0STakashi Iwai }
1494bf6313a0STakashi Iwai
1495bf6313a0STakashi Iwai err = snd_usb_init_pitch(chip, ep->cur_audiofmt);
1496bf6313a0STakashi Iwai if (err < 0)
1497bf6313a0STakashi Iwai goto unlock;
1498bf6313a0STakashi Iwai
1499c11117b6STakashi Iwai err = init_sample_rate(chip, ep);
1500bf6313a0STakashi Iwai if (err < 0)
1501bf6313a0STakashi Iwai goto unlock;
1502bf6313a0STakashi Iwai
1503bf6313a0STakashi Iwai err = snd_usb_select_mode_quirk(chip, ep->cur_audiofmt);
1504bf6313a0STakashi Iwai if (err < 0)
1505bf6313a0STakashi Iwai goto unlock;
1506bf6313a0STakashi Iwai
1507bf6313a0STakashi Iwai /* for UAC2/3, enable the interface altset here at last */
1508bf6313a0STakashi Iwai if (!iface_first) {
1509bf6313a0STakashi Iwai err = endpoint_set_interface(chip, ep, true);
1510bf6313a0STakashi Iwai if (err < 0)
1511bf6313a0STakashi Iwai goto unlock;
1512bf6313a0STakashi Iwai }
1513bf6313a0STakashi Iwai
151400272c61STakashi Iwai ep->iface_ref->need_setup = false;
151500272c61STakashi Iwai
1516bf6313a0STakashi Iwai done:
15171045f5f1STakashi Iwai ep->need_prepare = false;
1518bf6313a0STakashi Iwai err = 1;
1519bf6313a0STakashi Iwai
1520bf6313a0STakashi Iwai unlock:
1521bf6313a0STakashi Iwai mutex_unlock(&chip->mutex);
1522bf6313a0STakashi Iwai return err;
1523bf6313a0STakashi Iwai }
1524bf6313a0STakashi Iwai
15254e7cf1fbSTakashi Iwai /* get the current rate set to the given clock by any endpoint */
snd_usb_endpoint_get_clock_rate(struct snd_usb_audio * chip,int clock)15264e7cf1fbSTakashi Iwai int snd_usb_endpoint_get_clock_rate(struct snd_usb_audio *chip, int clock)
15274e7cf1fbSTakashi Iwai {
1528c11117b6STakashi Iwai struct snd_usb_clock_ref *ref;
15294e7cf1fbSTakashi Iwai int rate = 0;
15304e7cf1fbSTakashi Iwai
15314e7cf1fbSTakashi Iwai if (!clock)
15324e7cf1fbSTakashi Iwai return 0;
15334e7cf1fbSTakashi Iwai mutex_lock(&chip->mutex);
1534c11117b6STakashi Iwai list_for_each_entry(ref, &chip->clock_ref_list, list) {
1535c11117b6STakashi Iwai if (ref->clock == clock) {
1536c11117b6STakashi Iwai rate = ref->rate;
15374e7cf1fbSTakashi Iwai break;
15384e7cf1fbSTakashi Iwai }
15394e7cf1fbSTakashi Iwai }
15404e7cf1fbSTakashi Iwai mutex_unlock(&chip->mutex);
15414e7cf1fbSTakashi Iwai return rate;
15424e7cf1fbSTakashi Iwai }
15434e7cf1fbSTakashi Iwai
154494c27215SDaniel Mack /**
154594c27215SDaniel Mack * snd_usb_endpoint_start: start an snd_usb_endpoint
154694c27215SDaniel Mack *
154794c27215SDaniel Mack * @ep: the endpoint to start
154894c27215SDaniel Mack *
154943b81e84STakashi Iwai * A call to this function will increment the running count of the endpoint.
155007a5e9d4SDaniel Mack * In case it is not already running, the URBs for this endpoint will be
155194c27215SDaniel Mack * submitted. Otherwise, this function does nothing.
155294c27215SDaniel Mack *
155394c27215SDaniel Mack * Must be balanced to calls of snd_usb_endpoint_stop().
155494c27215SDaniel Mack *
155594c27215SDaniel Mack * Returns an error if the URB submission failed, 0 in all other cases.
155694c27215SDaniel Mack */
snd_usb_endpoint_start(struct snd_usb_endpoint * ep)15571d0f9530SIoan-Adrian Ratiu int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
15588fdff6a3SDaniel Mack {
1559d5f871f8STakashi Iwai bool is_playback = usb_pipeout(ep->pipe);
15608fdff6a3SDaniel Mack int err;
15618fdff6a3SDaniel Mack unsigned int i;
15628fdff6a3SDaniel Mack
156347ab1545STakashi Iwai if (atomic_read(&ep->chip->shutdown))
15648fdff6a3SDaniel Mack return -EBADFD;
15658fdff6a3SDaniel Mack
156653837b4aSTakashi Iwai if (ep->sync_source)
156753837b4aSTakashi Iwai WRITE_ONCE(ep->sync_source->sync_sink, ep);
1568bf6313a0STakashi Iwai
156943b81e84STakashi Iwai usb_audio_dbg(ep->chip, "Starting %s EP 0x%x (running %d)\n",
157043b81e84STakashi Iwai ep_type_name(ep->type), ep->ep_num,
157143b81e84STakashi Iwai atomic_read(&ep->running));
157257234bc1STakashi Iwai
15738fdff6a3SDaniel Mack /* already running? */
157443b81e84STakashi Iwai if (atomic_inc_return(&ep->running) != 1)
15758fdff6a3SDaniel Mack return 0;
15768fdff6a3SDaniel Mack
1577c11117b6STakashi Iwai if (ep->clock_ref)
1578c11117b6STakashi Iwai atomic_inc(&ep->clock_ref->locked);
1579c11117b6STakashi Iwai
15808fdff6a3SDaniel Mack ep->active_mask = 0;
15818fdff6a3SDaniel Mack ep->unlink_mask = 0;
15828fdff6a3SDaniel Mack ep->phase = 0;
1583f0bd62b6SAlexander Tsoy ep->sample_accum = 0;
15848fdff6a3SDaniel Mack
15852b58fd5bSDaniel Mack snd_usb_endpoint_start_quirk(ep);
15862b58fd5bSDaniel Mack
15878fdff6a3SDaniel Mack /*
15888fdff6a3SDaniel Mack * If this endpoint has a data endpoint as implicit feedback source,
15898fdff6a3SDaniel Mack * don't start the urbs here. Instead, mark them all as available,
159007a5e9d4SDaniel Mack * wait for the record urbs to return and queue the playback urbs
159107a5e9d4SDaniel Mack * from that context.
15928fdff6a3SDaniel Mack */
15938fdff6a3SDaniel Mack
15945c2b3014STakashi Iwai if (!ep_state_update(ep, EP_STATE_STOPPED, EP_STATE_RUNNING))
15955c2b3014STakashi Iwai goto __error;
15968fdff6a3SDaniel Mack
1597ebe8dc5aSTakashi Iwai if (snd_usb_endpoint_implicit_feedback_sink(ep) &&
1598019c7f91STakashi Iwai !(ep->chip->quirk_flags & QUIRK_FLAG_PLAYBACK_FIRST)) {
1599bf6313a0STakashi Iwai usb_audio_dbg(ep->chip, "No URB submission due to implicit fb sync\n");
1600d5f871f8STakashi Iwai i = 0;
1601d5f871f8STakashi Iwai goto fill_rest;
16028fdff6a3SDaniel Mack }
16038fdff6a3SDaniel Mack
16048fdff6a3SDaniel Mack for (i = 0; i < ep->nurbs; i++) {
16058fdff6a3SDaniel Mack struct urb *urb = ep->urb[i].urb;
16068fdff6a3SDaniel Mack
16078fdff6a3SDaniel Mack if (snd_BUG_ON(!urb))
16088fdff6a3SDaniel Mack goto __error;
16098fdff6a3SDaniel Mack
1610d5f871f8STakashi Iwai if (is_playback)
1611d5f871f8STakashi Iwai err = prepare_outbound_urb(ep, urb->context, true);
1612d5f871f8STakashi Iwai else
1613d5f871f8STakashi Iwai err = prepare_inbound_urb(ep, urb->context);
1614d5f871f8STakashi Iwai if (err < 0) {
1615d5f871f8STakashi Iwai /* stop filling at applptr */
1616d5f871f8STakashi Iwai if (err == -EAGAIN)
1617d5f871f8STakashi Iwai break;
1618d5f871f8STakashi Iwai usb_audio_dbg(ep->chip,
1619d5f871f8STakashi Iwai "EP 0x%x: failed to prepare urb: %d\n",
1620d5f871f8STakashi Iwai ep->ep_num, err);
1621d5f871f8STakashi Iwai goto __error;
16228fdff6a3SDaniel Mack }
16238fdff6a3SDaniel Mack
1624ab574d16STakashi Iwai if (!atomic_read(&ep->chip->shutdown))
16258fdff6a3SDaniel Mack err = usb_submit_urb(urb, GFP_ATOMIC);
1626ab574d16STakashi Iwai else
1627ab574d16STakashi Iwai err = -ENODEV;
16288fdff6a3SDaniel Mack if (err < 0) {
1629ab574d16STakashi Iwai if (!atomic_read(&ep->chip->shutdown))
16300ba41d91STakashi Iwai usb_audio_err(ep->chip,
16310ba41d91STakashi Iwai "cannot submit urb %d, error %d: %s\n",
16328fdff6a3SDaniel Mack i, err, usb_error_string(err));
16338fdff6a3SDaniel Mack goto __error;
16348fdff6a3SDaniel Mack }
16358fdff6a3SDaniel Mack set_bit(i, &ep->active_mask);
163686a42ad0STakashi Iwai atomic_inc(&ep->submitted_urbs);
16378fdff6a3SDaniel Mack }
16388fdff6a3SDaniel Mack
1639d5f871f8STakashi Iwai if (!i) {
1640d5f871f8STakashi Iwai usb_audio_dbg(ep->chip, "XRUN at starting EP 0x%x\n",
1641d5f871f8STakashi Iwai ep->ep_num);
1642d5f871f8STakashi Iwai goto __error;
1643d5f871f8STakashi Iwai }
1644d5f871f8STakashi Iwai
1645bf6313a0STakashi Iwai usb_audio_dbg(ep->chip, "%d URBs submitted for EP 0x%x\n",
1646d5f871f8STakashi Iwai i, ep->ep_num);
1647d5f871f8STakashi Iwai
1648d5f871f8STakashi Iwai fill_rest:
1649d5f871f8STakashi Iwai /* put the remaining URBs to ready list */
1650d5f871f8STakashi Iwai if (is_playback) {
1651d5f871f8STakashi Iwai for (; i < ep->nurbs; i++)
1652d5f871f8STakashi Iwai push_back_to_ready_list(ep, ep->urb + i);
1653d5f871f8STakashi Iwai }
1654d5f871f8STakashi Iwai
16558fdff6a3SDaniel Mack return 0;
16568fdff6a3SDaniel Mack
16578fdff6a3SDaniel Mack __error:
1658813a17caSTakashi Iwai snd_usb_endpoint_stop(ep, false);
16598fdff6a3SDaniel Mack return -EPIPE;
16608fdff6a3SDaniel Mack }
16618fdff6a3SDaniel Mack
166294c27215SDaniel Mack /**
166394c27215SDaniel Mack * snd_usb_endpoint_stop: stop an snd_usb_endpoint
166494c27215SDaniel Mack *
166594c27215SDaniel Mack * @ep: the endpoint to stop (may be NULL)
1666813a17caSTakashi Iwai * @keep_pending: keep in-flight URBs
166794c27215SDaniel Mack *
166843b81e84STakashi Iwai * A call to this function will decrement the running count of the endpoint.
166994c27215SDaniel Mack * In case the last user has requested the endpoint stop, the URBs will
167007a5e9d4SDaniel Mack * actually be deactivated.
167194c27215SDaniel Mack *
167294c27215SDaniel Mack * Must be balanced to calls of snd_usb_endpoint_start().
1673b2eb950dSTakashi Iwai *
1674b2eb950dSTakashi Iwai * The caller needs to synchronize the pending stop operation via
1675b2eb950dSTakashi Iwai * snd_usb_endpoint_sync_pending_stop().
167694c27215SDaniel Mack */
snd_usb_endpoint_stop(struct snd_usb_endpoint * ep,bool keep_pending)1677813a17caSTakashi Iwai void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool keep_pending)
16788fdff6a3SDaniel Mack {
16798fdff6a3SDaniel Mack if (!ep)
16808fdff6a3SDaniel Mack return;
16818fdff6a3SDaniel Mack
168243b81e84STakashi Iwai usb_audio_dbg(ep->chip, "Stopping %s EP 0x%x (running %d)\n",
168343b81e84STakashi Iwai ep_type_name(ep->type), ep->ep_num,
168443b81e84STakashi Iwai atomic_read(&ep->running));
168557234bc1STakashi Iwai
168643b81e84STakashi Iwai if (snd_BUG_ON(!atomic_read(&ep->running)))
16878fdff6a3SDaniel Mack return;
16888fdff6a3SDaniel Mack
1689988cc175STakashi Iwai if (!atomic_dec_return(&ep->running)) {
169053837b4aSTakashi Iwai if (ep->sync_source)
169153837b4aSTakashi Iwai WRITE_ONCE(ep->sync_source->sync_sink, NULL);
1692813a17caSTakashi Iwai stop_urbs(ep, false, keep_pending);
1693c11117b6STakashi Iwai if (ep->clock_ref)
16949a737e7fSTakashi Iwai atomic_dec(&ep->clock_ref->locked);
169567df411dSJohn Keeping
169667df411dSJohn Keeping if (ep->chip->quirk_flags & QUIRK_FLAG_FORCE_IFACE_RESET &&
169767df411dSJohn Keeping usb_pipeout(ep->pipe)) {
169867df411dSJohn Keeping ep->need_prepare = true;
169967df411dSJohn Keeping if (ep->iface_ref)
170067df411dSJohn Keeping ep->iface_ref->need_setup = true;
170167df411dSJohn Keeping }
17028fdff6a3SDaniel Mack }
1703988cc175STakashi Iwai }
17048fdff6a3SDaniel Mack
170594c27215SDaniel Mack /**
170692a586bdSTakashi Iwai * snd_usb_endpoint_release: Tear down an snd_usb_endpoint
170792a586bdSTakashi Iwai *
170892a586bdSTakashi Iwai * @ep: the endpoint to release
170992a586bdSTakashi Iwai *
171043b81e84STakashi Iwai * This function does not care for the endpoint's running count but will tear
171192a586bdSTakashi Iwai * down all the streaming URBs immediately.
171292a586bdSTakashi Iwai */
snd_usb_endpoint_release(struct snd_usb_endpoint * ep)171392a586bdSTakashi Iwai void snd_usb_endpoint_release(struct snd_usb_endpoint *ep)
171492a586bdSTakashi Iwai {
1715d6cda465STakashi Iwai release_urbs(ep, true);
171692a586bdSTakashi Iwai }
171792a586bdSTakashi Iwai
171892a586bdSTakashi Iwai /**
171900272c61STakashi Iwai * snd_usb_endpoint_free_all: Free the resources of an snd_usb_endpoint
1720036f90ddSTakashi Iwai * @chip: The chip
172194c27215SDaniel Mack *
172200272c61STakashi Iwai * This free all endpoints and those resources
172394c27215SDaniel Mack */
snd_usb_endpoint_free_all(struct snd_usb_audio * chip)172400272c61STakashi Iwai void snd_usb_endpoint_free_all(struct snd_usb_audio *chip)
17258fdff6a3SDaniel Mack {
172600272c61STakashi Iwai struct snd_usb_endpoint *ep, *en;
172700272c61STakashi Iwai struct snd_usb_iface_ref *ip, *in;
1728c11117b6STakashi Iwai struct snd_usb_clock_ref *cp, *cn;
172900272c61STakashi Iwai
173000272c61STakashi Iwai list_for_each_entry_safe(ep, en, &chip->ep_list, list)
17318fdff6a3SDaniel Mack kfree(ep);
173200272c61STakashi Iwai
173300272c61STakashi Iwai list_for_each_entry_safe(ip, in, &chip->iface_ref_list, list)
173400272c61STakashi Iwai kfree(ip);
1735c11117b6STakashi Iwai
1736c11117b6STakashi Iwai list_for_each_entry_safe(cp, cn, &chip->clock_ref_list, list)
173703a8b0dfSWan Jiabing kfree(cp);
17388fdff6a3SDaniel Mack }
17398fdff6a3SDaniel Mack
1740bf6313a0STakashi Iwai /*
174194c27215SDaniel Mack * snd_usb_handle_sync_urb: parse an USB sync packet
17428fdff6a3SDaniel Mack *
174394c27215SDaniel Mack * @ep: the endpoint to handle the packet
174494c27215SDaniel Mack * @sender: the sending endpoint
174594c27215SDaniel Mack * @urb: the received packet
174694c27215SDaniel Mack *
174794c27215SDaniel Mack * This function is called from the context of an endpoint that received
174894c27215SDaniel Mack * the packet and is used to let another endpoint object handle the payload.
17498fdff6a3SDaniel Mack */
snd_usb_handle_sync_urb(struct snd_usb_endpoint * ep,struct snd_usb_endpoint * sender,const struct urb * urb)1750bf6313a0STakashi Iwai static void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
17518fdff6a3SDaniel Mack struct snd_usb_endpoint *sender,
17528fdff6a3SDaniel Mack const struct urb *urb)
17538fdff6a3SDaniel Mack {
17548fdff6a3SDaniel Mack int shift;
17558fdff6a3SDaniel Mack unsigned int f;
17568fdff6a3SDaniel Mack unsigned long flags;
17578fdff6a3SDaniel Mack
17588fdff6a3SDaniel Mack snd_BUG_ON(ep == sender);
17598fdff6a3SDaniel Mack
176094c27215SDaniel Mack /*
176194c27215SDaniel Mack * In case the endpoint is operating in implicit feedback mode, prepare
176207a5e9d4SDaniel Mack * a new outbound URB that has the same layout as the received packet
176307a5e9d4SDaniel Mack * and add it to the list of pending urbs. queue_pending_output_urbs()
176407a5e9d4SDaniel Mack * will take care of them later.
176594c27215SDaniel Mack */
176698ae472bSEldad Zack if (snd_usb_endpoint_implicit_feedback_sink(ep) &&
176743b81e84STakashi Iwai atomic_read(&ep->running)) {
17688fdff6a3SDaniel Mack
17698fdff6a3SDaniel Mack /* implicit feedback case */
17708fdff6a3SDaniel Mack int i, bytes = 0;
17718fdff6a3SDaniel Mack struct snd_urb_ctx *in_ctx;
17728fdff6a3SDaniel Mack struct snd_usb_packet_info *out_packet;
17738fdff6a3SDaniel Mack
17748fdff6a3SDaniel Mack in_ctx = urb->context;
17758fdff6a3SDaniel Mack
17768fdff6a3SDaniel Mack /* Count overall packet size */
17778fdff6a3SDaniel Mack for (i = 0; i < in_ctx->packets; i++)
17788fdff6a3SDaniel Mack if (urb->iso_frame_desc[i].status == 0)
17798fdff6a3SDaniel Mack bytes += urb->iso_frame_desc[i].actual_length;
17808fdff6a3SDaniel Mack
17818fdff6a3SDaniel Mack /*
17828fdff6a3SDaniel Mack * skip empty packets. At least M-Audio's Fast Track Ultra stops
17838fdff6a3SDaniel Mack * streaming once it received a 0-byte OUT URB
17848fdff6a3SDaniel Mack */
17858fdff6a3SDaniel Mack if (bytes == 0)
17868fdff6a3SDaniel Mack return;
17878fdff6a3SDaniel Mack
17888fdff6a3SDaniel Mack spin_lock_irqsave(&ep->lock, flags);
1789c15871e1STakashi Iwai if (ep->next_packet_queued >= ARRAY_SIZE(ep->next_packet)) {
1790c15871e1STakashi Iwai spin_unlock_irqrestore(&ep->lock, flags);
1791c15871e1STakashi Iwai usb_audio_err(ep->chip,
1792c15871e1STakashi Iwai "next package FIFO overflow EP 0x%x\n",
1793c15871e1STakashi Iwai ep->ep_num);
1794c15871e1STakashi Iwai notify_xrun(ep);
1795c15871e1STakashi Iwai return;
1796c15871e1STakashi Iwai }
1797c15871e1STakashi Iwai
1798c15871e1STakashi Iwai out_packet = next_packet_fifo_enqueue(ep);
17998fdff6a3SDaniel Mack
18008fdff6a3SDaniel Mack /*
18018fdff6a3SDaniel Mack * Iterate through the inbound packet and prepare the lengths
18028fdff6a3SDaniel Mack * for the output packet. The OUT packet we are about to send
180328acb120SEldad Zack * will have the same amount of payload bytes per stride as the
180428acb120SEldad Zack * IN packet we just received. Since the actual size is scaled
180528acb120SEldad Zack * by the stride, use the sender stride to calculate the length
180628acb120SEldad Zack * in case the number of channels differ between the implicitly
180728acb120SEldad Zack * fed-back endpoint and the synchronizing endpoint.
18088fdff6a3SDaniel Mack */
18098fdff6a3SDaniel Mack
18108fdff6a3SDaniel Mack out_packet->packets = in_ctx->packets;
18118fdff6a3SDaniel Mack for (i = 0; i < in_ctx->packets; i++) {
18128fdff6a3SDaniel Mack if (urb->iso_frame_desc[i].status == 0)
18138fdff6a3SDaniel Mack out_packet->packet_size[i] =
181428acb120SEldad Zack urb->iso_frame_desc[i].actual_length / sender->stride;
18158fdff6a3SDaniel Mack else
18168fdff6a3SDaniel Mack out_packet->packet_size[i] = 0;
18178fdff6a3SDaniel Mack }
18188fdff6a3SDaniel Mack
18198fdff6a3SDaniel Mack spin_unlock_irqrestore(&ep->lock, flags);
1820d5f871f8STakashi Iwai snd_usb_queue_pending_output_urbs(ep, false);
18218fdff6a3SDaniel Mack
18228fdff6a3SDaniel Mack return;
18238fdff6a3SDaniel Mack }
18248fdff6a3SDaniel Mack
182594c27215SDaniel Mack /*
182694c27215SDaniel Mack * process after playback sync complete
182794c27215SDaniel Mack *
182894c27215SDaniel Mack * Full speed devices report feedback values in 10.14 format as samples
182994c27215SDaniel Mack * per frame, high speed devices in 16.16 format as samples per
183094c27215SDaniel Mack * microframe.
183194c27215SDaniel Mack *
183294c27215SDaniel Mack * Because the Audio Class 1 spec was written before USB 2.0, many high
183394c27215SDaniel Mack * speed devices use a wrong interpretation, some others use an
183494c27215SDaniel Mack * entirely different format.
183594c27215SDaniel Mack *
183694c27215SDaniel Mack * Therefore, we cannot predict what format any particular device uses
183794c27215SDaniel Mack * and must detect it automatically.
183894c27215SDaniel Mack */
18398fdff6a3SDaniel Mack
18408fdff6a3SDaniel Mack if (urb->iso_frame_desc[0].status != 0 ||
18418fdff6a3SDaniel Mack urb->iso_frame_desc[0].actual_length < 3)
18428fdff6a3SDaniel Mack return;
18438fdff6a3SDaniel Mack
18448fdff6a3SDaniel Mack f = le32_to_cpup(urb->transfer_buffer);
18458fdff6a3SDaniel Mack if (urb->iso_frame_desc[0].actual_length == 3)
18468fdff6a3SDaniel Mack f &= 0x00ffffff;
18478fdff6a3SDaniel Mack else
18488fdff6a3SDaniel Mack f &= 0x0fffffff;
18498fdff6a3SDaniel Mack
18508fdff6a3SDaniel Mack if (f == 0)
18518fdff6a3SDaniel Mack return;
18528fdff6a3SDaniel Mack
1853ca0dd273SDaniel Mack if (unlikely(sender->tenor_fb_quirk)) {
18547040b6d1SClemens Ladisch /*
1855ca0dd273SDaniel Mack * Devices based on Tenor 8802 chipsets (TEAC UD-H01
1856ca0dd273SDaniel Mack * and others) sometimes change the feedback value
18577040b6d1SClemens Ladisch * by +/- 0x1.0000.
18587040b6d1SClemens Ladisch */
18597040b6d1SClemens Ladisch if (f < ep->freqn - 0x8000)
186036e1ac3cSDaniel Mack f += 0xf000;
18617040b6d1SClemens Ladisch else if (f > ep->freqn + 0x8000)
186236e1ac3cSDaniel Mack f -= 0xf000;
18637040b6d1SClemens Ladisch } else if (unlikely(ep->freqshift == INT_MIN)) {
18648fdff6a3SDaniel Mack /*
18658fdff6a3SDaniel Mack * The first time we see a feedback value, determine its format
18668fdff6a3SDaniel Mack * by shifting it left or right until it matches the nominal
18678fdff6a3SDaniel Mack * frequency value. This assumes that the feedback does not
18688fdff6a3SDaniel Mack * differ from the nominal value more than +50% or -25%.
18698fdff6a3SDaniel Mack */
18708fdff6a3SDaniel Mack shift = 0;
18718fdff6a3SDaniel Mack while (f < ep->freqn - ep->freqn / 4) {
18728fdff6a3SDaniel Mack f <<= 1;
18738fdff6a3SDaniel Mack shift++;
18748fdff6a3SDaniel Mack }
18758fdff6a3SDaniel Mack while (f > ep->freqn + ep->freqn / 2) {
18768fdff6a3SDaniel Mack f >>= 1;
18778fdff6a3SDaniel Mack shift--;
18788fdff6a3SDaniel Mack }
18798fdff6a3SDaniel Mack ep->freqshift = shift;
18808fdff6a3SDaniel Mack } else if (ep->freqshift >= 0)
18818fdff6a3SDaniel Mack f <<= ep->freqshift;
18828fdff6a3SDaniel Mack else
18838fdff6a3SDaniel Mack f >>= -ep->freqshift;
18848fdff6a3SDaniel Mack
18858fdff6a3SDaniel Mack if (likely(f >= ep->freqn - ep->freqn / 8 && f <= ep->freqmax)) {
18868fdff6a3SDaniel Mack /*
18878fdff6a3SDaniel Mack * If the frequency looks valid, set it.
18888fdff6a3SDaniel Mack * This value is referred to in prepare_playback_urb().
18898fdff6a3SDaniel Mack */
18908fdff6a3SDaniel Mack spin_lock_irqsave(&ep->lock, flags);
18918fdff6a3SDaniel Mack ep->freqm = f;
18928fdff6a3SDaniel Mack spin_unlock_irqrestore(&ep->lock, flags);
18938fdff6a3SDaniel Mack } else {
18948fdff6a3SDaniel Mack /*
18958fdff6a3SDaniel Mack * Out of range; maybe the shift value is wrong.
18968fdff6a3SDaniel Mack * Reset it so that we autodetect again the next time.
18978fdff6a3SDaniel Mack */
18988fdff6a3SDaniel Mack ep->freqshift = INT_MIN;
18998fdff6a3SDaniel Mack }
19008fdff6a3SDaniel Mack }
19018fdff6a3SDaniel Mack
1902