提交 39e469ab 编写于 作者: S Steven Toth 提交者: Mauro Carvalho Chehab

V4L/DVB (12940): SAA7164: IRQ / message timeout related change

In some cases we're seeing large timeouts on commands. I'm changing the
implementation so that the deferred worker checks the PCI bus for
any messages and signals the waiting caller accordingly. The previous
mechanism was too unreliable.
Signed-off-by: NSteven Toth <stoth@kernellabs.com>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 068ed40b
...@@ -78,6 +78,43 @@ u32 saa7164_cmd_timeout_get(struct saa7164_dev *dev, u8 seqno) ...@@ -78,6 +78,43 @@ u32 saa7164_cmd_timeout_get(struct saa7164_dev *dev, u8 seqno)
return ret; return ret;
} }
/* Commands to the f/w get marshelled to/from this code then onto the PCI
* -bus/c running buffer. */
int saa7164_irq_dequeue(struct saa7164_dev *dev)
{
int ret = SAA_OK;
u32 timeout;
wait_queue_head_t *q = 0;
dprintk(DBGLVL_CMD, "%s()\n", __func__);
/* While any outstand message on the bus exists... */
do {
/* Peek the msg bus */
tmComResInfo_t tRsp = { 0, 0, 0, 0, 0, 0 };
ret = saa7164_bus_get(dev, &tRsp, NULL, 1);
if (ret != SAA_OK)
break;
q = &dev->cmds[tRsp.seqno].wait;
timeout = saa7164_cmd_timeout_get(dev, tRsp.seqno);
dprintk(DBGLVL_CMD, "%s() timeout = %d\n", __func__, timeout);
if (!timeout) {
dprintk(DBGLVL_CMD,
"%s() signalled seqno(%d) (for dequeue)\n",
__func__, tRsp.seqno);
dev->cmds[tRsp.seqno].signalled = 1;
wake_up(q);
} else {
printk(KERN_ERR
"%s() found timed out command on the bus\n",
__func__);
}
} while (0);
return ret;
}
/* Commands to the f/w get marshelled to/from this code then onto the PCI /* Commands to the f/w get marshelled to/from this code then onto the PCI
* -bus/c running buffer. */ * -bus/c running buffer. */
int saa7164_cmd_dequeue(struct saa7164_dev *dev) int saa7164_cmd_dequeue(struct saa7164_dev *dev)
......
...@@ -69,7 +69,7 @@ static void saa7164_work_cmdhandler(struct work_struct *w) ...@@ -69,7 +69,7 @@ static void saa7164_work_cmdhandler(struct work_struct *w)
struct saa7164_dev *dev = container_of(w, struct saa7164_dev, workcmd); struct saa7164_dev *dev = container_of(w, struct saa7164_dev, workcmd);
/* Wake up any complete commands */ /* Wake up any complete commands */
saa7164_cmd_signal(dev, 0); saa7164_irq_dequeue(dev);
} }
static void saa7164_buffer_deliver(struct saa7164_buffer *buf) static void saa7164_buffer_deliver(struct saa7164_buffer *buf)
......
...@@ -328,6 +328,7 @@ int saa7164_cmd_send(struct saa7164_dev *dev, ...@@ -328,6 +328,7 @@ int saa7164_cmd_send(struct saa7164_dev *dev,
u8 id, tmComResCmd_t command, u16 controlselector, u8 id, tmComResCmd_t command, u16 controlselector,
u16 size, void *buf); u16 size, void *buf);
void saa7164_cmd_signal(struct saa7164_dev *dev, u8 seqno); void saa7164_cmd_signal(struct saa7164_dev *dev, u8 seqno);
int saa7164_irq_dequeue(struct saa7164_dev *dev);
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
/* saa7164-api.c */ /* saa7164-api.c */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册