1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * uvc_video.c -- USB Video Class Gadget driver
4 *
5 * Copyright (C) 2009-2010
6 * Laurent Pinchart (laurent.pinchart@ideasonboard.com)
7 */
8
9 #include <linux/kernel.h>
10 #include <linux/device.h>
11 #include <linux/errno.h>
12 #include <linux/usb/ch9.h>
13 #include <linux/usb/gadget.h>
14 #include <linux/usb/video.h>
15 #include <asm/unaligned.h>
16
17 #include <media/v4l2-dev.h>
18
19 #include "uvc.h"
20 #include "uvc_queue.h"
21 #include "uvc_video.h"
22
23 /* --------------------------------------------------------------------------
24 * Video codecs
25 */
26
27 static int
uvc_video_encode_header(struct uvc_video * video,struct uvc_buffer * buf,u8 * data,int len)28 uvc_video_encode_header(struct uvc_video *video, struct uvc_buffer *buf,
29 u8 *data, int len)
30 {
31 struct uvc_device *uvc = container_of(video, struct uvc_device, video);
32 struct usb_composite_dev *cdev = uvc->func.config->cdev;
33 struct timespec64 ts = ns_to_timespec64(buf->buf.vb2_buf.timestamp);
34 int pos = 2;
35
36 data[1] = UVC_STREAM_EOH | video->fid;
37
38 if (video->queue.buf_used == 0 && ts.tv_sec) {
39 /* dwClockFrequency is 48 MHz */
40 u32 pts = ((u64)ts.tv_sec * USEC_PER_SEC + ts.tv_nsec / NSEC_PER_USEC) * 48;
41
42 data[1] |= UVC_STREAM_PTS;
43 put_unaligned_le32(pts, &data[pos]);
44 pos += 4;
45 }
46
47 if (cdev->gadget->ops->get_frame) {
48 u32 sof, stc;
49
50 sof = usb_gadget_frame_number(cdev->gadget);
51 ktime_get_ts64(&ts);
52 stc = ((u64)ts.tv_sec * USEC_PER_SEC + ts.tv_nsec / NSEC_PER_USEC) * 48;
53
54 data[1] |= UVC_STREAM_SCR;
55 put_unaligned_le32(stc, &data[pos]);
56 put_unaligned_le16(sof, &data[pos+4]);
57 pos += 6;
58 }
59
60 data[0] = pos;
61
62 if (buf->bytesused - video->queue.buf_used <= len - pos)
63 data[1] |= UVC_STREAM_EOF;
64
65 return pos;
66 }
67
68 static int
uvc_video_encode_data(struct uvc_video * video,struct uvc_buffer * buf,u8 * data,int len)69 uvc_video_encode_data(struct uvc_video *video, struct uvc_buffer *buf,
70 u8 *data, int len)
71 {
72 struct uvc_video_queue *queue = &video->queue;
73 unsigned int nbytes;
74 void *mem;
75
76 /* Copy video data to the USB buffer. */
77 mem = buf->mem + queue->buf_used;
78 nbytes = min((unsigned int)len, buf->bytesused - queue->buf_used);
79
80 memcpy(data, mem, nbytes);
81 queue->buf_used += nbytes;
82
83 return nbytes;
84 }
85
86 static void
uvc_video_encode_bulk(struct usb_request * req,struct uvc_video * video,struct uvc_buffer * buf)87 uvc_video_encode_bulk(struct usb_request *req, struct uvc_video *video,
88 struct uvc_buffer *buf)
89 {
90 void *mem = req->buf;
91 struct uvc_request *ureq = req->context;
92 int len = video->req_size;
93 int ret;
94
95 /* Add a header at the beginning of the payload. */
96 if (video->payload_size == 0) {
97 ret = uvc_video_encode_header(video, buf, mem, len);
98 video->payload_size += ret;
99 mem += ret;
100 len -= ret;
101 }
102
103 /* Process video data. */
104 len = min((int)(video->max_payload_size - video->payload_size), len);
105 ret = uvc_video_encode_data(video, buf, mem, len);
106
107 video->payload_size += ret;
108 len -= ret;
109
110 req->length = video->req_size - len;
111 req->zero = video->payload_size == video->max_payload_size;
112
113 if (buf->bytesused == video->queue.buf_used) {
114 video->queue.buf_used = 0;
115 buf->state = UVC_BUF_STATE_DONE;
116 list_del(&buf->queue);
117 video->fid ^= UVC_STREAM_FID;
118 ureq->last_buf = buf;
119
120 video->payload_size = 0;
121 }
122
123 if (video->payload_size == video->max_payload_size ||
124 video->queue.flags & UVC_QUEUE_DROP_INCOMPLETE ||
125 buf->bytesused == video->queue.buf_used)
126 video->payload_size = 0;
127 }
128
129 static void
uvc_video_encode_isoc_sg(struct usb_request * req,struct uvc_video * video,struct uvc_buffer * buf)130 uvc_video_encode_isoc_sg(struct usb_request *req, struct uvc_video *video,
131 struct uvc_buffer *buf)
132 {
133 unsigned int pending = buf->bytesused - video->queue.buf_used;
134 struct uvc_request *ureq = req->context;
135 struct scatterlist *sg, *iter;
136 unsigned int len = video->req_size;
137 unsigned int sg_left, part = 0;
138 unsigned int i;
139 int header_len;
140
141 sg = ureq->sgt.sgl;
142 sg_init_table(sg, ureq->sgt.nents);
143
144 /* Init the header. */
145 header_len = uvc_video_encode_header(video, buf, ureq->header,
146 video->req_size);
147 sg_set_buf(sg, ureq->header, header_len);
148 len -= header_len;
149
150 if (pending <= len)
151 len = pending;
152
153 req->length = (len == pending) ?
154 len + header_len : video->req_size;
155
156 /* Init the pending sgs with payload */
157 sg = sg_next(sg);
158
159 for_each_sg(sg, iter, ureq->sgt.nents - 1, i) {
160 if (!len || !buf->sg || !buf->sg->length)
161 break;
162
163 sg_left = buf->sg->length - buf->offset;
164 part = min_t(unsigned int, len, sg_left);
165
166 sg_set_page(iter, sg_page(buf->sg), part, buf->offset);
167
168 if (part == sg_left) {
169 buf->offset = 0;
170 buf->sg = sg_next(buf->sg);
171 } else {
172 buf->offset += part;
173 }
174 len -= part;
175 }
176
177 /* Assign the video data with header. */
178 req->buf = NULL;
179 req->sg = ureq->sgt.sgl;
180 req->num_sgs = i + 1;
181
182 req->length -= len;
183 video->queue.buf_used += req->length - header_len;
184
185 if (buf->bytesused == video->queue.buf_used || !buf->sg ||
186 video->queue.flags & UVC_QUEUE_DROP_INCOMPLETE) {
187 video->queue.buf_used = 0;
188 buf->state = UVC_BUF_STATE_DONE;
189 buf->offset = 0;
190 list_del(&buf->queue);
191 video->fid ^= UVC_STREAM_FID;
192 ureq->last_buf = buf;
193 }
194 }
195
196 static void
uvc_video_encode_isoc(struct usb_request * req,struct uvc_video * video,struct uvc_buffer * buf)197 uvc_video_encode_isoc(struct usb_request *req, struct uvc_video *video,
198 struct uvc_buffer *buf)
199 {
200 void *mem = req->buf;
201 struct uvc_request *ureq = req->context;
202 int len = video->req_size;
203 int ret;
204
205 /* Add the header. */
206 ret = uvc_video_encode_header(video, buf, mem, len);
207 mem += ret;
208 len -= ret;
209
210 /* Process video data. */
211 ret = uvc_video_encode_data(video, buf, mem, len);
212 len -= ret;
213
214 req->length = video->req_size - len;
215
216 if (buf->bytesused == video->queue.buf_used ||
217 video->queue.flags & UVC_QUEUE_DROP_INCOMPLETE) {
218 video->queue.buf_used = 0;
219 buf->state = UVC_BUF_STATE_DONE;
220 list_del(&buf->queue);
221 video->fid ^= UVC_STREAM_FID;
222 ureq->last_buf = buf;
223 }
224 }
225
226 /* --------------------------------------------------------------------------
227 * Request handling
228 */
229
230 /*
231 * Callers must take care to hold req_lock when this function may be called
232 * from multiple threads. For example, when frames are streaming to the host.
233 */
234 static void
uvc_video_free_request(struct uvc_request * ureq,struct usb_ep * ep)235 uvc_video_free_request(struct uvc_request *ureq, struct usb_ep *ep)
236 {
237 sg_free_table(&ureq->sgt);
238 if (ureq->req && ep) {
239 usb_ep_free_request(ep, ureq->req);
240 ureq->req = NULL;
241 }
242
243 kfree(ureq->req_buffer);
244 ureq->req_buffer = NULL;
245
246 if (!list_empty(&ureq->list))
247 list_del_init(&ureq->list);
248
249 kfree(ureq);
250 }
251
uvcg_video_ep_queue(struct uvc_video * video,struct usb_request * req)252 static int uvcg_video_ep_queue(struct uvc_video *video, struct usb_request *req)
253 {
254 int ret;
255
256 ret = usb_ep_queue(video->ep, req, GFP_ATOMIC);
257 if (ret < 0) {
258 uvcg_err(&video->uvc->func, "Failed to queue request (%d).\n",
259 ret);
260
261 /* If the endpoint is disabled the descriptor may be NULL. */
262 if (video->ep->desc) {
263 /* Isochronous endpoints can't be halted. */
264 if (usb_endpoint_xfer_bulk(video->ep->desc))
265 usb_ep_set_halt(video->ep);
266 }
267 }
268
269 return ret;
270 }
271
272 /* This function must be called with video->req_lock held. */
uvcg_video_usb_req_queue(struct uvc_video * video,struct usb_request * req,bool queue_to_ep)273 static int uvcg_video_usb_req_queue(struct uvc_video *video,
274 struct usb_request *req, bool queue_to_ep)
275 {
276 bool is_bulk = video->max_payload_size;
277 struct list_head *list = NULL;
278
279 if (!video->is_enabled)
280 return -ENODEV;
281
282 if (queue_to_ep) {
283 struct uvc_request *ureq = req->context;
284 /*
285 * With USB3 handling more requests at a higher speed, we can't
286 * afford to generate an interrupt for every request. Decide to
287 * interrupt:
288 *
289 * - When no more requests are available in the free queue, as
290 * this may be our last chance to refill the endpoint's
291 * request queue.
292 *
293 * - When this is request is the last request for the video
294 * buffer, as we want to start sending the next video buffer
295 * ASAP in case it doesn't get started already in the next
296 * iteration of this loop.
297 *
298 * - Four times over the length of the requests queue (as
299 * indicated by video->uvc_num_requests), as a trade-off
300 * between latency and interrupt load.
301 */
302 if (list_empty(&video->req_free) || ureq->last_buf ||
303 !(video->req_int_count %
304 DIV_ROUND_UP(video->uvc_num_requests, 4))) {
305 video->req_int_count = 0;
306 req->no_interrupt = 0;
307 } else {
308 req->no_interrupt = 1;
309 }
310 video->req_int_count++;
311 return uvcg_video_ep_queue(video, req);
312 }
313 /*
314 * If we're not queuing to the ep, for isoc we're queuing
315 * to the req_ready list, otherwise req_free.
316 */
317 list = is_bulk ? &video->req_free : &video->req_ready;
318 list_add_tail(&req->list, list);
319 return 0;
320 }
321
322 /*
323 * Must only be called from uvcg_video_enable - since after that we only want to
324 * queue requests to the endpoint from the uvc_video_complete complete handler.
325 * This function is needed in order to 'kick start' the flow of requests from
326 * gadget driver to the usb controller.
327 */
uvc_video_ep_queue_initial_requests(struct uvc_video * video)328 static void uvc_video_ep_queue_initial_requests(struct uvc_video *video)
329 {
330 struct usb_request *req = NULL;
331 unsigned long flags = 0;
332 unsigned int count = 0;
333 int ret = 0;
334
335 /*
336 * We only queue half of the free list since we still want to have
337 * some free usb_requests in the free list for the video_pump async_wq
338 * thread to encode uvc buffers into. Otherwise we could get into a
339 * situation where the free list does not have any usb requests to
340 * encode into - we always end up queueing 0 length requests to the
341 * end point.
342 */
343 unsigned int half_list_size = video->uvc_num_requests / 2;
344
345 spin_lock_irqsave(&video->req_lock, flags);
346 /*
347 * Take these requests off the free list and queue them all to the
348 * endpoint. Since we queue 0 length requests with the req_lock held,
349 * there isn't any 'data' race involved here with the complete handler.
350 */
351 while (count < half_list_size) {
352 req = list_first_entry(&video->req_free, struct usb_request,
353 list);
354 list_del(&req->list);
355 req->length = 0;
356 ret = uvcg_video_ep_queue(video, req);
357 if (ret < 0) {
358 uvcg_queue_cancel(&video->queue, 0);
359 break;
360 }
361 count++;
362 }
363 spin_unlock_irqrestore(&video->req_lock, flags);
364 }
365
366 static void
uvc_video_complete(struct usb_ep * ep,struct usb_request * req)367 uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
368 {
369 struct uvc_request *ureq = req->context;
370 struct uvc_video *video = ureq->video;
371 struct uvc_video_queue *queue = &video->queue;
372 struct uvc_buffer *last_buf;
373 unsigned long flags;
374 bool is_bulk = video->max_payload_size;
375 int ret = 0;
376
377 spin_lock_irqsave(&video->req_lock, flags);
378 if (!video->is_enabled) {
379 /*
380 * When is_enabled is false, uvcg_video_disable() ensures
381 * that in-flight uvc_buffers are returned, so we can
382 * safely call free_request without worrying about
383 * last_buf.
384 */
385 uvc_video_free_request(ureq, ep);
386 spin_unlock_irqrestore(&video->req_lock, flags);
387 return;
388 }
389
390 last_buf = ureq->last_buf;
391 ureq->last_buf = NULL;
392 spin_unlock_irqrestore(&video->req_lock, flags);
393
394 switch (req->status) {
395 case 0:
396 break;
397
398 case -EXDEV:
399 uvcg_dbg(&video->uvc->func, "VS request missed xfer.\n");
400 queue->flags |= UVC_QUEUE_DROP_INCOMPLETE;
401 break;
402
403 case -ESHUTDOWN: /* disconnect from host. */
404 uvcg_dbg(&video->uvc->func, "VS request cancelled.\n");
405 uvcg_queue_cancel(queue, 1);
406 break;
407
408 default:
409 uvcg_warn(&video->uvc->func,
410 "VS request completed with status %d.\n",
411 req->status);
412 uvcg_queue_cancel(queue, 0);
413 }
414
415 if (last_buf) {
416 spin_lock_irqsave(&queue->irqlock, flags);
417 uvcg_complete_buffer(queue, last_buf);
418 spin_unlock_irqrestore(&queue->irqlock, flags);
419 }
420
421 spin_lock_irqsave(&video->req_lock, flags);
422 /*
423 * Video stream might have been disabled while we were
424 * processing the current usb_request. So make sure
425 * we're still streaming before queueing the usb_request
426 * back to req_free
427 */
428 if (video->is_enabled) {
429 /*
430 * Here we check whether any request is available in the ready
431 * list. If it is, queue it to the ep and add the current
432 * usb_request to the req_free list - for video_pump to fill in.
433 * Otherwise, just use the current usb_request to queue a 0
434 * length request to the ep. Since we always add to the req_free
435 * list if we dequeue from the ready list, there will never
436 * be a situation where the req_free list is completely out of
437 * requests and cannot recover.
438 */
439 struct usb_request *to_queue = req;
440
441 to_queue->length = 0;
442 if (!list_empty(&video->req_ready)) {
443 to_queue = list_first_entry(&video->req_ready,
444 struct usb_request, list);
445 list_del(&to_queue->list);
446 list_add_tail(&req->list, &video->req_free);
447 /*
448 * Queue work to the wq as well since it is possible that a
449 * buffer may not have been completely encoded with the set of
450 * in-flight usb requests for whih the complete callbacks are
451 * firing.
452 * In that case, if we do not queue work to the worker thread,
453 * the buffer will never be marked as complete - and therefore
454 * not be returned to userpsace. As a result,
455 * dequeue -> queue -> dequeue flow of uvc buffers will not
456 * happen.
457 */
458 queue_work(video->async_wq, &video->pump);
459 }
460 /*
461 * Queue to the endpoint. The actual queueing to ep will
462 * only happen on one thread - the async_wq for bulk endpoints
463 * and this thread for isoc endpoints.
464 */
465 ret = uvcg_video_usb_req_queue(video, to_queue, !is_bulk);
466 if (ret < 0) {
467 /*
468 * Endpoint error, but the stream is still enabled.
469 * Put request back in req_free for it to be cleaned
470 * up later.
471 */
472 list_add_tail(&to_queue->list, &video->req_free);
473 }
474 } else {
475 uvc_video_free_request(ureq, ep);
476 ret = 0;
477 }
478 spin_unlock_irqrestore(&video->req_lock, flags);
479 if (ret < 0)
480 uvcg_queue_cancel(queue, 0);
481 }
482
483 static int
uvc_video_free_requests(struct uvc_video * video)484 uvc_video_free_requests(struct uvc_video *video)
485 {
486 struct uvc_request *ureq, *temp;
487
488 list_for_each_entry_safe(ureq, temp, &video->ureqs, list)
489 uvc_video_free_request(ureq, video->ep);
490
491 INIT_LIST_HEAD(&video->ureqs);
492 INIT_LIST_HEAD(&video->req_free);
493 INIT_LIST_HEAD(&video->req_ready);
494 video->req_size = 0;
495 return 0;
496 }
497
498 static int
uvc_video_alloc_requests(struct uvc_video * video)499 uvc_video_alloc_requests(struct uvc_video *video)
500 {
501 struct uvc_request *ureq;
502 unsigned int req_size;
503 unsigned int i;
504 int ret = -ENOMEM;
505
506 BUG_ON(video->req_size);
507
508 req_size = video->ep->maxpacket
509 * max_t(unsigned int, video->ep->maxburst, 1)
510 * (video->ep->mult);
511
512 for (i = 0; i < video->uvc_num_requests; i++) {
513 ureq = kzalloc(sizeof(struct uvc_request), GFP_KERNEL);
514 if (ureq == NULL)
515 goto error;
516
517 INIT_LIST_HEAD(&ureq->list);
518
519 list_add_tail(&ureq->list, &video->ureqs);
520
521 ureq->req_buffer = kmalloc(req_size, GFP_KERNEL);
522 if (ureq->req_buffer == NULL)
523 goto error;
524
525 ureq->req = usb_ep_alloc_request(video->ep, GFP_KERNEL);
526 if (ureq->req == NULL)
527 goto error;
528
529 ureq->req->buf = ureq->req_buffer;
530 ureq->req->length = 0;
531 ureq->req->complete = uvc_video_complete;
532 ureq->req->context = ureq;
533 ureq->video = video;
534 ureq->last_buf = NULL;
535
536 list_add_tail(&ureq->req->list, &video->req_free);
537 /* req_size/PAGE_SIZE + 1 for overruns and + 1 for header */
538 sg_alloc_table(&ureq->sgt,
539 DIV_ROUND_UP(req_size - UVCG_REQUEST_HEADER_LEN,
540 PAGE_SIZE) + 2, GFP_KERNEL);
541 }
542
543 video->req_size = req_size;
544
545 return 0;
546
547 error:
548 uvc_video_free_requests(video);
549 return ret;
550 }
551
552 /* --------------------------------------------------------------------------
553 * Video streaming
554 */
555
556 /*
557 * uvcg_video_pump - Pump video data into the USB requests
558 *
559 * This function fills the available USB requests (listed in req_free) with
560 * video data from the queued buffers.
561 */
uvcg_video_pump(struct work_struct * work)562 static void uvcg_video_pump(struct work_struct *work)
563 {
564 struct uvc_video *video = container_of(work, struct uvc_video, pump);
565 struct uvc_video_queue *queue = &video->queue;
566 /* video->max_payload_size is only set when using bulk transfer */
567 bool is_bulk = video->max_payload_size;
568 struct usb_request *req = NULL;
569 struct uvc_buffer *buf;
570 unsigned long flags;
571 int ret = 0;
572
573 while (true) {
574 if (!video->ep->enabled)
575 return;
576
577 /*
578 * Check is_enabled and retrieve the first available USB
579 * request, protected by the request lock.
580 */
581 spin_lock_irqsave(&video->req_lock, flags);
582 if (!video->is_enabled || list_empty(&video->req_free)) {
583 spin_unlock_irqrestore(&video->req_lock, flags);
584 return;
585 }
586 req = list_first_entry(&video->req_free, struct usb_request,
587 list);
588 list_del(&req->list);
589 spin_unlock_irqrestore(&video->req_lock, flags);
590
591 /*
592 * Retrieve the first available video buffer and fill the
593 * request, protected by the video queue irqlock.
594 */
595 spin_lock_irqsave(&queue->irqlock, flags);
596 buf = uvcg_queue_head(queue);
597
598 if (buf != NULL) {
599 video->encode(req, video, buf);
600 } else {
601 /*
602 * Either the queue has been disconnected or no video buffer
603 * available for bulk transfer. Either way, stop processing
604 * further.
605 */
606 spin_unlock_irqrestore(&queue->irqlock, flags);
607 break;
608 }
609
610 spin_unlock_irqrestore(&queue->irqlock, flags);
611
612 spin_lock_irqsave(&video->req_lock, flags);
613 /* For bulk end points we queue from the worker thread
614 * since we would preferably not want to wait on requests
615 * to be ready, in the uvcg_video_complete() handler.
616 * For isoc endpoints we add the request to the ready list
617 * and only queue it to the endpoint from the complete handler.
618 */
619 ret = uvcg_video_usb_req_queue(video, req, is_bulk);
620 spin_unlock_irqrestore(&video->req_lock, flags);
621
622 if (ret < 0) {
623 uvcg_queue_cancel(queue, 0);
624 break;
625 }
626
627 /* The request is owned by the endpoint / ready list. */
628 req = NULL;
629 }
630
631 if (!req)
632 return;
633
634 spin_lock_irqsave(&video->req_lock, flags);
635 if (video->is_enabled)
636 list_add_tail(&req->list, &video->req_free);
637 else
638 uvc_video_free_request(req->context, video->ep);
639 spin_unlock_irqrestore(&video->req_lock, flags);
640 }
641
642 /*
643 * Disable the video stream
644 */
645 int
uvcg_video_disable(struct uvc_video * video)646 uvcg_video_disable(struct uvc_video *video)
647 {
648 unsigned long flags;
649 struct list_head inflight_bufs;
650 struct usb_request *req, *temp;
651 struct uvc_buffer *buf, *btemp;
652 struct uvc_request *ureq, *utemp;
653
654 if (video->ep == NULL) {
655 uvcg_info(&video->uvc->func,
656 "Video disable failed, device is uninitialized.\n");
657 return -ENODEV;
658 }
659
660 INIT_LIST_HEAD(&inflight_bufs);
661 spin_lock_irqsave(&video->req_lock, flags);
662 video->is_enabled = false;
663
664 /*
665 * Remove any in-flight buffers from the uvc_requests
666 * because we want to return them before cancelling the
667 * queue. This ensures that we aren't stuck waiting for
668 * all complete callbacks to come through before disabling
669 * vb2 queue.
670 */
671 list_for_each_entry(ureq, &video->ureqs, list) {
672 if (ureq->last_buf) {
673 list_add_tail(&ureq->last_buf->queue, &inflight_bufs);
674 ureq->last_buf = NULL;
675 }
676 }
677 spin_unlock_irqrestore(&video->req_lock, flags);
678
679 cancel_work_sync(&video->pump);
680 uvcg_queue_cancel(&video->queue, 0);
681
682 spin_lock_irqsave(&video->req_lock, flags);
683 /*
684 * Remove all uvc_requests from ureqs with list_del_init
685 * This lets uvc_video_free_request correctly identify
686 * if the uvc_request is attached to a list or not when freeing
687 * memory.
688 */
689 list_for_each_entry_safe(ureq, utemp, &video->ureqs, list)
690 list_del_init(&ureq->list);
691
692 list_for_each_entry_safe(req, temp, &video->req_free, list) {
693 list_del(&req->list);
694 uvc_video_free_request(req->context, video->ep);
695 }
696
697 list_for_each_entry_safe(req, temp, &video->req_ready, list) {
698 list_del(&req->list);
699 uvc_video_free_request(req->context, video->ep);
700 }
701
702 INIT_LIST_HEAD(&video->ureqs);
703 INIT_LIST_HEAD(&video->req_free);
704 INIT_LIST_HEAD(&video->req_ready);
705 video->req_size = 0;
706 spin_unlock_irqrestore(&video->req_lock, flags);
707
708 /*
709 * Return all the video buffers before disabling the queue.
710 */
711 spin_lock_irqsave(&video->queue.irqlock, flags);
712 list_for_each_entry_safe(buf, btemp, &inflight_bufs, queue) {
713 list_del(&buf->queue);
714 uvcg_complete_buffer(&video->queue, buf);
715 }
716 spin_unlock_irqrestore(&video->queue.irqlock, flags);
717
718 uvcg_queue_enable(&video->queue, 0);
719 return 0;
720 }
721
722 /*
723 * Enable the video stream.
724 */
uvcg_video_enable(struct uvc_video * video)725 int uvcg_video_enable(struct uvc_video *video)
726 {
727 int ret;
728
729 if (video->ep == NULL) {
730 uvcg_info(&video->uvc->func,
731 "Video enable failed, device is uninitialized.\n");
732 return -ENODEV;
733 }
734
735 /*
736 * Safe to access request related fields without req_lock because
737 * this is the only thread currently active, and no other
738 * request handling thread will become active until this function
739 * returns.
740 */
741 video->is_enabled = true;
742
743 if ((ret = uvcg_queue_enable(&video->queue, 1)) < 0)
744 return ret;
745
746 if ((ret = uvc_video_alloc_requests(video)) < 0)
747 return ret;
748
749 if (video->max_payload_size) {
750 video->encode = uvc_video_encode_bulk;
751 video->payload_size = 0;
752 } else
753 video->encode = video->queue.use_sg ?
754 uvc_video_encode_isoc_sg : uvc_video_encode_isoc;
755
756 video->req_int_count = 0;
757
758 uvc_video_ep_queue_initial_requests(video);
759
760 return ret;
761 }
762
763 /*
764 * Initialize the UVC video stream.
765 */
uvcg_video_init(struct uvc_video * video,struct uvc_device * uvc)766 int uvcg_video_init(struct uvc_video *video, struct uvc_device *uvc)
767 {
768 video->is_enabled = false;
769 INIT_LIST_HEAD(&video->ureqs);
770 INIT_LIST_HEAD(&video->req_free);
771 INIT_LIST_HEAD(&video->req_ready);
772 spin_lock_init(&video->req_lock);
773 INIT_WORK(&video->pump, uvcg_video_pump);
774
775 /* Allocate a work queue for asynchronous video pump handler. */
776 video->async_wq = alloc_workqueue("uvcgadget", WQ_UNBOUND | WQ_HIGHPRI, 0);
777 if (!video->async_wq)
778 return -EINVAL;
779
780 video->uvc = uvc;
781 video->fcc = V4L2_PIX_FMT_YUYV;
782 video->bpp = 16;
783 video->width = 320;
784 video->height = 240;
785 video->imagesize = 320 * 240 * 2;
786
787 /* Initialize the video buffers queue. */
788 uvcg_queue_init(&video->queue, uvc->v4l2_dev.dev->parent,
789 V4L2_BUF_TYPE_VIDEO_OUTPUT, &video->mutex);
790 return 0;
791 }
792