Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 11891
b: refs/heads/master
c: e659a3f
h: refs/heads/master
i:
  11889: e18f806
  11887: 63bbd08
v: v3
  • Loading branch information
Kylene Jo Hall authored and Linus Torvalds committed Oct 31, 2005
1 parent 46f6066 commit f40d801
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 73 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b4ed3e3cbb312869929cf4528d71e52629a6cacb
refs/heads/master: e659a3fe2027b19ecd8abb7ad79253672763454b
65 changes: 30 additions & 35 deletions trunk/drivers/char/tpm/tpm.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
if (count == 0)
return -ENODATA;
if (count > bufsiz) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"invalid count value %x %zx \n", count, bufsiz);
return -E2BIG;
}

down(&chip->tpm_mutex);

if ((rc = chip->vendor->send(chip, (u8 *) buf, count)) < 0) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"tpm_transmit: tpm_send: error %zd\n", rc);
goto out;
}
Expand All @@ -86,7 +86,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
}

if ((status == chip->vendor->req_canceled)) {
dev_err(&chip->pci_dev->dev, "Operation Canceled\n");
dev_err(chip->dev, "Operation Canceled\n");
rc = -ECANCELED;
goto out;
}
Expand All @@ -97,14 +97,14 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,


chip->vendor->cancel(chip);
dev_err(&chip->pci_dev->dev, "Operation Timed out\n");
dev_err(chip->dev, "Operation Timed out\n");
rc = -ETIME;
goto out;

