Commit cb784724 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB (7559): em28xx: Fills the entire buffer, before getting another one

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 5e28e009
...@@ -137,6 +137,8 @@ static inline void buffer_filled(struct em28xx *dev, ...@@ -137,6 +137,8 @@ static inline void buffer_filled(struct em28xx *dev,
buf->vb.field_count++; buf->vb.field_count++;
do_gettimeofday(&buf->vb.ts); do_gettimeofday(&buf->vb.ts);
dev->isoc_ctl.buf = NULL;
list_del(&buf->vb.queue); list_del(&buf->vb.queue);
wake_up(&buf->vb.done); wake_up(&buf->vb.done);
} }
...@@ -269,6 +271,11 @@ static inline int get_next_buf(struct em28xx_dmaqueue *dma_q, ...@@ -269,6 +271,11 @@ static inline int get_next_buf(struct em28xx_dmaqueue *dma_q,
{ {
struct em28xx *dev = container_of(dma_q, struct em28xx, vidq); struct em28xx *dev = container_of(dma_q, struct em28xx, vidq);
/* If the previous buffer were not filled yet, continue */
*buf = dev->isoc_ctl.buf;
if (*buf)
return 1;
if (list_empty(&dma_q->active)) { if (list_empty(&dma_q->active)) {
em28xx_isocdbg("No active queue to serve\n"); em28xx_isocdbg("No active queue to serve\n");
return 0; return 0;
...@@ -276,6 +283,9 @@ static inline int get_next_buf(struct em28xx_dmaqueue *dma_q, ...@@ -276,6 +283,9 @@ static inline int get_next_buf(struct em28xx_dmaqueue *dma_q,
*buf = list_entry(dma_q->active.next, struct em28xx_buffer, vb.queue); *buf = list_entry(dma_q->active.next, struct em28xx_buffer, vb.queue);
dev->isoc_ctl.buf = *buf;
return 1; return 1;
} }
...@@ -303,13 +313,9 @@ static inline int em28xx_isoc_copy(struct urb *urb) ...@@ -303,13 +313,9 @@ static inline int em28xx_isoc_copy(struct urb *urb)
return 0; return 0;
} }
buf = dev->isoc_ctl.buf; rc = get_next_buf(dma_q, &buf);
if (rc <= 0)
if (!buf) { return rc;
rc = get_next_buf(dma_q, &buf);
if (rc <= 0)
return rc;
}
outp = videobuf_to_vmalloc(&buf->vb); outp = videobuf_to_vmalloc(&buf->vb);
...@@ -351,7 +357,6 @@ static inline int em28xx_isoc_copy(struct urb *urb) ...@@ -351,7 +357,6 @@ static inline int em28xx_isoc_copy(struct urb *urb)
rc = get_next_buf(dma_q, &buf); rc = get_next_buf(dma_q, &buf);
if (rc <= 0) if (rc <= 0)
return rc; return rc;
outp = videobuf_to_vmalloc(&buf->vb); outp = videobuf_to_vmalloc(&buf->vb);
} }
...@@ -416,7 +421,6 @@ static void em28xx_uninit_isoc(struct em28xx *dev) ...@@ -416,7 +421,6 @@ static void em28xx_uninit_isoc(struct em28xx *dev)
em28xx_isocdbg("em28xx: called em28xx_uninit_isoc\n"); em28xx_isocdbg("em28xx: called em28xx_uninit_isoc\n");
dev->isoc_ctl.nfields = -1; dev->isoc_ctl.nfields = -1;
dev->isoc_ctl.buf = NULL;
for (i = 0; i < dev->isoc_ctl.num_bufs; i++) { for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
urb = dev->isoc_ctl.urb[i]; urb = dev->isoc_ctl.urb[i];
if (urb) { if (urb) {
...@@ -478,6 +482,7 @@ static int em28xx_prepare_isoc(struct em28xx *dev, int max_packets, ...@@ -478,6 +482,7 @@ static int em28xx_prepare_isoc(struct em28xx *dev, int max_packets,
} }
dev->isoc_ctl.max_pkt_size = dev->max_pkt_size; dev->isoc_ctl.max_pkt_size = dev->max_pkt_size;
dev->isoc_ctl.buf = NULL;
sb_size = max_packets * dev->isoc_ctl.max_pkt_size; sb_size = max_packets * dev->isoc_ctl.max_pkt_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment