mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
shpchp: fix command completion check
This patch fixes the problem that shpchp driver could mis-detect command failures if the system was under heavy load. Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
094ed76e89
commit
d1729ccecd
1 changed files with 9 additions and 5 deletions
|
@ -302,6 +302,12 @@ static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int sec)
|
|||
add_timer(&php_ctlr->int_poll_timer);
|
||||
}
|
||||
|
||||
static inline int is_ctrl_busy(struct controller *ctrl)
|
||||
{
|
||||
u16 cmd_status = shpc_readw(ctrl, CMD_STATUS);
|
||||
return cmd_status & 0x1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns 1 if SHPC finishes executing a command within 1 sec,
|
||||
* otherwise returns 0.
|
||||
|
@ -309,16 +315,14 @@ static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int sec)
|
|||
static inline int shpc_poll_ctrl_busy(struct controller *ctrl)
|
||||
{
|
||||
int i;
|
||||
u16 cmd_status = shpc_readw(ctrl, CMD_STATUS);
|
||||
|
||||
if (!(cmd_status & 0x1))
|
||||
if (!is_ctrl_busy(ctrl))
|
||||
return 1;
|
||||
|
||||
/* Check every 0.1 sec for a total of 1 sec */
|
||||
for (i = 0; i < 10; i++) {
|
||||
msleep(100);
|
||||
cmd_status = shpc_readw(ctrl, CMD_STATUS);
|
||||
if (!(cmd_status & 0x1))
|
||||
if (!is_ctrl_busy(ctrl))
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -336,7 +340,7 @@ static inline int shpc_wait_cmd(struct controller *ctrl)
|
|||
else
|
||||
rc = wait_event_interruptible_timeout(ctrl->queue,
|
||||
!ctrl->cmd_busy, timeout);
|
||||
if (!rc) {
|
||||
if (!rc && is_ctrl_busy(ctrl)) {
|
||||
retval = -EIO;
|
||||
err("Command not completed in 1000 msec\n");
|
||||
} else if (rc < 0) {
|
||||
|
|
Loading…
Reference in a new issue