Commit d081d470 authored by Matthias Kaehlcke's avatar Matthias Kaehlcke Committed by Linus Torvalds

use mutex instead of semaphore in TPM driver

The TPM driver uses two semaphores as mutexes.  Use the mutex API instead of
the (binary) semaphores.
Signed-off-by: default avatarMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
Cc: Kylene Hall <kjhall@us.ibm.com>
Cc: Marcel Selhorst <tpm@selhorst.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 69f545ea
...@@ -24,7 +24,9 @@ ...@@ -24,7 +24,9 @@
*/ */
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/mutex.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include "tpm.h" #include "tpm.h"
enum tpm_const { enum tpm_const {
...@@ -328,10 +330,10 @@ static void timeout_work(struct work_struct *work) ...@@ -328,10 +330,10 @@ static void timeout_work(struct work_struct *work)
{ {
struct tpm_chip *chip = container_of(work, struct tpm_chip, work); struct tpm_chip *chip = container_of(work, struct tpm_chip, work);
down(&chip->buffer_mutex); mutex_lock(&chip->buffer_mutex);
atomic_set(&chip->data_pending, 0); atomic_set(&chip->data_pending, 0);
memset(chip->data_buffer, 0, TPM_BUFSIZE); memset(chip->data_buffer, 0, TPM_BUFSIZE);
up(&chip->buffer_mutex); mutex_unlock(&chip->buffer_mutex);
} }
/* /*
...@@ -380,7 +382,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf, ...@@ -380,7 +382,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
return -E2BIG; return -E2BIG;
} }
down(&chip->tpm_mutex); mutex_lock(&chip->tpm_mutex);
if ((rc = chip->vendor.send(chip, (u8 *) buf, count)) < 0) { if ((rc = chip->vendor.send(chip, (u8 *) buf, count)) < 0) {
dev_err(chip->dev, dev_err(chip->dev,
...@@ -419,7 +421,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf, ...@@ -419,7 +421,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
dev_err(chip->dev, dev_err(chip->dev,
"tpm_transmit: tpm_recv: error %zd\n", rc); "tpm_transmit: tpm_recv: error %zd\n", rc);
out: out:
up(&chip->tpm_mutex); mutex_unlock(&chip->tpm_mutex);
return rc; return rc;
} }
...@@ -966,14 +968,14 @@ ssize_t tpm_write(struct file *file, const char __user *buf, ...@@ -966,14 +968,14 @@ ssize_t tpm_write(struct file *file, const char __user *buf,
while (atomic_read(&chip->data_pending) != 0) while (atomic_read(&chip->data_pending) != 0)
msleep(TPM_TIMEOUT); msleep(TPM_TIMEOUT);
down(&chip->buffer_mutex); mutex_lock(&chip->buffer_mutex);
if (in_size > TPM_BUFSIZE) if (in_size > TPM_BUFSIZE)
in_size = TPM_BUFSIZE; in_size = TPM_BUFSIZE;
if (copy_from_user if (copy_from_user
(chip->data_buffer, (void __user *) buf, in_size)) { (chip->data_buffer, (void __user *) buf, in_size)) {
up(&chip->buffer_mutex); mutex_unlock(&chip->buffer_mutex);
return -EFAULT; return -EFAULT;
} }
...@@ -981,7 +983,7 @@ ssize_t tpm_write(struct file *file, const char __user *buf, ...@@ -981,7 +983,7 @@ ssize_t tpm_write(struct file *file, const char __user *buf,
out_size = tpm_transmit(chip, chip->data_buffer, TPM_BUFSIZE); out_size = tpm_transmit(chip, chip->data_buffer, TPM_BUFSIZE);
atomic_set(&chip->data_pending, out_size); atomic_set(&chip->data_pending, out_size);
up(&chip->buffer_mutex); mutex_unlock(&chip->buffer_mutex);
/* Set a timeout by which the reader must come claim the result */ /* Set a timeout by which the reader must come claim the result */
mod_timer(&chip->user_read_timer, jiffies + (60 * HZ)); mod_timer(&chip->user_read_timer, jiffies + (60 * HZ));
...@@ -1004,10 +1006,10 @@ ssize_t tpm_read(struct file *file, char __user *buf, ...@@ -1004,10 +1006,10 @@ ssize_t tpm_read(struct file *file, char __user *buf,
if (size < ret_size) if (size < ret_size)
ret_size = size; ret_size = size;
down(&chip->buffer_mutex); mutex_lock(&chip->buffer_mutex);
if (copy_to_user(buf, chip->data_buffer, ret_size)) if (copy_to_user(buf, chip->data_buffer, ret_size))
ret_size = -EFAULT; ret_size = -EFAULT;
up(&chip->buffer_mutex); mutex_unlock(&chip->buffer_mutex);
} }
return ret_size; return ret_size;
...@@ -1105,8 +1107,8 @@ struct tpm_chip *tpm_register_hardware(struct device *dev, const struct tpm_vend ...@@ -1105,8 +1107,8 @@ struct tpm_chip *tpm_register_hardware(struct device *dev, const struct tpm_vend
return NULL; return NULL;
} }
init_MUTEX(&chip->buffer_mutex); mutex_init(&chip->buffer_mutex);
init_MUTEX(&chip->tpm_mutex); mutex_init(&chip->tpm_mutex);
INIT_LIST_HEAD(&chip->list); INIT_LIST_HEAD(&chip->list);
INIT_WORK(&chip->work, timeout_work); INIT_WORK(&chip->work, timeout_work);
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/mutex.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -94,11 +95,11 @@ struct tpm_chip { ...@@ -94,11 +95,11 @@ struct tpm_chip {
/* Data passed to and from the tpm via the read/write calls */ /* Data passed to and from the tpm via the read/write calls */
u8 *data_buffer; u8 *data_buffer;
atomic_t data_pending; atomic_t data_pending;
struct semaphore buffer_mutex; struct mutex buffer_mutex;
struct timer_list user_read_timer; /* user needs to claim result */ struct timer_list user_read_timer; /* user needs to claim result */
struct work_struct work; struct work_struct work;
struct semaphore tpm_mutex; /* tpm is processing */ struct mutex tpm_mutex; /* tpm is processing */
struct tpm_vendor_specific vendor; struct tpm_vendor_specific vendor;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment