From: Kylene Hall Fix the timer to be inited and modified properly. This work depends on the fixing of the msleep stuff which in patch 1 of this set. Signed-of-by: Kylene Hall Signed-off-by: Andrew Morton --- drivers/char/tpm/tpm.c | 24 ++++++------------------ drivers/char/tpm/tpm.h | 2 -- 2 files changed, 6 insertions(+), 20 deletions(-) diff -puN drivers/char/tpm/tpm.c~fix-tpm-driver-how-timer-is-initialized drivers/char/tpm/tpm.c --- 25/drivers/char/tpm/tpm.c~fix-tpm-driver-how-timer-is-initialized 2005-05-09 18:21:24.000000000 -0700 +++ 25-akpm/drivers/char/tpm/tpm.c 2005-05-09 18:21:24.000000000 -0700 @@ -434,16 +434,7 @@ int tpm_release(struct inode *inode, str spin_lock(&driver_lock); chip->num_opens--; - spin_unlock(&driver_lock); - - down(&chip->timer_manipulation_mutex); - if (timer_pending(&chip->user_read_timer)) - del_singleshot_timer_sync(&chip->user_read_timer); - else if (timer_pending(&chip->device_timer)) - del_singleshot_timer_sync(&chip->device_timer); - up(&chip->timer_manipulation_mutex); - - kfree(chip->data_buffer); + del_singleshot_timer_sync(&chip->user_read_timer); atomic_set(&chip->data_pending, 0); pci_dev_put(chip->pci_dev); @@ -481,13 +472,7 @@ ssize_t tpm_write(struct file * file, co up(&chip->buffer_mutex); /* Set a timeout by which the reader must come claim the result */ - down(&chip->timer_manipulation_mutex); - init_timer(&chip->user_read_timer); - chip->user_read_timer.function = user_reader_timeout; - chip->user_read_timer.data = (unsigned long) chip; - chip->user_read_timer.expires = jiffies + (60 * HZ); - add_timer(&chip->user_read_timer); - up(&chip->timer_manipulation_mutex); + mod_timer(&chip->user_read_timer, jiffies + (60 * HZ)); return in_size; } @@ -617,9 +602,12 @@ int tpm_register_hardware(struct pci_dev init_MUTEX(&chip->buffer_mutex); init_MUTEX(&chip->tpm_mutex); - init_MUTEX(&chip->timer_manipulation_mutex); INIT_LIST_HEAD(&chip->list); + init_timer(&chip->user_read_timer); + chip->user_read_timer.function = user_reader_timeout; + chip->user_read_timer.data = (unsigned long) chip; + chip->vendor = entry; chip->dev_num = -1; diff -puN drivers/char/tpm/tpm.h~fix-tpm-driver-how-timer-is-initialized drivers/char/tpm/tpm.h --- 25/drivers/char/tpm/tpm.h~fix-tpm-driver-how-timer-is-initialized 2005-05-09 18:21:24.000000000 -0700 +++ 25-akpm/drivers/char/tpm/tpm.h 2005-05-09 18:21:24.000000000 -0700 @@ -63,8 +63,6 @@ struct tpm_chip { struct timer_list user_read_timer; /* user needs to claim result */ struct semaphore tpm_mutex; /* tpm is processing */ - struct timer_list device_timer; /* tpm is processing */ - struct semaphore timer_manipulation_mutex; struct tpm_vendor_specific *vendor; _