Messages in this thread Patch in this message | | | Date | Thu, 05 May 2005 00:44:42 +0400 | From | Manu Abraham <> | Subject | [PATCH] Fix dst i2c read/write timeout failure. |
| |
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 <manu@kromtek.com>
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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |