[PATCH] Fix dst i2c read/write timeout failure.

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

 



Hi,

Attached is a patch to bttv which fixes the following problems.


Affected cards and problems:
~~~~~~~~~~~~~~~~~~~~~~~~
o VP-1020 (200103A) Tuning problems, device detection.
o VP-1020 (DST-MOT) Errors during tuning, device detection fails in a while.
o VP-1030 (DST-CI) Tuning sometimes fails after CI commands.
o VP-2031 (DCT-CI) Tuning problems


The timeout happens before the actual timeout occured in the MCU
on the board, and hence the problems.


Changes: (bttv-i2c.diff)
~~~~~~~~~~~~~~~~~~~~~~~~
o Changed the custom wait queue to wait_event_interruptible_timeout()
     - Suggestion by Johannes Stezenbach.

o Fixed the wait queue timeout problem
     - This fixes the timeout problem on various cards.
     - This problem was visible as many
         * Cannot tune to channels, when signal levels are very low.
         * app_info does not work in some conditions for CI based cards
     - Smaller values worked good for newer cards, but the older cards
suffered, settled down to the worst case values that could happen in any
eventuality.


Signed-off-by: Manu Abraham <[email protected]>


Index: linux-2.6.12-rc3/drivers/media/video/bttv-i2c.c
========================================
--- linux-2.6.12-rc3.orig/drivers/media/video/bttv-i2c.c	2005-05-03
16:04:28.000000000 +0400
+++ linux-2.6.12-rc3/drivers/media/video/bttv-i2c.c	2005-05-05
00:01:00.000000000 +0400
@@ -29,6 +29,7 @@
  #include <linux/moduleparam.h>
  #include <linux/init.h>
  #include <linux/delay.h>
+#include <linux/jiffies.h>
  #include <asm/io.h>

  #include "bttvp.h"
@@ -130,17 +131,14 @@ static u32 functionality(struct i2c_adap
  static int
  bttv_i2c_wait_done(struct bttv *btv)
  {
-	DECLARE_WAITQUEUE(wait, current);
  	int rc = 0;

-	add_wait_queue(&btv->i2c_queue, &wait);
-	if (0 == btv->i2c_done)
-		msleep_interruptible(20);
-	remove_wait_queue(&btv->i2c_queue, &wait);
-
-	if (0 == btv->i2c_done)
-		/* timeout */
-		rc = -EIO;
+	/* timeout */
+	if (wait_event_interruptible_timeout(btv->i2c_queue,
+		btv->i2c_done, msecs_to_jiffies(85)) == -ERESTARTSYS)
+
+	rc = -EIO;
+	
  	if (btv->i2c_done & BT848_INT_RACK)
  		rc = 1;
  	btv->i2c_done = 0;



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux