Merge with /home/shaggy/git/linus-clean/
[powerpc.git] / drivers / char / tpm / tpm.c
index 726d1b5..049d128 100644 (file)
@@ -146,8 +146,12 @@ ssize_t tpm_show_pcrs(struct device *dev, struct device_attribute *attr,
 
        memcpy(data, cap_pcr, sizeof(cap_pcr));
        if ((len = tpm_transmit(chip, data, sizeof(data)))
-           < CAP_PCR_RESULT_SIZE)
-               return len;
+           < CAP_PCR_RESULT_SIZE) {
+               dev_dbg(&chip->pci_dev->dev, "A TPM error (%d) occurred "
+                               "attempting to determine the number of PCRS\n",
+                       be32_to_cpu(*((__be32 *) (data + 6))));
+               return 0;
+       }
 
        num_pcrs = be32_to_cpu(*((__be32 *) (data + 14)));
 
@@ -156,16 +160,20 @@ ssize_t tpm_show_pcrs(struct device *dev, struct device_attribute *attr,
                index = cpu_to_be32(i);
                memcpy(data + 10, &index, 4);
                if ((len = tpm_transmit(chip, data, sizeof(data)))
-                   < READ_PCR_RESULT_SIZE)
-                       return len;
+                   < READ_PCR_RESULT_SIZE){
+                       dev_dbg(&chip->pci_dev->dev, "A TPM error (%d) occurred"
+                               " attempting to read PCR %d of %d\n",
+                               be32_to_cpu(*((__be32 *) (data + 6))), i, num_pcrs);
+                       goto out;
+               }
                str += sprintf(str, "PCR-%02d: ", i);
                for (j = 0; j < TPM_DIGEST_SIZE; j++)
                        str += sprintf(str, "%02X ", *(data + 10 + j));
                str += sprintf(str, "\n");
        }
+out:
        return str - buf;
 }
-
 EXPORT_SYMBOL_GPL(tpm_show_pcrs);
 
 #define  READ_PUBEK_RESULT_SIZE 314
@@ -197,7 +205,10 @@ ssize_t tpm_show_pubek(struct device *dev, struct device_attribute *attr,
 
        if ((len = tpm_transmit(chip, data, READ_PUBEK_RESULT_SIZE)) <
            READ_PUBEK_RESULT_SIZE) {
-               rc = len;
+               dev_dbg(&chip->pci_dev->dev, "A TPM error (%d) occurred "
+                               "attempting to read the PUBEK\n",
+                           be32_to_cpu(*((__be32 *) (data + 6))));
+               rc = 0;
                goto out;
        }
 
@@ -222,10 +233,10 @@ ssize_t tpm_show_pubek(struct device *dev, struct device_attribute *attr,
                    data[15], data[16], data[17], data[22], data[23],
                    data[24], data[25], data[26], data[27], data[28],
                    data[29], data[30], data[31], data[32], data[33],
-                   be32_to_cpu(*((__be32 *) (data + 32))));
+                   be32_to_cpu(*((__be32 *) (data + 34))));
 
        for (i = 0; i < 256; i++) {
-               str += sprintf(str, "%02X ", data[i + 39]);
+               str += sprintf(str, "%02X ", data[i + 38]);
                if ((i + 1) % 16 == 0)
                        str += sprintf(str, "\n");
        }
@@ -453,6 +464,7 @@ void __devexit tpm_remove(struct pci_dev *pci_dev)
 
        pci_set_drvdata(pci_dev, NULL);
        misc_deregister(&chip->vendor->miscdev);
+       kfree(chip->vendor->miscdev.name);
 
        sysfs_remove_group(&pci_dev->dev.kobj, chip->vendor->attr_group);
 
@@ -515,7 +527,9 @@ EXPORT_SYMBOL_GPL(tpm_pm_resume);
 int tpm_register_hardware(struct pci_dev *pci_dev,
                          struct tpm_vendor_specific *entry)
 {
-       char devname[7];
+#define DEVNAME_SIZE 7
+
+       char *devname;
        struct tpm_chip *chip;
        int i, j;
 
@@ -558,7 +572,8 @@ dev_num_search_complete:
        else
                chip->vendor->miscdev.minor = MISC_DYNAMIC_MINOR;
 
-       snprintf(devname, sizeof(devname), "%s%d", "tpm", chip->dev_num);
+       devname = kmalloc(DEVNAME_SIZE, GFP_KERNEL);
+       scnprintf(devname, DEVNAME_SIZE, "%s%d", "tpm", chip->dev_num);
        chip->vendor->miscdev.name = devname;
 
        chip->vendor->miscdev.dev = &(pci_dev->dev);