[linux-dvb] [Patch] Added Nova-S-Plus and Nova-SE2 DVB-S support

Steve Toth stoth at hauppauge.com
Thu Dec 1 22:02:46 CET 2005


Johannes Stezenbach wrote:
> On Thu, Dec 01, 2005, Steve Toth wrote:
>   
>>> How long does the private 3 wire write usually take? Doesn't
>>> the initial check in your code fail everytime because it is
>>> done too soon, and then your code waits needlessly for 500msecs
>>> before checking again?
>>>       
Fair comment. 500ms was probably way too high.

It doesn't say in the public datasheet how long it can take, but I've 
reduced the values to very reasonable limits.

I don't have the ability to test the patch (for a couple of days) but it 
should be fine. Anyone else want to try it prior to sign-off?

Thanks,

Steve

-------------- next part --------------
Index: linux/drivers/media/dvb/frontends/cx24123.c
===================================================================
RCS file: /cvs/video4linux/v4l-dvb/linux/drivers/media/dvb/frontends/cx24123.c,v
retrieving revision 1.4
diff -u -p -r1.4 cx24123.c
--- linux/drivers/media/dvb/frontends/cx24123.c	26 Nov 2005 23:46:56 -0000	1.4
+++ linux/drivers/media/dvb/frontends/cx24123.c	1 Dec 2005 20:55:49 -0000
@@ -483,6 +483,8 @@ static int cx24123_pll_calculate(struct 
 /*
  * Tuner data is 21 bits long, must be left-aligned in data.
  * Tuner cx24109 is written through a dedicated 3wire interface on the demod chip.
+ * If the tuner hangs during byte xmit the timeout code will avoid a
+ * driver hang and fail after a reasonable timeout.
  */
 static int cx24123_pll_writereg(struct dvb_frontend* fe, struct dvb_frontend_parameters *p, u32 data)
 {
@@ -501,12 +503,11 @@ static int cx24123_pll_writereg(struct d
 	cx24123_writereg(state, 0x22, (data >> 16) & 0xff);
 	while ( ( cx24123_readreg(state, 0x20) & 0x40 ) == 0 )
 	{
-		/* Safety - No reason why the write should not complete, and we never get here, avoid hang */
 		if (timeout++ >= 4) {
-			printk("%s:  demodulator is no longer responding, aborting.\n",__FUNCTION__);
+			printk("%s:  demodulator is not responding, possibly hung, aborting.\n", __FUNCTION__);
 			return -EREMOTEIO;
 		}
-		msleep(500);
+		msleep(10);
 	}
 
 	timeout = 0;
@@ -514,12 +515,11 @@ static int cx24123_pll_writereg(struct d
 	cx24123_writereg(state, 0x22, (data>>8) & 0xff );
 	while ( (cx24123_readreg(state, 0x20) & 0x40 ) == 0 )
 	{
-		/* Safety - No reason why the write should not complete, and we never get here, avoid hang */
 		if (timeout++ >= 4) {
-			printk("%s:  demodulator is not responding, possibly hung, aborting.\n",__FUNCTION__);
+			printk("%s:  demodulator is not responding, possibly hung, aborting.\n", __FUNCTION__);
 			return -EREMOTEIO;
 		}
-		msleep(500);
+		msleep(10);
 	}
 
 	timeout = 0;
@@ -527,12 +527,11 @@ static int cx24123_pll_writereg(struct d
 	cx24123_writereg(state, 0x22, (data) & 0xff );
 	while ((cx24123_readreg(state, 0x20) & 0x80))
 	{
-		/* Safety - No reason why the write should not complete, and we never get here, avoid hang */
 		if (timeout++ >= 4) {
-			printk("%s:  demodulator is not responding, possibly hung, aborting.\n",__FUNCTION__);
+			printk("%s:  demodulator is not responding, possibly hung, aborting.\n", __FUNCTION__);
 			return -EREMOTEIO;
 		}
-		msleep(500);
+		msleep(10);
 	}
 
 	/* Trigger the demod to configure the tuner */


More information about the linux-dvb mailing list