V4L/DVB (6305): V4L: videobuf-core.c avoid NULL dereferences in videobuf-core
[safe/jmp/linux-2.6] / drivers / media / video / videobuf-core.c
1 /*
2  * generic helper functions for handling video4linux capture buffers
3  *
4  * (c) 2007 Mauro Carvalho Chehab, <mchehab@infradead.org>
5  *
6  * Highly based on video-buf written originally by:
7  * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
8  * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org>
9  * (c) 2006 Ted Walther and John Sokol
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2
14  */
15
16 #include <linux/init.h>
17 #include <linux/module.h>
18 #include <linux/moduleparam.h>
19 #include <linux/slab.h>
20 #include <linux/interrupt.h>
21
22 #include <media/videobuf-core.h>
23
24 #define MAGIC_BUFFER 0x20070728
25 #define MAGIC_CHECK(is,should)  if (unlikely((is) != (should))) \
26         { printk(KERN_ERR "magic mismatch: %x (expected %x)\n",is,should); BUG(); }
27
28 static int debug = 0;
29 module_param(debug, int, 0644);
30
31 MODULE_DESCRIPTION("helper module to manage video4linux buffers");
32 MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
33 MODULE_LICENSE("GPL");
34
35 #define dprintk(level, fmt, arg...)     if (debug >= level) \
36         printk(KERN_DEBUG "vbuf: " fmt , ## arg)
37
38 /* --------------------------------------------------------------------- */
39
40 #define CALL(q, f, arg...)                                              \
41         ( (q->int_ops->f)? q->int_ops->f(arg) : 0)
42
43 void* videobuf_alloc(struct videobuf_queue* q)
44 {
45         struct videobuf_buffer *vb;
46
47         BUG_ON (q->msize<sizeof(*vb));
48
49         if (!q->int_ops || !q->int_ops->alloc) {
50                 printk(KERN_ERR "No specific ops defined!\n");
51                 BUG();
52         }
53
54         vb = q->int_ops->alloc(q->msize);
55
56         if (NULL != vb) {
57                 init_waitqueue_head(&vb->done);
58                 vb->magic     = MAGIC_BUFFER;
59         }
60
61         return vb;
62 }
63
64 int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
65 {
66         int retval = 0;
67         DECLARE_WAITQUEUE(wait, current);
68
69         MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
70         add_wait_queue(&vb->done, &wait);
71         while (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED) {
72                 if (non_blocking) {
73                         retval = -EAGAIN;
74                         break;
75                 }
76                 set_current_state(intr  ? TASK_INTERRUPTIBLE
77                                         : TASK_UNINTERRUPTIBLE);
78                 if (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED)
79                         schedule();
80                 set_current_state(TASK_RUNNING);
81                 if (intr && signal_pending(current)) {
82                         dprintk(1,"buffer waiton: -EINTR\n");
83                         retval = -EINTR;
84                         break;
85                 }
86         }
87         remove_wait_queue(&vb->done, &wait);
88         return retval;
89 }
90
91 int videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb,
92                     struct v4l2_framebuffer *fbuf)
93 {
94         MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
95         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
96
97         /* FIXME: This is required to avoid OOPS on some cases, since mmap_mapper()
98            method should be called before _iolock.
99            On some cases, the mmap_mapper() is called only after scheduling.
100
101            However, this way is just too dirty! Better to wait for some event.
102          */
103         schedule_timeout(HZ);
104
105         return CALL(q,iolock,q,vb,fbuf);
106 }
107
108 /* --------------------------------------------------------------------- */
109
110
111 void videobuf_queue_core_init(struct videobuf_queue* q,
112                          struct videobuf_queue_ops *ops,
113                          void *dev,
114                          spinlock_t *irqlock,
115                          enum v4l2_buf_type type,
116                          enum v4l2_field field,
117                          unsigned int msize,
118                          void *priv,
119                          struct videobuf_qtype_ops *int_ops)
120 {
121         memset(q,0,sizeof(*q));
122         q->irqlock   = irqlock;
123         q->dev       = dev;
124         q->type      = type;
125         q->field     = field;
126         q->msize     = msize;
127         q->ops       = ops;
128         q->priv_data = priv;
129         q->int_ops   = int_ops;
130
131         /* All buffer operations are mandatory */
132         BUG_ON (!q->ops->buf_setup);
133         BUG_ON (!q->ops->buf_prepare);
134         BUG_ON (!q->ops->buf_queue);
135         BUG_ON (!q->ops->buf_release);
136
137         /* Having implementations for abstract methods are mandatory */
138         BUG_ON (!q->int_ops);
139
140         mutex_init(&q->lock);
141         INIT_LIST_HEAD(&q->stream);
142 }
143
144 int videobuf_queue_is_busy(struct videobuf_queue *q)
145 {
146         int i;
147
148         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
149
150         if (q->streaming) {
151                 dprintk(1,"busy: streaming active\n");
152                 return 1;
153         }
154         if (q->reading) {
155                 dprintk(1,"busy: pending read #1\n");
156                 return 1;
157         }
158         if (q->read_buf) {
159                 dprintk(1,"busy: pending read #2\n");
160                 return 1;
161         }
162         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
163                 if (NULL == q->bufs[i])
164                         continue;
165                 if (q->bufs[i]->map) {
166                         dprintk(1,"busy: buffer #%d mapped\n",i);
167                         return 1;
168                 }
169                 if (q->bufs[i]->state == STATE_QUEUED) {
170                         dprintk(1,"busy: buffer #%d queued\n",i);
171                         return 1;
172                 }
173                 if (q->bufs[i]->state == STATE_ACTIVE) {
174                         dprintk(1,"busy: buffer #%d avtive\n",i);
175                         return 1;
176                 }
177         }
178         return 0;
179 }
180
181 void videobuf_queue_cancel(struct videobuf_queue *q)
182 {
183         unsigned long flags=0;
184         int i;
185
186         /* remove queued buffers from list */
187         if (q->irqlock)
188                 spin_lock_irqsave(q->irqlock,flags);
189         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
190                 if (NULL == q->bufs[i])
191                         continue;
192                 if (q->bufs[i]->state == STATE_QUEUED) {
193                         list_del(&q->bufs[i]->queue);
194                         q->bufs[i]->state = STATE_ERROR;
195                 }
196         }
197         if (q->irqlock)
198                 spin_unlock_irqrestore(q->irqlock,flags);
199
200         /* free all buffers + clear queue */
201         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
202                 if (NULL == q->bufs[i])
203                         continue;
204                 q->ops->buf_release(q,q->bufs[i]);
205         }
206         INIT_LIST_HEAD(&q->stream);
207 }
208
209 /* --------------------------------------------------------------------- */
210
211 enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
212 {
213         enum v4l2_field field = q->field;
214
215         BUG_ON(V4L2_FIELD_ANY == field);
216
217         if (V4L2_FIELD_ALTERNATE == field) {
218                 if (V4L2_FIELD_TOP == q->last) {
219                         field   = V4L2_FIELD_BOTTOM;
220                         q->last = V4L2_FIELD_BOTTOM;
221                 } else {
222                         field   = V4L2_FIELD_TOP;
223                         q->last = V4L2_FIELD_TOP;
224                 }
225         }
226         return field;
227 }
228
229 static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
230                             struct videobuf_buffer *vb, enum v4l2_buf_type type)
231 {
232         MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
233         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
234
235         b->index    = vb->i;
236         b->type     = type;
237
238         b->memory   = vb->memory;
239         switch (b->memory) {
240         case V4L2_MEMORY_MMAP:
241                 b->m.offset  = vb->boff;
242                 b->length    = vb->bsize;
243                 break;
244         case V4L2_MEMORY_USERPTR:
245                 b->m.userptr = vb->baddr;
246                 b->length    = vb->bsize;
247                 break;
248         case V4L2_MEMORY_OVERLAY:
249                 b->m.offset  = vb->boff;
250                 break;
251         }
252
253         b->flags    = 0;
254         if (vb->map)
255                 b->flags |= V4L2_BUF_FLAG_MAPPED;
256
257         switch (vb->state) {
258         case STATE_PREPARED:
259         case STATE_QUEUED:
260         case STATE_ACTIVE:
261                 b->flags |= V4L2_BUF_FLAG_QUEUED;
262                 break;
263         case STATE_DONE:
264         case STATE_ERROR:
265                 b->flags |= V4L2_BUF_FLAG_DONE;
266                 break;
267         case STATE_NEEDS_INIT:
268         case STATE_IDLE:
269                 /* nothing */
270                 break;
271         }
272
273         if (vb->input != UNSET) {
274                 b->flags |= V4L2_BUF_FLAG_INPUT;
275                 b->input  = vb->input;
276         }
277
278         b->field     = vb->field;
279         b->timestamp = vb->ts;
280         b->bytesused = vb->size;
281         b->sequence  = vb->field_count >> 1;
282 }
283
284 int videobuf_reqbufs(struct videobuf_queue *q,
285                  struct v4l2_requestbuffers *req)
286 {
287         unsigned int size,count;
288         int retval;
289
290         if (req->type != q->type) {
291                 dprintk(1,"reqbufs: queue type invalid\n");
292                 return -EINVAL;
293         }
294         if (req->count < 1) {
295                 dprintk(1,"reqbufs: count invalid (%d)\n",req->count);
296                 return -EINVAL;
297         }
298         if (req->memory != V4L2_MEMORY_MMAP     &&
299             req->memory != V4L2_MEMORY_USERPTR  &&
300             req->memory != V4L2_MEMORY_OVERLAY) {
301                 dprintk(1,"reqbufs: memory type invalid\n");
302                 return -EINVAL;
303         }
304
305         mutex_lock(&q->lock);
306         if (q->streaming) {
307                 dprintk(1,"reqbufs: streaming already exists\n");
308                 retval = -EBUSY;
309                 goto done;
310         }
311         if (!list_empty(&q->stream)) {
312                 dprintk(1,"reqbufs: stream running\n");
313                 retval = -EBUSY;
314                 goto done;
315         }
316
317         count = req->count;
318         if (count > VIDEO_MAX_FRAME)
319                 count = VIDEO_MAX_FRAME;
320         size = 0;
321         q->ops->buf_setup(q,&count,&size);
322         size = PAGE_ALIGN(size);
323         dprintk(1,"reqbufs: bufs=%d, size=0x%x [%d pages total]\n",
324                 count, size, (count*size)>>PAGE_SHIFT);
325
326         retval = videobuf_mmap_setup(q,count,size,req->memory);
327         if (retval < 0) {
328                 dprintk(1,"reqbufs: mmap setup returned %d\n",retval);
329                 goto done;
330         }
331
332         req->count = retval;
333
334  done:
335         mutex_unlock(&q->lock);
336         return retval;
337 }
338
339 int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
340 {
341         if (unlikely(b->type != q->type)) {
342                 dprintk(1,"querybuf: Wrong type.\n");
343                 return -EINVAL;
344         }
345         if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) {
346                 dprintk(1,"querybuf: index out of range.\n");
347                 return -EINVAL;
348         }
349         if (unlikely(NULL == q->bufs[b->index])) {
350                 dprintk(1,"querybuf: buffer is null.\n");
351                 return -EINVAL;
352         }
353         videobuf_status(q,b,q->bufs[b->index],q->type);
354         return 0;
355 }
356
357 int videobuf_qbuf(struct videobuf_queue *q,
358               struct v4l2_buffer *b)
359 {
360         struct videobuf_buffer *buf;
361         enum v4l2_field field;
362         unsigned long flags=0;
363         int retval;
364
365         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
366
367         if (b->memory == V4L2_MEMORY_MMAP)
368                 down_read(&current->mm->mmap_sem);
369
370         mutex_lock(&q->lock);
371         retval = -EBUSY;
372         if (q->reading) {
373                 dprintk(1,"qbuf: Reading running...\n");
374                 goto done;
375         }
376         retval = -EINVAL;
377         if (b->type != q->type) {
378                 dprintk(1,"qbuf: Wrong type.\n");
379                 goto done;
380         }
381         if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) {
382                 dprintk(1,"qbuf: index out of range.\n");
383                 goto done;
384         }
385         buf = q->bufs[b->index];
386         if (NULL == buf) {
387                 dprintk(1,"qbuf: buffer is null.\n");
388                 goto done;
389         }
390         MAGIC_CHECK(buf->magic,MAGIC_BUFFER);
391         if (buf->memory != b->memory) {
392                 dprintk(1,"qbuf: memory type is wrong.\n");
393                 goto done;
394         }
395         if (buf->state != STATE_NEEDS_INIT && buf->state != STATE_IDLE) {
396                 dprintk(1,"qbuf: buffer is already queued or active.\n");
397                 goto done;
398         }
399
400         if (b->flags & V4L2_BUF_FLAG_INPUT) {
401                 if (b->input >= q->inputs) {
402                         dprintk(1,"qbuf: wrong input.\n");
403                         goto done;
404                 }
405                 buf->input = b->input;
406         } else {
407                 buf->input = UNSET;
408         }
409
410         switch (b->memory) {
411         case V4L2_MEMORY_MMAP:
412                 if (0 == buf->baddr) {
413                         dprintk(1,"qbuf: mmap requested but buffer addr is zero!\n");
414                         goto done;
415                 }
416                 break;
417         case V4L2_MEMORY_USERPTR:
418                 if (b->length < buf->bsize) {
419                         dprintk(1,"qbuf: buffer length is not enough\n");
420                         goto done;
421                 }
422                 if (STATE_NEEDS_INIT != buf->state && buf->baddr != b->m.userptr)
423                         q->ops->buf_release(q,buf);
424                 buf->baddr = b->m.userptr;
425                 break;
426         case V4L2_MEMORY_OVERLAY:
427                 buf->boff = b->m.offset;
428                 break;
429         default:
430                 dprintk(1,"qbuf: wrong memory type\n");
431                 goto done;
432         }
433
434         dprintk(1,"qbuf: requesting next field\n");
435         field = videobuf_next_field(q);
436         retval = q->ops->buf_prepare(q,buf,field);
437         if (0 != retval) {
438                 dprintk(1,"qbuf: buffer_prepare returned %d\n",retval);
439                 goto done;
440         }
441
442         list_add_tail(&buf->stream,&q->stream);
443         if (q->streaming) {
444                 if (q->irqlock)
445                         spin_lock_irqsave(q->irqlock,flags);
446                 q->ops->buf_queue(q,buf);
447                 if (q->irqlock)
448                         spin_unlock_irqrestore(q->irqlock,flags);
449         }
450         dprintk(1,"qbuf: succeded\n");
451         retval = 0;
452
453  done:
454         mutex_unlock(&q->lock);
455
456         if (b->memory == V4L2_MEMORY_MMAP)
457                 up_read(&current->mm->mmap_sem);
458
459         return retval;
460 }
461
462 int videobuf_dqbuf(struct videobuf_queue *q,
463                struct v4l2_buffer *b, int nonblocking)
464 {
465         struct videobuf_buffer *buf;
466         int retval;
467
468         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
469
470         mutex_lock(&q->lock);
471         retval = -EBUSY;
472         if (q->reading) {
473                 dprintk(1,"dqbuf: Reading running...\n");
474                 goto done;
475         }
476         retval = -EINVAL;
477         if (b->type != q->type) {
478                 dprintk(1,"dqbuf: Wrong type.\n");
479                 goto done;
480         }
481         if (list_empty(&q->stream)) {
482                 dprintk(1,"dqbuf: stream running\n");
483                 goto done;
484         }
485         buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
486         retval = videobuf_waiton(buf, nonblocking, 1);
487         if (retval < 0) {
488                 dprintk(1,"dqbuf: waiton returned %d\n",retval);
489                 goto done;
490         }
491         switch (buf->state) {
492         case STATE_ERROR:
493                 dprintk(1,"dqbuf: state is error\n");
494                 retval = -EIO;
495                 CALL(q,sync,q, buf);
496                 buf->state = STATE_IDLE;
497                 break;
498         case STATE_DONE:
499                 dprintk(1,"dqbuf: state is done\n");
500                 CALL(q,sync,q, buf);
501                 buf->state = STATE_IDLE;
502                 break;
503         default:
504                 dprintk(1,"dqbuf: state invalid\n");
505                 retval = -EINVAL;
506                 goto done;
507         }
508         list_del(&buf->stream);
509         memset(b,0,sizeof(*b));
510         videobuf_status(q,b,buf,q->type);
511
512  done:
513         mutex_unlock(&q->lock);
514         return retval;
515 }
516
517 int videobuf_streamon(struct videobuf_queue *q)
518 {
519         struct videobuf_buffer *buf;
520         struct list_head *list;
521         unsigned long flags=0;
522         int retval;
523
524         mutex_lock(&q->lock);
525         retval = -EBUSY;
526         if (q->reading)
527                 goto done;
528         retval = 0;
529         if (q->streaming)
530                 goto done;
531         q->streaming = 1;
532         if (q->irqlock)
533                 spin_lock_irqsave(q->irqlock,flags);
534         list_for_each(list,&q->stream) {
535                 buf = list_entry(list, struct videobuf_buffer, stream);
536                 if (buf->state == STATE_PREPARED)
537                         q->ops->buf_queue(q,buf);
538         }
539         if (q->irqlock)
540                 spin_unlock_irqrestore(q->irqlock,flags);
541
542  done:
543         mutex_unlock(&q->lock);
544         return retval;
545 }
546
547 int videobuf_streamoff(struct videobuf_queue *q)
548 {
549         int retval = -EINVAL;
550
551         mutex_lock(&q->lock);
552         if (!q->streaming)
553                 goto done;
554         videobuf_queue_cancel(q);
555         q->streaming = 0;
556         retval = 0;
557
558  done:
559         mutex_unlock(&q->lock);
560         return retval;
561 }
562
563 static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
564                                       char __user *data,
565                                       size_t count, loff_t *ppos)
566 {
567         enum v4l2_field field;
568         unsigned long flags=0;
569         int retval;
570
571         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
572
573         /* setup stuff */
574         q->read_buf = videobuf_alloc(q);
575         if (NULL == q->read_buf)
576                 return -ENOMEM;
577
578         q->read_buf->memory = V4L2_MEMORY_USERPTR;
579         q->read_buf->baddr  = (unsigned long)data;
580         q->read_buf->bsize  = count;
581
582         field = videobuf_next_field(q);
583         retval = q->ops->buf_prepare(q,q->read_buf,field);
584         if (0 != retval)
585                 goto done;
586
587         /* start capture & wait */
588         if (q->irqlock)
589                 spin_lock_irqsave(q->irqlock,flags);
590         q->ops->buf_queue(q,q->read_buf);
591         if (q->irqlock)
592                 spin_unlock_irqrestore(q->irqlock,flags);
593         retval = videobuf_waiton(q->read_buf,0,0);
594         if (0 == retval) {
595                 CALL(q,sync,q,q->read_buf);
596                 if (STATE_ERROR == q->read_buf->state)
597                         retval = -EIO;
598                 else
599                         retval = q->read_buf->size;
600         }
601
602  done:
603         /* cleanup */
604         q->ops->buf_release(q,q->read_buf);
605         kfree(q->read_buf);
606         q->read_buf = NULL;
607         return retval;
608 }
609
610 ssize_t videobuf_read_one(struct videobuf_queue *q,
611                           char __user *data, size_t count, loff_t *ppos,
612                           int nonblocking)
613 {
614         enum v4l2_field field;
615         unsigned long flags=0;
616         unsigned size, nbufs;
617         int retval;
618
619         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
620
621         mutex_lock(&q->lock);
622
623         nbufs = 1; size = 0;
624         q->ops->buf_setup(q,&nbufs,&size);
625
626         if (NULL == q->read_buf  &&
627             count >= size        &&
628             !nonblocking) {
629                 retval = videobuf_read_zerocopy(q,data,count,ppos);
630                 if (retval >= 0  ||  retval == -EIO)
631                         /* ok, all done */
632                         goto done;
633                 /* fallback to kernel bounce buffer on failures */
634         }
635
636         if (NULL == q->read_buf) {
637                 /* need to capture a new frame */
638                 retval = -ENOMEM;
639                 q->read_buf = videobuf_alloc(q);
640
641                 dprintk(1,"video alloc=0x%p\n", q->read_buf);
642                 if (NULL == q->read_buf)
643                         goto done;
644                 q->read_buf->memory = V4L2_MEMORY_USERPTR;
645                 q->read_buf->bsize = count; /* preferred size */
646                 field = videobuf_next_field(q);
647                 retval = q->ops->buf_prepare(q,q->read_buf,field);
648
649                 if (0 != retval) {
650                         kfree (q->read_buf);
651                         q->read_buf = NULL;
652                         goto done;
653                 }
654                 if (q->irqlock)
655                         spin_lock_irqsave(q->irqlock,flags);
656
657                 q->ops->buf_queue(q,q->read_buf);
658                 if (q->irqlock)
659                         spin_unlock_irqrestore(q->irqlock,flags);
660                 q->read_off = 0;
661         }
662
663         /* wait until capture is done */
664         retval = videobuf_waiton(q->read_buf, nonblocking, 1);
665         if (0 != retval)
666                 goto done;
667
668         CALL(q,sync,q,q->read_buf);
669
670         if (STATE_ERROR == q->read_buf->state) {
671                 /* catch I/O errors */
672                 q->ops->buf_release(q,q->read_buf);
673                 kfree(q->read_buf);
674                 q->read_buf = NULL;
675                 retval = -EIO;
676                 goto done;
677         }
678
679         /* Copy to userspace */
680         retval=CALL(q,copy_to_user,q,data,count,nonblocking);
681         if (retval<0)
682                 goto done;
683
684         q->read_off += retval;
685         if (q->read_off == q->read_buf->size) {
686                 /* all data copied, cleanup */
687                 q->ops->buf_release(q,q->read_buf);
688                 kfree(q->read_buf);
689                 q->read_buf = NULL;
690         }
691
692  done:
693         mutex_unlock(&q->lock);
694         return retval;
695 }
696
697 int videobuf_read_start(struct videobuf_queue *q)
698 {
699         enum v4l2_field field;
700         unsigned long flags=0;
701         unsigned int count = 0, size = 0;
702         int err, i;
703
704         q->ops->buf_setup(q,&count,&size);
705         if (count < 2)
706                 count = 2;
707         if (count > VIDEO_MAX_FRAME)
708                 count = VIDEO_MAX_FRAME;
709         size = PAGE_ALIGN(size);
710
711         err = videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR);
712         if (err < 0)
713                 return err;
714
715         count = err;
716
717         for (i = 0; i < count; i++) {
718                 field = videobuf_next_field(q);
719                 err = q->ops->buf_prepare(q,q->bufs[i],field);
720                 if (err)
721                         return err;
722                 list_add_tail(&q->bufs[i]->stream, &q->stream);
723         }
724         if (q->irqlock)
725                 spin_lock_irqsave(q->irqlock,flags);
726         for (i = 0; i < count; i++)
727                 q->ops->buf_queue(q,q->bufs[i]);
728         if (q->irqlock)
729                 spin_unlock_irqrestore(q->irqlock,flags);
730         q->reading = 1;
731         return 0;
732 }
733
734 void videobuf_read_stop(struct videobuf_queue *q)
735 {
736         int i;
737
738         videobuf_queue_cancel(q);
739         videobuf_mmap_free(q);
740         INIT_LIST_HEAD(&q->stream);
741         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
742                 if (NULL == q->bufs[i])
743                         continue;
744                 kfree(q->bufs[i]);
745                 q->bufs[i] = NULL;
746         }
747         q->read_buf = NULL;
748         q->reading  = 0;
749 }
750
751 ssize_t videobuf_read_stream(struct videobuf_queue *q,
752                              char __user *data, size_t count, loff_t *ppos,
753                              int vbihack, int nonblocking)
754 {
755         int rc, retval;
756         unsigned long flags=0;
757
758         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
759
760         dprintk(2,"%s\n",__FUNCTION__);
761         mutex_lock(&q->lock);
762         retval = -EBUSY;
763         if (q->streaming)
764                 goto done;
765         if (!q->reading) {
766                 retval = videobuf_read_start(q);
767                 if (retval < 0)
768                         goto done;
769         }
770
771         retval = 0;
772         while (count > 0) {
773                 /* get / wait for data */
774                 if (NULL == q->read_buf) {
775                         q->read_buf = list_entry(q->stream.next,
776                                                  struct videobuf_buffer,
777                                                  stream);
778                         list_del(&q->read_buf->stream);
779                         q->read_off = 0;
780                 }
781                 rc = videobuf_waiton(q->read_buf, nonblocking, 1);
782                 if (rc < 0) {
783                         if (0 == retval)
784                                 retval = rc;
785                         break;
786                 }
787
788                 if (q->read_buf->state == STATE_DONE) {
789                         rc = CALL (q,copy_stream, q, data + retval, count,
790                                         retval, vbihack, nonblocking);
791                         if (rc < 0) {
792                                 retval = rc;
793                                 break;
794                         }
795                         retval      += rc;
796                         count       -= rc;
797                         q->read_off += rc;
798                 } else {
799                         /* some error */
800                         q->read_off = q->read_buf->size;
801                         if (0 == retval)
802                                 retval = -EIO;
803                 }
804
805                 /* requeue buffer when done with copying */
806                 if (q->read_off == q->read_buf->size) {
807                         list_add_tail(&q->read_buf->stream,
808                                       &q->stream);
809                         if (q->irqlock)
810                                 spin_lock_irqsave(q->irqlock,flags);
811                         q->ops->buf_queue(q,q->read_buf);
812                         if (q->irqlock)
813                                 spin_unlock_irqrestore(q->irqlock,flags);
814                         q->read_buf = NULL;
815                 }
816                 if (retval < 0)
817                         break;
818         }
819
820  done:
821         mutex_unlock(&q->lock);
822         return retval;
823 }
824
825 unsigned int videobuf_poll_stream(struct file *file,
826                                   struct videobuf_queue *q,
827                                   poll_table *wait)
828 {
829         struct videobuf_buffer *buf = NULL;
830         unsigned int rc = 0;
831
832         mutex_lock(&q->lock);
833         if (q->streaming) {
834                 if (!list_empty(&q->stream))
835                         buf = list_entry(q->stream.next,
836                                          struct videobuf_buffer, stream);
837         } else {
838                 if (!q->reading)
839                         videobuf_read_start(q);
840                 if (!q->reading) {
841                         rc = POLLERR;
842                 } else if (NULL == q->read_buf) {
843                         q->read_buf = list_entry(q->stream.next,
844                                                  struct videobuf_buffer,
845                                                  stream);
846                         list_del(&q->read_buf->stream);
847                         q->read_off = 0;
848                 }
849                 buf = q->read_buf;
850         }
851         if (!buf)
852                 rc = POLLERR;
853
854         if (0 == rc) {
855                 poll_wait(file, &buf->done, wait);
856                 if (buf->state == STATE_DONE ||
857                     buf->state == STATE_ERROR)
858                         rc = POLLIN|POLLRDNORM;
859         }
860         mutex_unlock(&q->lock);
861         return rc;
862 }
863
864 int videobuf_mmap_setup(struct videobuf_queue *q,
865                         unsigned int bcount, unsigned int bsize,
866                         enum v4l2_memory memory)
867 {
868         unsigned int i;
869         int err;
870
871         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
872
873         err = videobuf_mmap_free(q);
874         if (0 != err)
875                 return err;
876
877         /* Allocate and initialize buffers */
878         for (i = 0; i < bcount; i++) {
879                 q->bufs[i] = videobuf_alloc(q);
880
881                 if (q->bufs[i] == NULL)
882                         break;
883
884                 q->bufs[i]->i      = i;
885                 q->bufs[i]->input  = UNSET;
886                 q->bufs[i]->memory = memory;
887                 q->bufs[i]->bsize  = bsize;
888                 switch (memory) {
889                 case V4L2_MEMORY_MMAP:
890                         q->bufs[i]->boff  = bsize * i;
891                         break;
892                 case V4L2_MEMORY_USERPTR:
893                 case V4L2_MEMORY_OVERLAY:
894                         /* nothing */
895                         break;
896                 }
897         }
898
899         if (!i)
900                 return -ENOMEM;
901
902         dprintk(1,"mmap setup: %d buffers, %d bytes each\n",
903                 i, bsize);
904
905         return i;
906 }
907
908 int videobuf_mmap_free(struct videobuf_queue *q)
909 {
910         int i;
911         int rc;
912
913         if (!q)
914                 return 0;
915
916         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
917
918         rc  = CALL(q,mmap_free,q);
919         if (rc<0)
920                 return rc;
921
922         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
923                 if (NULL == q->bufs[i])
924                         continue;
925                 q->ops->buf_release(q,q->bufs[i]);
926                 kfree(q->bufs[i]);
927                 q->bufs[i] = NULL;
928         }
929
930         return rc;
931 }
932
933 int videobuf_mmap_mapper(struct videobuf_queue *q,
934                          struct vm_area_struct *vma)
935 {
936         int retval;
937
938         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
939
940         mutex_lock(&q->lock);
941         retval=CALL(q,mmap_mapper,q,vma);
942         mutex_unlock(&q->lock);
943
944         return retval;
945 }
946
947 #ifdef CONFIG_VIDEO_V4L1_COMPAT
948 int videobuf_cgmbuf(struct videobuf_queue *q,
949                     struct video_mbuf *mbuf, int count)
950 {
951         struct v4l2_requestbuffers req;
952         int rc,i;
953
954         MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
955
956         memset(&req,0,sizeof(req));
957         req.type   = q->type;
958         req.count  = count;
959         req.memory = V4L2_MEMORY_MMAP;
960         rc = videobuf_reqbufs(q,&req);
961         if (rc < 0)
962                 return rc;
963
964         mbuf->frames = req.count;
965         mbuf->size   = 0;
966         for (i = 0; i < mbuf->frames; i++) {
967                 mbuf->offsets[i]  = q->bufs[i]->boff;
968                 mbuf->size       += q->bufs[i]->bsize;
969         }
970
971         return 0;
972 }
973 #endif
974
975 /* --------------------------------------------------------------------- */
976
977 EXPORT_SYMBOL_GPL(videobuf_waiton);
978 EXPORT_SYMBOL_GPL(videobuf_iolock);
979
980 EXPORT_SYMBOL_GPL(videobuf_alloc);
981
982 EXPORT_SYMBOL_GPL(videobuf_queue_core_init);
983 EXPORT_SYMBOL_GPL(videobuf_queue_cancel);
984 EXPORT_SYMBOL_GPL(videobuf_queue_is_busy);
985
986 EXPORT_SYMBOL_GPL(videobuf_next_field);
987 EXPORT_SYMBOL_GPL(videobuf_reqbufs);
988 EXPORT_SYMBOL_GPL(videobuf_querybuf);
989 EXPORT_SYMBOL_GPL(videobuf_qbuf);
990 EXPORT_SYMBOL_GPL(videobuf_dqbuf);
991 EXPORT_SYMBOL_GPL(videobuf_cgmbuf);
992 EXPORT_SYMBOL_GPL(videobuf_streamon);
993 EXPORT_SYMBOL_GPL(videobuf_streamoff);
994
995 EXPORT_SYMBOL_GPL(videobuf_read_start);
996 EXPORT_SYMBOL_GPL(videobuf_read_stop);
997 EXPORT_SYMBOL_GPL(videobuf_read_stream);
998 EXPORT_SYMBOL_GPL(videobuf_read_one);
999 EXPORT_SYMBOL_GPL(videobuf_poll_stream);
1000
1001 EXPORT_SYMBOL_GPL(videobuf_mmap_setup);
1002 EXPORT_SYMBOL_GPL(videobuf_mmap_free);
1003 EXPORT_SYMBOL_GPL(videobuf_mmap_mapper);
1004
1005 /*
1006  * Local variables:
1007  * c-basic-offset: 8
1008  * End:
1009  */