Commit d1729cce authored by Kenji Kaneshige's avatar Kenji Kaneshige Committed by Greg Kroah-Hartman

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: default avatarKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: default avatarKristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 094ed76e
...@@ -302,6 +302,12 @@ static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int sec) ...@@ -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); 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, * Returns 1 if SHPC finishes executing a command within 1 sec,
* otherwise returns 0. * otherwise returns 0.
...@@ -309,16 +315,14 @@ static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int sec) ...@@ -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) static inline int shpc_poll_ctrl_busy(struct controller *ctrl)
{ {
int i; int i;
u16 cmd_status = shpc_readw(ctrl, CMD_STATUS);
if (!(cmd_status & 0x1)) if (!is_ctrl_busy(ctrl))
return 1; return 1;
/* Check every 0.1 sec for a total of 1 sec */ /* Check every 0.1 sec for a total of 1 sec */
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
msleep(100); msleep(100);
cmd_status = shpc_readw(ctrl, CMD_STATUS); if (!is_ctrl_busy(ctrl))
if (!(cmd_status & 0x1))
return 1; return 1;
} }
...@@ -336,7 +340,7 @@ static inline int shpc_wait_cmd(struct controller *ctrl) ...@@ -336,7 +340,7 @@ static inline int shpc_wait_cmd(struct controller *ctrl)
else else
rc = wait_event_interruptible_timeout(ctrl->queue, rc = wait_event_interruptible_timeout(ctrl->queue,
!ctrl->cmd_busy, timeout); !ctrl->cmd_busy, timeout);
if (!rc) { if (!rc && is_ctrl_busy(ctrl)) {
retval = -EIO; retval = -EIO;
err("Command not completed in 1000 msec\n"); err("Command not completed in 1000 msec\n");
} else if (rc < 0) { } else if (rc < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment