aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/ivtv/ivtv-driver.h
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2007-07-28 18:45:50 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-10-09 21:05:32 -0400
commit37093b1ea600d84fbf7252baf12eedec85ae40f1 (patch)
treeba78b73933c0d7b8989831c49a86f16c26f99b04 /drivers/media/video/ivtv/ivtv-driver.h
parentf4071b85ea0ca3bd06f63c330562b4cfdffa8473 (diff)
V4L/DVB (6047): ivtv: Fix scatter/gather DMA timeouts
It turns out that the cx23415/6 DMA engine cannot do scatter/gather DMA reliably. Every so often depending on the phase of the moon and your hardware configuration the cx2341x DMA engine simply chokes on it and you have to reboot to get it working again. This change replaced the scatter/gather DMA by single transfers at a time, where the driver is now responsible for DMA-ing each buffer. UDMA is still done using scatter/gather DMA, that will be fixed soon. Many thanks to Mark Bryars <mark.bryars@etvinteractive.com> for discovering the link between scatter/gather and the DMA timeouts. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-driver.h')
-rw-r--r--drivers/media/video/ivtv/ivtv-driver.h22
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/media/video/ivtv/ivtv-driver.h b/drivers/media/video/ivtv/ivtv-driver.h
index f5de2fd01b1a..e80f9f65a905 100644
--- a/drivers/media/video/ivtv/ivtv-driver.h
+++ b/drivers/media/video/ivtv/ivtv-driver.h
@@ -382,7 +382,6 @@ struct ivtv_mailbox_data {
382#define IVTV_F_I_RADIO_USER 5 /* The radio tuner is selected */ 382#define IVTV_F_I_RADIO_USER 5 /* The radio tuner is selected */
383#define IVTV_F_I_DIG_RST 6 /* Reset digitizer */ 383#define IVTV_F_I_DIG_RST 6 /* Reset digitizer */
384#define IVTV_F_I_DEC_YUV 7 /* YUV instead of MPG is being decoded */ 384#define IVTV_F_I_DEC_YUV 7 /* YUV instead of MPG is being decoded */
385#define IVTV_F_I_ENC_VBI 8 /* VBI DMA */
386#define IVTV_F_I_UPDATE_CC 9 /* CC should be updated */ 385#define IVTV_F_I_UPDATE_CC 9 /* CC should be updated */
387#define IVTV_F_I_UPDATE_WSS 10 /* WSS should be updated */ 386#define IVTV_F_I_UPDATE_WSS 10 /* WSS should be updated */
388#define IVTV_F_I_UPDATE_VPS 11 /* VPS should be updated */ 387#define IVTV_F_I_UPDATE_VPS 11 /* VPS should be updated */
@@ -405,7 +404,7 @@ struct ivtv_mailbox_data {
405#define IVTV_F_I_EV_VSYNC_ENABLED 31 /* VSYNC event enabled */ 404#define IVTV_F_I_EV_VSYNC_ENABLED 31 /* VSYNC event enabled */
406 405
407/* Scatter-Gather array element, used in DMA transfers */ 406/* Scatter-Gather array element, used in DMA transfers */
408struct ivtv_SG_element { 407struct ivtv_sg_element {
409 u32 src; 408 u32 src;
410 u32 dst; 409 u32 dst;
411 u32 size; 410 u32 size;
@@ -417,7 +416,7 @@ struct ivtv_user_dma {
417 struct page *map[IVTV_DMA_SG_OSD_ENT]; 416 struct page *map[IVTV_DMA_SG_OSD_ENT];
418 417
419 /* Base Dev SG Array for cx23415/6 */ 418 /* Base Dev SG Array for cx23415/6 */
420 struct ivtv_SG_element SGarray[IVTV_DMA_SG_OSD_ENT]; 419 struct ivtv_sg_element SGarray[IVTV_DMA_SG_OSD_ENT];
421 dma_addr_t SG_handle; 420 dma_addr_t SG_handle;
422 int SG_length; 421 int SG_length;
423 422
@@ -468,6 +467,10 @@ struct ivtv_stream {
468 int dma; /* can be PCI_DMA_TODEVICE, 467 int dma; /* can be PCI_DMA_TODEVICE,
469 PCI_DMA_FROMDEVICE or 468 PCI_DMA_FROMDEVICE or
470 PCI_DMA_NONE */ 469 PCI_DMA_NONE */
470 u32 pending_offset;
471 u32 pending_backup;
472 u64 pending_pts;
473
471 u32 dma_offset; 474 u32 dma_offset;
472 u32 dma_backup; 475 u32 dma_backup;
473 u64 dma_pts; 476 u64 dma_pts;
@@ -493,10 +496,13 @@ struct ivtv_stream {
493 u16 dma_xfer_cnt; 496 u16 dma_xfer_cnt;
494 497
495 /* Base Dev SG Array for cx23415/6 */ 498 /* Base Dev SG Array for cx23415/6 */
496 struct ivtv_SG_element *SGarray; 499 struct ivtv_sg_element *sg_pending;
497 struct ivtv_SG_element *PIOarray; 500 struct ivtv_sg_element *sg_processing;
498 dma_addr_t SG_handle; 501 struct ivtv_sg_element *sg_dma;
499 int SG_length; 502 dma_addr_t sg_handle;
503 int sg_pending_size;
504 int sg_processing_size;
505 int sg_processed;
500 506
501 /* SG List of Buffers */ 507 /* SG List of Buffers */
502 struct scatterlist *SGlist; 508 struct scatterlist *SGlist;
@@ -637,7 +643,6 @@ struct vbi_info {
637 u32 enc_start, enc_size; 643 u32 enc_start, enc_size;
638 int fpi; 644 int fpi;
639 u32 frame; 645 u32 frame;
640 u32 dma_offset;
641 u8 cc_data_odd[256]; 646 u8 cc_data_odd[256];
642 u8 cc_data_even[256]; 647 u8 cc_data_even[256];
643 int cc_pos; 648 int cc_pos;
@@ -724,6 +729,7 @@ struct ivtv {
724 int cur_pio_stream; /* index of stream doing PIO */ 729 int cur_pio_stream; /* index of stream doing PIO */
725 u32 dma_data_req_offset; 730 u32 dma_data_req_offset;
726 u32 dma_data_req_size; 731 u32 dma_data_req_size;
732 int dma_retries;
727 int output_mode; /* NONE, MPG, YUV, UDMA YUV, passthrough */ 733 int output_mode; /* NONE, MPG, YUV, UDMA YUV, passthrough */
728 spinlock_t lock; /* lock access to this struct */ 734 spinlock_t lock; /* lock access to this struct */
729 int search_pack_header; 735 int search_pack_header;