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

Commit cb252053 authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman
Browse files

tpm: tpm_try_transmit() refactor error flow.



commit 01f54664a4db0d612de0ece8e0022f21f9374e9b upstream.

First, rename out_no_locality to out_locality for bailing out on
both tpm_cmd_ready() and tpm_request_locality() failure.
Second, ignore the return value of go_to_idle() as  it may override
the return value of the actual tpm operation, the go_to_idle() error
will be caught on any consequent command.
Last, fix the wrong 'goto out', that jumped back instead of forward.

Cc: stable@vger.kernel.org
Fixes: 627448e85c76 ("tpm: separate cmd_ready/go_idle from runtime_pm")
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tested-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3f23e65d
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -479,13 +479,15 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip,

	if (need_locality) {
		rc = tpm_request_locality(chip, flags);
		if (rc < 0)
			goto out_no_locality;
		if (rc < 0) {
			need_locality = false;
			goto out_locality;
		}
	}

	rc = tpm_cmd_ready(chip, flags);
	if (rc)
		goto out;
		goto out_locality;

	rc = tpm2_prepare_space(chip, space, ordinal, buf);
	if (rc)
@@ -549,14 +551,13 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip,
		dev_err(&chip->dev, "tpm2_commit_space: error %d\n", rc);

out:
	rc = tpm_go_idle(chip, flags);
	if (rc)
		goto out;
	/* may fail but do not override previous error value in rc */
	tpm_go_idle(chip, flags);

out_locality:
	if (need_locality)
		tpm_relinquish_locality(chip, flags);

out_no_locality:
	if (chip->ops->clk_enable != NULL)
		chip->ops->clk_enable(chip, false);