summaryrefslogtreecommitdiff
path: root/linux/drivers/media
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@infradead.org>2008-04-13 11:56:02 -0300
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-04-13 11:56:02 -0300
commitefa9721ae9eaafcd1e0c57c5025bdda6c2bbecba (patch)
treee035014e314bcef32a964ee4b4e44d30e724d367 /linux/drivers/media
parentb86b4b8178e1138396086c4a21abe9a2e0695860 (diff)
downloadmediapointer-dvb-s2-efa9721ae9eaafcd1e0c57c5025bdda6c2bbecba.tar.gz
mediapointer-dvb-s2-efa9721ae9eaafcd1e0c57c5025bdda6c2bbecba.tar.bz2
Various fixes for the em28xx videobuf code
From: Aidan Thornton <makosoft@googlemail.com> - Aborting buffer_filled if no-one's waiting on the waitqueue probably isn't what we want, since just because no-one's waiting for it now doesn't mean they wouldn't dequeue it in time. (vivi gets away with this, possibly because it can fill each buffer much faster.) - The first BUG_ON(lencopy <= 0); really isn't worth causing a kernel panic over, especially since there are some reasons why it could trigger in normal use. - The top and botom frames are actually the wrong way around. Signed-off-by: Aidan Thornton <makosoft@googlemail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'linux/drivers/media')
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-video.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/linux/drivers/media/video/em28xx/em28xx-video.c b/linux/drivers/media/video/em28xx/em28xx-video.c
index d40f72096..517299c52 100644
--- a/linux/drivers/media/video/em28xx/em28xx-video.c
+++ b/linux/drivers/media/video/em28xx/em28xx-video.c
@@ -155,14 +155,6 @@ static inline void buffer_filled(struct em28xx *dev,
{
mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
- /* Nobody is waiting something to be done, just return */
- if (!waitqueue_active(&buf->vb.done)) {
- printk(KERN_ERR "em28xx: buffer underrun at %ld\n",
- jiffies);
-
- return;
- }
-
/* Advice that buffer was filled */
em28xx_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
buf->vb.state = VIDEOBUF_DONE;
@@ -222,7 +214,8 @@ static void em28xx_copy_video(struct em28xx *dev,
((char *)outp + buf->vb.size));
lencopy = remain = (char *)outp + buf->vb.size - (char *)startwrite;
}
- BUG_ON(lencopy <= 0);
+ if (lencopy <= 0)
+ return;
memcpy(startwrite, startread, lencopy);
remain -= lencopy;
@@ -379,11 +372,13 @@ static inline int em28xx_isoc_copy(struct urb *urb)
if (p[0] == 0x22 && p[1] == 0x5a) {
/* FIXME - are the fields the right way around? */
em28xx_isocdbg("Video frame, length=%i, %s\n", len,
- (p[2] & 1)? "top" : "bottom");
+ (p[2] & 1)? "odd" : "even");
em28xx_isocdbg("Current buffer is: outp = 0x%p,"
" len = %i\n", outp, (int)buf->vb.size);
- if (p[2] & 1) {
+ if (p[2] & 1)
+ buf->top_field = 0;
+ else {
if (buf->receiving) {
buffer_filled(dev, dma_q, buf);
rc = get_next_buf(dma_q, &buf);
@@ -394,8 +389,7 @@ static inline int em28xx_isoc_copy(struct urb *urb)
}
buf->top_field = 1;
- } else
- buf->top_field = 0;
+ }
buf->receiving = 1;
dma_q->pos = 0;
} else if (p[0] == 0x33 && p[1] == 0x95 && p[2] == 0x00) {