diff options
author | Johannes Stezenbach <js@linuxtv.org> | 2005-05-17 00:54:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-17 10:59:25 -0400 |
commit | c4ee3fd469302884dda95e1f310d5ffcd9f5acf9 (patch) | |
tree | 00671eb14e2d6fd77f7f3b521105214845f212e5 /drivers/media/dvb/b2c2/flexcop-pci.c | |
parent | 4853f16ad881194ec4c49f73287ef1999b2585ea (diff) |
[PATCH] dvb: flexcop: use hw pid filter
- enabled the HW PID by default for the PCI cards
- correct the TS demux parsing when PID filter is enabled (and thus the
timer IRQ)
- rewrote the PID-filter and FULLTS control part in flexcop-hw-filter
(thanks to Krzysztof Matula for pointing that out)
Signed-off-by: Patrick Boettcher <pb@linuxtv.org>
Signed-off-by: Johannes Stezenbach <js@linuxtv.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/media/dvb/b2c2/flexcop-pci.c')
-rw-r--r-- | drivers/media/dvb/b2c2/flexcop-pci.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/media/dvb/b2c2/flexcop-pci.c b/drivers/media/dvb/b2c2/flexcop-pci.c index c52286ea669f..78952096fb74 100644 --- a/drivers/media/dvb/b2c2/flexcop-pci.c +++ b/drivers/media/dvb/b2c2/flexcop-pci.c | |||
@@ -9,7 +9,7 @@ | |||
9 | #define FC_LOG_PREFIX "flexcop-pci" | 9 | #define FC_LOG_PREFIX "flexcop-pci" |
10 | #include "flexcop-common.h" | 10 | #include "flexcop-common.h" |
11 | 11 | ||
12 | static int enable_pid_filtering = 0; | 12 | static int enable_pid_filtering = 1; |
13 | module_param(enable_pid_filtering, int, 0444); | 13 | module_param(enable_pid_filtering, int, 0444); |
14 | MODULE_PARM_DESC(enable_pid_filtering, "enable hardware pid filtering: supported values: 0 (fullts), 1"); | 14 | MODULE_PARM_DESC(enable_pid_filtering, "enable hardware pid filtering: supported values: 0 (fullts), 1"); |
15 | 15 | ||
@@ -45,13 +45,14 @@ struct flexcop_pci { | |||
45 | void __iomem *io_mem; | 45 | void __iomem *io_mem; |
46 | u32 irq; | 46 | u32 irq; |
47 | /* buffersize (at least for DMA1, need to be % 188 == 0, | 47 | /* buffersize (at least for DMA1, need to be % 188 == 0, |
48 | * this is logic is required */ | 48 | * this logic is required */ |
49 | #define FC_DEFAULT_DMA1_BUFSIZE (1280 * 188) | 49 | #define FC_DEFAULT_DMA1_BUFSIZE (1280 * 188) |
50 | #define FC_DEFAULT_DMA2_BUFSIZE (10 * 188) | 50 | #define FC_DEFAULT_DMA2_BUFSIZE (10 * 188) |
51 | struct flexcop_dma dma[2]; | 51 | struct flexcop_dma dma[2]; |
52 | 52 | ||
53 | int active_dma1_addr; /* 0 = addr0 of dma1; 1 = addr1 of dma1 */ | 53 | int active_dma1_addr; /* 0 = addr0 of dma1; 1 = addr1 of dma1 */ |
54 | u32 last_dma1_cur_pos; /* position of the pointer last time the timer/packet irq occured */ | 54 | u32 last_dma1_cur_pos; /* position of the pointer last time the timer/packet irq occured */ |
55 | int count; | ||
55 | 56 | ||
56 | spinlock_t irq_lock; | 57 | spinlock_t irq_lock; |
57 | 58 | ||
@@ -99,15 +100,6 @@ static irqreturn_t flexcop_pci_irq(int irq, void *dev_id, struct pt_regs *regs) | |||
99 | 100 | ||
100 | spin_lock_irq(&fc_pci->irq_lock); | 101 | spin_lock_irq(&fc_pci->irq_lock); |
101 | 102 | ||
102 | deb_irq("irq: %08x cur_addr: %08x (%d), our addrs. 1: %08x 2: %08x; 0x000: " | ||
103 | "%08x, 0x00c: %08x\n",v.raw, | ||
104 | fc->read_ibi_reg(fc,dma1_008).dma_0x8.dma_cur_addr << 2, | ||
105 | fc_pci->active_dma1_addr, | ||
106 | fc_pci->dma[0].dma_addr0,fc_pci->dma[0].dma_addr1, | ||
107 | fc->read_ibi_reg(fc,dma1_000).raw, | ||
108 | fc->read_ibi_reg(fc,dma1_00c).raw); | ||
109 | |||
110 | |||
111 | if (v.irq_20c.DMA1_IRQ_Status == 1) { | 103 | if (v.irq_20c.DMA1_IRQ_Status == 1) { |
112 | if (fc_pci->active_dma1_addr == 0) | 104 | if (fc_pci->active_dma1_addr == 0) |
113 | flexcop_pass_dmx_packets(fc_pci->fc_dev,fc_pci->dma[0].cpu_addr0,fc_pci->dma[0].size / 188); | 105 | flexcop_pass_dmx_packets(fc_pci->fc_dev,fc_pci->dma[0].cpu_addr0,fc_pci->dma[0].size / 188); |
@@ -123,21 +115,28 @@ static irqreturn_t flexcop_pci_irq(int irq, void *dev_id, struct pt_regs *regs) | |||
123 | fc->read_ibi_reg(fc,dma1_008).dma_0x8.dma_cur_addr << 2; | 115 | fc->read_ibi_reg(fc,dma1_008).dma_0x8.dma_cur_addr << 2; |
124 | u32 cur_pos = cur_addr - fc_pci->dma[0].dma_addr0; | 116 | u32 cur_pos = cur_addr - fc_pci->dma[0].dma_addr0; |
125 | 117 | ||
118 | deb_irq("irq: %08x cur_addr: %08x: cur_pos: %08x, last_cur_pos: %08x ", | ||
119 | v.raw,cur_addr,cur_pos,fc_pci->last_dma1_cur_pos); | ||
120 | |||
126 | /* buffer end was reached, restarted from the beginning | 121 | /* buffer end was reached, restarted from the beginning |
127 | * pass the data from last_cur_pos to the buffer end to the demux | 122 | * pass the data from last_cur_pos to the buffer end to the demux |
128 | */ | 123 | */ |
129 | if (cur_pos < fc_pci->last_dma1_cur_pos) { | 124 | if (cur_pos < fc_pci->last_dma1_cur_pos) { |
125 | deb_irq(" end was reached: passing %d bytes ",(fc_pci->dma[0].size*2 - 1) - fc_pci->last_dma1_cur_pos); | ||
130 | flexcop_pass_dmx_data(fc_pci->fc_dev, | 126 | flexcop_pass_dmx_data(fc_pci->fc_dev, |
131 | fc_pci->dma[0].cpu_addr0 + fc_pci->last_dma1_cur_pos, | 127 | fc_pci->dma[0].cpu_addr0 + fc_pci->last_dma1_cur_pos, |
132 | (fc_pci->dma[0].size*2 - 1) - fc_pci->last_dma1_cur_pos); | 128 | (fc_pci->dma[0].size*2) - fc_pci->last_dma1_cur_pos); |
133 | fc_pci->last_dma1_cur_pos = 0; | 129 | fc_pci->last_dma1_cur_pos = 0; |
130 | fc_pci->count = 0; | ||
134 | } | 131 | } |
135 | 132 | ||
136 | if (cur_pos > fc_pci->last_dma1_cur_pos) { | 133 | if (cur_pos > fc_pci->last_dma1_cur_pos) { |
134 | deb_irq(" passing %d bytes ",cur_pos - fc_pci->last_dma1_cur_pos); | ||
137 | flexcop_pass_dmx_data(fc_pci->fc_dev, | 135 | flexcop_pass_dmx_data(fc_pci->fc_dev, |
138 | fc_pci->dma[0].cpu_addr0 + fc_pci->last_dma1_cur_pos, | 136 | fc_pci->dma[0].cpu_addr0 + fc_pci->last_dma1_cur_pos, |
139 | cur_pos - fc_pci->last_dma1_cur_pos); | 137 | cur_pos - fc_pci->last_dma1_cur_pos); |
140 | } | 138 | } |
139 | deb_irq("\n"); | ||
141 | 140 | ||
142 | fc_pci->last_dma1_cur_pos = cur_pos; | 141 | fc_pci->last_dma1_cur_pos = cur_pos; |
143 | } else | 142 | } else |
@@ -301,6 +300,11 @@ static int flexcop_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
301 | 300 | ||
302 | fc->stream_control = flexcop_pci_stream_control; | 301 | fc->stream_control = flexcop_pci_stream_control; |
303 | 302 | ||
303 | if (enable_pid_filtering) | ||
304 | info("will use the HW PID filter."); | ||
305 | else | ||
306 | info("will pass the complete TS to the demuxer."); | ||
307 | |||
304 | fc->pid_filtering = enable_pid_filtering; | 308 | fc->pid_filtering = enable_pid_filtering; |
305 | fc->bus_type = FC_PCI; | 309 | fc->bus_type = FC_PCI; |
306 | 310 | ||