Lines Matching refs:ep

50 	struct snd_usb_midi2_endpoint *ep;
105 static void do_submit_urbs_locked(struct snd_usb_midi2_endpoint *ep,
112 if (ep->disconnected)
115 while (ep->urb_free) {
116 index = find_first_bit(&ep->urb_free, ep->num_urbs);
117 if (index >= ep->num_urbs)
119 ctx = &ep->urbs[index];
120 err = prepare(ep, ctx->urb);
125 ctx->urb->dev = ep->dev;
128 dev_dbg(&ep->dev->dev,
132 clear_bit(index, &ep->urb_free);
137 static int prepare_output_urb(struct snd_usb_midi2_endpoint *ep,
142 count = snd_ump_transmit(ep->ump, urb->transfer_buffer,
143 ep->packets);
145 dev_dbg(&ep->dev->dev, "rawmidi transmit error %d\n", count);
153 static void submit_output_urbs_locked(struct snd_usb_midi2_endpoint *ep)
155 do_submit_urbs_locked(ep, prepare_output_urb);
162 struct snd_usb_midi2_endpoint *ep = ctx->ep;
165 spin_lock_irqsave(&ep->lock, flags);
166 set_bit(ctx->index, &ep->urb_free);
167 if (urb->status >= 0 && atomic_read(&ep->running))
168 submit_output_urbs_locked(ep);
169 if (ep->urb_free == ep->urb_free_mask)
170 wake_up(&ep->wait);
171 spin_unlock_irqrestore(&ep->lock, flags);
175 static int prepare_input_urb(struct snd_usb_midi2_endpoint *ep,
178 urb->transfer_buffer_length = ep->packets;
182 static void submit_input_urbs_locked(struct snd_usb_midi2_endpoint *ep)
184 do_submit_urbs_locked(ep, prepare_input_urb);
191 struct snd_usb_midi2_endpoint *ep = ctx->ep;
195 spin_lock_irqsave(&ep->lock, flags);
196 if (ep->disconnected || urb->status < 0)
200 if (len > ep->packets)
201 len = ep->packets;
204 snd_ump_receive(ep->ump, (u32 *)urb->transfer_buffer, len);
207 set_bit(ctx->index, &ep->urb_free);
208 submit_input_urbs_locked(ep);
209 if (ep->urb_free == ep->urb_free_mask)
210 wake_up(&ep->wait);
211 spin_unlock_irqrestore(&ep->lock, flags);
215 static void submit_io_urbs(struct snd_usb_midi2_endpoint *ep)
219 if (!ep)
221 spin_lock_irqsave(&ep->lock, flags);
222 if (ep->direction == STR_IN)
223 submit_input_urbs_locked(ep);
225 submit_output_urbs_locked(ep);
226 spin_unlock_irqrestore(&ep->lock, flags);
230 static void kill_midi_urbs(struct snd_usb_midi2_endpoint *ep, bool suspending)
234 if (!ep)
237 ep->suspended = ep->running;
238 atomic_set(&ep->running, 0);
239 for (i = 0; i < ep->num_urbs; i++) {
240 if (!ep->urbs[i].urb)
242 usb_kill_urb(ep->urbs[i].urb);
247 static void drain_urb_queue(struct snd_usb_midi2_endpoint *ep)
249 if (!ep)
251 spin_lock_irq(&ep->lock);
252 atomic_set(&ep->running, 0);
253 wait_event_lock_irq_timeout(ep->wait,
254 ep->disconnected ||
255 ep->urb_free == ep->urb_free_mask,
256 ep->lock, msecs_to_jiffies(500));
257 spin_unlock_irq(&ep->lock);
261 static void free_midi_urbs(struct snd_usb_midi2_endpoint *ep)
266 if (!ep)
269 ctx = &ep->urbs[i];
272 usb_free_coherent(ep->dev, ep->packets,
278 ep->num_urbs = 0;
283 static int alloc_midi_urbs(struct snd_usb_midi2_endpoint *ep)
291 endpoint = ep->endpoint;
292 len = ep->packets;
293 if (ep->direction == STR_IN)
298 ep->num_urbs = 0;
299 ep->urb_free = ep->urb_free_mask = 0;
301 ctx = &ep->urbs[i];
305 dev_err(&ep->dev->dev, "URB alloc failed\n");
308 ctx->ep = ep;
309 buffer = usb_alloc_coherent(ep->dev, len, GFP_KERNEL,
312 dev_err(&ep->dev->dev,
316 if (ep->interval)
317 usb_fill_int_urb(ctx->urb, ep->dev, ep->pipe,
318 buffer, len, comp, ctx, ep->interval);
320 usb_fill_bulk_urb(ctx->urb, ep->dev, ep->pipe,
324 dev_err(&ep->dev->dev, "invalid MIDI EP %x\n",
329 ep->num_urbs++;
331 ep->urb_free = ep->urb_free_mask = GENMASK(ep->num_urbs - 1, 0);
346 struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
349 if (!ep || !ep->endpoint)
351 if (ep->disconnected)
353 if (ep->direction == STR_OUT) {
354 err = alloc_midi_urbs(ep);
356 free_midi_urbs(ep);
366 struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
368 if (ep->direction == STR_OUT) {
369 kill_midi_urbs(ep, false);
370 drain_urb_queue(ep);
371 free_midi_urbs(ep);
379 struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
381 atomic_set(&ep->running, up);
382 if (up && ep->direction == STR_OUT && !ep->disconnected)
383 submit_io_urbs(ep);
389 struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
391 drain_urb_queue(ep);
397 struct snd_usb_midi2_endpoint *ep;
400 list_for_each_entry(ep, &umidi->ep_list, list) {
401 if (ep->direction == STR_IN) {
402 err = alloc_midi_urbs(ep);
408 list_for_each_entry(ep, &umidi->ep_list, list) {
409 if (ep->direction == STR_IN)
410 submit_io_urbs(ep);
416 list_for_each_entry(ep, &umidi->ep_list, list) {
417 if (ep->direction == STR_IN)
418 free_midi_urbs(ep);
436 struct snd_usb_midi2_endpoint *ep;
443 ep = kzalloc(sizeof(*ep), GFP_KERNEL);
444 if (!ep)
447 spin_lock_init(&ep->lock);
448 init_waitqueue_head(&ep->wait);
449 ep->dev = umidi->chip->dev;
453 ep->endpoint = endpoint;
454 ep->direction = dir;
455 ep->ms_ep = ms_ep;
457 ep->interval = hostep->desc.bInterval;
459 ep->interval = 0;
461 if (ep->interval)
462 ep->pipe = usb_rcvintpipe(ep->dev, endpoint);
464 ep->pipe = usb_rcvbulkpipe(ep->dev, endpoint);
466 if (ep->interval)
467 ep->pipe = usb_sndintpipe(ep->dev, endpoint);
469 ep->pipe = usb_sndbulkpipe(ep->dev, endpoint);
471 ep->packets = usb_maxpacket(ep->dev, ep->pipe);
472 list_add_tail(&ep->list, &umidi->ep_list);
478 static void free_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
480 list_del(&ep->list);
481 free_midi_urbs(ep);
482 kfree(ep);
488 struct snd_usb_midi2_endpoint *ep;
491 ep = list_first_entry(&umidi->ep_list,
493 free_midi2_endpoint(ep);
772 struct snd_usb_midi2_endpoint *ep,
779 ep->endpoint);
790 return create_midi2_ump(umidi, ep, pair_ep, blk_id);
943 struct snd_usb_midi2_endpoint *ep;
960 list_for_each_entry(ep, &umidi->ep_list, list) {
962 if (ep->direction != STR_IN)
964 for (blk = 0; blk < ep->ms_ep->bNumGrpTrmBlock; blk++) {
965 id = ep->ms_ep->baAssoGrpTrmBlkID[blk];
966 err = find_matching_ep_partner(umidi, ep, id);
976 list_for_each_entry(ep, &umidi->ep_list, list) {
977 if (ep->rmidi)
979 for (blk = 0; blk < ep->ms_ep->bNumGrpTrmBlock; blk++) {
980 id = ep->ms_ep->baAssoGrpTrmBlkID[blk];
985 ep->endpoint, id);
986 if (ep->direction == STR_IN)
987 err = create_midi2_ump(umidi, ep, NULL, id);
989 err = create_midi2_ump(umidi, NULL, ep, id);
1175 static void suspend_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
1177 kill_midi_urbs(ep, true);
1178 drain_urb_queue(ep);
1184 struct snd_usb_midi2_endpoint *ep;
1187 list_for_each_entry(ep, &umidi->ep_list, list)
1188 suspend_midi2_endpoint(ep);
1192 static void resume_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
1194 ep->running = ep->suspended;
1195 if (ep->direction == STR_IN)
1196 submit_io_urbs(ep);
1203 struct snd_usb_midi2_endpoint *ep;
1207 list_for_each_entry(ep, &umidi->ep_list, list)
1208 resume_midi2_endpoint(ep);
1215 struct snd_usb_midi2_endpoint *ep;
1219 list_for_each_entry(ep, &umidi->ep_list, list) {
1220 ep->disconnected = 1;
1221 kill_midi_urbs(ep, false);
1222 drain_urb_queue(ep);