Lines Matching refs:vin
150 vio9p_t *vin = (vio9p_t *)arg0; in vio9p_int_handler() local
152 mutex_enter(&vin->vin_mutex); in vio9p_int_handler()
153 uint_t count = vio9p_poll(vin); in vio9p_int_handler()
154 mutex_exit(&vin->vin_mutex); in vio9p_int_handler()
160 vio9p_req_freelist_put(vio9p_t *vin, vio9p_req_t *vnr) in vio9p_req_freelist_put() argument
165 vin->vin_generation = 0; in vio9p_req_freelist_put()
166 list_insert_head(&vin->vin_req_freelist, vnr); in vio9p_req_freelist_put()
168 if (vin->vin_open) { in vio9p_req_freelist_put()
172 cv_broadcast(&vin->vin_cv); in vio9p_req_freelist_put()
177 vio9p_req_free(vio9p_t *vin, vio9p_req_t *vnr) in vio9p_req_free() argument
179 VERIFY(MUTEX_HELD(&vin->vin_mutex)); in vio9p_req_free()
182 list_remove(&vin->vin_completes, vnr); in vio9p_req_free()
185 vio9p_req_freelist_put(vin, vnr); in vio9p_req_free()
189 vio9p_req_free_impl(vio9p_t *vin, vio9p_req_t *vnr) in vio9p_req_free_impl() argument
207 list_remove(&vin->vin_reqs, vnr); in vio9p_req_free_impl()
208 VERIFY3U(vin->vin_nreqs, >, 0); in vio9p_req_free_impl()
209 vin->vin_nreqs--; in vio9p_req_free_impl()
219 vio9p_req_alloc(vio9p_t *vin, bool wait) in vio9p_req_alloc() argument
223 VERIFY(MUTEX_HELD(&vin->vin_mutex)); in vio9p_req_alloc()
229 if ((vnr = list_remove_head(&vin->vin_req_freelist)) != NULL) { in vio9p_req_alloc()
237 if ((vnr = vio9p_req_alloc_impl(vin, KM_NOSLEEP_LAZY)) != NULL) { in vio9p_req_alloc()
246 if (cv_wait_sig(&vin->vin_cv, &vin->vin_mutex) == 0) { in vio9p_req_alloc()
257 vio9p_req_alloc_impl(vio9p_t *vin, int kmflag) in vio9p_req_alloc_impl() argument
259 dev_info_t *dip = vin->vin_dip; in vio9p_req_alloc_impl()
262 if (vin->vin_nreqs >= VIRTIO_9P_MAX_REQS) { in vio9p_req_alloc_impl()
277 list_insert_tail(&vin->vin_reqs, vnr); in vio9p_req_alloc_impl()
278 vin->vin_nreqs++; in vio9p_req_alloc_impl()
280 if ((vnr->vnr_chain = virtio_chain_alloc(vin->vin_vq, kmflag)) == in vio9p_req_alloc_impl()
282 dev_err(vin->vin_dip, CE_WARN, "!chain alloc failure"); in vio9p_req_alloc_impl()
290 if ((vnr->vnr_dma_out = virtio_dma_alloc(vin->vin_virtio, in vio9p_req_alloc_impl()
311 if ((vnr->vnr_dma_in = virtio_dma_alloc(vin->vin_virtio, in vio9p_req_alloc_impl()
332 vio9p_req_free_impl(vin, vnr); in vio9p_req_alloc_impl()
337 vio9p_poll(vio9p_t *vin) in vio9p_poll() argument
343 VERIFY(MUTEX_HELD(&vin->vin_mutex)); in vio9p_poll()
345 while ((vic = virtio_queue_poll(vin->vin_vq)) != NULL) { in vio9p_poll()
352 if (!vin->vin_open || in vio9p_poll()
353 vnr->vnr_generation != vin->vin_generation) { in vio9p_poll()
359 vio9p_req_free(vin, vnr); in vio9p_poll()
363 list_insert_tail(&vin->vin_completes, vnr); in vio9p_poll()
368 cv_broadcast(&vin->vin_cv); in vio9p_poll()
396 vio9p_t *vin = ddi_get_soft_state(vio9p_state, instance); in vio9p_attach() local
397 vin->vin_dip = dip; in vio9p_attach()
398 vin->vin_virtio = vio; in vio9p_attach()
399 ddi_set_driver_private(dip, vin); in vio9p_attach()
400 list_create(&vin->vin_reqs, sizeof (vio9p_req_t), in vio9p_attach()
402 list_create(&vin->vin_completes, sizeof (vio9p_req_t), in vio9p_attach()
404 list_create(&vin->vin_req_freelist, sizeof (vio9p_req_t), in vio9p_attach()
419 vin->vin_tag[n] = virtio_dev_get8(vio, in vio9p_attach()
429 if ((vin->vin_vq = virtio_queue_alloc(vio, VIRTIO_9P_VIRTQ_REQUESTS, in vio9p_attach()
430 "requests", vio9p_int_handler, vin, B_FALSE, in vio9p_attach()
432 return (vio9p_teardown(vin, VIRTIO_9P_TEARDOWN_PRE_MUTEX)); in vio9p_attach()
437 return (vio9p_teardown(vin, VIRTIO_9P_TEARDOWN_PRE_MUTEX)); in vio9p_attach()
440 cv_init(&vin->vin_cv, NULL, CV_DRIVER, NULL); in vio9p_attach()
441 mutex_init(&vin->vin_mutex, NULL, MUTEX_DRIVER, virtio_intr_pri(vio)); in vio9p_attach()
447 if ((vnr = vio9p_req_alloc_impl(vin, KM_SLEEP)) == NULL) { in vio9p_attach()
449 return (vio9p_teardown(vin, VIRTIO_9P_TEARDOWN_ATTACH)); in vio9p_attach()
451 vio9p_req_freelist_put(vin, vnr); in vio9p_attach()
454 return (vio9p_teardown(vin, VIRTIO_9P_TEARDOWN_ATTACH)); in vio9p_attach()
464 return (vio9p_teardown(vin, VIRTIO_9P_TEARDOWN_ATTACH)); in vio9p_attach()
473 vio9p_teardown(vio9p_t *vin, vio9p_teardown_style_t style) in vio9p_teardown() argument
475 dev_info_t *dip = vin->vin_dip; in vio9p_teardown()
481 VERIFY(MUTEX_NOT_HELD(&vin->vin_mutex)); in vio9p_teardown()
486 if (vin->vin_virtio != NULL) { in vio9p_teardown()
491 virtio_interrupts_disable(vin->vin_virtio); in vio9p_teardown()
498 vio9p_req_t *vnr = list_remove_head(&vin->vin_req_freelist); in vio9p_teardown()
502 vio9p_req_free_impl(vin, vnr); in vio9p_teardown()
504 VERIFY(list_is_empty(&vin->vin_req_freelist)); in vio9p_teardown()
505 list_destroy(&vin->vin_req_freelist); in vio9p_teardown()
511 VERIFY0(vin->vin_nreqs); in vio9p_teardown()
512 VERIFY(list_is_empty(&vin->vin_reqs)); in vio9p_teardown()
513 list_destroy(&vin->vin_reqs); in vio9p_teardown()
515 VERIFY(list_is_empty(&vin->vin_completes)); in vio9p_teardown()
516 list_destroy(&vin->vin_completes); in vio9p_teardown()
521 if (vin->vin_virtio != NULL) { in vio9p_teardown()
523 virtio_fini(vin->vin_virtio, failed); in vio9p_teardown()
527 mutex_destroy(&vin->vin_mutex); in vio9p_teardown()
528 cv_destroy(&vin->vin_cv); in vio9p_teardown()
540 vio9p_t *vin = ddi_get_driver_private(dip); in vio9p_detach() local
546 mutex_enter(&vin->vin_mutex); in vio9p_detach()
551 VERIFY(!vin->vin_open); in vio9p_detach()
558 for (vio9p_req_t *vnr = list_head(&vin->vin_reqs); in vio9p_detach()
559 vnr != NULL; vnr = list_next(&vin->vin_reqs, vnr)) { in vio9p_detach()
573 virtio_shutdown(vin->vin_virtio); in vio9p_detach()
574 while ((vic = virtio_queue_evacuate(vin->vin_vq)) != NULL) { in vio9p_detach()
579 vio9p_req_free_impl(vin, vnr); in vio9p_detach()
583 mutex_exit(&vin->vin_mutex); in vio9p_detach()
585 return (vio9p_teardown(vin, VIRTIO_9P_TEARDOWN_DETACH)); in vio9p_detach()
591 vio9p_t *vin; in vio9p_quiesce() local
593 if ((vin = ddi_get_driver_private(dip)) == NULL) { in vio9p_quiesce()
597 return (virtio_quiesce(vin->vin_virtio)); in vio9p_quiesce()
616 vio9p_t *vin = ddi_get_soft_state(vio9p_state, getminor(*dev)); in vio9p_open() local
617 if (vin == NULL) { in vio9p_open()
621 mutex_enter(&vin->vin_mutex); in vio9p_open()
622 if (vin->vin_open) { in vio9p_open()
623 mutex_exit(&vin->vin_mutex); in vio9p_open()
626 vin->vin_open = true; in vio9p_open()
628 vin->vin_generation++; in vio9p_open()
629 if (vin->vin_generation == 0) { in vio9p_open()
630 vin->vin_generation++; in vio9p_open()
633 mutex_exit(&vin->vin_mutex); in vio9p_open()
644 vio9p_t *vin = ddi_get_soft_state(vio9p_state, getminor(dev)); in vio9p_close() local
645 if (vin == NULL) { in vio9p_close()
649 mutex_enter(&vin->vin_mutex); in vio9p_close()
650 if (!vin->vin_open) { in vio9p_close()
651 mutex_exit(&vin->vin_mutex); in vio9p_close()
659 while ((vnr = list_remove_head(&vin->vin_completes)) != NULL) { in vio9p_close()
660 vio9p_req_free(vin, vnr); in vio9p_close()
663 vin->vin_open = false; in vio9p_close()
664 mutex_exit(&vin->vin_mutex); in vio9p_close()
672 vio9p_t *vin = ddi_get_soft_state(vio9p_state, getminor(dev)); in vio9p_ioctl() local
673 if (vin == NULL) { in vio9p_ioctl()
679 if (ddi_copyout(vin->vin_tag, (void *)arg, in vio9p_ioctl()
680 sizeof (vin->vin_tag), mode) != 0) { in vio9p_ioctl()
695 vio9p_t *vin; in vio9p_read() local
697 if ((vin = ddi_get_soft_state(vio9p_state, getminor(dev))) == NULL) { in vio9p_read()
701 mutex_enter(&vin->vin_mutex); in vio9p_read()
703 if ((vnr = list_remove_head(&vin->vin_completes)) == NULL) { in vio9p_read()
705 mutex_exit(&vin->vin_mutex); in vio9p_read()
712 if (cv_wait_sig(&vin->vin_cv, &vin->vin_mutex) == 0) { in vio9p_read()
713 mutex_exit(&vin->vin_mutex); in vio9p_read()
736 list_insert_head(&vin->vin_completes, vnr); in vio9p_read()
737 mutex_exit(&vin->vin_mutex); in vio9p_read()
741 mutex_exit(&vin->vin_mutex); in vio9p_read()
743 mutex_enter(&vin->vin_mutex); in vio9p_read()
746 vio9p_req_free(vin, vnr); in vio9p_read()
752 list_insert_head(&vin->vin_completes, vnr); in vio9p_read()
755 mutex_exit(&vin->vin_mutex); in vio9p_read()
775 vio9p_t *vin = ddi_get_soft_state(vio9p_state, getminor(dev)); in vio9p_write() local
776 if (vin == NULL) { in vio9p_write()
780 mutex_enter(&vin->vin_mutex); in vio9p_write()
781 vio9p_req_t *vnr = vio9p_req_alloc(vin, blocking); in vio9p_write()
783 mutex_exit(&vin->vin_mutex); in vio9p_write()
786 vnr->vnr_generation = vin->vin_generation; in vio9p_write()
789 mutex_exit(&vin->vin_mutex); in vio9p_write()
792 mutex_enter(&vin->vin_mutex); in vio9p_write()
798 vio9p_req_free(vin, vnr); in vio9p_write()
801 mutex_exit(&vin->vin_mutex); in vio9p_write()