Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] Re: [PATCH] Skystar2 pid filters reorganization



Roberto Ragusa wrote:
Hi,

this patch reorganizes the hw filter in skystar2.c to avoid many similar
functions. I also tried to raise the artificial limit of 0x27 simulated
filters to 60 (there is a #define now).

I'm not still sure about how to handle the group/mask filter, hence a
couple of "#ifdef 0" in the code.

I don't see any regression, and I expect some improvements because of the
0x27->60 change (but "scan" behaviour is not improved too much).

This patch is not ready for CVS. I only want some feedback about it
(do you experience problems?).

I would like to know if there is any specific reason to mask pid
numbers with 0x3fff or 0xffff (instead of 0x1fff). I converted everything
to 0x1fff, otherwise there are problems with spurious high bits
not cleared in the hardware registers (no packets match).

The patch is not very human-readable because diff didn't do a good job,
sorry.

Hi Roberto,

please do not yet apply these changes. I have rewritten parts of the code to enable the true 36 hardware filters (not that software emulation used right now). The reason for 37 slots is, that the flexcop has (at least) 36 HARDWARE PID filters. I tried to enable them, see my attached patch. I have not tested these changes yet, and I won't find the time before weekend, but it would be great if you could hold back your changes until this is settled, since parts of your changes would have to be taken back in order to work properly. If you want to test my code, please do so (the earlier the better).

There is at least one thing I'm not sure about in the new code: The right flags in line 1505.

filter_enable_data_filter(adapter,i-6,3);
The second param could also be 2 or 1.

Regards,

Niklas
Index: skystar2.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/b2c2/skystar2.c,v
retrieving revision 1.15
diff -p -u -r1.15 skystar2.c
--- skystar2.c	26 Nov 2003 00:43:58 -0000	1.15
+++ skystar2.c	27 Nov 2003 07:36:56 -0000
@@ -9,6 +9,9 @@
  * 	
  * IMP: Converted to Linux coding style
  * 	 Roberto Ragusa, r.ragusa at libero.it
+ *
+ * Added hardware filtering support, 
+ *     Niklas Peinecke, n.peinecke at gdv.uni-hannover.de
  * 	
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -980,7 +983,7 @@ static void filter_enable_pmt_filter(str
 	}
 }
 
-static void filter_enable_emm_fFilter(struct adapter *adapter, u32 op)
+static void filter_enable_emm_filter(struct adapter *adapter, u32 op)
 {
 	dprintk("%s: op=%x\n", __FUNCTION__, op);
 
@@ -1046,6 +1049,31 @@ static void ctrl_enable_mac(struct adapt
 	}
 }
 
+/* NP experimental code */
+
+/* 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 A, 2: enable B, 3: enable AB */
+static void filter_enable_data_filter(struct adapter *adapter,u8 id,u8 op)
+{
+	filter_select_data_filter(adapter,id);
+	if(op==0) write_reg_op(adapter,0x314,2,0xffff9fff,0);
+	else if(op==1) write_reg_op(adapter,0x314,3,0xffff9fff,0x00002000);
+	else if(op==2) write_reg_op(adapter,0x314,3,0xffff9fff,0x00004000);
+	else if(op==3) write_reg_op(adapter,0x314,3,0xffff9fff,0x00006000);
+}
+
+/* set PID for data filter */
+static void pid_set_data_pid(struct adapter *adapter,u8 id,u32 pid)
+{
+	filter_select_data_filter(adapter,id);
+	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;
@@ -1279,7 +1307,7 @@ 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);
 }
 */
 
@@ -1292,10 +1320,20 @@ static void open_whole_bandwidth(struct 
 	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);
 }
 
