diff mbox

Mantis DMA transfer cleanup, fixes data corruption and a race, improves performance.

Message ID 4C1DDB95.5050401@kolumbus.fi (mailing list archive)
State Superseded
Headers show

Commit Message

Marko Ristola June 20, 2010, 9:12 a.m. UTC
None
diff mbox

Patch

diff --git a/drivers/media/dvb/mantis/hopper_cards.c 
b/drivers/media/dvb/mantis/hopper_cards.c
index 09e9fc7..3b7e376 100644
--- a/drivers/media/dvb/mantis/hopper_cards.c
+++ b/drivers/media/dvb/mantis/hopper_cards.c
@@ -126,7 +126,7 @@  static irqreturn_t hopper_irq_handler(int irq, void 
*dev_id)
      }
      if (stat & MANTIS_INT_RISCI) {
          dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]);
-        mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
+        mantis->busy_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
          tasklet_schedule(&mantis->tasklet);
      }
      if (stat & MANTIS_INT_I2CDONE) {
diff --git a/drivers/media/dvb/mantis/mantis_cards.c 
b/drivers/media/dvb/mantis/mantis_cards.c
index cf4b39f..8f048d5 100644
--- a/drivers/media/dvb/mantis/mantis_cards.c
+++ b/drivers/media/dvb/mantis/mantis_cards.c
@@ -134,7 +134,7 @@  static irqreturn_t mantis_irq_handler(int irq, void 
*dev_id)
      }
      if (stat & MANTIS_INT_RISCI) {
          dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]);
-        mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
+        mantis->busy_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
          tasklet_schedule(&mantis->tasklet);
      }
      if (stat & MANTIS_INT_I2CDONE) {
diff --git a/drivers/media/dvb/mantis/mantis_common.h 
b/drivers/media/dvb/mantis/mantis_common.h
index d0b645a..23b23b7 100644
--- a/drivers/media/dvb/mantis/mantis_common.h
+++ b/drivers/media/dvb/mantis/mantis_common.h
@@ -122,11 +122,8 @@  struct mantis_pci {
      unsigned int        num;

      /*    RISC Core        */
-    u32            finished_block;
+    u32            busy_block;
      u32            last_block;
-    u32            line_bytes;
-    u32            line_count;
-    u32            risc_pos;
      u8            *buf_cpu;
      dma_addr_t        buf_dma;
      u32            *risc_cpu;
diff --git a/drivers/media/dvb/mantis/mantis_dma.c 
b/drivers/media/dvb/mantis/mantis_dma.c
index 46202a4..c61ca7d 100644
--- a/drivers/media/dvb/mantis/mantis_dma.c
+++ b/drivers/media/dvb/mantis/mantis_dma.c
@@ -43,13 +43,17 @@ 
  #define RISC_IRQ        (0x01 << 24)

  #define RISC_STATUS(status)    ((((~status) & 0x0f) << 20) | ((status 
& 0x0f) << 16))
-#define RISC_FLUSH()        (mantis->risc_pos = 0)
-#define RISC_INSTR(opcode)    (mantis->risc_cpu[mantis->risc_pos++] = 
cpu_to_le32(opcode))
+#define RISC_FLUSH(risc_pos)        (risc_pos = 0)
+#define RISC_INSTR(risc_pos, opcode)    (mantis->risc_cpu[risc_pos++] = 
cpu_to_le32(opcode))

  #define MANTIS_BUF_SIZE        (64 * 1024)
-#define MANTIS_BLOCK_BYTES    (MANTIS_BUF_SIZE >> 4)
-#define MANTIS_BLOCK_COUNT    (1 << 4)
-#define MANTIS_RISC_SIZE    PAGE_SIZE
+#define MANTIS_BLOCK_BYTES      (MANTIS_BUF_SIZE / 4)
+#define MANTIS_DMA_TR_BYTES     (2 * 1024) /* upper limit: 4095 bytes. */
+#define MANTIS_BLOCK_COUNT    (MANTIS_BUF_SIZE / MANTIS_BLOCK_BYTES)
+
+#define MANTIS_DMA_TR_UNITS     (MANTIS_BLOCK_BYTES / MANTIS_DMA_TR_BYTES)
+/* MANTIS_BUF_SIZE / MANTIS_DMA_TR_UNITS must not exceed 
MANTIS_RISC_SIZE (4k RISC cmd buffer) */