diff --git a/drivers/dahdi/wcte12xp/base.c b/drivers/dahdi/wcte12xp/base.c index fd60c9a..fde868b 100644 --- a/drivers/dahdi/wcte12xp/base.c +++ b/drivers/dahdi/wcte12xp/base.c @@ -580,7 +580,7 @@ static int t1_getreg(struct t1 *wc, int addr) cmd->data = 0x00; cmd->flags = __CMD_RD; submit_cmd(wc, cmd); - ret = wait_for_completion_timeout(&cmd->complete, HZ*10); + ret = wait_for_completion_interruptible_timeout(&cmd->complete, HZ*10); if (unlikely(!ret)) { spin_lock_irqsave(&wc->cmd_list_lock, flags); if (!list_empty(&cmd->node)) { @@ -588,12 +588,15 @@ static int t1_getreg(struct t1 *wc, int addr) * can go ahead and free it right away. */ list_del_init(&cmd->node); spin_unlock_irqrestore(&wc->cmd_list_lock, flags); - if (printk_ratelimit()) { - dev_warn(&wc->vb.pdev->dev, - "Timeout in %s\n", __func__); - } free_cmd(wc, cmd); - return -EIO; + if (-ERESTARTSYS != ret) { + if (printk_ratelimit()) { + dev_warn(&wc->vb.pdev->dev, + "Timeout in %s\n", __func__); + } + ret = -EIO; + } + return ret; } else { /* Looks like this command was removed from the list by * someone else already. Let's wait for them to complete @@ -638,17 +641,20 @@ static inline int t1_getpins(struct t1 *wc, int inisr) cmd->data = 0x00; cmd->flags = __CMD_PINS; submit_cmd(wc, cmd); - ret = wait_for_completion_timeout(&cmd->complete, HZ*2); + ret = wait_for_completion_interruptible_timeout(&cmd->complete, HZ*2); if (unlikely(!ret)) { spin_lock_irqsave(&wc->cmd_list_lock, flags); list_del_init(&cmd->node); spin_unlock_irqrestore(&wc->cmd_list_lock, flags); - if (printk_ratelimit()) { - dev_warn(&wc->vb.pdev->dev, - "Timeout in %s\n", __func__); - } free_cmd(wc, cmd); - return -EIO; + if (-ERESTARTSYS != ret) { + if (printk_ratelimit()) { + dev_warn(&wc->vb.pdev->dev, + "Timeout in %s\n", __func__); + } + ret = -EIO; + } + return ret; } ret = cmd->data; free_cmd(wc, cmd); diff --git a/include/dahdi/kernel.h b/include/dahdi/kernel.h index 1baea8f..1eccfbf 100644 --- a/include/dahdi/kernel.h +++ b/include/dahdi/kernel.h @@ -1240,12 +1240,13 @@ static inline void list_replace(struct list_head *old, struct list_head *new) #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11) #if !defined(HAVE_WAIT_FOR_COMPLETION_TIMEOUT) static inline unsigned long -wait_for_completion_timeout(struct completion *x, unsigned long timeout) +wait_for_completion_interruptible_timeout(struct completion *x, + unsigned long timeout) { /* There is a race condition here. If x->done is reset to 0 * before the call to wait_for_completion after this thread wakes. */ - timeout = wait_event_timeout(x->wait, x->done, timeout); + timeout = wait_event_interruptible_timeout(x->wait, x->done, timeout); if (timeout) wait_for_completion(x);