On Fri, 4 Feb 2005, Greg KH wrote:
> On Fri, Feb 04, 2005 at 03:37:20PM -0600, Kylene Hall wrote:
> > On Fri, 2005-02-04 at 14:52, Greg KH wrote:
> > > On Fri, Feb 04, 2005 at 02:12:50PM -0600, Kylene Hall wrote:
> > > > +static struct class tpm_class = {
> > > > +       .name = "tpm",
> > > > +       .class_dev_attrs = tpm_attrs,
> > > > +};
> > > 
> > > Where is your release function?  Did you see any warnings from the
> > > kernel when you removed any of these class devices?  Why did you ignore
> > > it?
> > > 
> > Sorry, I missed the warning message.  I have looked at some other
> > instances for what I might need to put in that function and I'm
> > stumped.  I didn't kmalloc my class_device structure so I don't need to
> > kfree it.
> 
> Anyway, why not try using the class_simple interface instead?  If you do
> that you don't have to worry (as much) in the reference counting logic.

Thanks for pointing me to the class in the miscdevice.  I was able to use 
that for my needs.  I do need this small patch however to get the sysfs 
file ownership correct on my sysfs files.  The patch also adds on more 
sysfs file we need.

Thanks,
Kylie

> 
> thanks,
> 
> greg k-h
> 
> 


Signed off by: Kylene Hall <[EMAIL PROTECTED]>
---
diff -uprN linux-2.6.10/drivers/char/tpm/tpm.c 
linux-2.6.10-tpm/drivers/char/tpm/tpm.c
--- linux-2.6.10/drivers/char/tpm/tpm.c 2005-02-04 15:03:03.000000000 -0600
+++ linux-2.6.10-tpm/drivers/char/tpm/tpm.c     2005-02-09 12:23:23.137004424 
-0600
@@ -246,8 +246,6 @@ static ssize_t show_pcrs(struct device *
        return str - buf;
 }
 
-static DEVICE_ATTR(pcrs, S_IRUGO, show_pcrs, NULL);
-
 #define  READ_PUBEK_RESULT_SIZE 314
 static u8 readpubek[] = {
        0, 193,                 /* TPM_TAG_RQU_COMMAND */
@@ -308,8 +306,6 @@ static ssize_t show_pubek(struct device 
        return str - buf;
 }
 
-static DEVICE_ATTR(pubek, S_IRUGO, show_pubek, NULL);
-
 #define CAP_VER_RESULT_SIZE 18
 static u8 cap_version[] = {
        0, 193,                 /* TPM_TAG_RQU_COMMAND */
@@ -362,7 +358,22 @@ static ssize_t show_caps(struct device *
        return str - buf;
 }
 
-static DEVICE_ATTR(caps, S_IRUGO, show_caps, NULL);
+static ssize_t store_cancel(struct device *dev, const char *buf,
+                           size_t count)
+{
+       struct tpm_chip *chip = dev_get_drvdata(dev);
+       if (chip == NULL)
+               return 0;
+
+       chip->vendor->cancel(chip);
+
+       down(&chip->timer_manipulation_mutex);
+       if (timer_pending(&chip->device_timer))
+               mod_timer(&chip->device_timer, jiffies);
+       up(&chip->timer_manipulation_mutex);
+
+       return count;
+}
 
 /*
  * Device file system interface to the TPM
@@ -524,6 +535,7 @@ EXPORT_SYMBOL_GPL(tpm_read);
 void tpm_remove_hardware(struct device *dev)
 {
        struct tpm_chip *chip = dev_get_drvdata(dev);
+       int i;
 
        if (chip == NULL) {
                dev_err(dev, "No device data found\n");
@@ -539,9 +551,8 @@ void tpm_remove_hardware(struct device *
        dev_set_drvdata(dev, NULL);
        misc_deregister(&chip->vendor->miscdev);
 
-       device_remove_file(dev, &dev_attr_pubek);
-       device_remove_file(dev, &dev_attr_pcrs);
-       device_remove_file(dev, &dev_attr_caps);
+       for ( i = 0; i < TPM_ATTRS; i++ ) 
+               device_remove_file(dev, &chip->attr[i]);
 
        dev_mask[chip->dev_num / 32] &= !(1 << (chip->dev_num % 32));
 
@@ -608,6 +619,11 @@ int tpm_register_hardware(struct device 
        struct tpm_chip *chip;
        int i, j;
 
+       DEVICE_ATTR(pcrs, S_IRUGO, show_pcrs, NULL);
+       DEVICE_ATTR(pubek, S_IRUGO, show_pubek, NULL);
+       DEVICE_ATTR(caps, S_IRUGO, show_caps, NULL);
+       DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, store_cancel);
+
        /* Driver specific per-device data */
        chip = kmalloc(sizeof(*chip), GFP_KERNEL);
        if (chip == NULL)
@@ -663,10 +679,16 @@ dev_num_search_complete:
 
        list_add(&chip->list, &tpm_chip_list);
 
-       device_create_file(dev, &dev_attr_pubek);
-       device_create_file(dev, &dev_attr_pcrs);
-       device_create_file(dev, &dev_attr_caps);
-
+       chip->attr[0] = dev_attr_pubek;
+       chip->attr[1] = dev_attr_pcrs;
+       chip->attr[2] = dev_attr_caps;
+       chip->attr[3] = dev_attr_cancel;
+
+       for ( i = 0; i < TPM_ATTRS; i++ ) {
+               chip->attr[i].attr.owner = chip->vendor->miscdev.fops->owner;
+               device_create_file(dev, &chip->attr[i]);                
+       }
+       
        return 0;
 }
 
diff -uprN linux-2.6.10/drivers/char/tpm/tpm.h 
linux-2.6.10-tpm/drivers/char/tpm/tpm.h
--- linux-2.6.10/drivers/char/tpm/tpm.h 2005-02-04 15:03:03.000000000 -0600
+++ linux-2.6.10-tpm/drivers/char/tpm/tpm.h     2005-02-09 12:23:18.244748160 
-0600
@@ -25,6 +25,7 @@
 #include <linux/miscdevice.h>
 
 #define TPM_TIMEOUT msecs_to_jiffies(5)
+#define TPM_ATTRS 4
 
 /* TPM addresses */
 #define        TPM_ADDR                        0x4E
@@ -46,6 +47,7 @@ struct tpm_vendor_specific {
 
 struct tpm_chip {
        struct device *dev;     /* PCI device stuff */
+       struct device_attribute attr[4];
 
        int dev_num;            /* /dev/tpm# */
        int num_opens;          /* only one allowed */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to