1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/kernel.h>
14#include <linux/mm.h>
15#include <linux/list.h>
16#include <linux/module.h>
17#include <linux/usb.h>
18#include <linux/videodev2.h>
19#include <linux/vmalloc.h>
20#include <linux/wait.h>
21#include <linux/atomic.h>
22
23#include "uvc.h"
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80static void
81uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
82{
83 mutex_init(&queue->mutex);
84 spin_lock_init(&queue->irqlock);
85 INIT_LIST_HEAD(&queue->mainqueue);
86 INIT_LIST_HEAD(&queue->irqqueue);
87 queue->type = type;
88}
89
90
91
92
93
94
95static int uvc_free_buffers(struct uvc_video_queue *queue)
96{
97 unsigned int i;
98
99 for (i = 0; i < queue->count; ++i) {
100 if (queue->buffer[i].vma_use_count != 0)
101 return -EBUSY;
102 }
103
104 if (queue->count) {
105 vfree(queue->mem);
106 queue->count = 0;
107 }
108
109 return 0;
110}
111
112
113
114
115
116
117
118
119
120static int
121uvc_alloc_buffers(struct uvc_video_queue *queue, unsigned int nbuffers,
122 unsigned int buflength)
123{
124 unsigned int bufsize = PAGE_ALIGN(buflength);
125 unsigned int i;
126 void *mem = NULL;
127 int ret;
128
129 if (nbuffers > UVC_MAX_VIDEO_BUFFERS)
130 nbuffers = UVC_MAX_VIDEO_BUFFERS;
131
132 mutex_lock(&queue->mutex);
133
134 if ((ret = uvc_free_buffers(queue)) < 0)
135 goto done;
136
137
138 if (nbuffers == 0)
139 goto done;
140
141
142 for (; nbuffers > 0; --nbuffers) {
143 mem = vmalloc_32(nbuffers * bufsize);
144 if (mem != NULL)
145 break;
146 }
147
148 if (mem == NULL) {
149 ret = -ENOMEM;
150 goto done;
151 }
152
153 for (i = 0; i < nbuffers; ++i) {
154 memset(&queue->buffer[i], 0, sizeof queue->buffer[i]);
155 queue->buffer[i].buf.index = i;
156 queue->buffer[i].buf.m.offset = i * bufsize;
157 queue->buffer[i].buf.length = buflength;
158 queue->buffer[i].buf.type = queue->type;
159 queue->buffer[i].buf.sequence = 0;
160 queue->buffer[i].buf.field = V4L2_FIELD_NONE;
161 queue->buffer[i].buf.memory = V4L2_MEMORY_MMAP;
162 queue->buffer[i].buf.flags = 0;
163 init_waitqueue_head(&queue->buffer[i].wait);
164 }
165
166 queue->mem = mem;
167 queue->count = nbuffers;
168 queue->buf_size = bufsize;
169 ret = nbuffers;
170
171done:
172 mutex_unlock(&queue->mutex);
173 return ret;
174}
175
176static void __uvc_query_buffer(struct uvc_buffer *buf,
177 struct v4l2_buffer *v4l2_buf)
178{
179 memcpy(v4l2_buf, &buf->buf, sizeof *v4l2_buf);
180
181 if (buf->vma_use_count)
182 v4l2_buf->flags |= V4L2_BUF_FLAG_MAPPED;
183
184 switch (buf->state) {
185 case UVC_BUF_STATE_ERROR:
186 case UVC_BUF_STATE_DONE:
187 v4l2_buf->flags |= V4L2_BUF_FLAG_DONE;
188 break;
189 case UVC_BUF_STATE_QUEUED:
190 case UVC_BUF_STATE_ACTIVE:
191 v4l2_buf->flags |= V4L2_BUF_FLAG_QUEUED;
192 break;
193 case UVC_BUF_STATE_IDLE:
194 default:
195 break;
196 }
197}
198
199static int
200uvc_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf)
201{
202 int ret = 0;
203
204 mutex_lock(&queue->mutex);
205 if (v4l2_buf->index >= queue->count) {
206 ret = -EINVAL;
207 goto done;
208 }
209
210 __uvc_query_buffer(&queue->buffer[v4l2_buf->index], v4l2_buf);
211
212done:
213 mutex_unlock(&queue->mutex);
214 return ret;
215}
216
217
218
219
220
221static int
222uvc_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf)
223{
224 struct uvc_buffer *buf;
225 unsigned long flags;
226 int ret = 0;
227
228 uvc_trace(UVC_TRACE_CAPTURE, "Queuing buffer %u.\n", v4l2_buf->index);
229
230 if (v4l2_buf->type != queue->type ||
231 v4l2_buf->memory != V4L2_MEMORY_MMAP) {
232 uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer type (%u) "
233 "and/or memory (%u).\n", v4l2_buf->type,
234 v4l2_buf->memory);
235 return -EINVAL;
236 }
237
238 mutex_lock(&queue->mutex);
239 if (v4l2_buf->index >= queue->count) {
240 uvc_trace(UVC_TRACE_CAPTURE, "[E] Out of range index.\n");
241 ret = -EINVAL;
242 goto done;
243 }
244
245 buf = &queue->buffer[v4l2_buf->index];
246 if (buf->state != UVC_BUF_STATE_IDLE) {
247 uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer state "
248 "(%u).\n", buf->state);
249 ret = -EINVAL;
250 goto done;
251 }
252
253 if (v4l2_buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
254 v4l2_buf->bytesused > buf->buf.length) {
255 uvc_trace(UVC_TRACE_CAPTURE, "[E] Bytes used out of bounds.\n");
256 ret = -EINVAL;
257 goto done;
258 }
259
260 if (v4l2_buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
261 buf->buf.bytesused = 0;
262 else
263 buf->buf.bytesused = v4l2_buf->bytesused;
264
265 spin_lock_irqsave(&queue->irqlock, flags);
266 if (queue->flags & UVC_QUEUE_DISCONNECTED) {
267 spin_unlock_irqrestore(&queue->irqlock, flags);
268 ret = -ENODEV;
269 goto done;
270 }
271 buf->state = UVC_BUF_STATE_QUEUED;
272
273 ret = (queue->flags & UVC_QUEUE_PAUSED) != 0;
274 queue->flags &= ~UVC_QUEUE_PAUSED;
275
276 list_add_tail(&buf->stream, &queue->mainqueue);
277 list_add_tail(&buf->queue, &queue->irqqueue);
278 spin_unlock_irqrestore(&queue->irqlock, flags);
279
280done:
281 mutex_unlock(&queue->mutex);
282 return ret;
283}
284
285static int uvc_queue_waiton(struct uvc_buffer *buf, int nonblocking)
286{
287 if (nonblocking) {
288 return (buf->state != UVC_BUF_STATE_QUEUED &&
289 buf->state != UVC_BUF_STATE_ACTIVE)
290 ? 0 : -EAGAIN;
291 }
292
293 return wait_event_interruptible(buf->wait,
294 buf->state != UVC_BUF_STATE_QUEUED &&
295 buf->state != UVC_BUF_STATE_ACTIVE);
296}
297
298
299
300
301
302static int
303uvc_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf,
304 int nonblocking)
305{
306 struct uvc_buffer *buf;
307 int ret = 0;
308
309 if (v4l2_buf->type != queue->type ||
310 v4l2_buf->memory != V4L2_MEMORY_MMAP) {
311 uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer type (%u) "
312 "and/or memory (%u).\n", v4l2_buf->type,
313 v4l2_buf->memory);
314 return -EINVAL;
315 }
316
317 mutex_lock(&queue->mutex);
318 if (list_empty(&queue->mainqueue)) {
319 uvc_trace(UVC_TRACE_CAPTURE, "[E] Empty buffer queue.\n");
320 ret = -EINVAL;
321 goto done;
322 }
323
324 buf = list_first_entry(&queue->mainqueue, struct uvc_buffer, stream);
325 if ((ret = uvc_queue_waiton(buf, nonblocking)) < 0)
326 goto done;
327
328 uvc_trace(UVC_TRACE_CAPTURE, "Dequeuing buffer %u (%u, %u bytes).\n",
329 buf->buf.index, buf->state, buf->buf.bytesused);
330
331 switch (buf->state) {
332 case UVC_BUF_STATE_ERROR:
333 uvc_trace(UVC_TRACE_CAPTURE, "[W] Corrupted data "
334 "(transmission error).\n");
335 ret = -EIO;
336 case UVC_BUF_STATE_DONE:
337 buf->state = UVC_BUF_STATE_IDLE;
338 break;
339
340 case UVC_BUF_STATE_IDLE:
341 case UVC_BUF_STATE_QUEUED:
342 case UVC_BUF_STATE_ACTIVE:
343 default:
344 uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer state %u "
345 "(driver bug?).\n", buf->state);
346 ret = -EINVAL;
347 goto done;
348 }
349
350 list_del(&buf->stream);
351 __uvc_query_buffer(buf, v4l2_buf);
352
353done:
354 mutex_unlock(&queue->mutex);
355 return ret;
356}
357
358
359
360
361
362
363
364static unsigned int
365uvc_queue_poll(struct uvc_video_queue *queue, struct file *file,
366 poll_table *wait)
367{
368 struct uvc_buffer *buf;
369 unsigned int mask = 0;
370
371 mutex_lock(&queue->mutex);
372 if (list_empty(&queue->mainqueue))
373 goto done;
374
375 buf = list_first_entry(&queue->mainqueue, struct uvc_buffer, stream);
376
377 poll_wait(file, &buf->wait, wait);
378 if (buf->state == UVC_BUF_STATE_DONE ||
379 buf->state == UVC_BUF_STATE_ERROR)
380 mask |= POLLOUT | POLLWRNORM;
381
382done:
383 mutex_unlock(&queue->mutex);
384 return mask;
385}
386
387
388
389
390static void uvc_vm_open(struct vm_area_struct *vma)
391{
392 struct uvc_buffer *buffer = vma->vm_private_data;
393 buffer->vma_use_count++;
394}
395
396static void uvc_vm_close(struct vm_area_struct *vma)
397{
398 struct uvc_buffer *buffer = vma->vm_private_data;
399 buffer->vma_use_count--;
400}
401
402static struct vm_operations_struct uvc_vm_ops = {
403 .open = uvc_vm_open,
404 .close = uvc_vm_close,
405};
406
407
408
409
410
411
412
413static int
414uvc_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma)
415{
416 struct uvc_buffer *uninitialized_var(buffer);
417 struct page *page;
418 unsigned long addr, start, size;
419 unsigned int i;
420 int ret = 0;
421
422 start = vma->vm_start;
423 size = vma->vm_end - vma->vm_start;
424
425 mutex_lock(&queue->mutex);
426
427 for (i = 0; i < queue->count; ++i) {
428 buffer = &queue->buffer[i];
429 if ((buffer->buf.m.offset >> PAGE_SHIFT) == vma->vm_pgoff)
430 break;
431 }
432
433 if (i == queue->count || size != queue->buf_size) {
434 ret = -EINVAL;
435 goto done;
436 }
437
438
439
440
441
442 vma->vm_flags |= VM_IO;
443
444 addr = (unsigned long)queue->mem + buffer->buf.m.offset;
445 while (size > 0) {
446 page = vmalloc_to_page((void *)addr);
447 if ((ret = vm_insert_page(vma, start, page)) < 0)
448 goto done;
449
450 start += PAGE_SIZE;
451 addr += PAGE_SIZE;
452 size -= PAGE_SIZE;
453 }
454
455 vma->vm_ops = &uvc_vm_ops;
456 vma->vm_private_data = buffer;
457 uvc_vm_open(vma);
458
459done:
460 mutex_unlock(&queue->mutex);
461 return ret;
462}
463
464
465
466
467
468
469
470
471
472
473
474
475
476static void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect)
477{
478 struct uvc_buffer *buf;
479 unsigned long flags;
480
481 spin_lock_irqsave(&queue->irqlock, flags);
482 while (!list_empty(&queue->irqqueue)) {
483 buf = list_first_entry(&queue->irqqueue, struct uvc_buffer,
484 queue);
485 list_del(&buf->queue);
486 buf->state = UVC_BUF_STATE_ERROR;
487 wake_up(&buf->wait);
488 }
489
490
491
492
493
494
495 if (disconnect)
496 queue->flags |= UVC_QUEUE_DISCONNECTED;
497 spin_unlock_irqrestore(&queue->irqlock, flags);
498}
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517static int uvc_queue_enable(struct uvc_video_queue *queue, int enable)
518{
519 unsigned int i;
520 int ret = 0;
521
522 mutex_lock(&queue->mutex);
523 if (enable) {
524 if (uvc_queue_streaming(queue)) {
525 ret = -EBUSY;
526 goto done;
527 }
528 queue->sequence = 0;
529 queue->flags |= UVC_QUEUE_STREAMING;
530 queue->buf_used = 0;
531 } else {
532 uvc_queue_cancel(queue, 0);
533 INIT_LIST_HEAD(&queue->mainqueue);
534
535 for (i = 0; i < queue->count; ++i)
536 queue->buffer[i].state = UVC_BUF_STATE_IDLE;
537
538 queue->flags &= ~UVC_QUEUE_STREAMING;
539 }
540
541done:
542 mutex_unlock(&queue->mutex);
543 return ret;
544}
545
546static struct uvc_buffer *
547uvc_queue_next_buffer(struct uvc_video_queue *queue, struct uvc_buffer *buf)
548{
549 struct uvc_buffer *nextbuf;
550 unsigned long flags;
551
552 if ((queue->flags & UVC_QUEUE_DROP_INCOMPLETE) &&
553 buf->buf.length != buf->buf.bytesused) {
554 buf->state = UVC_BUF_STATE_QUEUED;
555 buf->buf.bytesused = 0;
556 return buf;
557 }
558
559 spin_lock_irqsave(&queue->irqlock, flags);
560 list_del(&buf->queue);
561 if (!list_empty(&queue->irqqueue))
562 nextbuf = list_first_entry(&queue->irqqueue, struct uvc_buffer,
563 queue);
564 else
565 nextbuf = NULL;
566 spin_unlock_irqrestore(&queue->irqlock, flags);
567
568 buf->buf.sequence = queue->sequence++;
569 do_gettimeofday(&buf->buf.timestamp);
570
571 wake_up(&buf->wait);
572 return nextbuf;
573}
574
575static struct uvc_buffer *uvc_queue_head(struct uvc_video_queue *queue)
576{
577 struct uvc_buffer *buf = NULL;
578
579 if (!list_empty(&queue->irqqueue))
580 buf = list_first_entry(&queue->irqqueue, struct uvc_buffer,
581 queue);
582 else
583 queue->flags |= UVC_QUEUE_PAUSED;
584
585 return buf;
586}
587
588