Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+9 −5
Original line number Original line Diff line number Diff line
@@ -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)
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)
	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) {