Lines Matching refs:sk

27 static unsigned usb_stream_next_packet_size(struct usb_stream_kernel *sk)  in usb_stream_next_packet_size()  argument
29 struct usb_stream *s = sk->s; in usb_stream_next_packet_size()
30 sk->out_phase_peeked = (sk->out_phase & 0xffff) + sk->freqn; in usb_stream_next_packet_size()
31 return (sk->out_phase_peeked >> 16) * s->cfg.frame_size; in usb_stream_next_packet_size()
34 static void playback_prep_freqn(struct usb_stream_kernel *sk, struct urb *urb) in playback_prep_freqn() argument
36 struct usb_stream *s = sk->s; in playback_prep_freqn()
39 for (pack = 0; pack < sk->n_o_ps; pack++) { in playback_prep_freqn()
40 int l = usb_stream_next_packet_size(sk); in playback_prep_freqn()
44 sk->out_phase = sk->out_phase_peeked; in playback_prep_freqn()
59 static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize, in init_pipe_urbs() argument
66 int transfer_length = maxpacket * sk->n_o_ps; in init_pipe_urbs()
75 urb->number_of_packets = sk->n_o_ps; in init_pipe_urbs()
76 urb->context = sk; in init_pipe_urbs()
85 for (p = 1; p < sk->n_o_ps; ++p) { in init_pipe_urbs()
92 static void init_urbs(struct usb_stream_kernel *sk, unsigned use_packsize, in init_urbs() argument
95 struct usb_stream *s = sk->s; in init_urbs()
102 sk->inurb[u] = usb_alloc_urb(sk->n_o_ps, GFP_KERNEL); in init_urbs()
103 sk->outurb[u] = usb_alloc_urb(sk->n_o_ps, GFP_KERNEL); in init_urbs()
106 init_pipe_urbs(sk, use_packsize, sk->inurb, indata, dev, in_pipe); in init_urbs()
107 init_pipe_urbs(sk, use_packsize, sk->outurb, sk->write_page, dev, in init_urbs()
130 void usb_stream_free(struct usb_stream_kernel *sk) in usb_stream_free() argument
136 usb_free_urb(sk->inurb[u]); in usb_stream_free()
137 sk->inurb[u] = NULL; in usb_stream_free()
138 usb_free_urb(sk->outurb[u]); in usb_stream_free()
139 sk->outurb[u] = NULL; in usb_stream_free()
142 s = sk->s; in usb_stream_free()
146 free_pages((unsigned long)sk->write_page, get_order(s->write_size)); in usb_stream_free()
147 sk->write_page = NULL; in usb_stream_free()
149 sk->s = NULL; in usb_stream_free()
152 struct usb_stream *usb_stream_new(struct usb_stream_kernel *sk, in usb_stream_new() argument
194 sk->s = (void *) __get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO, pg); in usb_stream_new()
195 if (!sk->s) { in usb_stream_new()
199 sk->s->cfg.version = USB_STREAM_INTERFACE_VERSION; in usb_stream_new()
201 sk->s->read_size = read_size; in usb_stream_new()
203 sk->s->cfg.sample_rate = sample_rate; in usb_stream_new()
204 sk->s->cfg.frame_size = frame_size; in usb_stream_new()
205 sk->n_o_ps = packets; in usb_stream_new()
206 sk->s->inpackets = packets * USB_STREAM_URBDEPTH; in usb_stream_new()
207 sk->s->cfg.period_frames = period_frames; in usb_stream_new()
208 sk->s->period_size = frame_size * period_frames; in usb_stream_new()
210 sk->s->write_size = write_size; in usb_stream_new()
213 sk->write_page = in usb_stream_new()
215 if (!sk->write_page) { in usb_stream_new()
217 usb_stream_free(sk); in usb_stream_new()
223 sk->freqn = get_usb_full_speed_rate(sample_rate); in usb_stream_new()
225 sk->freqn = get_usb_high_speed_rate(sample_rate); in usb_stream_new()
227 init_urbs(sk, use_packsize, dev, in_pipe, out_pipe); in usb_stream_new()
228 sk->s->state = usb_stream_stopped; in usb_stream_new()
230 return sk->s; in usb_stream_new()
236 static bool balance_check(struct usb_stream_kernel *sk, struct urb *urb) in balance_check() argument
242 sk->iso_frame_balance = 0x7FFFFFFF; in balance_check()
245 r = sk->iso_frame_balance == 0; in balance_check()
247 sk->i_urb = urb; in balance_check()
251 static bool balance_playback(struct usb_stream_kernel *sk, struct urb *urb) in balance_playback() argument
253 sk->iso_frame_balance += urb->number_of_packets; in balance_playback()
254 return balance_check(sk, urb); in balance_playback()
257 static bool balance_capture(struct usb_stream_kernel *sk, struct urb *urb) in balance_capture() argument
259 sk->iso_frame_balance -= urb->number_of_packets; in balance_capture()
260 return balance_check(sk, urb); in balance_capture()
273 static int usb_stream_prepare_playback(struct usb_stream_kernel *sk, in usb_stream_prepare_playback() argument
276 struct usb_stream *s = sk->s; in usb_stream_prepare_playback()
281 io = sk->idle_outurb; in usb_stream_prepare_playback()
285 struct urb *ii = sk->completed_inurb; in usb_stream_prepare_playback()
296 s->sync_packet < inurb->number_of_packets && p < sk->n_o_ps; in usb_stream_prepare_playback()
349 static int submit_urbs(struct usb_stream_kernel *sk, in submit_urbs() argument
353 prepare_inurb(sk->idle_outurb->number_of_packets, sk->idle_inurb); in submit_urbs()
354 err = usb_submit_urb(sk->idle_inurb, GFP_ATOMIC); in submit_urbs()
359 sk->idle_inurb = sk->completed_inurb; in submit_urbs()
360 sk->completed_inurb = inurb; in submit_urbs()
361 err = usb_submit_urb(sk->idle_outurb, GFP_ATOMIC); in submit_urbs()
366 sk->idle_outurb = sk->completed_outurb; in submit_urbs()
367 sk->completed_outurb = outurb; in submit_urbs()
387 iu = sk->idle_inurb; in loop_back()
412 if (iu == sk->completed_inurb) { in loop_back()
420 iu = sk->completed_inurb; in loop_back()
432 static void stream_idle(struct usb_stream_kernel *sk, in stream_idle() argument
435 struct usb_stream *s = sk->s; in stream_idle()
478 s->outpacket[0].offset = (sk->idle_outurb->transfer_buffer - in stream_idle()
479 sk->write_page) - l; in stream_idle()
481 if (usb_stream_prepare_playback(sk, inurb) < 0) in stream_idle()
484 s->outpacket[0].length = sk->idle_outurb->transfer_buffer_length + l; in stream_idle()
485 s->outpacket[1].offset = sk->completed_outurb->transfer_buffer - in stream_idle()
486 sk->write_page; in stream_idle()
488 if (submit_urbs(sk, inurb, outurb) < 0) in stream_idle()
493 wake_up_all(&sk->sleep); in stream_idle()
497 wake_up_all(&sk->sleep); in stream_idle()
502 struct usb_stream_kernel *sk = urb->context; in i_capture_idle() local
503 if (balance_capture(sk, urb)) in i_capture_idle()
504 stream_idle(sk, urb, sk->i_urb); in i_capture_idle()
509 struct usb_stream_kernel *sk = urb->context; in i_playback_idle() local
510 if (balance_playback(sk, urb)) in i_playback_idle()
511 stream_idle(sk, sk->i_urb, urb); in i_playback_idle()
514 static void stream_start(struct usb_stream_kernel *sk, in stream_start() argument
517 struct usb_stream *s = sk->s; in stream_start()
577 if (usb_stream_prepare_playback(sk, inurb) < 0) in stream_start()
581 playback_prep_freqn(sk, sk->idle_outurb); in stream_start()
583 if (submit_urbs(sk, inurb, outurb) < 0) in stream_start()
589 subs_set_complete(sk->inurb, i_capture_idle); in stream_start()
590 subs_set_complete(sk->outurb, i_playback_idle); in stream_start()
597 struct usb_stream_kernel *sk = urb->context; in i_capture_start() local
598 struct usb_stream *s = sk->s; in i_capture_start()
636 if (balance_capture(sk, urb)) in i_capture_start()
637 stream_start(sk, urb, sk->i_urb); in i_capture_start()
642 struct usb_stream_kernel *sk = urb->context; in i_playback_start() local
643 if (balance_playback(sk, urb)) in i_playback_start()
644 stream_start(sk, sk->i_urb, urb); in i_playback_start()
647 int usb_stream_start(struct usb_stream_kernel *sk) in usb_stream_start() argument
649 struct usb_stream *s = sk->s; in usb_stream_start()
657 subs_set_complete(sk->inurb, i_capture_start); in usb_stream_start()
658 subs_set_complete(sk->outurb, i_playback_start); in usb_stream_start()
659 memset(sk->write_page, 0, s->write_size); in usb_stream_start()
666 sk->iso_frame_balance = 0; in usb_stream_start()
669 struct urb *inurb = sk->inurb[u]; in usb_stream_start()
670 struct urb *outurb = sk->outurb[u]; in usb_stream_start()
671 playback_prep_freqn(sk, outurb); in usb_stream_start()
710 usb_stream_stop(sk); in usb_stream_start()
721 sk->idle_inurb = sk->inurb[USB_STREAM_NURBS - 2]; in usb_stream_start()
722 sk->idle_outurb = sk->outurb[USB_STREAM_NURBS - 2]; in usb_stream_start()
723 sk->completed_inurb = sk->inurb[USB_STREAM_NURBS - 1]; in usb_stream_start()
724 sk->completed_outurb = sk->outurb[USB_STREAM_NURBS - 1]; in usb_stream_start()
742 void usb_stream_stop(struct usb_stream_kernel *sk) in usb_stream_stop() argument
745 if (!sk->s) in usb_stream_stop()
748 usb_kill_urb(sk->inurb[u]); in usb_stream_stop()
749 usb_kill_urb(sk->outurb[u]); in usb_stream_stop()
751 sk->s->state = usb_stream_stopped; in usb_stream_stop()