From 53f4e170fc008cc7bf59bc7247a9d0056d9207ac Mon Sep 17 00:00:00 2001 From: Steven Toth Date: Sat, 31 Jul 2010 14:47:36 -0300 Subject: [PATCH] --- yaml --- r: 219361 b: refs/heads/master c: 4a52be0faa014380b7bf15c5ca7e3dea7cb4ea52 h: refs/heads/master i: 219359: a2a660ae87b647e6bc555843e778570d8b520a32 v: v3 --- [refs] | 2 +- .../drivers/media/video/saa7164/saa7164-cmd.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 142b921bdaad..8884f932e975 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 91d80189fab8c473a392d81b6834b8032191c990 +refs/heads/master: 4a52be0faa014380b7bf15c5ca7e3dea7cb4ea52 diff --git a/trunk/drivers/media/video/saa7164/saa7164-cmd.c b/trunk/drivers/media/video/saa7164/saa7164-cmd.c index f33c0b533841..e4ec44f5c7cc 100644 --- a/trunk/drivers/media/video/saa7164/saa7164-cmd.c +++ b/trunk/drivers/media/video/saa7164/saa7164-cmd.c @@ -82,9 +82,10 @@ u32 saa7164_cmd_timeout_get(struct saa7164_dev *dev, u8 seqno) * -bus/c running buffer. */ int saa7164_irq_dequeue(struct saa7164_dev *dev) { - int ret = SAA_OK; + int ret = SAA_OK, i = 0; u32 timeout; wait_queue_head_t *q = 0; + u8 tmp[512]; dprintk(DBGLVL_CMD, "%s()\n", __func__); /* While any outstand message on the bus exists... */ @@ -109,8 +110,22 @@ int saa7164_irq_dequeue(struct saa7164_dev *dev) printk(KERN_ERR "%s() found timed out command on the bus\n", __func__); + + /* Clean the bus */ + ret = saa7164_bus_get(dev, &tRsp, &tmp, 0); + printk(KERN_ERR "%s() ret = %x\n", __func__, ret); + if (ret == SAA_ERR_EMPTY) + /* Someone else already fetched the response */ + return SAA_OK; + + if (ret != SAA_OK) + return ret; } - } while (0); + + /* It's unlikely to have more than 4 or 5 pending messages, ensure we exit + * at some point regardles. + */ + } while (i++ < 32); return ret; }