forked from luck/tmp_suning_uos_patched
pciehp: block signals while waiting for command completion
Since we need to wait for command completion for muximum 1sec, waiting command should not be interrupted by a signal. Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
parent
125c39f7d2
commit
d737bdc141
@ -268,9 +268,8 @@ static inline int pcie_poll_cmd(struct controller *ctrl)
|
||||
return timeout;
|
||||
}
|
||||
|
||||
static inline int pcie_wait_cmd(struct controller *ctrl, int poll)
|
||||
static inline void pcie_wait_cmd(struct controller *ctrl, int poll)
|
||||
{
|
||||
int retval = 0;
|
||||
unsigned int msecs = pciehp_poll_mode ? 2500 : 1000;
|
||||
unsigned long timeout = msecs_to_jiffies(msecs);
|
||||
int rc;
|
||||
@ -278,16 +277,9 @@ static inline int pcie_wait_cmd(struct controller *ctrl, int poll)
|
||||
if (poll)
|
||||
rc = pcie_poll_cmd(ctrl);
|
||||
else
|
||||
rc = wait_event_interruptible_timeout(ctrl->queue,
|
||||
!ctrl->cmd_busy, timeout);
|
||||
rc = wait_event_timeout(ctrl->queue, !ctrl->cmd_busy, timeout);
|
||||
if (!rc)
|
||||
dbg("Command not completed in 1000 msec\n");
|
||||
else if (rc < 0) {
|
||||
retval = -EINTR;
|
||||
info("Command was interrupted by a signal\n");
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -365,7 +357,7 @@ static int pcie_write_cmd(struct controller *ctrl, u16 cmd, u16 mask)
|
||||
if (!(slot_ctrl & HP_INTR_ENABLE) ||
|
||||
!(slot_ctrl & CMD_CMPL_INTR_ENABLE))
|
||||
poll = 1;
|
||||
retval = pcie_wait_cmd(ctrl, poll);
|
||||
pcie_wait_cmd(ctrl, poll);
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&ctrl->ctrl_lock);
|
||||
@ -797,7 +789,7 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
|
||||
if (intr_loc & CMD_COMPLETED) {
|
||||
ctrl->cmd_busy = 0;
|
||||
smp_mb();
|
||||
wake_up_interruptible(&ctrl->queue);
|
||||
wake_up(&ctrl->queue);
|
||||
}
|
||||
|
||||
if (!(intr_loc & ~CMD_COMPLETED))
|
||||
|
Loading…
Reference in New Issue
Block a user