diff options
-rw-r--r-- | drivers/media/video/saa7164/saa7164-buffer.c | 1 | ||||
-rw-r--r-- | drivers/media/video/saa7164/saa7164-core.c | 33 | ||||
-rw-r--r-- | drivers/media/video/saa7164/saa7164-encoder.c | 8 | ||||
-rw-r--r-- | drivers/media/video/saa7164/saa7164.h | 3 |
4 files changed, 29 insertions, 16 deletions
diff --git a/drivers/media/video/saa7164/saa7164-buffer.c b/drivers/media/video/saa7164/saa7164-buffer.c index 5f45ea7f3d7c..c7bd81e248f6 100644 --- a/drivers/media/video/saa7164/saa7164-buffer.c +++ b/drivers/media/video/saa7164/saa7164-buffer.c @@ -241,6 +241,7 @@ int saa7164_buffer_cfg_port(struct saa7164_port *port) dprintk(DBGLVL_BUF, "%s(port=%d)\n", __func__, port->nr); + port->counter = 0; saa7164_writel(port->bufcounter, 0); saa7164_writel(port->pitch, params->pitch); saa7164_writel(port->bufsize, params->pitch * params->numberoflines); diff --git a/drivers/media/video/saa7164/saa7164-core.c b/drivers/media/video/saa7164/saa7164-core.c index ad619b325e96..09f7a64f538b 100644 --- a/drivers/media/video/saa7164/saa7164-core.c +++ b/drivers/media/video/saa7164/saa7164-core.c @@ -316,9 +316,9 @@ static void saa7164_work_enchandler(struct work_struct *w) if (buf->idx == rp) { crc = crc32(0, buf->cpu, buf->actual_size); - if (crc != port->shadow_crc[rp]) - printk(KERN_ERR "%s crc didn't match shadow was 0x%x now 0x%x\n", - __func__, port->shadow_crc[rp], crc); +// if (crc != port->shadow_crc[rp]) +// printk(KERN_ERR "%s crc didn't match shadow was 0x%x now 0x%x\n", +// __func__, port->shadow_crc[rp], crc); /* Found the buffer, deal with it */ dprintk(DBGLVL_IRQ, "%s() wp: %d processing: %d crc32: 0x%x\n", @@ -350,12 +350,6 @@ static void saa7164_work_enchandler(struct work_struct *w) else ok = 0; - if (ok == 0) - printk(KERN_ERR - "rp: %d dmacrc: 0x%08x shadcrc: 0x%08x ubufcrc: 0x%08x %s\n", - rp, buf->crc, port->shadow_crc[rp], ubuf->crc, - ok ? "crcgood" : "crcbad"); - /* Requeue the buffer on the free list */ ubuf->pos = 0; @@ -430,6 +424,7 @@ static irqreturn_t saa7164_irq_encoder(struct saa7164_port *port) struct list_head *c, *n; int wp, rp, i = 0; u8 *p; + u32 *up, j; /* Find the current write point from the hardware */ wp = saa7164_readl(port->bufcounter); @@ -438,6 +433,8 @@ static irqreturn_t saa7164_irq_encoder(struct saa7164_port *port) return 0; } + printk(KERN_ERR "port %p wp = %d\n", port, wp); + /* Find the previous buffer to the current write point */ if (wp == 0) rp = 7; @@ -449,6 +446,11 @@ static irqreturn_t saa7164_irq_encoder(struct saa7164_port *port) return 0; } + if (rp == port->last_irq_rp) { + printk(KERN_ERR "%s() Duplicate rp = %d port %p\n", + __func__, rp, port); + } + if (rp != ((port->last_irq_rp + 1) % 8)) { printk(KERN_ERR "%s() Multiple bufs on interrupt, port %p\n", __func__, port); @@ -503,16 +505,17 @@ static irqreturn_t saa7164_irq_encoder(struct saa7164_port *port) } if (buf->idx == rp) { - - memcpy_fromio(port->shadow_buf[rp], buf->cpu, buf->actual_size); - + up = (u32 *)port->shadow_buf[rp]; + for (j = 0 ; j < (buf->actual_size / sizeof(u32)); j++) { + *(up + j) = (rp << 28) | port->counter++; + } port->shadow_crc[rp] = crc32(0, port->shadow_buf[rp], buf->actual_size); buf->crc = crc32(0, buf->cpu, buf->actual_size); - if (port->shadow_crc[rp] != buf->crc) - printk(KERN_ERR "%s() crc check failed 0x%x vs 0x%x\n", - __func__, port->shadow_crc[rp], buf->crc); +// if (port->shadow_crc[rp] != buf->crc) +// printk(KERN_ERR "%s() crc check failed 0x%x vs 0x%x\n", +// __func__, port->shadow_crc[rp], buf->crc); break; } diff --git a/drivers/media/video/saa7164/saa7164-encoder.c b/drivers/media/video/saa7164/saa7164-encoder.c index 08b62e41c466..b904c61f8f81 100644 --- a/drivers/media/video/saa7164/saa7164-encoder.c +++ b/drivers/media/video/saa7164/saa7164-encoder.c @@ -1008,6 +1008,7 @@ struct saa7164_user_buffer *saa7164_enc_next_buf(struct saa7164_port *port) struct saa7164_user_buffer *buf = 0; struct saa7164_dev *dev = port->dev; u32 crc; + u32 *d; mutex_lock(&port->dmaqueue_lock); if (!list_empty(&port->list_buf_used.list)) { @@ -1020,6 +1021,13 @@ struct saa7164_user_buffer *saa7164_enc_next_buf(struct saa7164_port *port) buf, buf->crc, crc); } + d = (u32 *)buf->data; + + if ((*d & 0xffffff) > (port->read_counter + 0x2000)) + printk(KERN_ERR "%s() *d 0x%x port %p\n", __func__, *d, port); + + port->read_counter = *d; + } mutex_unlock(&port->dmaqueue_lock); diff --git a/drivers/media/video/saa7164/saa7164.h b/drivers/media/video/saa7164/saa7164.h index 80571e0e3d4b..58141dfed246 100644 --- a/drivers/media/video/saa7164/saa7164.h +++ b/drivers/media/video/saa7164/saa7164.h @@ -395,7 +395,8 @@ struct saa7164_port { u8 *shadow_buf[8]; u32 shadow_crc[8]; - u32 dvd_pack_offset; + u32 counter; + u32 read_counter; }; struct saa7164_dev { |