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

Steve Toth stoth at hauppauge.com
Fri Dec 2 01:07:35 CET 2005


> I know this nit-picking in this case, but code tends to get copied
> and reussed so it pays off to do the trivial cases correctly.
> An msleep(10) could sleep very long if the machine is busy,
> thus one should write timeout code like this:
>   
Thanks.

As requested, done.

Tested here, working perfect.

[Patch] Cleaned up tuner timeout code.

Signed-off-by: Steven Toth <stoth at hauppauge.com>



-------------- 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	2 Dec 2005 00:03:48 -0000
@@ -487,8 +487,7 @@ static int cx24123_pll_calculate(struct 
 static int cx24123_pll_writereg(struct dvb_frontend* fe, struct dvb_frontend_parameters *p, u32 data)
 {
 	struct cx24123_state *state = fe->demodulator_priv;
-
-	u8 timeout = 0;
+	unsigned long timeout;
 
 	/* align the 21 bytes into to bit23 boundary */
 	data = data << 3;
@@ -496,43 +495,37 @@ static int cx24123_pll_writereg(struct d
 	/* Reset the demod pll word length to 0x15 bits */
 	cx24123_writereg(state, 0x21, 0x15);
 
-	timeout = 0;
 	/* write the msb 8 bits, wait for the send to be completed */
+	timeout = jiffies + msecs_to_jiffies(40);
 	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__);
+	while ((cx24123_readreg(state, 0x20) & 0x40) == 0) {
+		if (time_after(jiffies, timeout)) {
+			printk("%s:  demodulator is not responding, possibly hung, aborting.\n", __FUNCTION__);
 			return -EREMOTEIO;
 		}
-		msleep(500);
+		msleep(10);
 	}
 
-	timeout = 0;
 	/* send another 8 bytes, wait for the send to be completed */
+	timeout = jiffies + msecs_to_jiffies(40);
 	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__);
+	while ((cx24123_readreg(state, 0x20) & 0x40) == 0) {
+		if (time_after(jiffies, timeout)) {
+			printk("%s:  demodulator is not responding, possibly hung, aborting.\n", __FUNCTION__);
 			return -EREMOTEIO;
 		}
-		msleep(500);
+		msleep(10);
 	}
 
-	timeout = 0;
 	/* send the lower 5 bits of this byte, padded with 3 LBB, wait for the send to be completed */
+	timeout = jiffies + msecs_to_jiffies(40);
 	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__);
+	while ((cx24123_readreg(state, 0x20) & 0x80)) {
+		if (time_after(jiffies, timeout)) {
+			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