out_recv:
rc = chip->vendor->recv(chip, (u8 *) buf, bufsiz);
if (rc < 0)
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"tpm_transmit: tpm_recv: error %zd\n", rc);
out:
up(&chip->tpm_mutex);
Expand Down Expand Up @@ -139,15 +139,14 @@ ssize_t tpm_show_pcrs(struct device *dev, struct device_attribute *attr,
__be32 index;
char *str = buf;

struct tpm_chip *chip =
pci_get_drvdata(to_pci_dev(dev));
struct tpm_chip *chip = dev_get_drvdata(dev);
if (chip == NULL)
return -ENODEV;

memcpy(data, cap_pcr, sizeof(cap_pcr));
if ((len = tpm_transmit(chip, data, sizeof(data)))
< CAP_PCR_RESULT_SIZE) {
dev_dbg(&chip->pci_dev->dev, "A TPM error (%d) occurred "
dev_dbg(chip->dev, "A TPM error (%d) occurred "
"attempting to determine the number of PCRS\n",
be32_to_cpu(*((__be32 *) (data + 6))));
return 0;
Expand All @@ -161,7 +160,7 @@ ssize_t tpm_show_pcrs(struct device *dev, struct device_attribute *attr,
memcpy(data + 10, &index, 4);
if ((len = tpm_transmit(chip, data, sizeof(data)))
< READ_PCR_RESULT_SIZE){
dev_dbg(&chip->pci_dev->dev, "A TPM error (%d) occurred"
dev_dbg(chip->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;
Expand Down Expand Up @@ -191,8 +190,7 @@ ssize_t tpm_show_pubek(struct device *dev, struct device_attribute *attr,
int i, rc;
char *str = buf;

struct tpm_chip *chip =
pci_get_drvdata(to_pci_dev(dev));
struct tpm_chip *chip = dev_get_drvdata(dev);
if (chip == NULL)
return -ENODEV;

Expand All @@ -205,7 +203,7 @@ 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) {
dev_dbg(&chip->pci_dev->dev, "A TPM error (%d) occurred "
dev_dbg(chip->dev, "A TPM error (%d) occurred "
"attempting to read the PUBEK\n",
be32_to_cpu(*((__be32 *) (data + 6))));
rc = 0;
Expand Down Expand Up @@ -274,8 +272,7 @@ ssize_t tpm_show_caps(struct device *dev, struct device_attribute *attr,
ssize_t len;
char *str = buf;

struct tpm_chip *chip =
pci_get_drvdata(to_pci_dev(dev));
struct tpm_chip *chip = dev_get_drvdata(dev);
if (chip == NULL)
return -ENODEV;

Expand Down Expand Up @@ -339,21 +336,21 @@ int tpm_open(struct inode *inode, struct file *file)
}

if (chip->num_opens) {
dev_dbg(&chip->pci_dev->dev,
dev_dbg(chip->dev,
"Another process owns this TPM\n");
rc = -EBUSY;
goto err_out;
}

chip->num_opens++;
pci_dev_get(chip->pci_dev);
get_device(chip->dev);

spin_unlock(&driver_lock);

chip->data_buffer = kmalloc(TPM_BUFSIZE * sizeof(u8), GFP_KERNEL);
if (chip->data_buffer == NULL) {
chip->num_opens--;
pci_dev_put(chip->pci_dev);
put_device(chip->dev);
return -ENOMEM;
}

Expand All @@ -378,7 +375,7 @@ int tpm_release(struct inode *inode, struct file *file)
chip->num_opens--;
del_singleshot_timer_sync(&chip->user_read_timer);
atomic_set(&chip->data_pending, 0);
pci_dev_put(chip->pci_dev);
put_device(chip->dev);
kfree(chip->data_buffer);
spin_unlock(&driver_lock);
return 0;
Expand Down Expand Up @@ -447,12 +444,12 @@ ssize_t tpm_read(struct file * file, char __user * buf,

EXPORT_SYMBOL_GPL(tpm_read);

void __devexit tpm_remove(struct pci_dev *pci_dev)
void tpm_remove_hardware(struct device *dev)
{
struct tpm_chip *chip = pci_get_drvdata(pci_dev);
struct tpm_chip *chip = dev_get_drvdata(dev);

if (chip == NULL) {
dev_err(&pci_dev->dev, "No device data found\n");
dev_err(dev, "No device data found\n");
return;
}

Expand All @@ -462,22 +459,20 @@ void __devexit tpm_remove(struct pci_dev *pci_dev)

spin_unlock(&driver_lock);

pci_set_drvdata(pci_dev, NULL);
dev_set_drvdata(dev, NULL);
misc_deregister(&chip->vendor->miscdev);
kfree(chip->vendor->miscdev.name);

sysfs_remove_group(&pci_dev->dev.kobj, chip->vendor->attr_group);

pci_disable_device(pci_dev);
sysfs_remove_group(&dev->kobj, chip->vendor->attr_group);

dev_mask[chip->dev_num / TPM_NUM_MASK_ENTRIES ] &= !(1 << (chip->dev_num % TPM_NUM_MASK_ENTRIES));

kfree(chip);

pci_dev_put(pci_dev);
put_device(dev);
}

EXPORT_SYMBOL_GPL(tpm_remove);
EXPORT_SYMBOL_GPL(tpm_remove_hardware);

static u8 savestate[] = {
0, 193, /* TPM_TAG_RQU_COMMAND */
Expand Down Expand Up @@ -524,7 +519,7 @@ EXPORT_SYMBOL_GPL(tpm_pm_resume);
* upon errant exit from this function specific probe function should call
* pci_disable_device
*/
int tpm_register_hardware(struct pci_dev *pci_dev,
int tpm_register_hardware(struct device *dev,
struct tpm_vendor_specific *entry)
{
#define DEVNAME_SIZE 7
Expand Down Expand Up @@ -563,7 +558,7 @@ int tpm_register_hardware(struct pci_dev *pci_dev,

dev_num_search_complete:
if (chip->dev_num < 0) {
dev_err(&pci_dev->dev,
dev_err(dev,
"No available tpm device numbers\n");
kfree(chip);
return -ENODEV;
Expand All @@ -576,29 +571,29 @@ int tpm_register_hardware(struct pci_dev *pci_dev,
scnprintf(devname, DEVNAME_SIZE, "%s%d", "tpm", chip->dev_num);
chip->vendor->miscdev.name = devname;

chip->vendor->miscdev.dev = &(pci_dev->dev);
chip->pci_dev = pci_dev_get(pci_dev);
chip->vendor->miscdev.dev = dev;
chip->dev = get_device(dev);

if (misc_register(&chip->vendor->miscdev)) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"unable to misc_register %s, minor %d\n",
chip->vendor->miscdev.name,
chip->vendor->miscdev.minor);
pci_dev_put(pci_dev);
put_device(dev);
kfree(chip);
dev_mask[i] &= !(1 << j);
return -ENODEV;
}

spin_lock(&driver_lock);

pci_set_drvdata(pci_dev, chip);
dev_set_drvdata(dev, chip);

list_add(&chip->list, &tpm_chip_list);

spin_unlock(&driver_lock);

sysfs_create_group(&pci_dev->dev.kobj, chip->vendor->attr_group);
sysfs_create_group(&dev->kobj, chip->vendor->attr_group);

return 0;
}
Expand Down
6 changes: 3 additions & 3 deletions trunk/drivers/char/tpm/tpm.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ struct tpm_vendor_specific {
};

struct tpm_chip {
struct pci_dev *pci_dev; /* PCI device stuff */
struct device *dev; /* Device stuff */

int dev_num; /* /dev/tpm# */
int num_opens; /* only one allowed */
Expand Down Expand Up @@ -92,13 +92,13 @@ static inline void tpm_write_index(int base, int index, int value)
outb(value & 0xFF, base+1);
}

extern int tpm_register_hardware(struct pci_dev *,
extern int tpm_register_hardware(struct device *,
struct tpm_vendor_specific *);
extern int tpm_open(struct inode *, struct file *);
extern int tpm_release(struct inode *, struct file *);
extern ssize_t tpm_write(struct file *, const char __user *, size_t,
loff_t *);
extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *);
extern void __devexit tpm_remove(struct pci_dev *);
extern void tpm_remove_hardware(struct device *);
extern int tpm_pm_suspend(struct pci_dev *, pm_message_t);
extern int tpm_pm_resume(struct pci_dev *);
26 changes: 17 additions & 9 deletions trunk/drivers/char/tpm/tpm_atmel.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
for (i = 0; i < 6; i++) {
status = inb(chip->vendor->base + 1);
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"error reading header\n");
return -EIO;
}
Expand All @@ -66,12 +66,12 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
size = be32_to_cpu(*native_size);

if (count < size) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"Recv size(%d) less than available space\n", size);
for (; i < size; i++) { /* clear the waiting data anyway */
status = inb(chip->vendor->base + 1);
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"error reading data\n");
return -EIO;
}
Expand All @@ -83,7 +83,7 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
for (; i < size; i++) {
status = inb(chip->vendor->base + 1);
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
dev_err(&chip->pci_dev->dev,
dev_err(chip->dev,
"error reading data\n");
return -EIO;
}
Expand All @@ -93,7 +93,7 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 * buf, size_t count)
/* make sure data available is gone */
status = inb(chip->vendor->base + 1);
if (status & ATML_STATUS_DATA_AVAIL) {
dev_err(&chip->pci_dev->dev, "data available is stuck\n");
dev_err(chip->dev, "data available is stuck\n");
return -EIO;
}

Expand All @@ -104,9 +104,9 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 * buf, size_t count)
{
int i;

dev_dbg(&chip->pci_dev->dev, "tpm_atml_send: ");
dev_dbg(chip->dev, "tpm_atml_send:\n");
for (i = 0; i < count; i++) {
dev_dbg(&chip->pci_dev->dev, "0x%x(%d) ", buf[i], buf[i]);
dev_dbg(chip->dev, "%d 0x%x(%d)\n", i, buf[i], buf[i]);
outb(buf[i], chip->vendor->base);
}

Expand Down Expand Up @@ -193,7 +193,7 @@ static int __devinit tpm_atml_init(struct pci_dev *pci_dev,
goto out_err;
}

if ((rc = tpm_register_hardware(pci_dev, &tpm_atmel)) < 0)
if ((rc = tpm_register_hardware(&pci_dev->dev, &tpm_atmel)) < 0)
goto out_err;

dev_info(&pci_dev->dev,
Expand All @@ -206,6 +206,14 @@ static int __devinit tpm_atml_init(struct pci_dev *pci_dev,
return rc;
}

static void __devexit tpm_atml_remove(struct pci_dev *pci_dev)
{
struct tpm_chip *chip = pci_get_drvdata(pci_dev);

if ( chip )
tpm_remove_hardware(chip->dev);
}

static struct pci_device_id tpm_pci_tbl[] __devinitdata = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12)},
Expand All @@ -226,7 +234,7 @@ static struct pci_driver atmel_pci_driver = {
.name = "tpm_atmel",
.id_table = tpm_pci_tbl,
.probe = tpm_atml_init,
.remove = __devexit_p(tpm_remove),
.remove = __devexit_p(tpm_atml_remove),
.suspend = tpm_pm_suspend,
.resume = tpm_pm_resume,
};
Expand Down
Loading

0 comments on commit f40d801

Please sign in to comment.