18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci */ 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/gfp.h> 68c2ecf20Sopenharmony_ci#include <linux/init.h> 78c2ecf20Sopenharmony_ci#include <linux/ratelimit.h> 88c2ecf20Sopenharmony_ci#include <linux/usb.h> 98c2ecf20Sopenharmony_ci#include <linux/usb/audio.h> 108c2ecf20Sopenharmony_ci#include <linux/slab.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <sound/core.h> 138c2ecf20Sopenharmony_ci#include <sound/pcm.h> 148c2ecf20Sopenharmony_ci#include <sound/pcm_params.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include "usbaudio.h" 178c2ecf20Sopenharmony_ci#include "helper.h" 188c2ecf20Sopenharmony_ci#include "card.h" 198c2ecf20Sopenharmony_ci#include "endpoint.h" 208c2ecf20Sopenharmony_ci#include "pcm.h" 218c2ecf20Sopenharmony_ci#include "quirks.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define EP_FLAG_RUNNING 1 248c2ecf20Sopenharmony_ci#define EP_FLAG_STOPPING 2 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci/* 278c2ecf20Sopenharmony_ci * snd_usb_endpoint is a model that abstracts everything related to an 288c2ecf20Sopenharmony_ci * USB endpoint and its streaming. 298c2ecf20Sopenharmony_ci * 308c2ecf20Sopenharmony_ci * There are functions to activate and deactivate the streaming URBs and 318c2ecf20Sopenharmony_ci * optional callbacks to let the pcm logic handle the actual content of the 328c2ecf20Sopenharmony_ci * packets for playback and record. Thus, the bus streaming and the audio 338c2ecf20Sopenharmony_ci * handlers are fully decoupled. 348c2ecf20Sopenharmony_ci * 358c2ecf20Sopenharmony_ci * There are two different types of endpoints in audio applications. 368c2ecf20Sopenharmony_ci * 378c2ecf20Sopenharmony_ci * SND_USB_ENDPOINT_TYPE_DATA handles full audio data payload for both 388c2ecf20Sopenharmony_ci * inbound and outbound traffic. 398c2ecf20Sopenharmony_ci * 408c2ecf20Sopenharmony_ci * SND_USB_ENDPOINT_TYPE_SYNC endpoints are for inbound traffic only and 418c2ecf20Sopenharmony_ci * expect the payload to carry Q10.14 / Q16.16 formatted sync information 428c2ecf20Sopenharmony_ci * (3 or 4 bytes). 438c2ecf20Sopenharmony_ci * 448c2ecf20Sopenharmony_ci * Each endpoint has to be configured prior to being used by calling 458c2ecf20Sopenharmony_ci * snd_usb_endpoint_set_params(). 468c2ecf20Sopenharmony_ci * 478c2ecf20Sopenharmony_ci * The model incorporates a reference counting, so that multiple users 488c2ecf20Sopenharmony_ci * can call snd_usb_endpoint_start() and snd_usb_endpoint_stop(), and 498c2ecf20Sopenharmony_ci * only the first user will effectively start the URBs, and only the last 508c2ecf20Sopenharmony_ci * one to stop it will tear the URBs down again. 518c2ecf20Sopenharmony_ci */ 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* 548c2ecf20Sopenharmony_ci * convert a sampling rate into our full speed format (fs/1000 in Q16.16) 558c2ecf20Sopenharmony_ci * this will overflow at approx 524 kHz 568c2ecf20Sopenharmony_ci */ 578c2ecf20Sopenharmony_cistatic inline unsigned get_usb_full_speed_rate(unsigned int rate) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci return ((rate << 13) + 62) / 125; 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci/* 638c2ecf20Sopenharmony_ci * convert a sampling rate into USB high speed format (fs/8000 in Q16.16) 648c2ecf20Sopenharmony_ci * this will overflow at approx 4 MHz 658c2ecf20Sopenharmony_ci */ 668c2ecf20Sopenharmony_cistatic inline unsigned get_usb_high_speed_rate(unsigned int rate) 678c2ecf20Sopenharmony_ci{ 688c2ecf20Sopenharmony_ci return ((rate << 10) + 62) / 125; 698c2ecf20Sopenharmony_ci} 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci/* 728c2ecf20Sopenharmony_ci * release a urb data 738c2ecf20Sopenharmony_ci */ 748c2ecf20Sopenharmony_cistatic void release_urb_ctx(struct snd_urb_ctx *u) 758c2ecf20Sopenharmony_ci{ 768c2ecf20Sopenharmony_ci if (u->urb && u->buffer_size) 778c2ecf20Sopenharmony_ci usb_free_coherent(u->ep->chip->dev, u->buffer_size, 788c2ecf20Sopenharmony_ci u->urb->transfer_buffer, 798c2ecf20Sopenharmony_ci u->urb->transfer_dma); 808c2ecf20Sopenharmony_ci usb_free_urb(u->urb); 818c2ecf20Sopenharmony_ci u->urb = NULL; 828c2ecf20Sopenharmony_ci u->buffer_size = 0; 838c2ecf20Sopenharmony_ci} 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_cistatic const char *usb_error_string(int err) 868c2ecf20Sopenharmony_ci{ 878c2ecf20Sopenharmony_ci switch (err) { 888c2ecf20Sopenharmony_ci case -ENODEV: 898c2ecf20Sopenharmony_ci return "no device"; 908c2ecf20Sopenharmony_ci case -ENOENT: 918c2ecf20Sopenharmony_ci return "endpoint not enabled"; 928c2ecf20Sopenharmony_ci case -EPIPE: 938c2ecf20Sopenharmony_ci return "endpoint stalled"; 948c2ecf20Sopenharmony_ci case -ENOSPC: 958c2ecf20Sopenharmony_ci return "not enough bandwidth"; 968c2ecf20Sopenharmony_ci case -ESHUTDOWN: 978c2ecf20Sopenharmony_ci return "device disabled"; 988c2ecf20Sopenharmony_ci case -EHOSTUNREACH: 998c2ecf20Sopenharmony_ci return "device suspended"; 1008c2ecf20Sopenharmony_ci case -EINVAL: 1018c2ecf20Sopenharmony_ci case -EAGAIN: 1028c2ecf20Sopenharmony_ci case -EFBIG: 1038c2ecf20Sopenharmony_ci case -EMSGSIZE: 1048c2ecf20Sopenharmony_ci return "internal error"; 1058c2ecf20Sopenharmony_ci default: 1068c2ecf20Sopenharmony_ci return "unknown error"; 1078c2ecf20Sopenharmony_ci } 1088c2ecf20Sopenharmony_ci} 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/** 1118c2ecf20Sopenharmony_ci * snd_usb_endpoint_implicit_feedback_sink: Report endpoint usage type 1128c2ecf20Sopenharmony_ci * 1138c2ecf20Sopenharmony_ci * @ep: The snd_usb_endpoint 1148c2ecf20Sopenharmony_ci * 1158c2ecf20Sopenharmony_ci * Determine whether an endpoint is driven by an implicit feedback 1168c2ecf20Sopenharmony_ci * data endpoint source. 1178c2ecf20Sopenharmony_ci */ 1188c2ecf20Sopenharmony_ciint snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep) 1198c2ecf20Sopenharmony_ci{ 1208c2ecf20Sopenharmony_ci return ep->sync_master && 1218c2ecf20Sopenharmony_ci ep->sync_master->type == SND_USB_ENDPOINT_TYPE_DATA && 1228c2ecf20Sopenharmony_ci ep->type == SND_USB_ENDPOINT_TYPE_DATA && 1238c2ecf20Sopenharmony_ci usb_pipeout(ep->pipe); 1248c2ecf20Sopenharmony_ci} 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci/* 1278c2ecf20Sopenharmony_ci * For streaming based on information derived from sync endpoints, 1288c2ecf20Sopenharmony_ci * prepare_outbound_urb_sizes() will call slave_next_packet_size() to 1298c2ecf20Sopenharmony_ci * determine the number of samples to be sent in the next packet. 1308c2ecf20Sopenharmony_ci * 1318c2ecf20Sopenharmony_ci * For implicit feedback, slave_next_packet_size() is unused. 1328c2ecf20Sopenharmony_ci */ 1338c2ecf20Sopenharmony_ciint snd_usb_endpoint_slave_next_packet_size(struct snd_usb_endpoint *ep) 1348c2ecf20Sopenharmony_ci{ 1358c2ecf20Sopenharmony_ci unsigned long flags; 1368c2ecf20Sopenharmony_ci int ret; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci if (ep->fill_max) 1398c2ecf20Sopenharmony_ci return ep->maxframesize; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci spin_lock_irqsave(&ep->lock, flags); 1428c2ecf20Sopenharmony_ci ep->phase = (ep->phase & 0xffff) 1438c2ecf20Sopenharmony_ci + (ep->freqm << ep->datainterval); 1448c2ecf20Sopenharmony_ci ret = min(ep->phase >> 16, ep->maxframesize); 1458c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&ep->lock, flags); 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci return ret; 1488c2ecf20Sopenharmony_ci} 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci/* 1518c2ecf20Sopenharmony_ci * For adaptive and synchronous endpoints, prepare_outbound_urb_sizes() 1528c2ecf20Sopenharmony_ci * will call next_packet_size() to determine the number of samples to be 1538c2ecf20Sopenharmony_ci * sent in the next packet. 1548c2ecf20Sopenharmony_ci */ 1558c2ecf20Sopenharmony_ciint snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep) 1568c2ecf20Sopenharmony_ci{ 1578c2ecf20Sopenharmony_ci int ret; 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci if (ep->fill_max) 1608c2ecf20Sopenharmony_ci return ep->maxframesize; 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci ep->sample_accum += ep->sample_rem; 1638c2ecf20Sopenharmony_ci if (ep->sample_accum >= ep->pps) { 1648c2ecf20Sopenharmony_ci ep->sample_accum -= ep->pps; 1658c2ecf20Sopenharmony_ci ret = ep->packsize[1]; 1668c2ecf20Sopenharmony_ci } else { 1678c2ecf20Sopenharmony_ci ret = ep->packsize[0]; 1688c2ecf20Sopenharmony_ci } 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci return ret; 1718c2ecf20Sopenharmony_ci} 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_cistatic void retire_outbound_urb(struct snd_usb_endpoint *ep, 1748c2ecf20Sopenharmony_ci struct snd_urb_ctx *urb_ctx) 1758c2ecf20Sopenharmony_ci{ 1768c2ecf20Sopenharmony_ci if (ep->retire_data_urb) 1778c2ecf20Sopenharmony_ci ep->retire_data_urb(ep->data_subs, urb_ctx->urb); 1788c2ecf20Sopenharmony_ci} 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic void retire_inbound_urb(struct snd_usb_endpoint *ep, 1818c2ecf20Sopenharmony_ci struct snd_urb_ctx *urb_ctx) 1828c2ecf20Sopenharmony_ci{ 1838c2ecf20Sopenharmony_ci struct urb *urb = urb_ctx->urb; 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci if (unlikely(ep->skip_packets > 0)) { 1868c2ecf20Sopenharmony_ci ep->skip_packets--; 1878c2ecf20Sopenharmony_ci return; 1888c2ecf20Sopenharmony_ci } 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci if (ep->sync_slave) 1918c2ecf20Sopenharmony_ci snd_usb_handle_sync_urb(ep->sync_slave, ep, urb); 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci if (ep->retire_data_urb) 1948c2ecf20Sopenharmony_ci ep->retire_data_urb(ep->data_subs, urb); 1958c2ecf20Sopenharmony_ci} 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_cistatic void prepare_silent_urb(struct snd_usb_endpoint *ep, 1988c2ecf20Sopenharmony_ci struct snd_urb_ctx *ctx) 1998c2ecf20Sopenharmony_ci{ 2008c2ecf20Sopenharmony_ci struct urb *urb = ctx->urb; 2018c2ecf20Sopenharmony_ci unsigned int offs = 0; 2028c2ecf20Sopenharmony_ci unsigned int extra = 0; 2038c2ecf20Sopenharmony_ci __le32 packet_length; 2048c2ecf20Sopenharmony_ci int i; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci /* For tx_length_quirk, put packet length at start of packet */ 2078c2ecf20Sopenharmony_ci if (ep->chip->tx_length_quirk) 2088c2ecf20Sopenharmony_ci extra = sizeof(packet_length); 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci for (i = 0; i < ctx->packets; ++i) { 2118c2ecf20Sopenharmony_ci unsigned int offset; 2128c2ecf20Sopenharmony_ci unsigned int length; 2138c2ecf20Sopenharmony_ci int counts; 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci if (ctx->packet_size[i]) 2168c2ecf20Sopenharmony_ci counts = ctx->packet_size[i]; 2178c2ecf20Sopenharmony_ci else if (ep->sync_master) 2188c2ecf20Sopenharmony_ci counts = snd_usb_endpoint_slave_next_packet_size(ep); 2198c2ecf20Sopenharmony_ci else 2208c2ecf20Sopenharmony_ci counts = snd_usb_endpoint_next_packet_size(ep); 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci length = counts * ep->stride; /* number of silent bytes */ 2238c2ecf20Sopenharmony_ci offset = offs * ep->stride + extra * i; 2248c2ecf20Sopenharmony_ci urb->iso_frame_desc[i].offset = offset; 2258c2ecf20Sopenharmony_ci urb->iso_frame_desc[i].length = length + extra; 2268c2ecf20Sopenharmony_ci if (extra) { 2278c2ecf20Sopenharmony_ci packet_length = cpu_to_le32(length); 2288c2ecf20Sopenharmony_ci memcpy(urb->transfer_buffer + offset, 2298c2ecf20Sopenharmony_ci &packet_length, sizeof(packet_length)); 2308c2ecf20Sopenharmony_ci } 2318c2ecf20Sopenharmony_ci memset(urb->transfer_buffer + offset + extra, 2328c2ecf20Sopenharmony_ci ep->silence_value, length); 2338c2ecf20Sopenharmony_ci offs += counts; 2348c2ecf20Sopenharmony_ci } 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci urb->number_of_packets = ctx->packets; 2378c2ecf20Sopenharmony_ci urb->transfer_buffer_length = offs * ep->stride + ctx->packets * extra; 2388c2ecf20Sopenharmony_ci} 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci/* 2418c2ecf20Sopenharmony_ci * Prepare a PLAYBACK urb for submission to the bus. 2428c2ecf20Sopenharmony_ci */ 2438c2ecf20Sopenharmony_cistatic void prepare_outbound_urb(struct snd_usb_endpoint *ep, 2448c2ecf20Sopenharmony_ci struct snd_urb_ctx *ctx) 2458c2ecf20Sopenharmony_ci{ 2468c2ecf20Sopenharmony_ci struct urb *urb = ctx->urb; 2478c2ecf20Sopenharmony_ci unsigned char *cp = urb->transfer_buffer; 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci urb->dev = ep->chip->dev; /* we need to set this at each time */ 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci switch (ep->type) { 2528c2ecf20Sopenharmony_ci case SND_USB_ENDPOINT_TYPE_DATA: 2538c2ecf20Sopenharmony_ci if (ep->prepare_data_urb) { 2548c2ecf20Sopenharmony_ci ep->prepare_data_urb(ep->data_subs, urb); 2558c2ecf20Sopenharmony_ci } else { 2568c2ecf20Sopenharmony_ci /* no data provider, so send silence */ 2578c2ecf20Sopenharmony_ci prepare_silent_urb(ep, ctx); 2588c2ecf20Sopenharmony_ci } 2598c2ecf20Sopenharmony_ci break; 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci case SND_USB_ENDPOINT_TYPE_SYNC: 2628c2ecf20Sopenharmony_ci if (snd_usb_get_speed(ep->chip->dev) >= USB_SPEED_HIGH) { 2638c2ecf20Sopenharmony_ci /* 2648c2ecf20Sopenharmony_ci * fill the length and offset of each urb descriptor. 2658c2ecf20Sopenharmony_ci * the fixed 12.13 frequency is passed as 16.16 through the pipe. 2668c2ecf20Sopenharmony_ci */ 2678c2ecf20Sopenharmony_ci urb->iso_frame_desc[0].length = 4; 2688c2ecf20Sopenharmony_ci urb->iso_frame_desc[0].offset = 0; 2698c2ecf20Sopenharmony_ci cp[0] = ep->freqn; 2708c2ecf20Sopenharmony_ci cp[1] = ep->freqn >> 8; 2718c2ecf20Sopenharmony_ci cp[2] = ep->freqn >> 16; 2728c2ecf20Sopenharmony_ci cp[3] = ep->freqn >> 24; 2738c2ecf20Sopenharmony_ci } else { 2748c2ecf20Sopenharmony_ci /* 2758c2ecf20Sopenharmony_ci * fill the length and offset of each urb descriptor. 2768c2ecf20Sopenharmony_ci * the fixed 10.14 frequency is passed through the pipe. 2778c2ecf20Sopenharmony_ci */ 2788c2ecf20Sopenharmony_ci urb->iso_frame_desc[0].length = 3; 2798c2ecf20Sopenharmony_ci urb->iso_frame_desc[0].offset = 0; 2808c2ecf20Sopenharmony_ci cp[0] = ep->freqn >> 2; 2818c2ecf20Sopenharmony_ci cp[1] = ep->freqn >> 10; 2828c2ecf20Sopenharmony_ci cp[2] = ep->freqn >> 18; 2838c2ecf20Sopenharmony_ci } 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci break; 2868c2ecf20Sopenharmony_ci } 2878c2ecf20Sopenharmony_ci} 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci/* 2908c2ecf20Sopenharmony_ci * Prepare a CAPTURE or SYNC urb for submission to the bus. 2918c2ecf20Sopenharmony_ci */ 2928c2ecf20Sopenharmony_cistatic inline void prepare_inbound_urb(struct snd_usb_endpoint *ep, 2938c2ecf20Sopenharmony_ci struct snd_urb_ctx *urb_ctx) 2948c2ecf20Sopenharmony_ci{ 2958c2ecf20Sopenharmony_ci int i, offs; 2968c2ecf20Sopenharmony_ci struct urb *urb = urb_ctx->urb; 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_ci urb->dev = ep->chip->dev; /* we need to set this at each time */ 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci switch (ep->type) { 3018c2ecf20Sopenharmony_ci case SND_USB_ENDPOINT_TYPE_DATA: 3028c2ecf20Sopenharmony_ci offs = 0; 3038c2ecf20Sopenharmony_ci for (i = 0; i < urb_ctx->packets; i++) { 3048c2ecf20Sopenharmony_ci urb->iso_frame_desc[i].offset = offs; 3058c2ecf20Sopenharmony_ci urb->iso_frame_desc[i].length = ep->curpacksize; 3068c2ecf20Sopenharmony_ci offs += ep->curpacksize; 3078c2ecf20Sopenharmony_ci } 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci urb->transfer_buffer_length = offs; 3108c2ecf20Sopenharmony_ci urb->number_of_packets = urb_ctx->packets; 3118c2ecf20Sopenharmony_ci break; 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci case SND_USB_ENDPOINT_TYPE_SYNC: 3148c2ecf20Sopenharmony_ci urb->iso_frame_desc[0].length = min(4u, ep->syncmaxsize); 3158c2ecf20Sopenharmony_ci urb->iso_frame_desc[0].offset = 0; 3168c2ecf20Sopenharmony_ci break; 3178c2ecf20Sopenharmony_ci } 3188c2ecf20Sopenharmony_ci} 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci/* 3218c2ecf20Sopenharmony_ci * Send output urbs that have been prepared previously. URBs are dequeued 3228c2ecf20Sopenharmony_ci * from ep->ready_playback_urbs and in case there aren't any available 3238c2ecf20Sopenharmony_ci * or there are no packets that have been prepared, this function does 3248c2ecf20Sopenharmony_ci * nothing. 3258c2ecf20Sopenharmony_ci * 3268c2ecf20Sopenharmony_ci * The reason why the functionality of sending and preparing URBs is separated 3278c2ecf20Sopenharmony_ci * is that host controllers don't guarantee the order in which they return 3288c2ecf20Sopenharmony_ci * inbound and outbound packets to their submitters. 3298c2ecf20Sopenharmony_ci * 3308c2ecf20Sopenharmony_ci * This function is only used for implicit feedback endpoints. For endpoints 3318c2ecf20Sopenharmony_ci * driven by dedicated sync endpoints, URBs are immediately re-submitted 3328c2ecf20Sopenharmony_ci * from their completion handler. 3338c2ecf20Sopenharmony_ci */ 3348c2ecf20Sopenharmony_cistatic void queue_pending_output_urbs(struct snd_usb_endpoint *ep) 3358c2ecf20Sopenharmony_ci{ 3368c2ecf20Sopenharmony_ci while (test_bit(EP_FLAG_RUNNING, &ep->flags)) { 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci unsigned long flags; 3398c2ecf20Sopenharmony_ci struct snd_usb_packet_info *packet; 3408c2ecf20Sopenharmony_ci struct snd_urb_ctx *ctx = NULL; 3418c2ecf20Sopenharmony_ci int err, i; 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci spin_lock_irqsave(&ep->lock, flags); 3448c2ecf20Sopenharmony_ci if (ep->next_packet_read_pos != ep->next_packet_write_pos) { 3458c2ecf20Sopenharmony_ci packet = ep->next_packet + ep->next_packet_read_pos; 3468c2ecf20Sopenharmony_ci ep->next_packet_read_pos++; 3478c2ecf20Sopenharmony_ci ep->next_packet_read_pos %= MAX_URBS; 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci /* take URB out of FIFO */ 3508c2ecf20Sopenharmony_ci if (!list_empty(&ep->ready_playback_urbs)) { 3518c2ecf20Sopenharmony_ci ctx = list_first_entry(&ep->ready_playback_urbs, 3528c2ecf20Sopenharmony_ci struct snd_urb_ctx, ready_list); 3538c2ecf20Sopenharmony_ci list_del_init(&ctx->ready_list); 3548c2ecf20Sopenharmony_ci } 3558c2ecf20Sopenharmony_ci } 3568c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&ep->lock, flags); 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_ci if (ctx == NULL) 3598c2ecf20Sopenharmony_ci return; 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci /* copy over the length information */ 3628c2ecf20Sopenharmony_ci for (i = 0; i < packet->packets; i++) 3638c2ecf20Sopenharmony_ci ctx->packet_size[i] = packet->packet_size[i]; 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci /* call the data handler to fill in playback data */ 3668c2ecf20Sopenharmony_ci prepare_outbound_urb(ep, ctx); 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ci err = usb_submit_urb(ctx->urb, GFP_ATOMIC); 3698c2ecf20Sopenharmony_ci if (err < 0) 3708c2ecf20Sopenharmony_ci usb_audio_err(ep->chip, 3718c2ecf20Sopenharmony_ci "Unable to submit urb #%d: %d (urb %p)\n", 3728c2ecf20Sopenharmony_ci ctx->index, err, ctx->urb); 3738c2ecf20Sopenharmony_ci else 3748c2ecf20Sopenharmony_ci set_bit(ctx->index, &ep->active_mask); 3758c2ecf20Sopenharmony_ci } 3768c2ecf20Sopenharmony_ci} 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci/* 3798c2ecf20Sopenharmony_ci * complete callback for urbs 3808c2ecf20Sopenharmony_ci */ 3818c2ecf20Sopenharmony_cistatic void snd_complete_urb(struct urb *urb) 3828c2ecf20Sopenharmony_ci{ 3838c2ecf20Sopenharmony_ci struct snd_urb_ctx *ctx = urb->context; 3848c2ecf20Sopenharmony_ci struct snd_usb_endpoint *ep = ctx->ep; 3858c2ecf20Sopenharmony_ci struct snd_pcm_substream *substream; 3868c2ecf20Sopenharmony_ci unsigned long flags; 3878c2ecf20Sopenharmony_ci int err; 3888c2ecf20Sopenharmony_ci 3898c2ecf20Sopenharmony_ci if (unlikely(urb->status == -ENOENT || /* unlinked */ 3908c2ecf20Sopenharmony_ci urb->status == -ENODEV || /* device removed */ 3918c2ecf20Sopenharmony_ci urb->status == -ECONNRESET || /* unlinked */ 3928c2ecf20Sopenharmony_ci urb->status == -ESHUTDOWN)) /* device disabled */ 3938c2ecf20Sopenharmony_ci goto exit_clear; 3948c2ecf20Sopenharmony_ci /* device disconnected */ 3958c2ecf20Sopenharmony_ci if (unlikely(atomic_read(&ep->chip->shutdown))) 3968c2ecf20Sopenharmony_ci goto exit_clear; 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ci if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags))) 3998c2ecf20Sopenharmony_ci goto exit_clear; 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_ci if (usb_pipeout(ep->pipe)) { 4028c2ecf20Sopenharmony_ci retire_outbound_urb(ep, ctx); 4038c2ecf20Sopenharmony_ci /* can be stopped during retire callback */ 4048c2ecf20Sopenharmony_ci if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags))) 4058c2ecf20Sopenharmony_ci goto exit_clear; 4068c2ecf20Sopenharmony_ci 4078c2ecf20Sopenharmony_ci if (snd_usb_endpoint_implicit_feedback_sink(ep)) { 4088c2ecf20Sopenharmony_ci spin_lock_irqsave(&ep->lock, flags); 4098c2ecf20Sopenharmony_ci list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs); 4108c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&ep->lock, flags); 4118c2ecf20Sopenharmony_ci queue_pending_output_urbs(ep); 4128c2ecf20Sopenharmony_ci 4138c2ecf20Sopenharmony_ci goto exit_clear; 4148c2ecf20Sopenharmony_ci } 4158c2ecf20Sopenharmony_ci 4168c2ecf20Sopenharmony_ci prepare_outbound_urb(ep, ctx); 4178c2ecf20Sopenharmony_ci /* can be stopped during prepare callback */ 4188c2ecf20Sopenharmony_ci if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags))) 4198c2ecf20Sopenharmony_ci goto exit_clear; 4208c2ecf20Sopenharmony_ci } else { 4218c2ecf20Sopenharmony_ci retire_inbound_urb(ep, ctx); 4228c2ecf20Sopenharmony_ci /* can be stopped during retire callback */ 4238c2ecf20Sopenharmony_ci if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags))) 4248c2ecf20Sopenharmony_ci goto exit_clear; 4258c2ecf20Sopenharmony_ci 4268c2ecf20Sopenharmony_ci prepare_inbound_urb(ep, ctx); 4278c2ecf20Sopenharmony_ci } 4288c2ecf20Sopenharmony_ci 4298c2ecf20Sopenharmony_ci err = usb_submit_urb(urb, GFP_ATOMIC); 4308c2ecf20Sopenharmony_ci if (err == 0) 4318c2ecf20Sopenharmony_ci return; 4328c2ecf20Sopenharmony_ci 4338c2ecf20Sopenharmony_ci usb_audio_err(ep->chip, "cannot submit urb (err = %d)\n", err); 4348c2ecf20Sopenharmony_ci if (ep->data_subs && ep->data_subs->pcm_substream) { 4358c2ecf20Sopenharmony_ci substream = ep->data_subs->pcm_substream; 4368c2ecf20Sopenharmony_ci snd_pcm_stop_xrun(substream); 4378c2ecf20Sopenharmony_ci } 4388c2ecf20Sopenharmony_ci 4398c2ecf20Sopenharmony_ciexit_clear: 4408c2ecf20Sopenharmony_ci clear_bit(ctx->index, &ep->active_mask); 4418c2ecf20Sopenharmony_ci} 4428c2ecf20Sopenharmony_ci 4438c2ecf20Sopenharmony_ci/** 4448c2ecf20Sopenharmony_ci * snd_usb_add_endpoint: Add an endpoint to an USB audio chip 4458c2ecf20Sopenharmony_ci * 4468c2ecf20Sopenharmony_ci * @chip: The chip 4478c2ecf20Sopenharmony_ci * @alts: The USB host interface 4488c2ecf20Sopenharmony_ci * @ep_num: The number of the endpoint to use 4498c2ecf20Sopenharmony_ci * @direction: SNDRV_PCM_STREAM_PLAYBACK or SNDRV_PCM_STREAM_CAPTURE 4508c2ecf20Sopenharmony_ci * @type: SND_USB_ENDPOINT_TYPE_DATA or SND_USB_ENDPOINT_TYPE_SYNC 4518c2ecf20Sopenharmony_ci * 4528c2ecf20Sopenharmony_ci * If the requested endpoint has not been added to the given chip before, 4538c2ecf20Sopenharmony_ci * a new instance is created. Otherwise, a pointer to the previoulsy 4548c2ecf20Sopenharmony_ci * created instance is returned. In case of any error, NULL is returned. 4558c2ecf20Sopenharmony_ci * 4568c2ecf20Sopenharmony_ci * New endpoints will be added to chip->ep_list and must be freed by 4578c2ecf20Sopenharmony_ci * calling snd_usb_endpoint_free(). 4588c2ecf20Sopenharmony_ci * 4598c2ecf20Sopenharmony_ci * For SND_USB_ENDPOINT_TYPE_SYNC, the caller needs to guarantee that 4608c2ecf20Sopenharmony_ci * bNumEndpoints > 1 beforehand. 4618c2ecf20Sopenharmony_ci */ 4628c2ecf20Sopenharmony_cistruct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip, 4638c2ecf20Sopenharmony_ci struct usb_host_interface *alts, 4648c2ecf20Sopenharmony_ci int ep_num, int direction, int type) 4658c2ecf20Sopenharmony_ci{ 4668c2ecf20Sopenharmony_ci struct snd_usb_endpoint *ep; 4678c2ecf20Sopenharmony_ci int is_playback = direction == SNDRV_PCM_STREAM_PLAYBACK; 4688c2ecf20Sopenharmony_ci 4698c2ecf20Sopenharmony_ci if (WARN_ON(!alts)) 4708c2ecf20Sopenharmony_ci return NULL; 4718c2ecf20Sopenharmony_ci 4728c2ecf20Sopenharmony_ci mutex_lock(&chip->mutex); 4738c2ecf20Sopenharmony_ci 4748c2ecf20Sopenharmony_ci list_for_each_entry(ep, &chip->ep_list, list) { 4758c2ecf20Sopenharmony_ci if (ep->ep_num == ep_num && 4768c2ecf20Sopenharmony_ci ep->iface == alts->desc.bInterfaceNumber && 4778c2ecf20Sopenharmony_ci ep->altsetting == alts->desc.bAlternateSetting) { 4788c2ecf20Sopenharmony_ci usb_audio_dbg(ep->chip, 4798c2ecf20Sopenharmony_ci "Re-using EP %x in iface %d,%d @%p\n", 4808c2ecf20Sopenharmony_ci ep_num, ep->iface, ep->altsetting, ep); 4818c2ecf20Sopenharmony_ci goto __exit_unlock; 4828c2ecf20Sopenharmony_ci } 4838c2ecf20Sopenharmony_ci } 4848c2ecf20Sopenharmony_ci 4858c2ecf20Sopenharmony_ci usb_audio_dbg(chip, "Creating new %s %s endpoint #%x\n", 4868c2ecf20Sopenharmony_ci is_playback ? "playback" : "capture", 4878c2ecf20Sopenharmony_ci type == SND_USB_ENDPOINT_TYPE_DATA ? "data" : "sync", 4888c2ecf20Sopenharmony_ci ep_num); 4898c2ecf20Sopenharmony_ci 4908c2ecf20Sopenharmony_ci ep = kzalloc(sizeof(*ep), GFP_KERNEL); 4918c2ecf20Sopenharmony_ci if (!ep) 4928c2ecf20Sopenharmony_ci goto __exit_unlock; 4938c2ecf20Sopenharmony_ci 4948c2ecf20Sopenharmony_ci ep->chip = chip; 4958c2ecf20Sopenharmony_ci spin_lock_init(&ep->lock); 4968c2ecf20Sopenharmony_ci ep->type = type; 4978c2ecf20Sopenharmony_ci ep->ep_num = ep_num; 4988c2ecf20Sopenharmony_ci ep->iface = alts->desc.bInterfaceNumber; 4998c2ecf20Sopenharmony_ci ep->altsetting = alts->desc.bAlternateSetting; 5008c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&ep->ready_playback_urbs); 5018c2ecf20Sopenharmony_ci ep_num &= USB_ENDPOINT_NUMBER_MASK; 5028c2ecf20Sopenharmony_ci 5038c2ecf20Sopenharmony_ci if (is_playback) 5048c2ecf20Sopenharmony_ci ep->pipe = usb_sndisocpipe(chip->dev, ep_num); 5058c2ecf20Sopenharmony_ci else 5068c2ecf20Sopenharmony_ci ep->pipe = usb_rcvisocpipe(chip->dev, ep_num); 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci if (type == SND_USB_ENDPOINT_TYPE_SYNC) { 5098c2ecf20Sopenharmony_ci if (get_endpoint(alts, 1)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE && 5108c2ecf20Sopenharmony_ci get_endpoint(alts, 1)->bRefresh >= 1 && 5118c2ecf20Sopenharmony_ci get_endpoint(alts, 1)->bRefresh <= 9) 5128c2ecf20Sopenharmony_ci ep->syncinterval = get_endpoint(alts, 1)->bRefresh; 5138c2ecf20Sopenharmony_ci else if (snd_usb_get_speed(chip->dev) == USB_SPEED_FULL) 5148c2ecf20Sopenharmony_ci ep->syncinterval = 1; 5158c2ecf20Sopenharmony_ci else if (get_endpoint(alts, 1)->bInterval >= 1 && 5168c2ecf20Sopenharmony_ci get_endpoint(alts, 1)->bInterval <= 16) 5178c2ecf20Sopenharmony_ci ep->syncinterval = get_endpoint(alts, 1)->bInterval - 1; 5188c2ecf20Sopenharmony_ci else 5198c2ecf20Sopenharmony_ci ep->syncinterval = 3; 5208c2ecf20Sopenharmony_ci 5218c2ecf20Sopenharmony_ci ep->syncmaxsize = le16_to_cpu(get_endpoint(alts, 1)->wMaxPacketSize); 5228c2ecf20Sopenharmony_ci } 5238c2ecf20Sopenharmony_ci 5248c2ecf20Sopenharmony_ci list_add_tail(&ep->list, &chip->ep_list); 5258c2ecf20Sopenharmony_ci 5268c2ecf20Sopenharmony_ci ep->is_implicit_feedback = 0; 5278c2ecf20Sopenharmony_ci 5288c2ecf20Sopenharmony_ci__exit_unlock: 5298c2ecf20Sopenharmony_ci mutex_unlock(&chip->mutex); 5308c2ecf20Sopenharmony_ci 5318c2ecf20Sopenharmony_ci return ep; 5328c2ecf20Sopenharmony_ci} 5338c2ecf20Sopenharmony_ci 5348c2ecf20Sopenharmony_ci/* 5358c2ecf20Sopenharmony_ci * wait until all urbs are processed. 5368c2ecf20Sopenharmony_ci */ 5378c2ecf20Sopenharmony_cistatic int wait_clear_urbs(struct snd_usb_endpoint *ep) 5388c2ecf20Sopenharmony_ci{ 5398c2ecf20Sopenharmony_ci unsigned long end_time = jiffies + msecs_to_jiffies(1000); 5408c2ecf20Sopenharmony_ci int alive; 5418c2ecf20Sopenharmony_ci 5428c2ecf20Sopenharmony_ci do { 5438c2ecf20Sopenharmony_ci alive = bitmap_weight(&ep->active_mask, ep->nurbs); 5448c2ecf20Sopenharmony_ci if (!alive) 5458c2ecf20Sopenharmony_ci break; 5468c2ecf20Sopenharmony_ci 5478c2ecf20Sopenharmony_ci schedule_timeout_uninterruptible(1); 5488c2ecf20Sopenharmony_ci } while (time_before(jiffies, end_time)); 5498c2ecf20Sopenharmony_ci 5508c2ecf20Sopenharmony_ci if (alive) 5518c2ecf20Sopenharmony_ci usb_audio_err(ep->chip, 5528c2ecf20Sopenharmony_ci "timeout: still %d active urbs on EP #%x\n", 5538c2ecf20Sopenharmony_ci alive, ep->ep_num); 5548c2ecf20Sopenharmony_ci clear_bit(EP_FLAG_STOPPING, &ep->flags); 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci ep->data_subs = NULL; 5578c2ecf20Sopenharmony_ci ep->sync_slave = NULL; 5588c2ecf20Sopenharmony_ci ep->retire_data_urb = NULL; 5598c2ecf20Sopenharmony_ci ep->prepare_data_urb = NULL; 5608c2ecf20Sopenharmony_ci 5618c2ecf20Sopenharmony_ci return 0; 5628c2ecf20Sopenharmony_ci} 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_ci/* sync the pending stop operation; 5658c2ecf20Sopenharmony_ci * this function itself doesn't trigger the stop operation 5668c2ecf20Sopenharmony_ci */ 5678c2ecf20Sopenharmony_civoid snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep) 5688c2ecf20Sopenharmony_ci{ 5698c2ecf20Sopenharmony_ci if (ep && test_bit(EP_FLAG_STOPPING, &ep->flags)) 5708c2ecf20Sopenharmony_ci wait_clear_urbs(ep); 5718c2ecf20Sopenharmony_ci} 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_ci/* 5748c2ecf20Sopenharmony_ci * unlink active urbs. 5758c2ecf20Sopenharmony_ci */ 5768c2ecf20Sopenharmony_cistatic int deactivate_urbs(struct snd_usb_endpoint *ep, bool force) 5778c2ecf20Sopenharmony_ci{ 5788c2ecf20Sopenharmony_ci unsigned int i; 5798c2ecf20Sopenharmony_ci 5808c2ecf20Sopenharmony_ci clear_bit(EP_FLAG_RUNNING, &ep->flags); 5818c2ecf20Sopenharmony_ci 5828c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&ep->ready_playback_urbs); 5838c2ecf20Sopenharmony_ci ep->next_packet_read_pos = 0; 5848c2ecf20Sopenharmony_ci ep->next_packet_write_pos = 0; 5858c2ecf20Sopenharmony_ci 5868c2ecf20Sopenharmony_ci for (i = 0; i < ep->nurbs; i++) { 5878c2ecf20Sopenharmony_ci if (test_bit(i, &ep->active_mask)) { 5888c2ecf20Sopenharmony_ci if (!test_and_set_bit(i, &ep->unlink_mask)) { 5898c2ecf20Sopenharmony_ci struct urb *u = ep->urb[i].urb; 5908c2ecf20Sopenharmony_ci usb_unlink_urb(u); 5918c2ecf20Sopenharmony_ci } 5928c2ecf20Sopenharmony_ci } 5938c2ecf20Sopenharmony_ci } 5948c2ecf20Sopenharmony_ci 5958c2ecf20Sopenharmony_ci return 0; 5968c2ecf20Sopenharmony_ci} 5978c2ecf20Sopenharmony_ci 5988c2ecf20Sopenharmony_ci/* 5998c2ecf20Sopenharmony_ci * release an endpoint's urbs 6008c2ecf20Sopenharmony_ci */ 6018c2ecf20Sopenharmony_cistatic void release_urbs(struct snd_usb_endpoint *ep, int force) 6028c2ecf20Sopenharmony_ci{ 6038c2ecf20Sopenharmony_ci int i; 6048c2ecf20Sopenharmony_ci 6058c2ecf20Sopenharmony_ci /* route incoming urbs to nirvana */ 6068c2ecf20Sopenharmony_ci ep->retire_data_urb = NULL; 6078c2ecf20Sopenharmony_ci ep->prepare_data_urb = NULL; 6088c2ecf20Sopenharmony_ci 6098c2ecf20Sopenharmony_ci /* stop urbs */ 6108c2ecf20Sopenharmony_ci deactivate_urbs(ep, force); 6118c2ecf20Sopenharmony_ci wait_clear_urbs(ep); 6128c2ecf20Sopenharmony_ci 6138c2ecf20Sopenharmony_ci for (i = 0; i < ep->nurbs; i++) 6148c2ecf20Sopenharmony_ci release_urb_ctx(&ep->urb[i]); 6158c2ecf20Sopenharmony_ci 6168c2ecf20Sopenharmony_ci usb_free_coherent(ep->chip->dev, SYNC_URBS * 4, 6178c2ecf20Sopenharmony_ci ep->syncbuf, ep->sync_dma); 6188c2ecf20Sopenharmony_ci 6198c2ecf20Sopenharmony_ci ep->syncbuf = NULL; 6208c2ecf20Sopenharmony_ci ep->nurbs = 0; 6218c2ecf20Sopenharmony_ci} 6228c2ecf20Sopenharmony_ci 6238c2ecf20Sopenharmony_ci/* 6248c2ecf20Sopenharmony_ci * Check data endpoint for format differences 6258c2ecf20Sopenharmony_ci */ 6268c2ecf20Sopenharmony_cistatic bool check_ep_params(struct snd_usb_endpoint *ep, 6278c2ecf20Sopenharmony_ci snd_pcm_format_t pcm_format, 6288c2ecf20Sopenharmony_ci unsigned int channels, 6298c2ecf20Sopenharmony_ci unsigned int period_bytes, 6308c2ecf20Sopenharmony_ci unsigned int frames_per_period, 6318c2ecf20Sopenharmony_ci unsigned int periods_per_buffer, 6328c2ecf20Sopenharmony_ci struct audioformat *fmt, 6338c2ecf20Sopenharmony_ci struct snd_usb_endpoint *sync_ep) 6348c2ecf20Sopenharmony_ci{ 6358c2ecf20Sopenharmony_ci unsigned int maxsize, minsize, packs_per_ms, max_packs_per_urb; 6368c2ecf20Sopenharmony_ci unsigned int max_packs_per_period, urbs_per_period, urb_packs; 6378c2ecf20Sopenharmony_ci unsigned int max_urbs; 6388c2ecf20Sopenharmony_ci int frame_bits = snd_pcm_format_physical_width(pcm_format) * channels; 6398c2ecf20Sopenharmony_ci int tx_length_quirk = (ep->chip->tx_length_quirk && 6408c2ecf20Sopenharmony_ci usb_pipeout(ep->pipe)); 6418c2ecf20Sopenharmony_ci bool ret = 1; 6428c2ecf20Sopenharmony_ci 6438c2ecf20Sopenharmony_ci if (pcm_format == SNDRV_PCM_FORMAT_DSD_U16_LE && fmt->dsd_dop) { 6448c2ecf20Sopenharmony_ci /* 6458c2ecf20Sopenharmony_ci * When operating in DSD DOP mode, the size of a sample frame 6468c2ecf20Sopenharmony_ci * in hardware differs from the actual physical format width 6478c2ecf20Sopenharmony_ci * because we need to make room for the DOP markers. 6488c2ecf20Sopenharmony_ci */ 6498c2ecf20Sopenharmony_ci frame_bits += channels << 3; 6508c2ecf20Sopenharmony_ci } 6518c2ecf20Sopenharmony_ci 6528c2ecf20Sopenharmony_ci ret = ret && (ep->datainterval == fmt->datainterval); 6538c2ecf20Sopenharmony_ci ret = ret && (ep->stride == frame_bits >> 3); 6548c2ecf20Sopenharmony_ci 6558c2ecf20Sopenharmony_ci switch (pcm_format) { 6568c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_U8: 6578c2ecf20Sopenharmony_ci ret = ret && (ep->silence_value == 0x80); 6588c2ecf20Sopenharmony_ci break; 6598c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U8: 6608c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U16_LE: 6618c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U32_LE: 6628c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U16_BE: 6638c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U32_BE: 6648c2ecf20Sopenharmony_ci ret = ret && (ep->silence_value == 0x69); 6658c2ecf20Sopenharmony_ci break; 6668c2ecf20Sopenharmony_ci default: 6678c2ecf20Sopenharmony_ci ret = ret && (ep->silence_value == 0); 6688c2ecf20Sopenharmony_ci } 6698c2ecf20Sopenharmony_ci 6708c2ecf20Sopenharmony_ci /* assume max. frequency is 50% higher than nominal */ 6718c2ecf20Sopenharmony_ci ret = ret && (ep->freqmax == ep->freqn + (ep->freqn >> 1)); 6728c2ecf20Sopenharmony_ci /* Round up freqmax to nearest integer in order to calculate maximum 6738c2ecf20Sopenharmony_ci * packet size, which must represent a whole number of frames. 6748c2ecf20Sopenharmony_ci * This is accomplished by adding 0x0.ffff before converting the 6758c2ecf20Sopenharmony_ci * Q16.16 format into integer. 6768c2ecf20Sopenharmony_ci * In order to accurately calculate the maximum packet size when 6778c2ecf20Sopenharmony_ci * the data interval is more than 1 (i.e. ep->datainterval > 0), 6788c2ecf20Sopenharmony_ci * multiply by the data interval prior to rounding. For instance, 6798c2ecf20Sopenharmony_ci * a freqmax of 41 kHz will result in a max packet size of 6 (5.125) 6808c2ecf20Sopenharmony_ci * frames with a data interval of 1, but 11 (10.25) frames with a 6818c2ecf20Sopenharmony_ci * data interval of 2. 6828c2ecf20Sopenharmony_ci * (ep->freqmax << ep->datainterval overflows at 8.192 MHz for the 6838c2ecf20Sopenharmony_ci * maximum datainterval value of 3, at USB full speed, higher for 6848c2ecf20Sopenharmony_ci * USB high speed, noting that ep->freqmax is in units of 6858c2ecf20Sopenharmony_ci * frames per packet in Q16.16 format.) 6868c2ecf20Sopenharmony_ci */ 6878c2ecf20Sopenharmony_ci maxsize = (((ep->freqmax << ep->datainterval) + 0xffff) >> 16) * 6888c2ecf20Sopenharmony_ci (frame_bits >> 3); 6898c2ecf20Sopenharmony_ci if (tx_length_quirk) 6908c2ecf20Sopenharmony_ci maxsize += sizeof(__le32); /* Space for length descriptor */ 6918c2ecf20Sopenharmony_ci /* but wMaxPacketSize might reduce this */ 6928c2ecf20Sopenharmony_ci if (ep->maxpacksize && ep->maxpacksize < maxsize) { 6938c2ecf20Sopenharmony_ci /* whatever fits into a max. size packet */ 6948c2ecf20Sopenharmony_ci unsigned int data_maxsize = maxsize = ep->maxpacksize; 6958c2ecf20Sopenharmony_ci 6968c2ecf20Sopenharmony_ci if (tx_length_quirk) 6978c2ecf20Sopenharmony_ci /* Need to remove the length descriptor to calc freq */ 6988c2ecf20Sopenharmony_ci data_maxsize -= sizeof(__le32); 6998c2ecf20Sopenharmony_ci ret = ret && (ep->freqmax == (data_maxsize / (frame_bits >> 3)) 7008c2ecf20Sopenharmony_ci << (16 - ep->datainterval)); 7018c2ecf20Sopenharmony_ci } 7028c2ecf20Sopenharmony_ci 7038c2ecf20Sopenharmony_ci if (ep->fill_max) 7048c2ecf20Sopenharmony_ci ret = ret && (ep->curpacksize == ep->maxpacksize); 7058c2ecf20Sopenharmony_ci else 7068c2ecf20Sopenharmony_ci ret = ret && (ep->curpacksize == maxsize); 7078c2ecf20Sopenharmony_ci 7088c2ecf20Sopenharmony_ci if (snd_usb_get_speed(ep->chip->dev) != USB_SPEED_FULL) { 7098c2ecf20Sopenharmony_ci packs_per_ms = 8 >> ep->datainterval; 7108c2ecf20Sopenharmony_ci max_packs_per_urb = MAX_PACKS_HS; 7118c2ecf20Sopenharmony_ci } else { 7128c2ecf20Sopenharmony_ci packs_per_ms = 1; 7138c2ecf20Sopenharmony_ci max_packs_per_urb = MAX_PACKS; 7148c2ecf20Sopenharmony_ci } 7158c2ecf20Sopenharmony_ci if (sync_ep && !snd_usb_endpoint_implicit_feedback_sink(ep)) 7168c2ecf20Sopenharmony_ci max_packs_per_urb = min(max_packs_per_urb, 7178c2ecf20Sopenharmony_ci 1U << sync_ep->syncinterval); 7188c2ecf20Sopenharmony_ci max_packs_per_urb = max(1u, max_packs_per_urb >> ep->datainterval); 7198c2ecf20Sopenharmony_ci 7208c2ecf20Sopenharmony_ci /* 7218c2ecf20Sopenharmony_ci * Capture endpoints need to use small URBs because there's no way 7228c2ecf20Sopenharmony_ci * to tell in advance where the next period will end, and we don't 7238c2ecf20Sopenharmony_ci * want the next URB to complete much after the period ends. 7248c2ecf20Sopenharmony_ci * 7258c2ecf20Sopenharmony_ci * Playback endpoints with implicit sync much use the same parameters 7268c2ecf20Sopenharmony_ci * as their corresponding capture endpoint. 7278c2ecf20Sopenharmony_ci */ 7288c2ecf20Sopenharmony_ci if (usb_pipein(ep->pipe) || 7298c2ecf20Sopenharmony_ci snd_usb_endpoint_implicit_feedback_sink(ep)) { 7308c2ecf20Sopenharmony_ci 7318c2ecf20Sopenharmony_ci urb_packs = packs_per_ms; 7328c2ecf20Sopenharmony_ci /* 7338c2ecf20Sopenharmony_ci * Wireless devices can poll at a max rate of once per 4ms. 7348c2ecf20Sopenharmony_ci * For dataintervals less than 5, increase the packet count to 7358c2ecf20Sopenharmony_ci * allow the host controller to use bursting to fill in the 7368c2ecf20Sopenharmony_ci * gaps. 7378c2ecf20Sopenharmony_ci */ 7388c2ecf20Sopenharmony_ci if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_WIRELESS) { 7398c2ecf20Sopenharmony_ci int interval = ep->datainterval; 7408c2ecf20Sopenharmony_ci 7418c2ecf20Sopenharmony_ci while (interval < 5) { 7428c2ecf20Sopenharmony_ci urb_packs <<= 1; 7438c2ecf20Sopenharmony_ci ++interval; 7448c2ecf20Sopenharmony_ci } 7458c2ecf20Sopenharmony_ci } 7468c2ecf20Sopenharmony_ci /* make capture URBs <= 1 ms and smaller than a period */ 7478c2ecf20Sopenharmony_ci urb_packs = min(max_packs_per_urb, urb_packs); 7488c2ecf20Sopenharmony_ci while (urb_packs > 1 && urb_packs * maxsize >= period_bytes) 7498c2ecf20Sopenharmony_ci urb_packs >>= 1; 7508c2ecf20Sopenharmony_ci ret = ret && (ep->nurbs == MAX_URBS); 7518c2ecf20Sopenharmony_ci 7528c2ecf20Sopenharmony_ci /* 7538c2ecf20Sopenharmony_ci * Playback endpoints without implicit sync are adjusted so that 7548c2ecf20Sopenharmony_ci * a period fits as evenly as possible in the smallest number of 7558c2ecf20Sopenharmony_ci * URBs. The total number of URBs is adjusted to the size of the 7568c2ecf20Sopenharmony_ci * ALSA buffer, subject to the MAX_URBS and MAX_QUEUE limits. 7578c2ecf20Sopenharmony_ci */ 7588c2ecf20Sopenharmony_ci } else { 7598c2ecf20Sopenharmony_ci /* determine how small a packet can be */ 7608c2ecf20Sopenharmony_ci minsize = (ep->freqn >> (16 - ep->datainterval)) * 7618c2ecf20Sopenharmony_ci (frame_bits >> 3); 7628c2ecf20Sopenharmony_ci /* with sync from device, assume it can be 12% lower */ 7638c2ecf20Sopenharmony_ci if (sync_ep) 7648c2ecf20Sopenharmony_ci minsize -= minsize >> 3; 7658c2ecf20Sopenharmony_ci minsize = max(minsize, 1u); 7668c2ecf20Sopenharmony_ci 7678c2ecf20Sopenharmony_ci /* how many packets will contain an entire ALSA period? */ 7688c2ecf20Sopenharmony_ci max_packs_per_period = DIV_ROUND_UP(period_bytes, minsize); 7698c2ecf20Sopenharmony_ci 7708c2ecf20Sopenharmony_ci /* how many URBs will contain a period? */ 7718c2ecf20Sopenharmony_ci urbs_per_period = DIV_ROUND_UP(max_packs_per_period, 7728c2ecf20Sopenharmony_ci max_packs_per_urb); 7738c2ecf20Sopenharmony_ci /* how many packets are needed in each URB? */ 7748c2ecf20Sopenharmony_ci urb_packs = DIV_ROUND_UP(max_packs_per_period, urbs_per_period); 7758c2ecf20Sopenharmony_ci 7768c2ecf20Sopenharmony_ci /* limit the number of frames in a single URB */ 7778c2ecf20Sopenharmony_ci ret = ret && (ep->max_urb_frames == 7788c2ecf20Sopenharmony_ci DIV_ROUND_UP(frames_per_period, urbs_per_period)); 7798c2ecf20Sopenharmony_ci 7808c2ecf20Sopenharmony_ci /* try to use enough URBs to contain an entire ALSA buffer */ 7818c2ecf20Sopenharmony_ci max_urbs = min((unsigned) MAX_URBS, 7828c2ecf20Sopenharmony_ci MAX_QUEUE * packs_per_ms / urb_packs); 7838c2ecf20Sopenharmony_ci ret = ret && (ep->nurbs == min(max_urbs, 7848c2ecf20Sopenharmony_ci urbs_per_period * periods_per_buffer)); 7858c2ecf20Sopenharmony_ci } 7868c2ecf20Sopenharmony_ci 7878c2ecf20Sopenharmony_ci ret = ret && (ep->datainterval == fmt->datainterval); 7888c2ecf20Sopenharmony_ci ret = ret && (ep->maxpacksize == fmt->maxpacksize); 7898c2ecf20Sopenharmony_ci ret = ret && 7908c2ecf20Sopenharmony_ci (ep->fill_max == !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX)); 7918c2ecf20Sopenharmony_ci 7928c2ecf20Sopenharmony_ci return ret; 7938c2ecf20Sopenharmony_ci} 7948c2ecf20Sopenharmony_ci 7958c2ecf20Sopenharmony_ci/* 7968c2ecf20Sopenharmony_ci * configure a data endpoint 7978c2ecf20Sopenharmony_ci */ 7988c2ecf20Sopenharmony_cistatic int data_ep_set_params(struct snd_usb_endpoint *ep, 7998c2ecf20Sopenharmony_ci snd_pcm_format_t pcm_format, 8008c2ecf20Sopenharmony_ci unsigned int channels, 8018c2ecf20Sopenharmony_ci unsigned int period_bytes, 8028c2ecf20Sopenharmony_ci unsigned int frames_per_period, 8038c2ecf20Sopenharmony_ci unsigned int periods_per_buffer, 8048c2ecf20Sopenharmony_ci struct audioformat *fmt, 8058c2ecf20Sopenharmony_ci struct snd_usb_endpoint *sync_ep) 8068c2ecf20Sopenharmony_ci{ 8078c2ecf20Sopenharmony_ci unsigned int maxsize, minsize, packs_per_ms, max_packs_per_urb; 8088c2ecf20Sopenharmony_ci unsigned int max_packs_per_period, urbs_per_period, urb_packs; 8098c2ecf20Sopenharmony_ci unsigned int max_urbs, i; 8108c2ecf20Sopenharmony_ci int frame_bits = snd_pcm_format_physical_width(pcm_format) * channels; 8118c2ecf20Sopenharmony_ci int tx_length_quirk = (ep->chip->tx_length_quirk && 8128c2ecf20Sopenharmony_ci usb_pipeout(ep->pipe)); 8138c2ecf20Sopenharmony_ci 8148c2ecf20Sopenharmony_ci if (pcm_format == SNDRV_PCM_FORMAT_DSD_U16_LE && fmt->dsd_dop) { 8158c2ecf20Sopenharmony_ci /* 8168c2ecf20Sopenharmony_ci * When operating in DSD DOP mode, the size of a sample frame 8178c2ecf20Sopenharmony_ci * in hardware differs from the actual physical format width 8188c2ecf20Sopenharmony_ci * because we need to make room for the DOP markers. 8198c2ecf20Sopenharmony_ci */ 8208c2ecf20Sopenharmony_ci frame_bits += channels << 3; 8218c2ecf20Sopenharmony_ci } 8228c2ecf20Sopenharmony_ci 8238c2ecf20Sopenharmony_ci ep->datainterval = fmt->datainterval; 8248c2ecf20Sopenharmony_ci ep->stride = frame_bits >> 3; 8258c2ecf20Sopenharmony_ci 8268c2ecf20Sopenharmony_ci switch (pcm_format) { 8278c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_U8: 8288c2ecf20Sopenharmony_ci ep->silence_value = 0x80; 8298c2ecf20Sopenharmony_ci break; 8308c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U8: 8318c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U16_LE: 8328c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U32_LE: 8338c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U16_BE: 8348c2ecf20Sopenharmony_ci case SNDRV_PCM_FORMAT_DSD_U32_BE: 8358c2ecf20Sopenharmony_ci ep->silence_value = 0x69; 8368c2ecf20Sopenharmony_ci break; 8378c2ecf20Sopenharmony_ci default: 8388c2ecf20Sopenharmony_ci ep->silence_value = 0; 8398c2ecf20Sopenharmony_ci } 8408c2ecf20Sopenharmony_ci 8418c2ecf20Sopenharmony_ci /* assume max. frequency is 50% higher than nominal */ 8428c2ecf20Sopenharmony_ci ep->freqmax = ep->freqn + (ep->freqn >> 1); 8438c2ecf20Sopenharmony_ci /* Round up freqmax to nearest integer in order to calculate maximum 8448c2ecf20Sopenharmony_ci * packet size, which must represent a whole number of frames. 8458c2ecf20Sopenharmony_ci * This is accomplished by adding 0x0.ffff before converting the 8468c2ecf20Sopenharmony_ci * Q16.16 format into integer. 8478c2ecf20Sopenharmony_ci * In order to accurately calculate the maximum packet size when 8488c2ecf20Sopenharmony_ci * the data interval is more than 1 (i.e. ep->datainterval > 0), 8498c2ecf20Sopenharmony_ci * multiply by the data interval prior to rounding. For instance, 8508c2ecf20Sopenharmony_ci * a freqmax of 41 kHz will result in a max packet size of 6 (5.125) 8518c2ecf20Sopenharmony_ci * frames with a data interval of 1, but 11 (10.25) frames with a 8528c2ecf20Sopenharmony_ci * data interval of 2. 8538c2ecf20Sopenharmony_ci * (ep->freqmax << ep->datainterval overflows at 8.192 MHz for the 8548c2ecf20Sopenharmony_ci * maximum datainterval value of 3, at USB full speed, higher for 8558c2ecf20Sopenharmony_ci * USB high speed, noting that ep->freqmax is in units of 8568c2ecf20Sopenharmony_ci * frames per packet in Q16.16 format.) 8578c2ecf20Sopenharmony_ci */ 8588c2ecf20Sopenharmony_ci maxsize = (((ep->freqmax << ep->datainterval) + 0xffff) >> 16) * 8598c2ecf20Sopenharmony_ci (frame_bits >> 3); 8608c2ecf20Sopenharmony_ci if (tx_length_quirk) 8618c2ecf20Sopenharmony_ci maxsize += sizeof(__le32); /* Space for length descriptor */ 8628c2ecf20Sopenharmony_ci /* but wMaxPacketSize might reduce this */ 8638c2ecf20Sopenharmony_ci if (ep->maxpacksize && ep->maxpacksize < maxsize) { 8648c2ecf20Sopenharmony_ci /* whatever fits into a max. size packet */ 8658c2ecf20Sopenharmony_ci unsigned int data_maxsize = maxsize = ep->maxpacksize; 8668c2ecf20Sopenharmony_ci 8678c2ecf20Sopenharmony_ci if (tx_length_quirk) 8688c2ecf20Sopenharmony_ci /* Need to remove the length descriptor to calc freq */ 8698c2ecf20Sopenharmony_ci data_maxsize -= sizeof(__le32); 8708c2ecf20Sopenharmony_ci ep->freqmax = (data_maxsize / (frame_bits >> 3)) 8718c2ecf20Sopenharmony_ci << (16 - ep->datainterval); 8728c2ecf20Sopenharmony_ci } 8738c2ecf20Sopenharmony_ci 8748c2ecf20Sopenharmony_ci if (ep->fill_max) 8758c2ecf20Sopenharmony_ci ep->curpacksize = ep->maxpacksize; 8768c2ecf20Sopenharmony_ci else 8778c2ecf20Sopenharmony_ci ep->curpacksize = maxsize; 8788c2ecf20Sopenharmony_ci 8798c2ecf20Sopenharmony_ci if (snd_usb_get_speed(ep->chip->dev) != USB_SPEED_FULL) { 8808c2ecf20Sopenharmony_ci packs_per_ms = 8 >> ep->datainterval; 8818c2ecf20Sopenharmony_ci max_packs_per_urb = MAX_PACKS_HS; 8828c2ecf20Sopenharmony_ci } else { 8838c2ecf20Sopenharmony_ci packs_per_ms = 1; 8848c2ecf20Sopenharmony_ci max_packs_per_urb = MAX_PACKS; 8858c2ecf20Sopenharmony_ci } 8868c2ecf20Sopenharmony_ci if (sync_ep && !snd_usb_endpoint_implicit_feedback_sink(ep)) 8878c2ecf20Sopenharmony_ci max_packs_per_urb = min(max_packs_per_urb, 8888c2ecf20Sopenharmony_ci 1U << sync_ep->syncinterval); 8898c2ecf20Sopenharmony_ci max_packs_per_urb = max(1u, max_packs_per_urb >> ep->datainterval); 8908c2ecf20Sopenharmony_ci 8918c2ecf20Sopenharmony_ci /* 8928c2ecf20Sopenharmony_ci * Capture endpoints need to use small URBs because there's no way 8938c2ecf20Sopenharmony_ci * to tell in advance where the next period will end, and we don't 8948c2ecf20Sopenharmony_ci * want the next URB to complete much after the period ends. 8958c2ecf20Sopenharmony_ci * 8968c2ecf20Sopenharmony_ci * Playback endpoints with implicit sync much use the same parameters 8978c2ecf20Sopenharmony_ci * as their corresponding capture endpoint. 8988c2ecf20Sopenharmony_ci */ 8998c2ecf20Sopenharmony_ci if (usb_pipein(ep->pipe) || 9008c2ecf20Sopenharmony_ci snd_usb_endpoint_implicit_feedback_sink(ep)) { 9018c2ecf20Sopenharmony_ci 9028c2ecf20Sopenharmony_ci urb_packs = packs_per_ms; 9038c2ecf20Sopenharmony_ci /* 9048c2ecf20Sopenharmony_ci * Wireless devices can poll at a max rate of once per 4ms. 9058c2ecf20Sopenharmony_ci * For dataintervals less than 5, increase the packet count to 9068c2ecf20Sopenharmony_ci * allow the host controller to use bursting to fill in the 9078c2ecf20Sopenharmony_ci * gaps. 9088c2ecf20Sopenharmony_ci */ 9098c2ecf20Sopenharmony_ci if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_WIRELESS) { 9108c2ecf20Sopenharmony_ci int interval = ep->datainterval; 9118c2ecf20Sopenharmony_ci while (interval < 5) { 9128c2ecf20Sopenharmony_ci urb_packs <<= 1; 9138c2ecf20Sopenharmony_ci ++interval; 9148c2ecf20Sopenharmony_ci } 9158c2ecf20Sopenharmony_ci } 9168c2ecf20Sopenharmony_ci /* make capture URBs <= 1 ms and smaller than a period */ 9178c2ecf20Sopenharmony_ci urb_packs = min(max_packs_per_urb, urb_packs); 9188c2ecf20Sopenharmony_ci while (urb_packs > 1 && urb_packs * maxsize >= period_bytes) 9198c2ecf20Sopenharmony_ci urb_packs >>= 1; 9208c2ecf20Sopenharmony_ci ep->nurbs = MAX_URBS; 9218c2ecf20Sopenharmony_ci 9228c2ecf20Sopenharmony_ci /* 9238c2ecf20Sopenharmony_ci * Playback endpoints without implicit sync are adjusted so that 9248c2ecf20Sopenharmony_ci * a period fits as evenly as possible in the smallest number of 9258c2ecf20Sopenharmony_ci * URBs. The total number of URBs is adjusted to the size of the 9268c2ecf20Sopenharmony_ci * ALSA buffer, subject to the MAX_URBS and MAX_QUEUE limits. 9278c2ecf20Sopenharmony_ci */ 9288c2ecf20Sopenharmony_ci } else { 9298c2ecf20Sopenharmony_ci /* determine how small a packet can be */ 9308c2ecf20Sopenharmony_ci minsize = (ep->freqn >> (16 - ep->datainterval)) * 9318c2ecf20Sopenharmony_ci (frame_bits >> 3); 9328c2ecf20Sopenharmony_ci /* with sync from device, assume it can be 12% lower */ 9338c2ecf20Sopenharmony_ci if (sync_ep) 9348c2ecf20Sopenharmony_ci minsize -= minsize >> 3; 9358c2ecf20Sopenharmony_ci minsize = max(minsize, 1u); 9368c2ecf20Sopenharmony_ci 9378c2ecf20Sopenharmony_ci /* how many packets will contain an entire ALSA period? */ 9388c2ecf20Sopenharmony_ci max_packs_per_period = DIV_ROUND_UP(period_bytes, minsize); 9398c2ecf20Sopenharmony_ci 9408c2ecf20Sopenharmony_ci /* how many URBs will contain a period? */ 9418c2ecf20Sopenharmony_ci urbs_per_period = DIV_ROUND_UP(max_packs_per_period, 9428c2ecf20Sopenharmony_ci max_packs_per_urb); 9438c2ecf20Sopenharmony_ci /* how many packets are needed in each URB? */ 9448c2ecf20Sopenharmony_ci urb_packs = DIV_ROUND_UP(max_packs_per_period, urbs_per_period); 9458c2ecf20Sopenharmony_ci 9468c2ecf20Sopenharmony_ci /* limit the number of frames in a single URB */ 9478c2ecf20Sopenharmony_ci ep->max_urb_frames = DIV_ROUND_UP(frames_per_period, 9488c2ecf20Sopenharmony_ci urbs_per_period); 9498c2ecf20Sopenharmony_ci 9508c2ecf20Sopenharmony_ci /* try to use enough URBs to contain an entire ALSA buffer */ 9518c2ecf20Sopenharmony_ci max_urbs = min((unsigned) MAX_URBS, 9528c2ecf20Sopenharmony_ci MAX_QUEUE * packs_per_ms / urb_packs); 9538c2ecf20Sopenharmony_ci ep->nurbs = min(max_urbs, urbs_per_period * periods_per_buffer); 9548c2ecf20Sopenharmony_ci } 9558c2ecf20Sopenharmony_ci 9568c2ecf20Sopenharmony_ci /* allocate and initialize data urbs */ 9578c2ecf20Sopenharmony_ci for (i = 0; i < ep->nurbs; i++) { 9588c2ecf20Sopenharmony_ci struct snd_urb_ctx *u = &ep->urb[i]; 9598c2ecf20Sopenharmony_ci u->index = i; 9608c2ecf20Sopenharmony_ci u->ep = ep; 9618c2ecf20Sopenharmony_ci u->packets = urb_packs; 9628c2ecf20Sopenharmony_ci u->buffer_size = maxsize * u->packets; 9638c2ecf20Sopenharmony_ci 9648c2ecf20Sopenharmony_ci if (fmt->fmt_type == UAC_FORMAT_TYPE_II) 9658c2ecf20Sopenharmony_ci u->packets++; /* for transfer delimiter */ 9668c2ecf20Sopenharmony_ci u->urb = usb_alloc_urb(u->packets, GFP_KERNEL); 9678c2ecf20Sopenharmony_ci if (!u->urb) 9688c2ecf20Sopenharmony_ci goto out_of_memory; 9698c2ecf20Sopenharmony_ci 9708c2ecf20Sopenharmony_ci u->urb->transfer_buffer = 9718c2ecf20Sopenharmony_ci usb_alloc_coherent(ep->chip->dev, u->buffer_size, 9728c2ecf20Sopenharmony_ci GFP_KERNEL, &u->urb->transfer_dma); 9738c2ecf20Sopenharmony_ci if (!u->urb->transfer_buffer) 9748c2ecf20Sopenharmony_ci goto out_of_memory; 9758c2ecf20Sopenharmony_ci u->urb->pipe = ep->pipe; 9768c2ecf20Sopenharmony_ci u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; 9778c2ecf20Sopenharmony_ci u->urb->interval = 1 << ep->datainterval; 9788c2ecf20Sopenharmony_ci u->urb->context = u; 9798c2ecf20Sopenharmony_ci u->urb->complete = snd_complete_urb; 9808c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&u->ready_list); 9818c2ecf20Sopenharmony_ci } 9828c2ecf20Sopenharmony_ci 9838c2ecf20Sopenharmony_ci return 0; 9848c2ecf20Sopenharmony_ci 9858c2ecf20Sopenharmony_ciout_of_memory: 9868c2ecf20Sopenharmony_ci release_urbs(ep, 0); 9878c2ecf20Sopenharmony_ci return -ENOMEM; 9888c2ecf20Sopenharmony_ci} 9898c2ecf20Sopenharmony_ci 9908c2ecf20Sopenharmony_ci/* 9918c2ecf20Sopenharmony_ci * configure a sync endpoint 9928c2ecf20Sopenharmony_ci */ 9938c2ecf20Sopenharmony_cistatic int sync_ep_set_params(struct snd_usb_endpoint *ep) 9948c2ecf20Sopenharmony_ci{ 9958c2ecf20Sopenharmony_ci int i; 9968c2ecf20Sopenharmony_ci 9978c2ecf20Sopenharmony_ci ep->syncbuf = usb_alloc_coherent(ep->chip->dev, SYNC_URBS * 4, 9988c2ecf20Sopenharmony_ci GFP_KERNEL, &ep->sync_dma); 9998c2ecf20Sopenharmony_ci if (!ep->syncbuf) 10008c2ecf20Sopenharmony_ci return -ENOMEM; 10018c2ecf20Sopenharmony_ci 10028c2ecf20Sopenharmony_ci ep->nurbs = SYNC_URBS; 10038c2ecf20Sopenharmony_ci for (i = 0; i < SYNC_URBS; i++) { 10048c2ecf20Sopenharmony_ci struct snd_urb_ctx *u = &ep->urb[i]; 10058c2ecf20Sopenharmony_ci u->index = i; 10068c2ecf20Sopenharmony_ci u->ep = ep; 10078c2ecf20Sopenharmony_ci u->packets = 1; 10088c2ecf20Sopenharmony_ci u->urb = usb_alloc_urb(1, GFP_KERNEL); 10098c2ecf20Sopenharmony_ci if (!u->urb) 10108c2ecf20Sopenharmony_ci goto out_of_memory; 10118c2ecf20Sopenharmony_ci u->urb->transfer_buffer = ep->syncbuf + i * 4; 10128c2ecf20Sopenharmony_ci u->urb->transfer_dma = ep->sync_dma + i * 4; 10138c2ecf20Sopenharmony_ci u->urb->transfer_buffer_length = 4; 10148c2ecf20Sopenharmony_ci u->urb->pipe = ep->pipe; 10158c2ecf20Sopenharmony_ci u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; 10168c2ecf20Sopenharmony_ci u->urb->number_of_packets = 1; 10178c2ecf20Sopenharmony_ci u->urb->interval = 1 << ep->syncinterval; 10188c2ecf20Sopenharmony_ci u->urb->context = u; 10198c2ecf20Sopenharmony_ci u->urb->complete = snd_complete_urb; 10208c2ecf20Sopenharmony_ci } 10218c2ecf20Sopenharmony_ci 10228c2ecf20Sopenharmony_ci return 0; 10238c2ecf20Sopenharmony_ci 10248c2ecf20Sopenharmony_ciout_of_memory: 10258c2ecf20Sopenharmony_ci release_urbs(ep, 0); 10268c2ecf20Sopenharmony_ci return -ENOMEM; 10278c2ecf20Sopenharmony_ci} 10288c2ecf20Sopenharmony_ci 10298c2ecf20Sopenharmony_ci/** 10308c2ecf20Sopenharmony_ci * snd_usb_endpoint_set_params: configure an snd_usb_endpoint 10318c2ecf20Sopenharmony_ci * 10328c2ecf20Sopenharmony_ci * @ep: the snd_usb_endpoint to configure 10338c2ecf20Sopenharmony_ci * @pcm_format: the audio fomat. 10348c2ecf20Sopenharmony_ci * @channels: the number of audio channels. 10358c2ecf20Sopenharmony_ci * @period_bytes: the number of bytes in one alsa period. 10368c2ecf20Sopenharmony_ci * @period_frames: the number of frames in one alsa period. 10378c2ecf20Sopenharmony_ci * @buffer_periods: the number of periods in one alsa buffer. 10388c2ecf20Sopenharmony_ci * @rate: the frame rate. 10398c2ecf20Sopenharmony_ci * @fmt: the USB audio format information 10408c2ecf20Sopenharmony_ci * @sync_ep: the sync endpoint to use, if any 10418c2ecf20Sopenharmony_ci * 10428c2ecf20Sopenharmony_ci * Determine the number of URBs to be used on this endpoint. 10438c2ecf20Sopenharmony_ci * An endpoint must be configured before it can be started. 10448c2ecf20Sopenharmony_ci * An endpoint that is already running can not be reconfigured. 10458c2ecf20Sopenharmony_ci */ 10468c2ecf20Sopenharmony_ciint snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, 10478c2ecf20Sopenharmony_ci snd_pcm_format_t pcm_format, 10488c2ecf20Sopenharmony_ci unsigned int channels, 10498c2ecf20Sopenharmony_ci unsigned int period_bytes, 10508c2ecf20Sopenharmony_ci unsigned int period_frames, 10518c2ecf20Sopenharmony_ci unsigned int buffer_periods, 10528c2ecf20Sopenharmony_ci unsigned int rate, 10538c2ecf20Sopenharmony_ci struct audioformat *fmt, 10548c2ecf20Sopenharmony_ci struct snd_usb_endpoint *sync_ep) 10558c2ecf20Sopenharmony_ci{ 10568c2ecf20Sopenharmony_ci int err; 10578c2ecf20Sopenharmony_ci 10588c2ecf20Sopenharmony_ci if (ep->use_count != 0) { 10598c2ecf20Sopenharmony_ci bool check = ep->is_implicit_feedback && 10608c2ecf20Sopenharmony_ci check_ep_params(ep, pcm_format, 10618c2ecf20Sopenharmony_ci channels, period_bytes, 10628c2ecf20Sopenharmony_ci period_frames, buffer_periods, 10638c2ecf20Sopenharmony_ci fmt, sync_ep); 10648c2ecf20Sopenharmony_ci 10658c2ecf20Sopenharmony_ci if (!check) { 10668c2ecf20Sopenharmony_ci usb_audio_warn(ep->chip, 10678c2ecf20Sopenharmony_ci "Unable to change format on ep #%x: already in use\n", 10688c2ecf20Sopenharmony_ci ep->ep_num); 10698c2ecf20Sopenharmony_ci return -EBUSY; 10708c2ecf20Sopenharmony_ci } 10718c2ecf20Sopenharmony_ci 10728c2ecf20Sopenharmony_ci usb_audio_dbg(ep->chip, 10738c2ecf20Sopenharmony_ci "Ep #%x already in use as implicit feedback but format not changed\n", 10748c2ecf20Sopenharmony_ci ep->ep_num); 10758c2ecf20Sopenharmony_ci return 0; 10768c2ecf20Sopenharmony_ci } 10778c2ecf20Sopenharmony_ci 10788c2ecf20Sopenharmony_ci /* release old buffers, if any */ 10798c2ecf20Sopenharmony_ci release_urbs(ep, 0); 10808c2ecf20Sopenharmony_ci 10818c2ecf20Sopenharmony_ci ep->datainterval = fmt->datainterval; 10828c2ecf20Sopenharmony_ci ep->maxpacksize = fmt->maxpacksize; 10838c2ecf20Sopenharmony_ci ep->fill_max = !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX); 10848c2ecf20Sopenharmony_ci 10858c2ecf20Sopenharmony_ci if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_FULL) { 10868c2ecf20Sopenharmony_ci ep->freqn = get_usb_full_speed_rate(rate); 10878c2ecf20Sopenharmony_ci ep->pps = 1000 >> ep->datainterval; 10888c2ecf20Sopenharmony_ci } else { 10898c2ecf20Sopenharmony_ci ep->freqn = get_usb_high_speed_rate(rate); 10908c2ecf20Sopenharmony_ci ep->pps = 8000 >> ep->datainterval; 10918c2ecf20Sopenharmony_ci } 10928c2ecf20Sopenharmony_ci 10938c2ecf20Sopenharmony_ci ep->sample_rem = rate % ep->pps; 10948c2ecf20Sopenharmony_ci ep->packsize[0] = rate / ep->pps; 10958c2ecf20Sopenharmony_ci ep->packsize[1] = (rate + (ep->pps - 1)) / ep->pps; 10968c2ecf20Sopenharmony_ci 10978c2ecf20Sopenharmony_ci /* calculate the frequency in 16.16 format */ 10988c2ecf20Sopenharmony_ci ep->freqm = ep->freqn; 10998c2ecf20Sopenharmony_ci ep->freqshift = INT_MIN; 11008c2ecf20Sopenharmony_ci 11018c2ecf20Sopenharmony_ci ep->phase = 0; 11028c2ecf20Sopenharmony_ci 11038c2ecf20Sopenharmony_ci switch (ep->type) { 11048c2ecf20Sopenharmony_ci case SND_USB_ENDPOINT_TYPE_DATA: 11058c2ecf20Sopenharmony_ci err = data_ep_set_params(ep, pcm_format, channels, 11068c2ecf20Sopenharmony_ci period_bytes, period_frames, 11078c2ecf20Sopenharmony_ci buffer_periods, fmt, sync_ep); 11088c2ecf20Sopenharmony_ci break; 11098c2ecf20Sopenharmony_ci case SND_USB_ENDPOINT_TYPE_SYNC: 11108c2ecf20Sopenharmony_ci err = sync_ep_set_params(ep); 11118c2ecf20Sopenharmony_ci break; 11128c2ecf20Sopenharmony_ci default: 11138c2ecf20Sopenharmony_ci err = -EINVAL; 11148c2ecf20Sopenharmony_ci } 11158c2ecf20Sopenharmony_ci 11168c2ecf20Sopenharmony_ci usb_audio_dbg(ep->chip, 11178c2ecf20Sopenharmony_ci "Setting params for ep #%x (type %d, %d urbs), ret=%d\n", 11188c2ecf20Sopenharmony_ci ep->ep_num, ep->type, ep->nurbs, err); 11198c2ecf20Sopenharmony_ci 11208c2ecf20Sopenharmony_ci return err; 11218c2ecf20Sopenharmony_ci} 11228c2ecf20Sopenharmony_ci 11238c2ecf20Sopenharmony_ci/** 11248c2ecf20Sopenharmony_ci * snd_usb_endpoint_start: start an snd_usb_endpoint 11258c2ecf20Sopenharmony_ci * 11268c2ecf20Sopenharmony_ci * @ep: the endpoint to start 11278c2ecf20Sopenharmony_ci * 11288c2ecf20Sopenharmony_ci * A call to this function will increment the use count of the endpoint. 11298c2ecf20Sopenharmony_ci * In case it is not already running, the URBs for this endpoint will be 11308c2ecf20Sopenharmony_ci * submitted. Otherwise, this function does nothing. 11318c2ecf20Sopenharmony_ci * 11328c2ecf20Sopenharmony_ci * Must be balanced to calls of snd_usb_endpoint_stop(). 11338c2ecf20Sopenharmony_ci * 11348c2ecf20Sopenharmony_ci * Returns an error if the URB submission failed, 0 in all other cases. 11358c2ecf20Sopenharmony_ci */ 11368c2ecf20Sopenharmony_ciint snd_usb_endpoint_start(struct snd_usb_endpoint *ep) 11378c2ecf20Sopenharmony_ci{ 11388c2ecf20Sopenharmony_ci int err; 11398c2ecf20Sopenharmony_ci unsigned int i; 11408c2ecf20Sopenharmony_ci 11418c2ecf20Sopenharmony_ci if (atomic_read(&ep->chip->shutdown)) 11428c2ecf20Sopenharmony_ci return -EBADFD; 11438c2ecf20Sopenharmony_ci 11448c2ecf20Sopenharmony_ci /* already running? */ 11458c2ecf20Sopenharmony_ci if (++ep->use_count != 1) 11468c2ecf20Sopenharmony_ci return 0; 11478c2ecf20Sopenharmony_ci 11488c2ecf20Sopenharmony_ci /* just to be sure */ 11498c2ecf20Sopenharmony_ci deactivate_urbs(ep, false); 11508c2ecf20Sopenharmony_ci 11518c2ecf20Sopenharmony_ci ep->active_mask = 0; 11528c2ecf20Sopenharmony_ci ep->unlink_mask = 0; 11538c2ecf20Sopenharmony_ci ep->phase = 0; 11548c2ecf20Sopenharmony_ci ep->sample_accum = 0; 11558c2ecf20Sopenharmony_ci 11568c2ecf20Sopenharmony_ci snd_usb_endpoint_start_quirk(ep); 11578c2ecf20Sopenharmony_ci 11588c2ecf20Sopenharmony_ci /* 11598c2ecf20Sopenharmony_ci * If this endpoint has a data endpoint as implicit feedback source, 11608c2ecf20Sopenharmony_ci * don't start the urbs here. Instead, mark them all as available, 11618c2ecf20Sopenharmony_ci * wait for the record urbs to return and queue the playback urbs 11628c2ecf20Sopenharmony_ci * from that context. 11638c2ecf20Sopenharmony_ci */ 11648c2ecf20Sopenharmony_ci 11658c2ecf20Sopenharmony_ci set_bit(EP_FLAG_RUNNING, &ep->flags); 11668c2ecf20Sopenharmony_ci 11678c2ecf20Sopenharmony_ci if (snd_usb_endpoint_implicit_feedback_sink(ep)) { 11688c2ecf20Sopenharmony_ci for (i = 0; i < ep->nurbs; i++) { 11698c2ecf20Sopenharmony_ci struct snd_urb_ctx *ctx = ep->urb + i; 11708c2ecf20Sopenharmony_ci list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs); 11718c2ecf20Sopenharmony_ci } 11728c2ecf20Sopenharmony_ci 11738c2ecf20Sopenharmony_ci return 0; 11748c2ecf20Sopenharmony_ci } 11758c2ecf20Sopenharmony_ci 11768c2ecf20Sopenharmony_ci for (i = 0; i < ep->nurbs; i++) { 11778c2ecf20Sopenharmony_ci struct urb *urb = ep->urb[i].urb; 11788c2ecf20Sopenharmony_ci 11798c2ecf20Sopenharmony_ci if (snd_BUG_ON(!urb)) 11808c2ecf20Sopenharmony_ci goto __error; 11818c2ecf20Sopenharmony_ci 11828c2ecf20Sopenharmony_ci if (usb_pipeout(ep->pipe)) { 11838c2ecf20Sopenharmony_ci prepare_outbound_urb(ep, urb->context); 11848c2ecf20Sopenharmony_ci } else { 11858c2ecf20Sopenharmony_ci prepare_inbound_urb(ep, urb->context); 11868c2ecf20Sopenharmony_ci } 11878c2ecf20Sopenharmony_ci 11888c2ecf20Sopenharmony_ci err = usb_submit_urb(urb, GFP_ATOMIC); 11898c2ecf20Sopenharmony_ci if (err < 0) { 11908c2ecf20Sopenharmony_ci usb_audio_err(ep->chip, 11918c2ecf20Sopenharmony_ci "cannot submit urb %d, error %d: %s\n", 11928c2ecf20Sopenharmony_ci i, err, usb_error_string(err)); 11938c2ecf20Sopenharmony_ci goto __error; 11948c2ecf20Sopenharmony_ci } 11958c2ecf20Sopenharmony_ci set_bit(i, &ep->active_mask); 11968c2ecf20Sopenharmony_ci } 11978c2ecf20Sopenharmony_ci 11988c2ecf20Sopenharmony_ci return 0; 11998c2ecf20Sopenharmony_ci 12008c2ecf20Sopenharmony_ci__error: 12018c2ecf20Sopenharmony_ci clear_bit(EP_FLAG_RUNNING, &ep->flags); 12028c2ecf20Sopenharmony_ci ep->use_count--; 12038c2ecf20Sopenharmony_ci deactivate_urbs(ep, false); 12048c2ecf20Sopenharmony_ci return -EPIPE; 12058c2ecf20Sopenharmony_ci} 12068c2ecf20Sopenharmony_ci 12078c2ecf20Sopenharmony_ci/** 12088c2ecf20Sopenharmony_ci * snd_usb_endpoint_stop: stop an snd_usb_endpoint 12098c2ecf20Sopenharmony_ci * 12108c2ecf20Sopenharmony_ci * @ep: the endpoint to stop (may be NULL) 12118c2ecf20Sopenharmony_ci * 12128c2ecf20Sopenharmony_ci * A call to this function will decrement the use count of the endpoint. 12138c2ecf20Sopenharmony_ci * In case the last user has requested the endpoint stop, the URBs will 12148c2ecf20Sopenharmony_ci * actually be deactivated. 12158c2ecf20Sopenharmony_ci * 12168c2ecf20Sopenharmony_ci * Must be balanced to calls of snd_usb_endpoint_start(). 12178c2ecf20Sopenharmony_ci * 12188c2ecf20Sopenharmony_ci * The caller needs to synchronize the pending stop operation via 12198c2ecf20Sopenharmony_ci * snd_usb_endpoint_sync_pending_stop(). 12208c2ecf20Sopenharmony_ci */ 12218c2ecf20Sopenharmony_civoid snd_usb_endpoint_stop(struct snd_usb_endpoint *ep) 12228c2ecf20Sopenharmony_ci{ 12238c2ecf20Sopenharmony_ci if (!ep) 12248c2ecf20Sopenharmony_ci return; 12258c2ecf20Sopenharmony_ci 12268c2ecf20Sopenharmony_ci if (snd_BUG_ON(ep->use_count == 0)) 12278c2ecf20Sopenharmony_ci return; 12288c2ecf20Sopenharmony_ci 12298c2ecf20Sopenharmony_ci if (--ep->use_count == 0) { 12308c2ecf20Sopenharmony_ci deactivate_urbs(ep, false); 12318c2ecf20Sopenharmony_ci set_bit(EP_FLAG_STOPPING, &ep->flags); 12328c2ecf20Sopenharmony_ci } 12338c2ecf20Sopenharmony_ci} 12348c2ecf20Sopenharmony_ci 12358c2ecf20Sopenharmony_ci/** 12368c2ecf20Sopenharmony_ci * snd_usb_endpoint_deactivate: deactivate an snd_usb_endpoint 12378c2ecf20Sopenharmony_ci * 12388c2ecf20Sopenharmony_ci * @ep: the endpoint to deactivate 12398c2ecf20Sopenharmony_ci * 12408c2ecf20Sopenharmony_ci * If the endpoint is not currently in use, this functions will 12418c2ecf20Sopenharmony_ci * deactivate its associated URBs. 12428c2ecf20Sopenharmony_ci * 12438c2ecf20Sopenharmony_ci * In case of any active users, this functions does nothing. 12448c2ecf20Sopenharmony_ci */ 12458c2ecf20Sopenharmony_civoid snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep) 12468c2ecf20Sopenharmony_ci{ 12478c2ecf20Sopenharmony_ci if (!ep) 12488c2ecf20Sopenharmony_ci return; 12498c2ecf20Sopenharmony_ci 12508c2ecf20Sopenharmony_ci if (ep->use_count != 0) 12518c2ecf20Sopenharmony_ci return; 12528c2ecf20Sopenharmony_ci 12538c2ecf20Sopenharmony_ci deactivate_urbs(ep, true); 12548c2ecf20Sopenharmony_ci wait_clear_urbs(ep); 12558c2ecf20Sopenharmony_ci} 12568c2ecf20Sopenharmony_ci 12578c2ecf20Sopenharmony_ci/** 12588c2ecf20Sopenharmony_ci * snd_usb_endpoint_release: Tear down an snd_usb_endpoint 12598c2ecf20Sopenharmony_ci * 12608c2ecf20Sopenharmony_ci * @ep: the endpoint to release 12618c2ecf20Sopenharmony_ci * 12628c2ecf20Sopenharmony_ci * This function does not care for the endpoint's use count but will tear 12638c2ecf20Sopenharmony_ci * down all the streaming URBs immediately. 12648c2ecf20Sopenharmony_ci */ 12658c2ecf20Sopenharmony_civoid snd_usb_endpoint_release(struct snd_usb_endpoint *ep) 12668c2ecf20Sopenharmony_ci{ 12678c2ecf20Sopenharmony_ci release_urbs(ep, 1); 12688c2ecf20Sopenharmony_ci} 12698c2ecf20Sopenharmony_ci 12708c2ecf20Sopenharmony_ci/** 12718c2ecf20Sopenharmony_ci * snd_usb_endpoint_free: Free the resources of an snd_usb_endpoint 12728c2ecf20Sopenharmony_ci * 12738c2ecf20Sopenharmony_ci * @ep: the endpoint to free 12748c2ecf20Sopenharmony_ci * 12758c2ecf20Sopenharmony_ci * This free all resources of the given ep. 12768c2ecf20Sopenharmony_ci */ 12778c2ecf20Sopenharmony_civoid snd_usb_endpoint_free(struct snd_usb_endpoint *ep) 12788c2ecf20Sopenharmony_ci{ 12798c2ecf20Sopenharmony_ci kfree(ep); 12808c2ecf20Sopenharmony_ci} 12818c2ecf20Sopenharmony_ci 12828c2ecf20Sopenharmony_ci/** 12838c2ecf20Sopenharmony_ci * snd_usb_handle_sync_urb: parse an USB sync packet 12848c2ecf20Sopenharmony_ci * 12858c2ecf20Sopenharmony_ci * @ep: the endpoint to handle the packet 12868c2ecf20Sopenharmony_ci * @sender: the sending endpoint 12878c2ecf20Sopenharmony_ci * @urb: the received packet 12888c2ecf20Sopenharmony_ci * 12898c2ecf20Sopenharmony_ci * This function is called from the context of an endpoint that received 12908c2ecf20Sopenharmony_ci * the packet and is used to let another endpoint object handle the payload. 12918c2ecf20Sopenharmony_ci */ 12928c2ecf20Sopenharmony_civoid snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep, 12938c2ecf20Sopenharmony_ci struct snd_usb_endpoint *sender, 12948c2ecf20Sopenharmony_ci const struct urb *urb) 12958c2ecf20Sopenharmony_ci{ 12968c2ecf20Sopenharmony_ci int shift; 12978c2ecf20Sopenharmony_ci unsigned int f; 12988c2ecf20Sopenharmony_ci unsigned long flags; 12998c2ecf20Sopenharmony_ci 13008c2ecf20Sopenharmony_ci snd_BUG_ON(ep == sender); 13018c2ecf20Sopenharmony_ci 13028c2ecf20Sopenharmony_ci /* 13038c2ecf20Sopenharmony_ci * In case the endpoint is operating in implicit feedback mode, prepare 13048c2ecf20Sopenharmony_ci * a new outbound URB that has the same layout as the received packet 13058c2ecf20Sopenharmony_ci * and add it to the list of pending urbs. queue_pending_output_urbs() 13068c2ecf20Sopenharmony_ci * will take care of them later. 13078c2ecf20Sopenharmony_ci */ 13088c2ecf20Sopenharmony_ci if (snd_usb_endpoint_implicit_feedback_sink(ep) && 13098c2ecf20Sopenharmony_ci ep->use_count != 0) { 13108c2ecf20Sopenharmony_ci 13118c2ecf20Sopenharmony_ci /* implicit feedback case */ 13128c2ecf20Sopenharmony_ci int i, bytes = 0; 13138c2ecf20Sopenharmony_ci struct snd_urb_ctx *in_ctx; 13148c2ecf20Sopenharmony_ci struct snd_usb_packet_info *out_packet; 13158c2ecf20Sopenharmony_ci 13168c2ecf20Sopenharmony_ci in_ctx = urb->context; 13178c2ecf20Sopenharmony_ci 13188c2ecf20Sopenharmony_ci /* Count overall packet size */ 13198c2ecf20Sopenharmony_ci for (i = 0; i < in_ctx->packets; i++) 13208c2ecf20Sopenharmony_ci if (urb->iso_frame_desc[i].status == 0) 13218c2ecf20Sopenharmony_ci bytes += urb->iso_frame_desc[i].actual_length; 13228c2ecf20Sopenharmony_ci 13238c2ecf20Sopenharmony_ci /* 13248c2ecf20Sopenharmony_ci * skip empty packets. At least M-Audio's Fast Track Ultra stops 13258c2ecf20Sopenharmony_ci * streaming once it received a 0-byte OUT URB 13268c2ecf20Sopenharmony_ci */ 13278c2ecf20Sopenharmony_ci if (bytes == 0) 13288c2ecf20Sopenharmony_ci return; 13298c2ecf20Sopenharmony_ci 13308c2ecf20Sopenharmony_ci spin_lock_irqsave(&ep->lock, flags); 13318c2ecf20Sopenharmony_ci out_packet = ep->next_packet + ep->next_packet_write_pos; 13328c2ecf20Sopenharmony_ci 13338c2ecf20Sopenharmony_ci /* 13348c2ecf20Sopenharmony_ci * Iterate through the inbound packet and prepare the lengths 13358c2ecf20Sopenharmony_ci * for the output packet. The OUT packet we are about to send 13368c2ecf20Sopenharmony_ci * will have the same amount of payload bytes per stride as the 13378c2ecf20Sopenharmony_ci * IN packet we just received. Since the actual size is scaled 13388c2ecf20Sopenharmony_ci * by the stride, use the sender stride to calculate the length 13398c2ecf20Sopenharmony_ci * in case the number of channels differ between the implicitly 13408c2ecf20Sopenharmony_ci * fed-back endpoint and the synchronizing endpoint. 13418c2ecf20Sopenharmony_ci */ 13428c2ecf20Sopenharmony_ci 13438c2ecf20Sopenharmony_ci out_packet->packets = in_ctx->packets; 13448c2ecf20Sopenharmony_ci for (i = 0; i < in_ctx->packets; i++) { 13458c2ecf20Sopenharmony_ci if (urb->iso_frame_desc[i].status == 0) 13468c2ecf20Sopenharmony_ci out_packet->packet_size[i] = 13478c2ecf20Sopenharmony_ci urb->iso_frame_desc[i].actual_length / sender->stride; 13488c2ecf20Sopenharmony_ci else 13498c2ecf20Sopenharmony_ci out_packet->packet_size[i] = 0; 13508c2ecf20Sopenharmony_ci } 13518c2ecf20Sopenharmony_ci 13528c2ecf20Sopenharmony_ci ep->next_packet_write_pos++; 13538c2ecf20Sopenharmony_ci ep->next_packet_write_pos %= MAX_URBS; 13548c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&ep->lock, flags); 13558c2ecf20Sopenharmony_ci queue_pending_output_urbs(ep); 13568c2ecf20Sopenharmony_ci 13578c2ecf20Sopenharmony_ci return; 13588c2ecf20Sopenharmony_ci } 13598c2ecf20Sopenharmony_ci 13608c2ecf20Sopenharmony_ci /* 13618c2ecf20Sopenharmony_ci * process after playback sync complete 13628c2ecf20Sopenharmony_ci * 13638c2ecf20Sopenharmony_ci * Full speed devices report feedback values in 10.14 format as samples 13648c2ecf20Sopenharmony_ci * per frame, high speed devices in 16.16 format as samples per 13658c2ecf20Sopenharmony_ci * microframe. 13668c2ecf20Sopenharmony_ci * 13678c2ecf20Sopenharmony_ci * Because the Audio Class 1 spec was written before USB 2.0, many high 13688c2ecf20Sopenharmony_ci * speed devices use a wrong interpretation, some others use an 13698c2ecf20Sopenharmony_ci * entirely different format. 13708c2ecf20Sopenharmony_ci * 13718c2ecf20Sopenharmony_ci * Therefore, we cannot predict what format any particular device uses 13728c2ecf20Sopenharmony_ci * and must detect it automatically. 13738c2ecf20Sopenharmony_ci */ 13748c2ecf20Sopenharmony_ci 13758c2ecf20Sopenharmony_ci if (urb->iso_frame_desc[0].status != 0 || 13768c2ecf20Sopenharmony_ci urb->iso_frame_desc[0].actual_length < 3) 13778c2ecf20Sopenharmony_ci return; 13788c2ecf20Sopenharmony_ci 13798c2ecf20Sopenharmony_ci f = le32_to_cpup(urb->transfer_buffer); 13808c2ecf20Sopenharmony_ci if (urb->iso_frame_desc[0].actual_length == 3) 13818c2ecf20Sopenharmony_ci f &= 0x00ffffff; 13828c2ecf20Sopenharmony_ci else 13838c2ecf20Sopenharmony_ci f &= 0x0fffffff; 13848c2ecf20Sopenharmony_ci 13858c2ecf20Sopenharmony_ci if (f == 0) 13868c2ecf20Sopenharmony_ci return; 13878c2ecf20Sopenharmony_ci 13888c2ecf20Sopenharmony_ci if (unlikely(sender->tenor_fb_quirk)) { 13898c2ecf20Sopenharmony_ci /* 13908c2ecf20Sopenharmony_ci * Devices based on Tenor 8802 chipsets (TEAC UD-H01 13918c2ecf20Sopenharmony_ci * and others) sometimes change the feedback value 13928c2ecf20Sopenharmony_ci * by +/- 0x1.0000. 13938c2ecf20Sopenharmony_ci */ 13948c2ecf20Sopenharmony_ci if (f < ep->freqn - 0x8000) 13958c2ecf20Sopenharmony_ci f += 0xf000; 13968c2ecf20Sopenharmony_ci else if (f > ep->freqn + 0x8000) 13978c2ecf20Sopenharmony_ci f -= 0xf000; 13988c2ecf20Sopenharmony_ci } else if (unlikely(ep->freqshift == INT_MIN)) { 13998c2ecf20Sopenharmony_ci /* 14008c2ecf20Sopenharmony_ci * The first time we see a feedback value, determine its format 14018c2ecf20Sopenharmony_ci * by shifting it left or right until it matches the nominal 14028c2ecf20Sopenharmony_ci * frequency value. This assumes that the feedback does not 14038c2ecf20Sopenharmony_ci * differ from the nominal value more than +50% or -25%. 14048c2ecf20Sopenharmony_ci */ 14058c2ecf20Sopenharmony_ci shift = 0; 14068c2ecf20Sopenharmony_ci while (f < ep->freqn - ep->freqn / 4) { 14078c2ecf20Sopenharmony_ci f <<= 1; 14088c2ecf20Sopenharmony_ci shift++; 14098c2ecf20Sopenharmony_ci } 14108c2ecf20Sopenharmony_ci while (f > ep->freqn + ep->freqn / 2) { 14118c2ecf20Sopenharmony_ci f >>= 1; 14128c2ecf20Sopenharmony_ci shift--; 14138c2ecf20Sopenharmony_ci } 14148c2ecf20Sopenharmony_ci ep->freqshift = shift; 14158c2ecf20Sopenharmony_ci } else if (ep->freqshift >= 0) 14168c2ecf20Sopenharmony_ci f <<= ep->freqshift; 14178c2ecf20Sopenharmony_ci else 14188c2ecf20Sopenharmony_ci f >>= -ep->freqshift; 14198c2ecf20Sopenharmony_ci 14208c2ecf20Sopenharmony_ci if (likely(f >= ep->freqn - ep->freqn / 8 && f <= ep->freqmax)) { 14218c2ecf20Sopenharmony_ci /* 14228c2ecf20Sopenharmony_ci * If the frequency looks valid, set it. 14238c2ecf20Sopenharmony_ci * This value is referred to in prepare_playback_urb(). 14248c2ecf20Sopenharmony_ci */ 14258c2ecf20Sopenharmony_ci spin_lock_irqsave(&ep->lock, flags); 14268c2ecf20Sopenharmony_ci ep->freqm = f; 14278c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&ep->lock, flags); 14288c2ecf20Sopenharmony_ci } else { 14298c2ecf20Sopenharmony_ci /* 14308c2ecf20Sopenharmony_ci * Out of range; maybe the shift value is wrong. 14318c2ecf20Sopenharmony_ci * Reset it so that we autodetect again the next time. 14328c2ecf20Sopenharmony_ci */ 14338c2ecf20Sopenharmony_ci ep->freqshift = INT_MIN; 14348c2ecf20Sopenharmony_ci } 14358c2ecf20Sopenharmony_ci} 14368c2ecf20Sopenharmony_ci 1437