|
@@ -489,29 +489,19 @@ ssize_t tpm_read(struct file * file, char __user * buf,
|
|
|
size_t size, loff_t * off)
|
|
|
{
|
|
|
struct tpm_chip *chip = file->private_data;
|
|
|
- int ret_size = -ENODATA;
|
|
|
+ int ret_size;
|
|
|
|
|
|
- if (atomic_read(&chip->data_pending) != 0) { /* Result available */
|
|
|
- down(&chip->timer_manipulation_mutex);
|
|
|
- del_singleshot_timer_sync(&chip->user_read_timer);
|
|
|
- up(&chip->timer_manipulation_mutex);
|
|
|
+ del_singleshot_timer_sync(&chip->user_read_timer);
|
|
|
+ ret_size = atomic_read(&chip->data_pending);
|
|
|
+ atomic_set(&chip->data_pending, 0);
|
|
|
+ if (ret_size > 0) { /* relay data */
|
|
|
+ if (size < ret_size)
|
|
|
+ ret_size = size;
|
|
|
|
|
|
down(&chip->buffer_mutex);
|
|
|
-
|
|
|
- ret_size = atomic_read(&chip->data_pending);
|
|
|
- atomic_set(&chip->data_pending, 0);
|
|
|
-
|
|
|
- if (ret_size == 0) /* timeout just occurred */
|
|
|
- ret_size = -ETIME;
|
|
|
- else if (ret_size > 0) { /* relay data */
|
|
|
- if (size < ret_size)
|
|
|
- ret_size = size;
|
|
|
-
|
|
|
- if (copy_to_user((void __user *) buf,
|
|
|
- chip->data_buffer, ret_size)) {
|
|
|
- ret_size = -EFAULT;
|
|
|
- }
|
|
|
- }
|
|
|
+ if (copy_to_user
|
|
|
+ ((void __user *) buf, chip->data_buffer, ret_size))
|
|
|
+ ret_size = -EFAULT;
|
|
|
up(&chip->buffer_mutex);
|
|
|
}
|
|
|
|