tpm tis: Do not print timeout messages twice
authorJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Wed, 26 Oct 2016 22:28:44 +0000 (16:28 -0600)
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Sun, 27 Nov 2016 23:31:30 +0000 (01:31 +0200)
The tis driver does a tpm_get_timeouts out side of tpm_chip_register,
and tpm_get_timeouts can print a message, resulting in two prints, eg:

 tpm tpm0: [Hardware Error]: Adjusting reported timeouts: A 10000->750000us B 10000->2000000us C 10000->750000us D 10000->750000us

Keep track and prevent tpm_get_timeouts from running a second time, and
clarify the purpose of the call in tpm_tis_core to only be connected to
irq testing.

Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
drivers/char/tpm/tpm-interface.c
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm_tis_core.c

index ffdae1d..ef0fcdb 100644 (file)
@@ -501,6 +501,9 @@ int tpm_get_timeouts(struct tpm_chip *chip)
        unsigned long old_timeout[4];
        ssize_t rc;
 
+       if (chip->flags & TPM_CHIP_FLAG_HAVE_TIMEOUTS)
+               return 0;
+
        if (chip->flags & TPM_CHIP_FLAG_TPM2) {
                /* Fixed timeouts for TPM2 */
                chip->timeout_a = msecs_to_jiffies(TPM2_TIMEOUT_A);
@@ -513,6 +516,8 @@ int tpm_get_timeouts(struct tpm_chip *chip)
                    msecs_to_jiffies(TPM2_DURATION_MEDIUM);
                chip->duration[TPM_LONG] =
                    msecs_to_jiffies(TPM2_DURATION_LONG);
+
+               chip->flags |= TPM_CHIP_FLAG_HAVE_TIMEOUTS;
                return 0;
        }
 
@@ -596,6 +601,8 @@ int tpm_get_timeouts(struct tpm_chip *chip)
                chip->duration_adjusted = true;
                dev_info(&chip->dev, "Adjusting TPM timeout parameters.");
        }
+
+       chip->flags |= TPM_CHIP_FLAG_HAVE_TIMEOUTS;
        return 0;
 }
 EXPORT_SYMBOL_GPL(tpm_get_timeouts);
index 1864932..21c3dbe 100644 (file)
@@ -143,6 +143,7 @@ enum tpm_chip_flags {
        TPM_CHIP_FLAG_TPM2              = BIT(1),
        TPM_CHIP_FLAG_IRQ               = BIT(2),
        TPM_CHIP_FLAG_VIRTUAL           = BIT(3),
+       TPM_CHIP_FLAG_HAVE_TIMEOUTS     = BIT(4),
 };
 
 struct tpm_chip {
index 2d1e451..7993678 100644 (file)
@@ -777,20 +777,20 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
        if (intfcaps & TPM_INTF_DATA_AVAIL_INT)
                dev_dbg(dev, "\tData Avail Int Support\n");
 
-       /* Very early on issue a command to the TPM in polling mode to make
-        * sure it works. May as well use that command to set the proper
-        *  timeouts for the driver.
-        */
-       if (tpm_get_timeouts(chip)) {
-               dev_err(dev, "Could not get TPM timeouts and durations\n");
-               rc = -ENODEV;
-               goto out_err;
-       }
-
        /* INTERRUPT Setup */
        init_waitqueue_head(&priv->read_queue);
        init_waitqueue_head(&priv->int_queue);
        if (irq != -1) {
+               /* Before doing irq testing issue a command to the TPM in polling mode
+                * to make sure it works. May as well use that command to set the
+                * proper timeouts for the driver.
+                */
+               if (tpm_get_timeouts(chip)) {
+                       dev_err(dev, "Could not get TPM timeouts and durations\n");
+                       rc = -ENODEV;
+                       goto out_err;
+               }
+
                if (irq) {
                        tpm_tis_probe_irq_single(chip, intmask, IRQF_SHARED,
                                                 irq);