[PATCH] tpm: add cancel function
authorKylene Hall <kjhall@us.ibm.com>
Fri, 24 Jun 2005 05:02:02 +0000 (22:02 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 24 Jun 2005 07:05:26 +0000 (00:05 -0700)
This patch provides the logic to check if an operation has been canceled while
waiting for the response to arrive.

Signed-off-by: Kylene Hall <kjhall@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/char/tpm/tpm.c
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm_atmel.c
drivers/char/tpm/tpm_nsc.c

index b72050c851d28763b9499d5b62a7f99f42426036..e7c1dedfe448dd3492f50fb88e4b05f899547e64 100644 (file)
@@ -141,7 +141,7 @@ EXPORT_SYMBOL_GPL(tpm_lpc_bus_init);
 static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
                            size_t bufsiz)
 {
-       ssize_t len;
+       ssize_t rc;
        u32 count;
        unsigned long stop;
 
@@ -157,10 +157,10 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
 
        down(&chip->tpm_mutex);
 
-       if ((len = chip->vendor->send(chip, (u8 *) buf, count)) < 0) {
+       if ((rc = chip->vendor->send(chip, (u8 *) buf, count)) < 0) {
                dev_err(&chip->pci_dev->dev,
-                       "tpm_transmit: tpm_send: error %zd\n", len);
-               return len;
+                       "tpm_transmit: tpm_send: error %zd\n", rc);
+               goto out;
        }
 
        stop = jiffies + 2 * 60 * HZ;
@@ -170,23 +170,31 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
                    chip->vendor->req_complete_val) {
                        goto out_recv;
                }
-               msleep(TPM_TIMEOUT); /* CHECK */
+
+               if ((status == chip->vendor->req_canceled)) {
+                       dev_err(&chip->pci_dev->dev, "Operation Canceled\n");
+                       rc = -ECANCELED;
+                       goto out;
+               }
+
+               msleep(TPM_TIMEOUT);    /* CHECK */
                rmb();
        } while (time_before(jiffies, stop));
 
 
        chip->vendor->cancel(chip);
-       dev_err(&chip->pci_dev->dev, "Time expired\n");
-       up(&chip->tpm_mutex);
-       return -EIO;
+       dev_err(&chip->pci_dev->dev, "Operation Timed out\n");
+       rc = -ETIME;
+       goto out;
 
 out_recv:
-       len = chip->vendor->recv(chip, (u8 *) buf, bufsiz);
-       if (len < 0)
+       rc = chip->vendor->recv(chip, (u8 *) buf, bufsiz);
+       if (rc < 0)
                dev_err(&chip->pci_dev->dev,
-                       "tpm_transmit: tpm_recv: error %zd\n", len);
+                       "tpm_transmit: tpm_recv: error %zd\n", rc);
+out:
        up(&chip->tpm_mutex);
-       return len;
+       return rc;
 }
 
 #define TPM_DIGEST_SIZE 20
index a3ff4dc5bdb3b40653b10610add5f8e5ddb94f28..714cb16b32cb832d7d5e013a34aa75bca229b326 100644 (file)
@@ -49,6 +49,7 @@ struct tpm_chip;
 struct tpm_vendor_specific {
        u8 req_complete_mask;
        u8 req_complete_val;
+       u8 req_canceled;
        u16 base;               /* TPM base address */
 
        int (*recv) (struct tpm_chip *, u8 *, size_t);
index 07abfb7143b105350d3ebaa353867ce17836a7a7..68974577a6a6301470993c29d599b565d3e9834d 100644 (file)
@@ -147,6 +147,7 @@ static struct tpm_vendor_specific tpm_atmel = {
        .cancel = tpm_atml_cancel,
        .req_complete_mask = ATML_STATUS_BUSY | ATML_STATUS_DATA_AVAIL,
        .req_complete_val = ATML_STATUS_DATA_AVAIL,
+       .req_canceled = ATML_STATUS_READY,
        .base = TPM_ATML_BASE,
        .attr_group = &atmel_attr_grp,
        .miscdev = { .fops = &atmel_ops, },
index 6752901695086c025c3430e6020414353a71814c..37bea14f9310d4005cc9e45a5924803db05a8b34 100644 (file)
@@ -245,6 +245,7 @@ static struct tpm_vendor_specific tpm_nsc = {
        .cancel = tpm_nsc_cancel,
        .req_complete_mask = NSC_STATUS_OBF,
        .req_complete_val = NSC_STATUS_OBF,
+       .req_canceled = NSC_STATUS_RDY,
        .base = TPM_NSC_BASE,
        .attr_group = &nsc_attr_grp,
        .miscdev = { .fops = &nsc_ops, },