Mailing List archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-dvb] Re: Skystar2 misc changes committed, testing wanted
Here is another patch for the skystar2.c.
Please, have a close look before committing it to cvs.
It mainly simply disables the default group filter to check pids
00-1f: IMHO, this default really isn't needed: it only adds unnecessary
complexity to the driver (and added unnecessary work to the poor Flex ;-)
I have _not_ tested this patch very much yet, but it should be fine.
Wolfgang
--- skystar2.c.orig 2003-12-11 15:28:44.000000000 +0000
+++ skystar2.c 2003-12-11 16:06:13.000000000 +0000
@@ -1035,7 +1035,7 @@ static void pid_set_group_pid(struct ada
{
u32 value;
- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
+ dprintk("%s: pid=%04x\n", __FUNCTION__, pid);
value = (pid & 0x3fff) | (read_reg_dw(adapter, 0x30c) & 0xffff0000);
write_reg_dw(adapter, 0x30c, value);
}
@@ -1044,7 +1044,7 @@ static void pid_set_group_mask(struct ad
{
u32 value;
- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
+ dprintk("%s: mask=%04x\n", __FUNCTION__, pid);
value = ((pid & 0x3fff) << 0x10) | (read_reg_dw(adapter, 0x30c) & 0xffff);
write_reg_dw(adapter, 0x30c, value);
}
@@ -1061,42 +1061,18 @@ static int pid_get_group_mask(struct ada
}
*/
-/*
-static void reset_hardware_pid_filter(struct adapter *adapter)
-{
- pid_set_stream1_pid(adapter, 0x1fff);
-
- pid_set_stream2_pid(adapter, 0x1fff);
- filter_enable_stream2_filter(adapter, 0);
-
- pid_set_pcr_pid(adapter, 0x1fff);
- filter_enable_pcr_filter(adapter, 0);
-
- pid_set_pmt_pid(adapter, 0x1fff);
- filter_enable_pmt_filter(adapter, 0);
-
- pid_set_ecm_pid(adapter, 0x1fff);
- filter_enable_ecm_filter(adapter, 0);
-
- pid_set_emm_pid(adapter, 0x1fff);
- filter_enable_emm_filter(adapter, 0);
-}
-*/
-
static void init_pids(struct adapter *adapter)
{
int i;
+ dprintk("%s\n", __FUNCTION__);
adapter->pid_count = 0;
adapter->whole_bandwidth_count = 0;
- for (i = 0; i < adapter->useable_hw_filters; i++) {
- dprintk("%s: setting filter %d to 0x1fff\n", __FUNCTION__, i);
+ for (i = 0; i < adapter->useable_hw_filters; i++)
adapter->hw_pids[i] = 0x1fff;
- pid_set_hw_pid(adapter, i, 0x1fff);
- }
-
- pid_set_group_pid(adapter, 0);
- pid_set_group_mask(adapter, 0x1fe0);
+ /* Do we have to disable all hw pids here as well, or was this
+ done by the 'Flex reset' already?
+ */
}
static void open_whole_bandwidth(struct adapter *adapter)
@@ -1104,19 +1080,13 @@ static void open_whole_bandwidth(struct
dprintk("%s:\n", __FUNCTION__);
pid_set_group_pid(adapter, 0);
pid_set_group_mask(adapter, 0);
-/*
filter_enable_mask_filter(adapter, 1);
-*/
}
static void close_whole_bandwidth(struct adapter *adapter)
{
dprintk("%s:\n", __FUNCTION__);
- pid_set_group_pid(adapter, 0);
- pid_set_group_mask(adapter, 0x1fe0);
-/*
- filter_enable_mask_filter(adapter, 1);
-*/
+ filter_enable_mask_filter(adapter, 0);
}
static void whole_bandwidth_inc(struct adapter *adapter)
@@ -1127,8 +1097,10 @@ static void whole_bandwidth_inc(struct a
static void whole_bandwidth_dec(struct adapter *adapter)
{
- if (--adapter->whole_bandwidth_count <= 0)
+ if (--adapter->whole_bandwidth_count <= 0) {
close_whole_bandwidth(adapter);
+ adapter->whole_bandwidth_count = 0;
+ }
}
/* The specified PID has to be let through the
@@ -1136,16 +1108,14 @@ static void whole_bandwidth_dec(struct a
We try to allocate an hardware filter and open whole
bandwidth when allocation is impossible.
All pids<=0x1f pass through the group filter.
- Returns 1 on success, -1 on error */
+ Returns 1 on success, -1 on error
+*/
static int add_hw_pid(struct adapter *adapter, u16 pid)
{
int i;
dprintk("%s: pid=%d\n", __FUNCTION__, pid);
- if (pid <= 0x1f)
- return 1;
-
/* we can't use a filter for 0x2000, so no search */
if (pid != 0x2000) {
/* find an unused hardware filter */
@@ -1173,9 +1143,6 @@ static int remove_hw_pid(struct adapter
dprintk("%s: pid=%d\n", __FUNCTION__, pid);
- if (pid <= 0x1f)
- return 1;
-
/* we can't use a filter for 0x2000, so no search */
if (pid != 0x2000) {
for (i = 0; i < adapter->useable_hw_filters; i++) {
@@ -1198,7 +1165,8 @@ static int remove_hw_pid(struct adapter
/* Adds a PID to the filters.
Adding a pid more than once is possible, we keep reference counts.
Whole stream available through pid==0x2000.
- Returns 1 on success, -1 on error */
+ Returns 1 on success, -1 on error
+*/
static int add_pid(struct adapter *adapter, u16 pid)
{
int i;
@@ -1209,12 +1177,12 @@ static int add_pid(struct adapter *adapt
return -1;
// check if the pid is already present
- for (i = 0; i < adapter->pid_count; i++)
+ for (i = 0; i < adapter->pid_count; i++) {
if (adapter->pid_list[i] == pid) {
adapter->pid_rc[i]++; // increment ref counter
return 1;
}
-
+ }
if (adapter->pid_count == N_PID_SLOTS)
return -1; // no more pids can be added
adapter->pid_list[adapter->pid_count] = pid; // register pid
@@ -1229,7 +1197,7 @@ static int add_pid(struct adapter *adapt
/* Removes a PID from the filters. */
static int remove_pid(struct adapter *adapter, u16 pid)
{
- int i, j;
+ int i;
dprintk("%s: pid=%d\n", __FUNCTION__, pid);
@@ -1243,8 +1211,8 @@ static int remove_pid(struct adapter *ad
if (adapter->pid_rc[i] <= 0) {
// remove from the list
adapter->pid_count--;
- adapter->pid_list[i]=adapter->pid_list[adapter->pid_count];
- adapter->pid_rc[i] = adapter->pid_rc[adapter->pid_count];
+ adapter->pid_list[i] = adapter->pid_list[adapter->pid_count];
+ adapter->pid_rc[i] = adapter->pid_rc[adapter->pid_count];
// hardware setting
remove_hw_pid(adapter, pid);
}
@@ -1522,8 +1490,6 @@ static void open_stream(struct adapter *
++adapter->capturing;
- filter_enable_mask_filter(adapter, 1);
-
add_pid(adapter, pid);
dprintk("%s: adapter->dma_status=%x\n", __FUNCTION__, adapter->dma_status);
@@ -1549,7 +1515,6 @@ static void open_stream(struct adapter *
if (dma_mask != 0) {
irq_dma_enable_disable_irq(adapter, 1);
-
dma_start_stop(adapter, dma_mask, 1);
}
}
@@ -1980,17 +1945,11 @@ static void driver_halt(struct pci_dev *
struct adapter *adapter;
adapter = pci_get_drvdata(pdev);
-
irq_dma_enable_disable_irq(adapter, 0);
-
ctrl_enable_receive_data(adapter, 0);
-
free_adapter_object(adapter);
-
pci_set_drvdata(pdev, NULL);
-
release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
-
release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
}
Home |
Main Index |
Thread Index