Mailing List archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-dvb] Re: [PATCH] skystar2 filters rewritten(?!)
Hi souldn't pid_rc be an array?
Il gio, 2003-12-04 alle 08:13, Niklas Peinecke ha scritto:
> Hi,
>
> here is the patch against todays CVS. I hope, we're all happy with the
> rewrite now (well, at leat happy enough to merge this in). I
> incorporated the changes made by Wolfgang yesterday [see his
> against-patch.dif] and rewrote the ref counters to have 8 bits instead
> of only 3.
>
> IMHO it should be save to include this into CVS now, but I'm open for
> further suggestions.
>
> Niklas
>
> ______________________________________________________________________
>
> Index: skystar2.c
> ===================================================================
> RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/b2c2/skystar2.c,v
> retrieving revision 1.18
> diff -p -u -r1.18 skystar2.c
> --- skystar2.c 3 Dec 2003 18:50:49 -0000 1.18
> +++ skystar2.c 4 Dec 2003 08:04:40 -0000
> @@ -5,13 +5,16 @@
> * Copyright (C) 2003 Vadim Catana, skystar@moldova.cc
> *
> * FIX: DiSEqC Tone Burst in flexcop_diseqc_ioctl()
> + * FIX: FULL soft DiSEqC for skystar2 (rev 193) VP310 equipped
> * Vincenzo Di Massa, hawk.it at tiscalinet.it
> *
> * IMP: Converted to Linux coding style
> * Roberto Ragusa, r.ragusa at libero.it
> *
> - * FIX: FULL soft DiSEqC for skystar2 (rev 193) VP310 equipped
> - * Vincenzo Di Massa, hawk.it at tiscalinet.it
> + * Added hardware filtering support,
> + * Niklas Peinecke, peinecke at gdv.uni-hannover.de
> + * Wolfgang Thiel, w-thiel at gmx.net
> + *
> *
> *
> * This program is free software; you can redistribute it and/or
> @@ -51,11 +54,15 @@
> #include "dvb_functions.h"
>
> static int debug = 0;
> -#define dprintk(x...) do { if (debug) printk(x); } while (0)
> +#define dprintk(x...) do { if (debug>=1) printk(x); } while (0)
> +#define ddprintk(x...) do { if (debug>=2) printk(x); } while (0)
> +static int enable_hw_filters=1;
>
> #define SIZE_OF_BUF_DMA1 0x3AC00
> #define SIZE_OF_BUF_DMA2 0x758
>
> +#define N_HW_FILTERS (6+32)
> +
> struct dmaq {
>
> u32 bus_addr;
> @@ -100,7 +107,11 @@ struct adapter {
>
> spinlock_t lock;
>
> - u16 pids[0x27];
> + u16 pids[N_HW_FILTERS];
> + u16 pid_list[256];
> + u8 pid_rc; // ref counters for the pids
> + u16 pid_count;
> + u16 whole_band_width;
> u32 mac_filter;
> };
>
> @@ -224,7 +235,7 @@ static u32 flex_i2c_read(struct adapter
> u32 bytes_to_transfer;
> u8 *start;
>
> - dprintk("%s:\n", __FUNCTION__);
> + ddprintk("%s:\n", __FUNCTION__);
>
> start = buf;
>
> @@ -253,7 +264,7 @@ static u32 flex_i2c_write(struct adapter
> u32 bytes_to_transfer;
> u8 *start;
>
> - dprintk("%s:\n", __FUNCTION__);
> + ddprintk("%s:\n", __FUNCTION__);
>
> start = buf;
>
> @@ -284,11 +295,11 @@ static int master_xfer(struct dvb_i2c_bu
> if (down_interruptible(&tmp->i2c_sem))
> return -ERESTARTSYS;
>
> - dprintk("%s: %d messages to transfer\n", __FUNCTION__, num);
> + ddprintk("%s: %d messages to transfer\n", __FUNCTION__, num);
>
> for (i = 0; i < num; i++)
> {
> - dprintk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i,
> + ddprintk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i,
> msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
>
> /* allow only the mt312 and stv0299 frontends to access the bus */
> @@ -602,13 +613,13 @@ static void sram_init(struct adapter *ad
>
> adapter->dw_sram_type = tmp & 0x30000;
>
> - dprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
> + ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
>
> } else {
>
> adapter->dw_sram_type = 0x10000;
>
> - dprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
> + ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
> }
>
> /* return value is never used? */
> @@ -933,83 +944,31 @@ static char eeprom_set_mac_addr(struct a
> */
>
> /* PID filter */
> -static void filter_enable_stream1_filter(struct adapter *adapter, u32 op)
> -{
> - dprintk("%s: op=%x\n", __FUNCTION__, op);
> -
> - if (op == 0) {
> - write_reg_op(adapter, 0x208, 2, ~0x00000001, 0);
> -
> - } else {
> -
> - write_reg_op(adapter, 0x208, 1, 0, 0x00000001);
> - }
> -}
> -
> -static void filter_enable_stream2_filter(struct adapter *adapter, u32 op)
> -{
> - dprintk("%s: op=%x\n", __FUNCTION__, op);
> -
> - if (op == 0) {
> - write_reg_op(adapter, 0x208, 2, ~0x00000002, 0);
> -
> - } else {
>
> - write_reg_op(adapter, 0x208, 1, 0, 0x00000002);
> - }
> -}
> -
> -static void filter_enable_pcr_filter(struct adapter *adapter, u32 op)
> +/* every flexcop has 6 "lower" hw PID filters */
> +/* these are enabled by setting bits 0-5 of 0x208 */
> +/* we do not check for id>5 here! */
> +static void filter_enable_hw_filter(struct adapter *adapter,u8 id,u8 op)
> {
> - dprintk("%s: op=%x\n", __FUNCTION__, op);
> + u32 mask=( 0x00000001 << id );
>
> - if (op == 0) {
> - write_reg_op(adapter, 0x208, 2, ~0x00000004, 0);
> -
> - } else {
> + dprintk("%s: id=%d op=%d\n", __FUNCTION__, id, op);
>
> - write_reg_op(adapter, 0x208, 1, 0, 0x00000004);
> - }
> -}
> -
> -static void filter_enable_pmt_filter(struct adapter *adapter, u32 op)
> -{
> - dprintk("%s: op=%x\n", __FUNCTION__, op);
> -
> - if (op == 0) {
> - write_reg_op(adapter, 0x208, 2, ~0x00000008, 0);
> -
> - } else {
> -
> - write_reg_op(adapter, 0x208, 1, 0, 0x00000008);
> - }
> + if (op == 0) write_reg_op(adapter, 0x208, 2, ~mask, 0);
> + else write_reg_op(adapter, 0x208, 1, 0, mask);
> }
>
> -static void filter_enable_emm_fFilter(struct adapter *adapter, u32 op)
> +/* this sets the PID that should pass the specified filter */
> +static void pid_set_hw_pid(struct adapter * adapter,u8 id,u32 pid)
> {
> - dprintk("%s: op=%x\n", __FUNCTION__, op);
> + u32 adr=0x300+((id&6)<<1);
>
> - if (op == 0) {
> - write_reg_op(adapter, 0x208, 2, ~0x00000010, 0);
> + dprintk("%s: id=%d addr=%x %c pid=%d\n", __FUNCTION__, id, adr, (id&1)? 'h':'l', pid);
>
> - } else {
> -
> - write_reg_op(adapter, 0x208, 1, 0, 0x00000010);
> - }
> + if((id&1)==0) write_reg_op(adapter,adr,3,0xffff8000,pid&0x1fff);
> + else write_reg_op(adapter,adr,3,0x8000ffff,(pid&0x1fff)<<16);
> }
>
> -static void filter_enable_ecm_filter(struct adapter *adapter, u32 op)
> -{
> - dprintk("%s: op=%x\n", __FUNCTION__, op);
> -
> - if (op == 0) {
> - write_reg_op(adapter, 0x208, 2, ~0x00000020, 0);
> -
> - } else {
> -
> - write_reg_op(adapter, 0x208, 1, 0, 0x00000020);
> - }
> -}
>
> /*
> static void filter_enable_null_filter(struct adapter *adapter, u32 op)
> @@ -1051,6 +1010,25 @@ static void ctrl_enable_mac(struct adapt
> }
> }
>
> +/* select data filter nr. id for setup */
> +static void filter_select_data_filter(struct adapter *adapter,u8 id)
> +{
> + write_reg_op(adapter,0x310,3,0xffffffe0,id&0x1f);
> +}
> +
> +/* enable data filter; 0: disable, 1: enable */
> +static void filter_enable_data_filter(struct adapter *adapter,u8 op)
> +{
> + if(op==0) write_reg_op(adapter,0x314,2,0xffff9fff,0);
> + else write_reg_op(adapter,0x314,3,0xffff9fff,0x00004000);
> +}
> +
> +/* set PID for data filter */
> +static void pid_set_data_pid(struct adapter *adapter,u32 pid)
> +{
> + write_reg_op(adapter,0x314,3,0xffffe000,pid & 0x1fff);
> +}
> +
> static int ca_set_mac_dst_addr_filter(struct adapter *adapter, u8 * mac)
> {
> u32 tmp1, tmp2;
> @@ -1091,29 +1069,6 @@ static void check_null_filter_enable(str
> }
> */
>
> -static void init_pids_info(struct adapter *adapter)
> -{
> - int i;
> -
> - for (i = 0; i < 0x27; i++)
> - adapter->pids[i] = 0x1FFF;
> -}
> -
> -static int check_pid(struct adapter *adapter, u16 pid)
> -{
> - u32 i;
> -
> - if (pid == 0x1FFF)
> - return 0;
> -
> - for (i = 0; i < 0x27; i++) {
> - if (adapter->pids[i] == pid || adapter->pids[i] == 0x2000)
> - return 1;
> - }
> -
> - return 0;
> -}
> -
> static void pid_set_group_pid(struct adapter * adapter, u32 pid)
> {
> u32 value;
> @@ -1142,120 +1097,7 @@ static void pid_set_group_mask(struct ad
> /* return value; */
> }
>
> -static void pid_set_stream1_pid(struct adapter * adapter, u32 pid)
> -{
> - u32 value;
> -
> - dprintk("%s: pid=%x\n", __FUNCTION__, pid);
> -
> - value = (pid & 0x3FFF) | (read_reg_dw(adapter, 0x300) & 0xFFFFC000);
> -
> - write_reg_dw(adapter, 0x300, value);
> -
> - /* return value is never used? */
> -/* return value; */
> -}
> -
> -static void pid_set_stream2_pid(struct adapter * adapter, u32 pid)
> -{
> - u32 value;
> -
> - dprintk("%s: pid=%x\n", __FUNCTION__, pid);
> -
> - value = ((pid & 0x3FFF) << 0x10) | (read_reg_dw(adapter, 0x300) & 0xFFFF);
> -
> - write_reg_dw(adapter, 0x300, value);
> -
> - /* return value is never used? */
> -/* return value; */
> -}
> -
> -static void pid_set_pcr_pid(struct adapter * adapter, u32 pid)
> -{
> - u32 value;
> -
> - dprintk("%s: pid=%x\n", __FUNCTION__, pid);
> -
> - value = (pid & 0x3FFF) | (read_reg_dw(adapter, 0x304) & 0xFFFFC000);
> -
> - write_reg_dw(adapter, 0x304, value);
> -
> - /* return value is never used? */
> -/* return value; */
> -}
> -
> -static void pid_set_pmt_pid(struct adapter * adapter, u32 pid)
> -{
> - u32 value;
> -
> - dprintk("%s: pid=%x\n", __FUNCTION__, pid);
> -
> - value = ((pid & 0x3FFF) << 0x10) | (read_reg_dw(adapter, 0x304) & 0x3FFF);
> -
> - write_reg_dw(adapter, 0x304, value);
> -
> - /* return value is never used? */
> -/* return value; */
> -}
> -
> -static void pid_set_emm_pid(struct adapter * adapter, u32 pid)
> -{
> - u32 value;
> -
> - dprintk("%s: pid=%x\n", __FUNCTION__, pid);
> -
> - value = (pid & 0xFFFF) | (read_reg_dw(adapter, 0x308) & 0xFFFF0000);
> -
> - write_reg_dw(adapter, 0x308, value);
> -
> - /* return value is never used? */
> -/* return value; */
> -}
> -
> -static void pid_set_ecm_pid(struct adapter * adapter, u32 pid)
> -{
> - u32 value;
> -
> - dprintk("%s: pid=%x\n", __FUNCTION__, pid);
> -
> - value = (pid << 0x10) | (read_reg_dw(adapter, 0x308) & 0xFFFF);
> -
> - write_reg_dw(adapter, 0x308, value);
> -
> - /* return value is never used? */
> -/* return value; */
> -}
> -
> -static int pid_get_stream1_pid(struct adapter * adapter)
> -{
> - return read_reg_dw(adapter, 0x300) & 0x00001FFF;
> -}
> -
> -static int pid_get_stream2_pid(struct adapter * adapter)
> -{
> - return (read_reg_dw(adapter, 0x300) >> 0x10)& 0x00001FFF;
> -}
> -
> -static int pid_get_pcr_pid(struct adapter * adapter)
> -{
> - return read_reg_dw(adapter, 0x304) & 0x00001FFF;
> -}
> -
> -static int pid_get_pmt_pid(struct adapter * adapter)
> -{
> - return (read_reg_dw(adapter, 0x304) >> 0x10)& 0x00001FFF;
> -}
> -
> -static int pid_get_emm_pid(struct adapter * adapter)
> -{
> - return read_reg_dw(adapter, 0x308) & 0x00001FFF;
> -}
> -
> -static int pid_get_ecm_pid(struct adapter * adapter)
> -{
> - return (read_reg_dw(adapter, 0x308) >> 0x10)& 0x00001FFF;
> -}
> -
> +/*
> static int pid_get_group_pid(struct adapter * adapter)
> {
> return read_reg_dw(adapter, 0x30C) & 0x00001FFF;
> @@ -1265,6 +1107,7 @@ static int pid_get_group_mask(struct ada
> {
> return (read_reg_dw(adapter, 0x30C) >> 0x10)& 0x00001FFF;
> }
> +*/
>
> /*
> static void reset_hardware_pid_filter(struct adapter *adapter)
> @@ -1284,10 +1127,29 @@ static void reset_hardware_pid_filter(st
> filter_enable_ecm_filter(adapter, 0);
>
> pid_set_emm_pid(adapter, 0x1FFF);
> - filter_enable_emm_fFilter(adapter, 0);
> + filter_enable_emm_filter(adapter, 0);
> }
> */
>
> +static void init_pids(struct adapter *adapter)
> +{
> + int i;
> +
> + for (i = 0; i < N_HW_FILTERS; i++)
> + adapter->pids[i] = 0x1FFF;
> + adapter->pid_count=0;
> + adapter->whole_bandwidth = 0;
> +
> + pid_set_group_pid(adapter, 0);
> + pid_set_group_mask(adapter, 0x1FE0);
> + pid_set_hw_pid(adapter,0,0x1FFF);
> + pid_set_hw_pid(adapter,1,0x1FFF);
> + pid_set_hw_pid(adapter,2,0x1FFF);
> + pid_set_hw_pid(adapter,3,0x1FFF);
> + pid_set_hw_pid(adapter,4,0x1FFF);
> + pid_set_hw_pid(adapter,5,0x1FFF);
> +}
> +
> static void open_whole_bandwidth(struct adapter *adapter)
> {
> dprintk("%s:\n", __FUNCTION__);
> @@ -1297,175 +1159,167 @@ static void open_whole_bandwidth(struct
> pid_set_group_mask(adapter, 0);
>
> filter_enable_mask_filter(adapter, 1);
> -
> }
>
> -static int add_hw_pid(struct adapter *adapter, u32 pid)
> +static void close_whole_bandwidth(struct adapter *adapter)
> {
> - dprintk("%s: pid=%d\n", __FUNCTION__, pid);
> -
> - if (pid <= 0x1F)
> - return 1;
> -
> - if ((pid_get_group_mask(adapter) == 0) && (pid_get_group_pid(adapter) == 0))
> - return 0;
> -
> - if (pid_get_stream1_pid(adapter) == 0x1FFF) {
> - pid_set_stream1_pid(adapter, pid & 0xFFFF);
> -
> - filter_enable_stream1_filter(adapter, 1);
> -
> - return 1;
> - }
> -
> - if (pid_get_stream2_pid(adapter) == 0x1FFF) {
> - pid_set_stream2_pid(adapter, (pid & 0xFFFF));
> -
> - filter_enable_stream2_filter(adapter, 1);
> -
> - return 1;
> - }
> -
> - if (pid_get_pcr_pid(adapter) == 0x1FFF) {
> - pid_set_pcr_pid(adapter, (pid & 0xFFFF));
> -
> - filter_enable_pcr_filter(adapter, 1);
> -
> - return 1;
> - }
> -
> - if ((pid_get_pmt_pid(adapter) & 0x1FFF) == 0x1FFF) {
> - pid_set_pmt_pid(adapter, (pid & 0xFFFF));
> -
> - filter_enable_pmt_filter(adapter, 1);
> -
> - return 1;
> - }
> -
> - if ((pid_get_emm_pid(adapter) & 0x1FFF) == 0x1FFF) {
> - pid_set_emm_pid(adapter, (pid & 0xFFFF));
> -
> - filter_enable_emm_fFilter(adapter, 1);
> -
> - return 1;
> - }
> + dprintk("%s:\n", __FUNCTION__);
> +
> + pid_set_group_pid(adapter, 0);
>
> - if ((pid_get_ecm_pid(adapter) & 0x1FFF) == 0x1FFF) {
> - pid_set_ecm_pid(adapter, (pid & 0xFFFF));
> + pid_set_group_mask(adapter, 0x1fe0);
>
> - filter_enable_ecm_filter(adapter, 1);
> + filter_enable_mask_filter(adapter, 1);
> +}
>
> - return 1;
> +/* this tries to add the specified PID to be let through the
> + hw filters. return 1 on success.
> + if this cannot be done (all filter in use), returns -1
> + for PID <= 0x1f there is always success reported, since
> + these are let through by the group filters anyway. */
> +static int add_hw_pid(struct adapter *adapter, u32 pid)
> +{
> + int num,i;
> +
> + if(pid<=0x1f) return 1;
> +
> + if(adapter->b2c2_revision==0xc0 || adapter->b2c2_revision==0xc3)
> + num=38; // FlexCop IIb & III have 6+32 hw filters
> + else num=6; // FlexCop II has 6 hw filters, every other should have at least 6
> +
> + for (i=0; i<num; i++) {
> + if (adapter->pids[i] == 0x1fff) { // find a free pid slot
> + adapter->pids[i]=pid;
> + if(i<6) {
> + pid_set_hw_pid(adapter,i,pid);
> + filter_enable_hw_filter(adapter,i,1);
> + return 1;
> + } else {
> + filter_select_data_filter(adapter,i-6);
> + pid_set_data_pid(adapter,pid);
> + filter_enable_data_filter(adapter,1);
> + return 1;
> + }
> + }
> }
> -
> return -1;
> }
>
> +/* returns -1 if the pid was not present in the filters */
> static int remove_hw_pid(struct adapter *adapter, u32 pid)
> {
> - dprintk("%s: pid=%d\n", __FUNCTION__, pid);
> -
> - if (pid <= 0x1F)
> - return 1;
> -
> - if (pid_get_stream1_pid(adapter) == pid) {
> - pid_set_stream1_pid(adapter, 0x1FFF);
> -
> - return 1;
> - }
> -
> - if (pid_get_stream2_pid(adapter) == pid) {
> - pid_set_stream2_pid(adapter, 0x1FFF);
> -
> - filter_enable_stream2_filter(adapter, 0);
> -
> - return 1;
> - }
> -
> - if (pid_get_pcr_pid(adapter) == pid) {
> - pid_set_pcr_pid(adapter, 0x1FFF);
> -
> - filter_enable_pcr_filter(adapter, 0);
> -
> - return 1;
> - }
> -
> - if (pid_get_pmt_pid(adapter) == pid) {
> - pid_set_pmt_pid(adapter, 0x1FFF);
> -
> - filter_enable_pmt_filter(adapter, 0);
> -
> - return 1;
> - }
> -
> - if (pid_get_emm_pid(adapter) == pid) {
> - pid_set_emm_pid(adapter, 0x1FFF);
> -
> - filter_enable_emm_fFilter(adapter, 0);
> -
> - return 1;
> - }
> -
> - if (pid_get_ecm_pid(adapter) == pid) {
> - pid_set_ecm_pid(adapter, 0x1FFF);
> -
> - filter_enable_ecm_filter(adapter, 0);
> -
> - return 1;
> + int num,i;
> +
> + if(pid<=0x1f) return 1;
> +
> + if(adapter->b2c2_revision==0xc0 || adapter->b2c2_revision==0xc3)
> + num=38; // FlexCop IIb & III have 6+32 hw filters
> + else num=6; // FlexCop II has 6 hw filters, every other should have at least 6
> +
> + for(i=0; i<num; i++) {
> + if (adapter->pids[i] == pid) { // find the pid slot
> + adapter->pids[i]=0x1fff;
> + if(i<6) {
> + pid_set_hw_pid(adapter,i,pid);
> + filter_enable_hw_filter(adapter,i,0);
> + return 1;
> + } else {
> + filter_select_data_filter(adapter,i-6);
> + pid_set_data_pid(adapter,pid);
> + filter_enable_data_filter(adapter,0);
> + return 1;
> + }
> + }
> }
> -
> return -1;
> }
>
> -static int add_pid(struct adapter *adapter, u32 pid)
> +/* Adds a PID to the filters.
> + If there are no more hw filters available, open the whole
> + ts stream to pass by.
> + Adding a pid more than once has no effect.
> + If pid==0x2000, open whole ts stream also.
> + Returns 1 on success, -1 on error */
> +static int add_pid(struct adapter *adapter,u32 pid)
> {
> int i;
> -
> +
> dprintk("%s: pid=%d\n", __FUNCTION__, pid);
> -
> - if (pid > 0x1FFE && pid != 0x2000)
> - return -1;
> -
> - if (check_pid(adapter, pid) == 1)
> +
> + if(pid==0x2000) {
> + if (adapter->whole_bandwidth == 0)
> + open_whole_bandwidth(adapter);
> + ++adapter->whole_bandwidth;
> return 1;
> -
> - for (i = 0; i < 0x27; i++) {
> - if (adapter->pids[i] == 0x1FFF) // find free pid filter
> - {
> - adapter->pids[i] = pid;
> -
> - if (pid == 0x2000 || add_hw_pid(adapter, pid) < 0)
> - open_whole_bandwidth(adapter);
> -
> + }
> +
> + if (pid > 0x1ffe) return -1;
> +
> + // check if the pid is already present
> + 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==256) return -1; // no more pids can be added
> + adapter->pid_list[adapter->pid_count]=pid; // register pid
> + adapter->pid_rc[adapter->pid_count]=1;
> + adapter->pid_count++;
> +
> + // setup a filter for the pid
> + // if there are no filters left, let the whole ts pass
> + if (add_hw_pid(adapter,pid)==-1) {
> + if (adapter->whole_bandwidth == 0)
> + open_whole_bandwidth(adapter);
> + adapter->whole_bandwidth++;
> }
> -
> - return -1;
> +
> + return 1;
> }
>
> +/* Removes a PID from the filters. */
> static int remove_pid(struct adapter *adapter, u32 pid)
> {
> - u32 i;
> -
> - dprintk("%s: pid=%d\n", __FUNCTION__, pid);
> -
> - if (pid > 0x1FFE)
> - return -1;
> -
> - for (i = 0; i < 0x27; i++) {
> - if (adapter->pids[i] == pid) {
> - adapter->pids[i] = 0x1FFF;
> -
> - remove_hw_pid(adapter, pid);
> + int i,j,num;
> +
> + if (pid==0x2000) {
> + if (adapter->whole_bandwith <= 0) return -1; // cannot remove a pid that was not added ;)
> + adapter->whole_bandwidth--;
> + if (adapter->whole_bandwidth == 0)
> + close_whole_bandwidth(adapter);
> + return 1;
> + }
> +
> + if (pid > 0x1ffe && pid != 0x2000) return -1;
> +
> + // check if the pid is present
> + for (i=0; i<adapter->pid_count; i++) {
> + if(adapter->pid_list[i]==pid) {
> + adapter->pid_rc[i]--;
> + if(adapter->pid_rc[i]<=0) {
> + // remove from the list
> + adapter->pid_count--;
> + for(j=i; j<adapter->pid_count; j++) {
> + adapter->pid_list[j]=adapter->pid_list[j+1];
> + adapter->pid_rc[j]=adapter->pid_rc[j+1];
> + }
> + // close filter and take care to reverse the effect of open_whole_bandwidth
> + if (remove_hw_pid(adapter,pid)==-1) {
> + if (adapter->whole_bandwidth > 0)
> + --adapter->whole_bandwidth;
> + if (adapter->whole_bandwidth == 0)
> + close_whole_bandwidth(adapter);
> + }
> + }
>
> return 1;
> }
> }
> -
> return -1;
> }
>
> +
> /* dma & irq */
> static void ctrl_enable_smc(struct adapter *adapter, u32 op)
> {
> @@ -1745,7 +1599,8 @@ static void open_stream(struct adapter *
>
> filter_enable_mask_filter(adapter, 1);
>
> - add_pid(adapter, pid);
> + if(enable_hw_filters==1) add_pid(adapter, pid);
> + else open_whole_bandwidth(adapter);
>
> dprintk("%s: adapter->dma_status=%x\n", __FUNCTION__, adapter->dma_status);
>
> @@ -1795,7 +1650,7 @@ static void close_stream(struct adapter
> dma_start_stop0x2102(adapter, dma_mask, 0);
> }
> }
> - remove_pid(adapter, pid);
> + if(enable_hw_filters==1) remove_pid(adapter, pid);
> }
>
> static void interrupt_service_dma1(struct adapter *adapter)
> @@ -1827,9 +1682,9 @@ static void interrupt_service_dma1(struc
> n_num_new_bytes_transferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + n_cur_dma_counter;
> }
>
> - dprintk("%s: n_cur_dma_counter = %d\n" , __FUNCTION__, n_cur_dma_counter);
> - dprintk("%s: dmaq1.tail = %d\n" , __FUNCTION__, adapter->dmaq1.tail);
> - dprintk("%s: bytes_transferred = %d\n" , __FUNCTION__, n_num_new_bytes_transferred);
> + ddprintk("%s: n_cur_dma_counter = %d\n" , __FUNCTION__, n_cur_dma_counter);
> + ddprintk("%s: dmaq1.tail = %d\n" , __FUNCTION__, adapter->dmaq1.tail);
> + ddprintk("%s: bytes_transferred = %d\n" , __FUNCTION__, n_num_new_bytes_transferred);
>
> if (n_num_new_bytes_transferred < dw_default_packet_size)
> return;
> @@ -1871,7 +1726,7 @@ static irqreturn_t isr(int irq, void *de
>
> u32 value;
>
> - dprintk("%s:\n", __FUNCTION__);
> + ddprintk("%s:\n", __FUNCTION__);
>
> spin_lock_irq(&tmp->lock);
>
> @@ -1915,7 +1770,7 @@ static void init_dma_queue(struct adapte
>
> adapter->dma_status = adapter->dma_status | 0x10000000;
>
> - dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq1.buffer, SIZE_OF_BUF_DMA1);
> + ddprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq1.buffer, SIZE_OF_BUF_DMA1);
>
> } else {
>
> @@ -1941,7 +1796,7 @@ static void init_dma_queue(struct adapte
>
> adapter->dma_status = adapter->dma_status | 0x20000000;
>
> - dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq2.buffer, (int) SIZE_OF_BUF_DMA2);
> + ddprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq2.buffer, (int) SIZE_OF_BUF_DMA2);
>
> } else {
>
> @@ -2080,16 +1935,7 @@ static int driver_initialize(struct pci_
> write_reg_dw(adapter, 0x210, 0xB2FF);
> write_reg_dw(adapter, 0x208, 0x40);
>
> - init_pids_info(adapter);
> -
> - pid_set_group_pid(adapter, 0);
> - pid_set_group_mask(adapter, 0x1FE0);
> - pid_set_stream1_pid(adapter, 0x1FFF);
> - pid_set_stream2_pid(adapter, 0x1FFF);
> - pid_set_pmt_pid(adapter, 0x1FFF);
> - pid_set_pcr_pid(adapter, 0x1FFF);
> - pid_set_ecm_pid(adapter, 0x1FFF);
> - pid_set_emm_pid(adapter, 0x1FFF);
> + init_pids(adapter);
>
> init_dma_queue(adapter);
>
> @@ -2101,25 +1947,25 @@ static int driver_initialize(struct pci_
>
> adapter->b2c2_revision = (read_reg_dw(adapter, 0x204) >> 0x18);
>
> - switch(adapter->b2c2_revision) {
> - case 0x82:
> - printk("%s: FlexCopII(rev.130) chip found\n", __FILE__);
> - break;
> - case 0xC3:
> - printk("%s: FlexCopIIB(rev.195) chip found\n", __FILE__);
> - break;
> - case 0xC0:
> - printk("%s: FlexCopIII(rev.192) chip found\n", __FILE__);
> - break;
> - default:
> - printk("%s: The revision of the FlexCop chip on your card is %d\n", __FILE__, adapter->b2c2_revision);
> - printk("%s: This driver works only with FlexCopII(rev.130), FlexCopIIB(rev.195) and FlexCopIII(rev. 192).\n", __FILE__);
> - 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));
> - return -ENODEV;
> - }
> + switch(adapter->b2c2_revision) {
> + case 0x82:
> + printk("%s: FlexCopII(rev.130) chip found\n", __FILE__);
> + break;
> + case 0xC3:
> + printk("%s: FlexCopIIB(rev.195) chip found\n", __FILE__);
> + break;
> + case 0xC0:
> + printk("%s: FlexCopIII(rev.192) chip found\n", __FILE__);
> + break;
> + default:
> + printk("%s: The revision of the FlexCop chip on your card is %d\n", __FILE__, adapter->b2c2_revision);
> + printk("%s: This driver works only with FlexCopII(rev.130), FlexCopIIB(rev.195) and FlexCopIII(rev. 192).\n", __FILE__);
> + 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));
> + return -ENODEV;
> + }
>
> tmp = read_reg_dw(adapter, 0x204);
>
> @@ -2551,7 +2397,9 @@ module_init(skystar2_init);
> module_exit(skystar2_cleanup);
>
> MODULE_PARM(debug,"i");
> -MODULE_PARM_DESC(debug, "enable verbose debug messages");
> +MODULE_PARM_DESC(debug, "enable verbose debug messages: supported values: 1 and 2");
> +MODULE_PARM(enable_hw_filters,"i");
> +MODULE_PARM_DESC(enable_hw_filters, "enable hardware filters, if disabled the whole ts is passed through");
>
> MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver");
> MODULE_LICENSE("GPL");
--
Vincenzo Di Massa <hawk78_it@yahoo.it>
--
Info:
To unsubscribe send a mail to ecartis@linuxtv.org with "unsubscribe linux-dvb" as subject.
Home |
Main Index |
Thread Index