summaryrefslogtreecommitdiff
path: root/drivers/dahdi/voicebus/GpakCust.c
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2010-02-08 22:49:32 +0000
committerShaun Ruffell <sruffell@digium.com>2010-02-08 22:49:32 +0000
commit42e275be0f7ce08a9fe2adf4815f7fd926a341bb (patch)
tree7aa554e74ca4bf83805d382073efc91967f27f6c /drivers/dahdi/voicebus/GpakCust.c
parent791a3df5afe66a8cbe15ebe030c2956fd2e00818 (diff)
vpmadt032,wcte12xp: Use a timeout on the read/write commands and during load.
It is possible for poorly behaving hardware (and driver bugs) to lockup the modprobe process by having it wait indefinitely for a command to complete that never will. DAHDI-451. git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@8003 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/voicebus/GpakCust.c')
-rw-r--r--drivers/dahdi/voicebus/GpakCust.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/dahdi/voicebus/GpakCust.c b/drivers/dahdi/voicebus/GpakCust.c
index 9491818..cce3308 100644
--- a/drivers/dahdi/voicebus/GpakCust.c
+++ b/drivers/dahdi/voicebus/GpakCust.c
@@ -133,9 +133,18 @@ static int vpmadt032_getreg_full_return(struct vpmadt032 *vpm, int pagechange,
u16 addr, u16 *outbuf, struct vpmadt032_cmd *cmd)
{
unsigned long flags;
- int ret = -EIO;
+ unsigned long ret;
BUG_ON(!cmd);
- wait_for_completion(&cmd->complete);
+
+ /* We'll wait for 200ms */
+ ret = wait_for_completion_timeout(&cmd->complete, HZ/5);
+ if (unlikely(!ret)) {
+ spin_lock_irqsave(&vpm->list_lock, flags);
+ list_add_tail(&cmd->node, &vpm->free_cmds);
+ spin_unlock_irqrestore(&vpm->list_lock, flags);
+ return -EIO;
+ }
+
if (cmd->desc & __VPM150M_FIN) {
*outbuf = cmd->data;
cmd->desc = 0;
@@ -146,7 +155,7 @@ static int vpmadt032_getreg_full_return(struct vpmadt032 *vpm, int pagechange,
spin_lock_irqsave(&vpm->list_lock, flags);
list_add_tail(&cmd->node, &vpm->free_cmds);
spin_unlock_irqrestore(&vpm->list_lock, flags);
- return ret;
+ return 0;
}
/* Read one of the registers on the VPMADT032 */