diff -r 47a89b96e10d linux/drivers/media/dvb/ttpci/budget-av.c --- a/linux/drivers/media/dvb/ttpci/budget-av.c Fri Jun 22 16:41:07 2007 -0400 +++ b/linux/drivers/media/dvb/ttpci/budget-av.c Sat Jun 23 17:50:36 2007 +0200 @@ -1058,7 +1058,8 @@ static void budget_av_irq(struct saa7146 dprintk(8, "dev: %p, budget_av: %p\n", dev, budget_av); - if (*isr & MASK_10) +// if (*isr & MASK_10) + if (*isr & (MASK_07|MASK_08)) ttpci_budget_irq10_handler(dev, isr); } @@ -1300,7 +1301,8 @@ static struct saa7146_extension budget_e .attach = budget_av_attach, .detach = budget_av_detach, - .irq_mask = MASK_10, +// .irq_mask = MASK_10, + .irq_mask = MASK_07|MASK_08, .irq_func = budget_av_irq, }; diff -r 47a89b96e10d linux/drivers/media/dvb/ttpci/budget-core.c --- a/linux/drivers/media/dvb/ttpci/budget-core.c Fri Jun 22 16:41:07 2007 -0400 +++ b/linux/drivers/media/dvb/ttpci/budget-core.c Sat Jun 23 17:52:22 2007 +0200 @@ -52,7 +52,8 @@ #define BUFFER_WARNING_WAIT (30*HZ) int budget_debug; -static int dma_buffer_size = TS_MIN_BUFSIZE_K; +//static int dma_buffer_size = TS_MIN_BUFSIZE_K; +static int dma_buffer_size = TS_MAX_BUFSIZE_K_DVBC; module_param_named(debug, budget_debug, int, 0644); module_param_named(bufsize, dma_buffer_size, int, 0444); MODULE_PARM_DESC(debug, "Turn on/off budget debugging (default:off)."); @@ -67,7 +68,9 @@ static int stop_ts_capture(struct budget dprintk(2, "budget: %p\n", budget); saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off - SAA7146_IER_DISABLE(budget->dev, MASK_10); +// SAA7146_IER_DISABLE(budget->dev, MASK_10); + SAA7146_IER_DISABLE(budget->dev, MASK_07); // PORT B interrupt + SAA7146_IER_DISABLE(budget->dev, MASK_08); // PORT A interrupt return 0; } @@ -113,22 +116,26 @@ static int start_ts_capture(struct budge case BUDGET_KNC1C_MK3: case BUDGET_KNC1CP_MK3: if (budget->video_port == BUDGET_VIDEO_PORTA) { - saa7146_write(dev, DD1_INIT, 0x06000200); +// saa7146_write(dev, DD1_INIT, 0x06000200); + saa7146_write(dev, DD1_INIT, 0x06C00200); saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); saa7146_write(dev, BRS_CTRL, 0x00000000); } else { - saa7146_write(dev, DD1_INIT, 0x00000600); +// saa7146_write(dev, DD1_INIT, 0x00000600); + saa7146_write(dev, DD1_INIT, 0x000006C0); saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); saa7146_write(dev, BRS_CTRL, 0x60000000); } break; default: if (budget->video_port == BUDGET_VIDEO_PORTA) { - saa7146_write(dev, DD1_INIT, 0x06000200); +// saa7146_write(dev, DD1_INIT, 0x06000200); + saa7146_write(dev, DD1_INIT, 0x06C00200); saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); saa7146_write(dev, BRS_CTRL, 0x00000000); } else { - saa7146_write(dev, DD1_INIT, 0x02000600); +// saa7146_write(dev, DD1_INIT, 0x02000600); + saa7146_write(dev, DD1_INIT, 0x020006C0); saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); saa7146_write(dev, BRS_CTRL, 0x60000000); } @@ -147,6 +154,8 @@ static int start_ts_capture(struct budge } saa7146_write(dev, PROT_ADDR3, budget->buffer_size); saa7146_write(dev, BASE_PAGE3, budget->pt.dma | ME1 | 0x90); + printk("(%s:%d) init value for BASE_PAGE3: %08x, value from saa7146: %08x\n", + __FILE__, __LINE__, budget->pt.dma | ME1 | 0x90, saa7146_read(dev, BASE_PAGE3)); saa7146_write(dev, PITCH3, budget->buffer_width); saa7146_write(dev, NUM_LINE_BYTE3, @@ -154,8 +163,15 @@ static int start_ts_capture(struct budge saa7146_write(dev, MC2, (MASK_04 | MASK_20)); - SAA7146_ISR_CLEAR(budget->dev, MASK_10); /* VPE */ - SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ +// SAA7146_ISR_CLEAR(budget->dev, MASK_10); /* VPE */ +// SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ + if (budget->video_port == BUDGET_VIDEO_PORTA) { + SAA7146_ISR_CLEAR(budget->dev, MASK_08); /* PORT A interrupt */ + SAA7146_IER_ENABLE(budget->dev, MASK_08); /* PORT A interrupt */ + } else { + SAA7146_ISR_CLEAR(budget->dev, MASK_07); /* PORT B interrupt */ + SAA7146_IER_ENABLE(budget->dev, MASK_07); /* PORT B interrupt */ + } saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */ return 0; @@ -574,11 +590,35 @@ void ttpci_budget_irq10_handler(struct s void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr) { struct budget *budget = (struct budget *) dev->ext_priv; + u32 newdma; + u32 buffer_size; dprintk(8, "dev: %p, budget: %p\n", dev, budget); - if (*isr & MASK_10) +// if (*isr & MASK_10) + if (*isr & (MASK_07|MASK_08)) { + + newdma = saa7146_read(budget->dev, PCI_VDP3); + buffer_size = budget->buffer_height * budget->buffer_width; + if (budget->buffer_size > buffer_size) { + if (newdma >= buffer_size && budget->lastdma < buffer_size) { + printk("(%s:%d) got %d interrupts for the lower half of the buffer (size=%dkb)\n", __FILE__, __LINE__, budget->count, budget->buffer_size / 1024); + budget->count = 0; + } else if (newdma < buffer_size && budget->lastdma >= buffer_size) { + printk("(%s:%d) got %d interrupts for the upper half of the buffer (size=%dkb)\n", __FILE__, __LINE__, budget->count, budget->buffer_size / 1024); + budget->count = 0; + } + } else { + if (newdma < budget->lastdma) { + printk("(%s:%d) got %d interrupts for the buffer (size=%dkb)\n", __FILE__, __LINE__, budget->count, budget->buffer_size / 1024); + budget->count = 0; + } + } + budget->count++; + budget->lastdma = newdma; + tasklet_schedule(&budget->vpe_tasklet); + } } void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port) diff -r 47a89b96e10d linux/drivers/media/dvb/ttpci/budget.h --- a/linux/drivers/media/dvb/ttpci/budget.h Fri Jun 22 16:41:07 2007 -0400 +++ b/linux/drivers/media/dvb/ttpci/budget.h Sat Jun 23 17:50:36 2007 +0200 @@ -83,6 +83,9 @@ struct budget { int fe_synced; void *priv; + + u32 lastdma; + u32 count; }; #define MAKE_BUDGET_INFO(x_var,x_name,x_type) \