Lines Matching refs:proxy_dev
28 struct proxy_dev { struct
55 static void vtpm_proxy_delete_device(struct proxy_dev *proxy_dev); argument
75 struct proxy_dev *proxy_dev = filp->private_data; in vtpm_proxy_fops_read() local
79 sig = wait_event_interruptible(proxy_dev->wq, in vtpm_proxy_fops_read()
80 proxy_dev->req_len != 0 || in vtpm_proxy_fops_read()
81 !(proxy_dev->state & STATE_OPENED_FLAG)); in vtpm_proxy_fops_read()
85 mutex_lock(&proxy_dev->buf_lock); in vtpm_proxy_fops_read()
87 if (!(proxy_dev->state & STATE_OPENED_FLAG)) { in vtpm_proxy_fops_read()
88 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_fops_read()
92 len = proxy_dev->req_len; in vtpm_proxy_fops_read()
94 if (count < len || len > sizeof(proxy_dev->buffer)) { in vtpm_proxy_fops_read()
95 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_fops_read()
101 rc = copy_to_user(buf, proxy_dev->buffer, len); in vtpm_proxy_fops_read()
102 memset(proxy_dev->buffer, 0, len); in vtpm_proxy_fops_read()
103 proxy_dev->req_len = 0; in vtpm_proxy_fops_read()
106 proxy_dev->state |= STATE_WAIT_RESPONSE_FLAG; in vtpm_proxy_fops_read()
108 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_fops_read()
130 struct proxy_dev *proxy_dev = filp->private_data; in vtpm_proxy_fops_write() local
132 mutex_lock(&proxy_dev->buf_lock); in vtpm_proxy_fops_write()
134 if (!(proxy_dev->state & STATE_OPENED_FLAG)) { in vtpm_proxy_fops_write()
135 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_fops_write()
139 if (count > sizeof(proxy_dev->buffer) || in vtpm_proxy_fops_write()
140 !(proxy_dev->state & STATE_WAIT_RESPONSE_FLAG)) { in vtpm_proxy_fops_write()
141 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_fops_write()
145 proxy_dev->state &= ~STATE_WAIT_RESPONSE_FLAG; in vtpm_proxy_fops_write()
147 proxy_dev->req_len = 0; in vtpm_proxy_fops_write()
149 if (copy_from_user(proxy_dev->buffer, buf, count)) { in vtpm_proxy_fops_write()
150 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_fops_write()
154 proxy_dev->resp_len = count; in vtpm_proxy_fops_write()
156 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_fops_write()
158 wake_up_interruptible(&proxy_dev->wq); in vtpm_proxy_fops_write()
173 struct proxy_dev *proxy_dev = filp->private_data; in vtpm_proxy_fops_poll() local
176 poll_wait(filp, &proxy_dev->wq, wait); in vtpm_proxy_fops_poll()
180 mutex_lock(&proxy_dev->buf_lock); in vtpm_proxy_fops_poll()
182 if (proxy_dev->req_len) in vtpm_proxy_fops_poll()
185 if (!(proxy_dev->state & STATE_OPENED_FLAG)) in vtpm_proxy_fops_poll()
188 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_fops_poll()
202 struct proxy_dev *proxy_dev = filp->private_data; in vtpm_proxy_fops_open() local
204 proxy_dev->state |= STATE_OPENED_FLAG; in vtpm_proxy_fops_open()
213 static void vtpm_proxy_fops_undo_open(struct proxy_dev *proxy_dev) in vtpm_proxy_fops_undo_open() argument
215 mutex_lock(&proxy_dev->buf_lock); in vtpm_proxy_fops_undo_open()
217 proxy_dev->state &= ~STATE_OPENED_FLAG; in vtpm_proxy_fops_undo_open()
219 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_fops_undo_open()
222 wake_up_interruptible(&proxy_dev->wq); in vtpm_proxy_fops_undo_open()
235 struct proxy_dev *proxy_dev = filp->private_data; in vtpm_proxy_fops_release() local
239 vtpm_proxy_delete_device(proxy_dev); in vtpm_proxy_fops_release()
268 struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev); in vtpm_proxy_tpm_op_recv() local
272 mutex_lock(&proxy_dev->buf_lock); in vtpm_proxy_tpm_op_recv()
274 if (!(proxy_dev->state & STATE_OPENED_FLAG)) { in vtpm_proxy_tpm_op_recv()
275 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_tpm_op_recv()
279 len = proxy_dev->resp_len; in vtpm_proxy_tpm_op_recv()
288 memcpy(buf, proxy_dev->buffer, len); in vtpm_proxy_tpm_op_recv()
289 proxy_dev->resp_len = 0; in vtpm_proxy_tpm_op_recv()
292 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_tpm_op_recv()
333 struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev); in vtpm_proxy_tpm_op_send() local
335 if (count > sizeof(proxy_dev->buffer)) { in vtpm_proxy_tpm_op_send()
338 count, sizeof(proxy_dev->buffer)); in vtpm_proxy_tpm_op_send()
342 if (!(proxy_dev->state & STATE_DRIVER_COMMAND) && in vtpm_proxy_tpm_op_send()
346 mutex_lock(&proxy_dev->buf_lock); in vtpm_proxy_tpm_op_send()
348 if (!(proxy_dev->state & STATE_OPENED_FLAG)) { in vtpm_proxy_tpm_op_send()
349 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_tpm_op_send()
353 proxy_dev->resp_len = 0; in vtpm_proxy_tpm_op_send()
355 proxy_dev->req_len = count; in vtpm_proxy_tpm_op_send()
356 memcpy(proxy_dev->buffer, buf, count); in vtpm_proxy_tpm_op_send()
358 proxy_dev->state &= ~STATE_WAIT_RESPONSE_FLAG; in vtpm_proxy_tpm_op_send()
360 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_tpm_op_send()
362 wake_up_interruptible(&proxy_dev->wq); in vtpm_proxy_tpm_op_send()
374 struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev); in vtpm_proxy_tpm_op_status() local
376 if (proxy_dev->resp_len) in vtpm_proxy_tpm_op_status()
384 struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev); in vtpm_proxy_tpm_req_canceled() local
387 mutex_lock(&proxy_dev->buf_lock); in vtpm_proxy_tpm_req_canceled()
389 ret = !(proxy_dev->state & STATE_OPENED_FLAG); in vtpm_proxy_tpm_req_canceled()
391 mutex_unlock(&proxy_dev->buf_lock); in vtpm_proxy_tpm_req_canceled()
401 struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev); in vtpm_proxy_request_locality() local
413 proxy_dev->state |= STATE_DRIVER_COMMAND; in vtpm_proxy_request_locality()
417 proxy_dev->state &= ~STATE_DRIVER_COMMAND; in vtpm_proxy_request_locality()
454 struct proxy_dev *proxy_dev = container_of(work, struct proxy_dev, in vtpm_proxy_work() local
458 rc = tpm_chip_register(proxy_dev->chip); in vtpm_proxy_work()
460 vtpm_proxy_fops_undo_open(proxy_dev); in vtpm_proxy_work()
462 proxy_dev->state |= STATE_REGISTERED_FLAG; in vtpm_proxy_work()
471 static void vtpm_proxy_work_stop(struct proxy_dev *proxy_dev) in vtpm_proxy_work_stop() argument
473 vtpm_proxy_fops_undo_open(proxy_dev); in vtpm_proxy_work_stop()
474 flush_work(&proxy_dev->work); in vtpm_proxy_work_stop()
480 static inline void vtpm_proxy_work_start(struct proxy_dev *proxy_dev) in vtpm_proxy_work_start() argument
482 queue_work(workqueue, &proxy_dev->work); in vtpm_proxy_work_start()
488 static struct proxy_dev *vtpm_proxy_create_proxy_dev(void) in vtpm_proxy_create_proxy_dev()
490 struct proxy_dev *proxy_dev; in vtpm_proxy_create_proxy_dev() local
494 proxy_dev = kzalloc(sizeof(*proxy_dev), GFP_KERNEL); in vtpm_proxy_create_proxy_dev()
495 if (proxy_dev == NULL) in vtpm_proxy_create_proxy_dev()
498 init_waitqueue_head(&proxy_dev->wq); in vtpm_proxy_create_proxy_dev()
499 mutex_init(&proxy_dev->buf_lock); in vtpm_proxy_create_proxy_dev()
500 INIT_WORK(&proxy_dev->work, vtpm_proxy_work); in vtpm_proxy_create_proxy_dev()
507 dev_set_drvdata(&chip->dev, proxy_dev); in vtpm_proxy_create_proxy_dev()
509 proxy_dev->chip = chip; in vtpm_proxy_create_proxy_dev()
511 return proxy_dev; in vtpm_proxy_create_proxy_dev()
514 kfree(proxy_dev); in vtpm_proxy_create_proxy_dev()
522 static inline void vtpm_proxy_delete_proxy_dev(struct proxy_dev *proxy_dev) in vtpm_proxy_delete_proxy_dev() argument
524 put_device(&proxy_dev->chip->dev); /* frees chip */ in vtpm_proxy_delete_proxy_dev()
525 kfree(proxy_dev); in vtpm_proxy_delete_proxy_dev()
537 struct proxy_dev *proxy_dev; in vtpm_proxy_create_device() local
544 proxy_dev = vtpm_proxy_create_proxy_dev(); in vtpm_proxy_create_device()
545 if (IS_ERR(proxy_dev)) in vtpm_proxy_create_device()
546 return ERR_CAST(proxy_dev); in vtpm_proxy_create_device()
548 proxy_dev->flags = vtpm_new_dev->flags; in vtpm_proxy_create_device()
557 file = anon_inode_getfile("[vtpms]", &vtpm_proxy_fops, proxy_dev, in vtpm_proxy_create_device()
568 if (proxy_dev->flags & VTPM_PROXY_FLAG_TPM2) in vtpm_proxy_create_device()
569 proxy_dev->chip->flags |= TPM_CHIP_FLAG_TPM2; in vtpm_proxy_create_device()
571 vtpm_proxy_work_start(proxy_dev); in vtpm_proxy_create_device()
574 vtpm_new_dev->major = MAJOR(proxy_dev->chip->dev.devt); in vtpm_proxy_create_device()
575 vtpm_new_dev->minor = MINOR(proxy_dev->chip->dev.devt); in vtpm_proxy_create_device()
576 vtpm_new_dev->tpm_num = proxy_dev->chip->dev_num; in vtpm_proxy_create_device()
584 vtpm_proxy_delete_proxy_dev(proxy_dev); in vtpm_proxy_create_device()
592 static void vtpm_proxy_delete_device(struct proxy_dev *proxy_dev) in vtpm_proxy_delete_device() argument
594 vtpm_proxy_work_stop(proxy_dev); in vtpm_proxy_delete_device()
601 vtpm_proxy_fops_undo_open(proxy_dev); in vtpm_proxy_delete_device()
603 if (proxy_dev->state & STATE_REGISTERED_FLAG) in vtpm_proxy_delete_device()
604 tpm_chip_unregister(proxy_dev->chip); in vtpm_proxy_delete_device()
606 vtpm_proxy_delete_proxy_dev(proxy_dev); in vtpm_proxy_delete_device()