-static int add_hw_pid(struct adapter *adapter, u32 pid)
+/*static int add_hw_pid(struct adapter *adapter, u32 pid)
 {
 	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
 
@@ -1340,7 +1378,7 @@ static int add_hw_pid(struct adapter *ad
 	if ((pid_get_emm_pid(adapter) & 0x1FFF) == 0x1FFF) {
 		pid_set_emm_pid(adapter, (pid & 0xFFFF));
 
-		filter_enable_emm_fFilter(adapter, 1);
+		filter_enable_emm_filter(adapter, 1);
 
 		return 1;
 	}
@@ -1396,7 +1434,7 @@ static int remove_hw_pid(struct adapter 
 	if (pid_get_emm_pid(adapter) == pid) {
 		pid_set_emm_pid(adapter, 0x1FFF);
 
-		filter_enable_emm_fFilter(adapter, 0);
+		filter_enable_emm_filter(adapter, 0);
 
 		return 1;
 	}
@@ -1410,7 +1448,7 @@ static int remove_hw_pid(struct adapter 
 	}
 
 	return -1;
-}
+}*/
 
 static int add_pid(struct adapter *adapter, u32 pid)
 {
@@ -1429,8 +1467,48 @@ static int add_pid(struct adapter *adapt
 		{
 			adapter->pids[i] = pid;
 
-			if (pid == 0x2000 || add_hw_pid(adapter, pid) < 0)
-				open_whole_bandwidth(adapter);
+			if(pid==0x2000) open_whole_bandwidth(adapter);
+			else
+			switch(i)
+			{
+				case 0:
+					pid_set_stream1_pid(adapter,pid);
+					filter_enable_stream1_filter(adapter,1);
+					break;
+					
+				case 1:
+					pid_set_stream2_pid(adapter,pid);
+					filter_enable_stream2_filter(adapter,1);
+					break;
+					
+				case 2:
+					pid_set_pcr_pid(adapter,pid);
+					filter_enable_pcr_filter(adapter,1);
+					break;
+				
+				case 3:
+					pid_set_pmt_pid(adapter,pid);
+					filter_enable_pmt_filter(adapter,1);
+					break;
+					
+				case 4:
+					pid_set_emm_pid(adapter,pid);
+					filter_enable_emm_filter(adapter,1);
+					break;
+					
+				case 5:
+					pid_set_ecm_pid(adapter,pid);
+					filter_enable_ecm_filter(adapter,1);
+					break;
+				
+				default:
+					if(i>=6 && i<=37)
+					{
+						pid_set_data_pid(adapter,i-6,pid);
+						filter_enable_data_filter(adapter,i-6,3);	/* fixme: right flags? */
+					}
+					else return -1;
+			}
 
 			return 1;
 		}
@@ -1449,10 +1527,52 @@ static int remove_pid(struct adapter *ad
 		return -1;
 
 	for (i = 0; i < 0x27; i++) {
-		if (adapter->pids[i] == pid) {
+		if (adapter->pids[i] == pid)
+		{
 			adapter->pids[i] = 0x1FFF;
 
-			remove_hw_pid(adapter, pid);
+			if(pid==0x2000) close_whole_bandwidth(adapter);
+			else
+			switch(i)
+			{
+				case 0:
+					pid_set_stream1_pid(adapter,0x1fff);
+					filter_enable_stream1_filter(adapter,0);
+					break;
+					
+				case 1:
+					pid_set_stream2_pid(adapter,0x1fff);
+					filter_enable_stream2_filter(adapter,0);
+					break;
+					
+				case 2:
+					pid_set_pcr_pid(adapter,0x1fff);
+					filter_enable_pcr_filter(adapter,0);
+					break;
+				
+				case 3:
+					pid_set_pmt_pid(adapter,0x1fff);
+					filter_enable_pmt_filter(adapter,0);
+					break;
+					
+				case 4:
+					pid_set_emm_pid(adapter,0x1fff);
+					filter_enable_emm_filter(adapter,0);
+					break;
+					
+				case 5:
+					pid_set_ecm_pid(adapter,0x1fff);
+					filter_enable_ecm_filter(adapter,0);
+					break;
+				
+				default:
+					if(i>=6 && i<=37)
+					{
+						pid_set_data_pid(adapter,i-6,0x1fff);
+						filter_enable_data_filter(adapter,i-6,0);	/* fixme: right flags? */
+					}
+					else return -1;
+			}
 
 			return 1;
 		}

Home | Main Index | Thread Index