Lines Matching refs:ep

90 		usb_free_coherent(u->ep->chip->dev, u->buffer_size,  in release_urb_ctx()
130 int snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep) in snd_usb_endpoint_implicit_feedback_sink() argument
132 return ep->sync_master && in snd_usb_endpoint_implicit_feedback_sink()
133 ep->sync_master->type == SND_USB_ENDPOINT_TYPE_DATA && in snd_usb_endpoint_implicit_feedback_sink()
134 ep->type == SND_USB_ENDPOINT_TYPE_DATA && in snd_usb_endpoint_implicit_feedback_sink()
135 usb_pipeout(ep->pipe); in snd_usb_endpoint_implicit_feedback_sink()
145 int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep) in snd_usb_endpoint_next_packet_size() argument
150 if (ep->fill_max) in snd_usb_endpoint_next_packet_size()
151 return ep->maxframesize; in snd_usb_endpoint_next_packet_size()
153 spin_lock_irqsave(&ep->lock, flags); in snd_usb_endpoint_next_packet_size()
154 ep->phase = (ep->phase & 0xffff) in snd_usb_endpoint_next_packet_size()
155 + (ep->freqm << ep->datainterval); in snd_usb_endpoint_next_packet_size()
156 ret = min(ep->phase >> 16, ep->maxframesize); in snd_usb_endpoint_next_packet_size()
157 spin_unlock_irqrestore(&ep->lock, flags); in snd_usb_endpoint_next_packet_size()
162 static void retire_outbound_urb(struct snd_usb_endpoint *ep, in retire_outbound_urb() argument
165 if (ep->retire_data_urb) in retire_outbound_urb()
166 ep->retire_data_urb(ep->data_subs, urb_ctx->urb); in retire_outbound_urb()
169 static void retire_inbound_urb(struct snd_usb_endpoint *ep, in retire_inbound_urb() argument
174 if (unlikely(ep->skip_packets > 0)) { in retire_inbound_urb()
175 ep->skip_packets--; in retire_inbound_urb()
179 if (ep->sync_slave) in retire_inbound_urb()
180 snd_usb_handle_sync_urb(ep->sync_slave, ep, urb); in retire_inbound_urb()
182 if (ep->retire_data_urb) in retire_inbound_urb()
183 ep->retire_data_urb(ep->data_subs, urb); in retire_inbound_urb()
189 static void prepare_outbound_urb(struct snd_usb_endpoint *ep, in prepare_outbound_urb() argument
196 urb->dev = ep->chip->dev; /* we need to set this at each time */ in prepare_outbound_urb()
198 switch (ep->type) { in prepare_outbound_urb()
200 if (ep->prepare_data_urb) { in prepare_outbound_urb()
201 ep->prepare_data_urb(ep->data_subs, urb); in prepare_outbound_urb()
211 counts = snd_usb_endpoint_next_packet_size(ep); in prepare_outbound_urb()
213 urb->iso_frame_desc[i].offset = offs * ep->stride; in prepare_outbound_urb()
214 urb->iso_frame_desc[i].length = counts * ep->stride; in prepare_outbound_urb()
219 urb->transfer_buffer_length = offs * ep->stride; in prepare_outbound_urb()
220 memset(urb->transfer_buffer, ep->silence_value, in prepare_outbound_urb()
221 offs * ep->stride); in prepare_outbound_urb()
226 if (snd_usb_get_speed(ep->chip->dev) >= USB_SPEED_HIGH) { in prepare_outbound_urb()
233 cp[0] = ep->freqn; in prepare_outbound_urb()
234 cp[1] = ep->freqn >> 8; in prepare_outbound_urb()
235 cp[2] = ep->freqn >> 16; in prepare_outbound_urb()
236 cp[3] = ep->freqn >> 24; in prepare_outbound_urb()
244 cp[0] = ep->freqn >> 2; in prepare_outbound_urb()
245 cp[1] = ep->freqn >> 10; in prepare_outbound_urb()
246 cp[2] = ep->freqn >> 18; in prepare_outbound_urb()
256 static inline void prepare_inbound_urb(struct snd_usb_endpoint *ep, in prepare_inbound_urb() argument
262 urb->dev = ep->chip->dev; /* we need to set this at each time */ in prepare_inbound_urb()
264 switch (ep->type) { in prepare_inbound_urb()
269 urb->iso_frame_desc[i].length = ep->curpacksize; in prepare_inbound_urb()
270 offs += ep->curpacksize; in prepare_inbound_urb()
278 urb->iso_frame_desc[0].length = min(4u, ep->syncmaxsize); in prepare_inbound_urb()
298 static void queue_pending_output_urbs(struct snd_usb_endpoint *ep) in queue_pending_output_urbs() argument
300 while (test_bit(EP_FLAG_RUNNING, &ep->flags)) { in queue_pending_output_urbs()
308 spin_lock_irqsave(&ep->lock, flags); in queue_pending_output_urbs()
309 if (ep->next_packet_read_pos != ep->next_packet_write_pos) { in queue_pending_output_urbs()
310 packet = ep->next_packet + ep->next_packet_read_pos; in queue_pending_output_urbs()
311 ep->next_packet_read_pos++; in queue_pending_output_urbs()
312 ep->next_packet_read_pos %= MAX_URBS; in queue_pending_output_urbs()
315 if (!list_empty(&ep->ready_playback_urbs)) in queue_pending_output_urbs()
316 ctx = list_first_entry(&ep->ready_playback_urbs, in queue_pending_output_urbs()
319 spin_unlock_irqrestore(&ep->lock, flags); in queue_pending_output_urbs()
332 prepare_outbound_urb(ep, ctx); in queue_pending_output_urbs()
336 usb_audio_err(ep->chip, in queue_pending_output_urbs()
340 set_bit(ctx->index, &ep->active_mask); in queue_pending_output_urbs()
350 struct snd_usb_endpoint *ep = ctx->ep; in snd_complete_urb() local
361 if (unlikely(atomic_read(&ep->chip->shutdown))) in snd_complete_urb()
364 if (usb_pipeout(ep->pipe)) { in snd_complete_urb()
365 retire_outbound_urb(ep, ctx); in snd_complete_urb()
367 if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags))) in snd_complete_urb()
370 if (snd_usb_endpoint_implicit_feedback_sink(ep)) { in snd_complete_urb()
371 spin_lock_irqsave(&ep->lock, flags); in snd_complete_urb()
372 list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs); in snd_complete_urb()
373 spin_unlock_irqrestore(&ep->lock, flags); in snd_complete_urb()
374 queue_pending_output_urbs(ep); in snd_complete_urb()
379 prepare_outbound_urb(ep, ctx); in snd_complete_urb()
381 retire_inbound_urb(ep, ctx); in snd_complete_urb()
383 if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags))) in snd_complete_urb()
386 prepare_inbound_urb(ep, ctx); in snd_complete_urb()
393 usb_audio_err(ep->chip, "cannot submit urb (err = %d)\n", err); in snd_complete_urb()
394 if (ep->data_subs && ep->data_subs->pcm_substream) { in snd_complete_urb()
395 substream = ep->data_subs->pcm_substream; in snd_complete_urb()
400 clear_bit(ctx->index, &ep->active_mask); in snd_complete_urb()
426 struct snd_usb_endpoint *ep; in snd_usb_add_endpoint() local
434 list_for_each_entry(ep, &chip->ep_list, list) { in snd_usb_add_endpoint()
435 if (ep->ep_num == ep_num && in snd_usb_add_endpoint()
436 ep->iface == alts->desc.bInterfaceNumber && in snd_usb_add_endpoint()
437 ep->altsetting == alts->desc.bAlternateSetting) { in snd_usb_add_endpoint()
438 usb_audio_dbg(ep->chip, in snd_usb_add_endpoint()
440 ep_num, ep->iface, ep->altsetting, ep); in snd_usb_add_endpoint()
450 ep = kzalloc(sizeof(*ep), GFP_KERNEL); in snd_usb_add_endpoint()
451 if (!ep) in snd_usb_add_endpoint()
454 ep->chip = chip; in snd_usb_add_endpoint()
455 spin_lock_init(&ep->lock); in snd_usb_add_endpoint()
456 ep->type = type; in snd_usb_add_endpoint()
457 ep->ep_num = ep_num; in snd_usb_add_endpoint()
458 ep->iface = alts->desc.bInterfaceNumber; in snd_usb_add_endpoint()
459 ep->altsetting = alts->desc.bAlternateSetting; in snd_usb_add_endpoint()
460 INIT_LIST_HEAD(&ep->ready_playback_urbs); in snd_usb_add_endpoint()
464 ep->pipe = usb_sndisocpipe(chip->dev, ep_num); in snd_usb_add_endpoint()
466 ep->pipe = usb_rcvisocpipe(chip->dev, ep_num); in snd_usb_add_endpoint()
472 ep->syncinterval = get_endpoint(alts, 1)->bRefresh; in snd_usb_add_endpoint()
474 ep->syncinterval = 1; in snd_usb_add_endpoint()
477 ep->syncinterval = get_endpoint(alts, 1)->bInterval - 1; in snd_usb_add_endpoint()
479 ep->syncinterval = 3; in snd_usb_add_endpoint()
481 ep->syncmaxsize = le16_to_cpu(get_endpoint(alts, 1)->wMaxPacketSize); in snd_usb_add_endpoint()
484 ep->syncmaxsize == 4) in snd_usb_add_endpoint()
485 ep->udh01_fb_quirk = 1; in snd_usb_add_endpoint()
488 list_add_tail(&ep->list, &chip->ep_list); in snd_usb_add_endpoint()
493 return ep; in snd_usb_add_endpoint()
499 static int wait_clear_urbs(struct snd_usb_endpoint *ep) in wait_clear_urbs() argument
505 alive = bitmap_weight(&ep->active_mask, ep->nurbs); in wait_clear_urbs()
513 usb_audio_err(ep->chip, in wait_clear_urbs()
515 alive, ep->ep_num); in wait_clear_urbs()
516 clear_bit(EP_FLAG_STOPPING, &ep->flags); in wait_clear_urbs()
524 void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep) in snd_usb_endpoint_sync_pending_stop() argument
526 if (ep && test_bit(EP_FLAG_STOPPING, &ep->flags)) in snd_usb_endpoint_sync_pending_stop()
527 wait_clear_urbs(ep); in snd_usb_endpoint_sync_pending_stop()
533 static int deactivate_urbs(struct snd_usb_endpoint *ep, bool force) in deactivate_urbs() argument
537 if (!force && atomic_read(&ep->chip->shutdown)) /* to be sure... */ in deactivate_urbs()
540 clear_bit(EP_FLAG_RUNNING, &ep->flags); in deactivate_urbs()
542 INIT_LIST_HEAD(&ep->ready_playback_urbs); in deactivate_urbs()
543 ep->next_packet_read_pos = 0; in deactivate_urbs()
544 ep->next_packet_write_pos = 0; in deactivate_urbs()
546 for (i = 0; i < ep->nurbs; i++) { in deactivate_urbs()
547 if (test_bit(i, &ep->active_mask)) { in deactivate_urbs()
548 if (!test_and_set_bit(i, &ep->unlink_mask)) { in deactivate_urbs()
549 struct urb *u = ep->urb[i].urb; in deactivate_urbs()
561 static void release_urbs(struct snd_usb_endpoint *ep, int force) in release_urbs() argument
566 ep->retire_data_urb = NULL; in release_urbs()
567 ep->prepare_data_urb = NULL; in release_urbs()
570 deactivate_urbs(ep, force); in release_urbs()
571 wait_clear_urbs(ep); in release_urbs()
573 for (i = 0; i < ep->nurbs; i++) in release_urbs()
574 release_urb_ctx(&ep->urb[i]); in release_urbs()
576 if (ep->syncbuf) in release_urbs()
577 usb_free_coherent(ep->chip->dev, SYNC_URBS * 4, in release_urbs()
578 ep->syncbuf, ep->sync_dma); in release_urbs()
580 ep->syncbuf = NULL; in release_urbs()
581 ep->nurbs = 0; in release_urbs()
587 static int data_ep_set_params(struct snd_usb_endpoint *ep, in data_ep_set_params() argument
610 ep->datainterval = fmt->datainterval; in data_ep_set_params()
611 ep->stride = frame_bits >> 3; in data_ep_set_params()
612 ep->silence_value = pcm_format == SNDRV_PCM_FORMAT_U8 ? 0x80 : 0; in data_ep_set_params()
615 ep->freqmax = ep->freqn + (ep->freqn >> 2); in data_ep_set_params()
616 maxsize = ((ep->freqmax + 0xffff) * (frame_bits >> 3)) in data_ep_set_params()
617 >> (16 - ep->datainterval); in data_ep_set_params()
619 if (ep->maxpacksize && ep->maxpacksize < maxsize) { in data_ep_set_params()
621 maxsize = ep->maxpacksize; in data_ep_set_params()
622 ep->freqmax = (maxsize / (frame_bits >> 3)) in data_ep_set_params()
623 << (16 - ep->datainterval); in data_ep_set_params()
626 if (ep->fill_max) in data_ep_set_params()
627 ep->curpacksize = ep->maxpacksize; in data_ep_set_params()
629 ep->curpacksize = maxsize; in data_ep_set_params()
631 if (snd_usb_get_speed(ep->chip->dev) != USB_SPEED_FULL) { in data_ep_set_params()
632 packs_per_ms = 8 >> ep->datainterval; in data_ep_set_params()
638 if (sync_ep && !snd_usb_endpoint_implicit_feedback_sink(ep)) in data_ep_set_params()
641 max_packs_per_urb = max(1u, max_packs_per_urb >> ep->datainterval); in data_ep_set_params()
651 if (usb_pipein(ep->pipe) || in data_ep_set_params()
652 snd_usb_endpoint_implicit_feedback_sink(ep)) { in data_ep_set_params()
661 if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_WIRELESS) { in data_ep_set_params()
662 int interval = ep->datainterval; in data_ep_set_params()
672 ep->nurbs = MAX_URBS; in data_ep_set_params()
682 minsize = (ep->freqn >> (16 - ep->datainterval)) * in data_ep_set_params()
699 ep->max_urb_frames = DIV_ROUND_UP(frames_per_period, in data_ep_set_params()
705 ep->nurbs = min(max_urbs, urbs_per_period * periods_per_buffer); in data_ep_set_params()
709 for (i = 0; i < ep->nurbs; i++) { in data_ep_set_params()
710 struct snd_urb_ctx *u = &ep->urb[i]; in data_ep_set_params()
712 u->ep = ep; in data_ep_set_params()
723 usb_alloc_coherent(ep->chip->dev, u->buffer_size, in data_ep_set_params()
727 u->urb->pipe = ep->pipe; in data_ep_set_params()
729 u->urb->interval = 1 << ep->datainterval; in data_ep_set_params()
738 release_urbs(ep, 0); in data_ep_set_params()
745 static int sync_ep_set_params(struct snd_usb_endpoint *ep) in sync_ep_set_params() argument
749 ep->syncbuf = usb_alloc_coherent(ep->chip->dev, SYNC_URBS * 4, in sync_ep_set_params()
750 GFP_KERNEL, &ep->sync_dma); in sync_ep_set_params()
751 if (!ep->syncbuf) in sync_ep_set_params()
755 struct snd_urb_ctx *u = &ep->urb[i]; in sync_ep_set_params()
757 u->ep = ep; in sync_ep_set_params()
762 u->urb->transfer_buffer = ep->syncbuf + i * 4; in sync_ep_set_params()
763 u->urb->transfer_dma = ep->sync_dma + i * 4; in sync_ep_set_params()
765 u->urb->pipe = ep->pipe; in sync_ep_set_params()
768 u->urb->interval = 1 << ep->syncinterval; in sync_ep_set_params()
773 ep->nurbs = SYNC_URBS; in sync_ep_set_params()
778 release_urbs(ep, 0); in sync_ep_set_params()
799 int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, in snd_usb_endpoint_set_params() argument
811 if (ep->use_count != 0) { in snd_usb_endpoint_set_params()
812 usb_audio_warn(ep->chip, in snd_usb_endpoint_set_params()
814 ep->ep_num); in snd_usb_endpoint_set_params()
819 release_urbs(ep, 0); in snd_usb_endpoint_set_params()
821 ep->datainterval = fmt->datainterval; in snd_usb_endpoint_set_params()
822 ep->maxpacksize = fmt->maxpacksize; in snd_usb_endpoint_set_params()
823 ep->fill_max = !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX); in snd_usb_endpoint_set_params()
825 if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_FULL) in snd_usb_endpoint_set_params()
826 ep->freqn = get_usb_full_speed_rate(rate); in snd_usb_endpoint_set_params()
828 ep->freqn = get_usb_high_speed_rate(rate); in snd_usb_endpoint_set_params()
831 ep->freqm = ep->freqn; in snd_usb_endpoint_set_params()
832 ep->freqshift = INT_MIN; in snd_usb_endpoint_set_params()
834 ep->phase = 0; in snd_usb_endpoint_set_params()
836 switch (ep->type) { in snd_usb_endpoint_set_params()
838 err = data_ep_set_params(ep, pcm_format, channels, in snd_usb_endpoint_set_params()
843 err = sync_ep_set_params(ep); in snd_usb_endpoint_set_params()
849 usb_audio_dbg(ep->chip, in snd_usb_endpoint_set_params()
851 ep->ep_num, ep->type, ep->nurbs, err); in snd_usb_endpoint_set_params()
871 int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, bool can_sleep) in snd_usb_endpoint_start() argument
876 if (atomic_read(&ep->chip->shutdown)) in snd_usb_endpoint_start()
880 if (++ep->use_count != 1) in snd_usb_endpoint_start()
884 deactivate_urbs(ep, false); in snd_usb_endpoint_start()
886 wait_clear_urbs(ep); in snd_usb_endpoint_start()
888 ep->active_mask = 0; in snd_usb_endpoint_start()
889 ep->unlink_mask = 0; in snd_usb_endpoint_start()
890 ep->phase = 0; in snd_usb_endpoint_start()
892 snd_usb_endpoint_start_quirk(ep); in snd_usb_endpoint_start()
901 set_bit(EP_FLAG_RUNNING, &ep->flags); in snd_usb_endpoint_start()
903 if (snd_usb_endpoint_implicit_feedback_sink(ep)) { in snd_usb_endpoint_start()
904 for (i = 0; i < ep->nurbs; i++) { in snd_usb_endpoint_start()
905 struct snd_urb_ctx *ctx = ep->urb + i; in snd_usb_endpoint_start()
906 list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs); in snd_usb_endpoint_start()
912 for (i = 0; i < ep->nurbs; i++) { in snd_usb_endpoint_start()
913 struct urb *urb = ep->urb[i].urb; in snd_usb_endpoint_start()
918 if (usb_pipeout(ep->pipe)) { in snd_usb_endpoint_start()
919 prepare_outbound_urb(ep, urb->context); in snd_usb_endpoint_start()
921 prepare_inbound_urb(ep, urb->context); in snd_usb_endpoint_start()
926 usb_audio_err(ep->chip, in snd_usb_endpoint_start()
931 set_bit(i, &ep->active_mask); in snd_usb_endpoint_start()
937 clear_bit(EP_FLAG_RUNNING, &ep->flags); in snd_usb_endpoint_start()
938 ep->use_count--; in snd_usb_endpoint_start()
939 deactivate_urbs(ep, false); in snd_usb_endpoint_start()
957 void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep) in snd_usb_endpoint_stop() argument
959 if (!ep) in snd_usb_endpoint_stop()
962 if (snd_BUG_ON(ep->use_count == 0)) in snd_usb_endpoint_stop()
965 if (--ep->use_count == 0) { in snd_usb_endpoint_stop()
966 deactivate_urbs(ep, false); in snd_usb_endpoint_stop()
967 ep->data_subs = NULL; in snd_usb_endpoint_stop()
968 ep->sync_slave = NULL; in snd_usb_endpoint_stop()
969 ep->retire_data_urb = NULL; in snd_usb_endpoint_stop()
970 ep->prepare_data_urb = NULL; in snd_usb_endpoint_stop()
971 set_bit(EP_FLAG_STOPPING, &ep->flags); in snd_usb_endpoint_stop()
985 void snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep) in snd_usb_endpoint_deactivate() argument
987 if (!ep) in snd_usb_endpoint_deactivate()
990 if (ep->use_count != 0) in snd_usb_endpoint_deactivate()
993 deactivate_urbs(ep, true); in snd_usb_endpoint_deactivate()
994 wait_clear_urbs(ep); in snd_usb_endpoint_deactivate()
1005 void snd_usb_endpoint_release(struct snd_usb_endpoint *ep) in snd_usb_endpoint_release() argument
1007 release_urbs(ep, 1); in snd_usb_endpoint_release()
1017 void snd_usb_endpoint_free(struct snd_usb_endpoint *ep) in snd_usb_endpoint_free() argument
1019 kfree(ep); in snd_usb_endpoint_free()
1032 void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep, in snd_usb_handle_sync_urb() argument
1040 snd_BUG_ON(ep == sender); in snd_usb_handle_sync_urb()
1048 if (snd_usb_endpoint_implicit_feedback_sink(ep) && in snd_usb_handle_sync_urb()
1049 ep->use_count != 0) { in snd_usb_handle_sync_urb()
1070 spin_lock_irqsave(&ep->lock, flags); in snd_usb_handle_sync_urb()
1071 out_packet = ep->next_packet + ep->next_packet_write_pos; in snd_usb_handle_sync_urb()
1092 ep->next_packet_write_pos++; in snd_usb_handle_sync_urb()
1093 ep->next_packet_write_pos %= MAX_URBS; in snd_usb_handle_sync_urb()
1094 spin_unlock_irqrestore(&ep->lock, flags); in snd_usb_handle_sync_urb()
1095 queue_pending_output_urbs(ep); in snd_usb_handle_sync_urb()
1133 if (f < ep->freqn - 0x8000) in snd_usb_handle_sync_urb()
1135 else if (f > ep->freqn + 0x8000) in snd_usb_handle_sync_urb()
1137 } else if (unlikely(ep->freqshift == INT_MIN)) { in snd_usb_handle_sync_urb()
1145 while (f < ep->freqn - ep->freqn / 4) { in snd_usb_handle_sync_urb()
1149 while (f > ep->freqn + ep->freqn / 2) { in snd_usb_handle_sync_urb()
1153 ep->freqshift = shift; in snd_usb_handle_sync_urb()
1154 } else if (ep->freqshift >= 0) in snd_usb_handle_sync_urb()
1155 f <<= ep->freqshift; in snd_usb_handle_sync_urb()
1157 f >>= -ep->freqshift; in snd_usb_handle_sync_urb()
1159 if (likely(f >= ep->freqn - ep->freqn / 8 && f <= ep->freqmax)) { in snd_usb_handle_sync_urb()
1164 spin_lock_irqsave(&ep->lock, flags); in snd_usb_handle_sync_urb()
1165 ep->freqm = f; in snd_usb_handle_sync_urb()
1166 spin_unlock_irqrestore(&ep->lock, flags); in snd_usb_handle_sync_urb()
1172 ep->freqshift = INT_MIN; in snd_usb_handle_sync_urb()