Lines Matching refs:vio
146 virtio_get8(virtio_t *vio, uintptr_t offset) in virtio_get8() argument
148 return (ddi_get8(vio->vio_barh, (uint8_t *)(vio->vio_bar + offset))); in virtio_get8()
152 virtio_get16(virtio_t *vio, uintptr_t offset) in virtio_get16() argument
154 return (ddi_get16(vio->vio_barh, (uint16_t *)(vio->vio_bar + offset))); in virtio_get16()
158 virtio_get32(virtio_t *vio, uintptr_t offset) in virtio_get32() argument
160 return (ddi_get32(vio->vio_barh, (uint32_t *)(vio->vio_bar + offset))); in virtio_get32()
164 virtio_put8(virtio_t *vio, uintptr_t offset, uint8_t value) in virtio_put8() argument
166 ddi_put8(vio->vio_barh, (uint8_t *)(vio->vio_bar + offset), value); in virtio_put8()
170 virtio_put16(virtio_t *vio, uintptr_t offset, uint16_t value) in virtio_put16() argument
172 ddi_put16(vio->vio_barh, (uint16_t *)(vio->vio_bar + offset), value); in virtio_put16()
176 virtio_put32(virtio_t *vio, uintptr_t offset, uint32_t value) in virtio_put32() argument
178 ddi_put32(vio->vio_barh, (uint32_t *)(vio->vio_bar + offset), value); in virtio_put32()
182 virtio_fini(virtio_t *vio, boolean_t failed) in virtio_fini() argument
184 mutex_enter(&vio->vio_mutex); in virtio_fini()
186 virtio_interrupts_teardown(vio); in virtio_fini()
189 while ((viq = list_remove_head(&vio->vio_queues)) != NULL) { in virtio_fini()
192 list_destroy(&vio->vio_queues); in virtio_fini()
198 virtio_set_status_locked(vio, VIRTIO_STATUS_FAILED); in virtio_fini()
200 virtio_device_reset_locked(vio); in virtio_fini()
207 vio->vio_initlevel &= ~VIRTIO_INITLEVEL_PROVIDER; in virtio_fini()
209 if (vio->vio_initlevel & VIRTIO_INITLEVEL_REGS) { in virtio_fini()
213 ddi_regs_map_free(&vio->vio_barh); in virtio_fini()
215 vio->vio_initlevel &= ~VIRTIO_INITLEVEL_REGS; in virtio_fini()
221 vio->vio_initlevel &= ~VIRTIO_INITLEVEL_SHUTDOWN; in virtio_fini()
222 VERIFY0(vio->vio_initlevel); in virtio_fini()
224 mutex_exit(&vio->vio_mutex); in virtio_fini()
225 mutex_destroy(&vio->vio_mutex); in virtio_fini()
227 kmem_free(vio, sizeof (*vio)); in virtio_fini()
267 virtio_t *vio = kmem_zalloc(sizeof (*vio), KM_SLEEP); in virtio_init() local
268 vio->vio_dip = dip; in virtio_init()
274 (caddr_t *)&vio->vio_bar, 0, 0, &virtio_acc_attr, in virtio_init()
275 &vio->vio_barh)) != DDI_SUCCESS) { in virtio_init()
277 kmem_free(vio, sizeof (*vio)); in virtio_init()
280 vio->vio_initlevel |= VIRTIO_INITLEVEL_REGS; in virtio_init()
290 mutex_init(&vio->vio_mutex, NULL, MUTEX_DRIVER, NULL); in virtio_init()
292 list_create(&vio->vio_queues, sizeof (virtio_queue_t), in virtio_init()
299 virtio_device_reset(vio); in virtio_init()
300 virtio_set_status(vio, VIRTIO_STATUS_ACKNOWLEDGE); in virtio_init()
301 virtio_set_status(vio, VIRTIO_STATUS_DRIVER); in virtio_init()
307 vio->vio_features_device = virtio_get32(vio, in virtio_init()
312 vio->vio_features = vio->vio_features_device & driver_features; in virtio_init()
313 virtio_put32(vio, VIRTIO_LEGACY_FEATURES_DRIVER, vio->vio_features); in virtio_init()
321 vio->vio_config_offset = VIRTIO_LEGACY_CFG_OFFSET; in virtio_init()
323 return (vio); in virtio_init()
334 virtio_register_cfgchange_handler(virtio_t *vio, ddi_intr_handler_t *func, in virtio_register_cfgchange_handler() argument
337 VERIFY(!(vio->vio_initlevel & VIRTIO_INITLEVEL_INT_ADDED)); in virtio_register_cfgchange_handler()
338 VERIFY(!vio->vio_cfgchange_handler_added); in virtio_register_cfgchange_handler()
340 mutex_enter(&vio->vio_mutex); in virtio_register_cfgchange_handler()
341 vio->vio_cfgchange_handler = func; in virtio_register_cfgchange_handler()
342 vio->vio_cfgchange_handlerarg = funcarg; in virtio_register_cfgchange_handler()
343 mutex_exit(&vio->vio_mutex); in virtio_register_cfgchange_handler()
353 virtio_init_complete(virtio_t *vio, int allowed_interrupt_types) in virtio_init_complete() argument
355 VERIFY(!(vio->vio_initlevel & VIRTIO_INITLEVEL_PROVIDER)); in virtio_init_complete()
356 vio->vio_initlevel |= VIRTIO_INITLEVEL_PROVIDER; in virtio_init_complete()
358 if (!list_is_empty(&vio->vio_queues) || in virtio_init_complete()
359 vio->vio_cfgchange_handler != NULL) { in virtio_init_complete()
363 if (virtio_interrupts_setup(vio, allowed_interrupt_types) != in virtio_init_complete()
372 mutex_destroy(&vio->vio_mutex); in virtio_init_complete()
373 mutex_init(&vio->vio_mutex, NULL, MUTEX_DRIVER, virtio_intr_pri(vio)); in virtio_init_complete()
374 for (virtio_queue_t *viq = list_head(&vio->vio_queues); viq != NULL; in virtio_init_complete()
375 viq = list_next(&vio->vio_queues, viq)) { in virtio_init_complete()
378 virtio_intr_pri(vio)); in virtio_init_complete()
381 virtio_set_status(vio, VIRTIO_STATUS_DRIVER_OK); in virtio_init_complete()
387 virtio_feature_present(virtio_t *vio, uint64_t feature_mask) in virtio_feature_present() argument
389 return ((vio->vio_features & feature_mask) != 0); in virtio_feature_present()
393 virtio_intr_pri(virtio_t *vio) in virtio_intr_pri() argument
395 VERIFY(vio->vio_initlevel & VIRTIO_INITLEVEL_INT_ADDED); in virtio_intr_pri()
397 return (DDI_INTR_PRI(vio->vio_interrupt_priority)); in virtio_intr_pri()
406 virtio_set_status_locked(virtio_t *vio, uint8_t status) in virtio_set_status_locked() argument
409 VERIFY(MUTEX_HELD(&vio->vio_mutex)); in virtio_set_status_locked()
411 uint8_t old = virtio_get8(vio, VIRTIO_LEGACY_DEVICE_STATUS); in virtio_set_status_locked()
412 virtio_put8(vio, VIRTIO_LEGACY_DEVICE_STATUS, status | old); in virtio_set_status_locked()
416 virtio_set_status(virtio_t *vio, uint8_t status) in virtio_set_status() argument
418 mutex_enter(&vio->vio_mutex); in virtio_set_status()
419 virtio_set_status_locked(vio, status); in virtio_set_status()
420 mutex_exit(&vio->vio_mutex); in virtio_set_status()
424 virtio_device_reset_locked(virtio_t *vio) in virtio_device_reset_locked() argument
426 VERIFY(MUTEX_HELD(&vio->vio_mutex)); in virtio_device_reset_locked()
427 virtio_put8(vio, VIRTIO_LEGACY_DEVICE_STATUS, VIRTIO_STATUS_RESET); in virtio_device_reset_locked()
431 virtio_device_reset(virtio_t *vio) in virtio_device_reset() argument
433 mutex_enter(&vio->vio_mutex); in virtio_device_reset()
434 virtio_device_reset_locked(vio); in virtio_device_reset()
435 mutex_exit(&vio->vio_mutex); in virtio_device_reset()
447 virtio_shutdown(virtio_t *vio) in virtio_shutdown() argument
449 mutex_enter(&vio->vio_mutex); in virtio_shutdown()
450 if (vio->vio_initlevel & VIRTIO_INITLEVEL_SHUTDOWN) { in virtio_shutdown()
454 mutex_exit(&vio->vio_mutex); in virtio_shutdown()
462 for (virtio_queue_t *viq = list_head(&vio->vio_queues); viq != NULL; in virtio_shutdown()
463 viq = list_next(&vio->vio_queues, viq)) { in virtio_shutdown()
473 virtio_device_reset_locked(vio); in virtio_shutdown()
474 vio->vio_initlevel |= VIRTIO_INITLEVEL_SHUTDOWN; in virtio_shutdown()
475 mutex_exit(&vio->vio_mutex); in virtio_shutdown()
482 virtio_quiesce(virtio_t *vio) in virtio_quiesce() argument
484 if (vio->vio_initlevel & VIRTIO_INITLEVEL_SHUTDOWN) { in virtio_quiesce()
496 virtio_device_reset_locked(vio); in virtio_quiesce()
509 virtio_dev_get8(virtio_t *vio, uintptr_t offset) in virtio_dev_get8() argument
511 mutex_enter(&vio->vio_mutex); in virtio_dev_get8()
512 uint8_t r = virtio_get8(vio, vio->vio_config_offset + offset); in virtio_dev_get8()
513 mutex_exit(&vio->vio_mutex); in virtio_dev_get8()
519 virtio_dev_get16(virtio_t *vio, uintptr_t offset) in virtio_dev_get16() argument
521 mutex_enter(&vio->vio_mutex); in virtio_dev_get16()
522 uint16_t r = virtio_get16(vio, vio->vio_config_offset + offset); in virtio_dev_get16()
523 mutex_exit(&vio->vio_mutex); in virtio_dev_get16()
529 virtio_dev_get32(virtio_t *vio, uintptr_t offset) in virtio_dev_get32() argument
531 mutex_enter(&vio->vio_mutex); in virtio_dev_get32()
532 uint32_t r = virtio_get32(vio, vio->vio_config_offset + offset); in virtio_dev_get32()
533 mutex_exit(&vio->vio_mutex); in virtio_dev_get32()
539 virtio_dev_get64(virtio_t *vio, uintptr_t offset) in virtio_dev_get64() argument
541 mutex_enter(&vio->vio_mutex); in virtio_dev_get64()
549 uintptr_t o_lo = vio->vio_config_offset + offset; in virtio_dev_get64()
552 uint64_t val = virtio_get32(vio, o_lo) | in virtio_dev_get64()
553 ((uint64_t)virtio_get32(vio, o_hi) << 32); in virtio_dev_get64()
556 uint64_t tval = virtio_get32(vio, o_lo) | in virtio_dev_get64()
557 ((uint64_t)virtio_get32(vio, o_hi) << 32); in virtio_dev_get64()
566 mutex_exit(&vio->vio_mutex); in virtio_dev_get64()
571 virtio_dev_put8(virtio_t *vio, uintptr_t offset, uint8_t value) in virtio_dev_put8() argument
573 mutex_enter(&vio->vio_mutex); in virtio_dev_put8()
574 virtio_put8(vio, vio->vio_config_offset + offset, value); in virtio_dev_put8()
575 mutex_exit(&vio->vio_mutex); in virtio_dev_put8()
579 virtio_dev_put16(virtio_t *vio, uintptr_t offset, uint16_t value) in virtio_dev_put16() argument
581 mutex_enter(&vio->vio_mutex); in virtio_dev_put16()
582 virtio_put16(vio, vio->vio_config_offset + offset, value); in virtio_dev_put16()
583 mutex_exit(&vio->vio_mutex); in virtio_dev_put16()
587 virtio_dev_put32(virtio_t *vio, uintptr_t offset, uint32_t value) in virtio_dev_put32() argument
589 mutex_enter(&vio->vio_mutex); in virtio_dev_put32()
590 virtio_put32(vio, vio->vio_config_offset + offset, value); in virtio_dev_put32()
591 mutex_exit(&vio->vio_mutex); in virtio_dev_put32()
614 virtio_queue_alloc(virtio_t *vio, uint16_t qidx, const char *name, in virtio_queue_alloc() argument
626 dev_err(vio->vio_dip, CE_WARN, "queue \"%s\" (%u) " in virtio_queue_alloc()
631 mutex_enter(&vio->vio_mutex); in virtio_queue_alloc()
633 if (vio->vio_initlevel & VIRTIO_INITLEVEL_PROVIDER) { in virtio_queue_alloc()
638 dev_err(vio->vio_dip, CE_WARN, "queue \"%s\" (%u) " in virtio_queue_alloc()
640 mutex_exit(&vio->vio_mutex); in virtio_queue_alloc()
648 virtio_put16(vio, VIRTIO_LEGACY_QUEUE_SELECT, qidx); in virtio_queue_alloc()
649 if ((qsz = virtio_get16(vio, VIRTIO_LEGACY_QUEUE_SIZE)) == 0) { in virtio_queue_alloc()
654 dev_err(vio->vio_dip, CE_WARN, "queue \"%s\" (%u) " in virtio_queue_alloc()
656 mutex_exit(&vio->vio_mutex); in virtio_queue_alloc()
660 mutex_exit(&vio->vio_mutex); in virtio_queue_alloc()
663 viq->viq_virtio = vio; in virtio_queue_alloc()
680 if (virtio_feature_present(vio, VIRTIO_F_RING_INDIRECT_DESC) && in virtio_queue_alloc()
695 ddi_get_name(vio->vio_dip), ddi_get_instance(vio->vio_dip), name); in virtio_queue_alloc()
697 dev_err(vio->vio_dip, CE_WARN, "could not allocate descriptor " in virtio_queue_alloc()
716 if (virtio_dma_init(vio, &viq->viq_dma, sz_driver + sz_device, in virtio_queue_alloc()
719 dev_err(vio->vio_dip, CE_WARN, "could not allocate queue " in virtio_queue_alloc()
739 mutex_enter(&vio->vio_mutex); in virtio_queue_alloc()
740 for (virtio_queue_t *chkvq = list_head(&vio->vio_queues); chkvq != NULL; in virtio_queue_alloc()
741 chkvq = list_next(&vio->vio_queues, chkvq)) { in virtio_queue_alloc()
743 dev_err(vio->vio_dip, CE_WARN, "attempt to register " in virtio_queue_alloc()
746 mutex_exit(&vio->vio_mutex); in virtio_queue_alloc()
751 list_insert_tail(&vio->vio_queues, viq); in virtio_queue_alloc()
760 virtio_put16(vio, VIRTIO_LEGACY_QUEUE_SELECT, qidx); in virtio_queue_alloc()
761 virtio_put32(vio, VIRTIO_LEGACY_QUEUE_ADDRESS, in virtio_queue_alloc()
764 mutex_exit(&vio->vio_mutex); in virtio_queue_alloc()
771 virtio_t *vio = viq->viq_virtio; in virtio_queue_free() local
777 VERIFY(!(vio->vio_initlevel & VIRTIO_INITLEVEL_INT_ADDED)); in virtio_queue_free()
786 virtio_put16(vio, VIRTIO_LEGACY_QUEUE_SELECT, viq->viq_index); in virtio_queue_free()
787 virtio_put32(vio, VIRTIO_LEGACY_QUEUE_ADDRESS, 0); in virtio_queue_free()
914 virtio_t *vio = viq->viq_virtio; in virtio_queue_evacuate() local
916 mutex_enter(&vio->vio_mutex); in virtio_queue_evacuate()
917 if (!(vio->vio_initlevel & VIRTIO_INITLEVEL_SHUTDOWN)) { in virtio_queue_evacuate()
918 dev_err(vio->vio_dip, CE_PANIC, in virtio_queue_evacuate()
921 mutex_exit(&vio->vio_mutex); in virtio_queue_evacuate()
959 virtio_t *vio = viq->viq_virtio; in virtio_chain_alloc() local
996 if (virtio_dma_init(vio, &vic->vic_indirect_dma, in virtio_chain_alloc()
1309 virtio_interrupts_alloc(virtio_t *vio, int type, int nrequired) in virtio_interrupts_alloc() argument
1311 dev_info_t *dip = vio->vio_dip; in virtio_interrupts_alloc()
1315 VERIFY(MUTEX_HELD(&vio->vio_mutex)); in virtio_interrupts_alloc()
1316 VERIFY(!(vio->vio_initlevel & VIRTIO_INITLEVEL_INT_ALLOC)); in virtio_interrupts_alloc()
1341 VERIFY3P(vio->vio_interrupts, ==, NULL); in virtio_interrupts_alloc()
1342 vio->vio_interrupts = kmem_zalloc( in virtio_interrupts_alloc()
1346 if ((r = ddi_intr_alloc(dip, vio->vio_interrupts, type, 0, nrequired, in virtio_interrupts_alloc()
1347 &vio->vio_ninterrupts, DDI_INTR_ALLOC_STRICT)) != DDI_SUCCESS) { in virtio_interrupts_alloc()
1350 kmem_free(vio->vio_interrupts, in virtio_interrupts_alloc()
1352 vio->vio_interrupts = NULL; in virtio_interrupts_alloc()
1356 vio->vio_initlevel |= VIRTIO_INITLEVEL_INT_ALLOC; in virtio_interrupts_alloc()
1357 vio->vio_interrupt_type = type; in virtio_interrupts_alloc()
1364 virtio_t *vio = (virtio_t *)arg0; in virtio_shared_isr() local
1368 mutex_enter(&vio->vio_mutex); in virtio_shared_isr()
1374 isr = virtio_get8(vio, VIRTIO_LEGACY_ISR_STATUS); in virtio_shared_isr()
1379 for (virtio_queue_t *viq = list_head(&vio->vio_queues); in virtio_shared_isr()
1380 viq != NULL; viq = list_next(&vio->vio_queues, viq)) { in virtio_shared_isr()
1382 mutex_exit(&vio->vio_mutex); in virtio_shared_isr()
1384 mutex_enter(&vio->vio_mutex); in virtio_shared_isr()
1386 if (vio->vio_initlevel & in virtio_shared_isr()
1398 mutex_exit(&vio->vio_mutex); in virtio_shared_isr()
1407 if (vio->vio_cfgchange_handler != NULL) { in virtio_shared_isr()
1408 (void) vio->vio_cfgchange_handler( in virtio_shared_isr()
1409 (caddr_t)vio->vio_cfgchange_handlerarg, in virtio_shared_isr()
1410 (caddr_t)vio); in virtio_shared_isr()
1418 virtio_interrupts_setup(virtio_t *vio, int allow_types) in virtio_interrupts_setup() argument
1420 dev_info_t *dip = vio->vio_dip; in virtio_interrupts_setup()
1424 mutex_enter(&vio->vio_mutex); in virtio_interrupts_setup()
1430 for (virtio_queue_t *viq = list_head(&vio->vio_queues); viq != NULL; in virtio_interrupts_setup()
1431 viq = list_next(&vio->vio_queues, viq)) { in virtio_interrupts_setup()
1441 if (vio->vio_cfgchange_handler != NULL) in virtio_interrupts_setup()
1446 mutex_exit(&vio->vio_mutex); in virtio_interrupts_setup()
1465 if (virtio_interrupts_alloc(vio, DDI_INTR_TYPE_MSIX, in virtio_interrupts_setup()
1475 if (virtio_interrupts_alloc(vio, DDI_INTR_TYPE_FIXED, 1) == in virtio_interrupts_setup()
1482 mutex_exit(&vio->vio_mutex); in virtio_interrupts_setup()
1490 for (int i = 0; i < vio->vio_ninterrupts; i++) { in virtio_interrupts_setup()
1493 if (ddi_intr_get_pri(vio->vio_interrupts[i], &ipri) != in virtio_interrupts_setup()
1510 if (i == 0 || ipri > vio->vio_interrupt_priority) { in virtio_interrupts_setup()
1511 vio->vio_interrupt_priority = ipri; in virtio_interrupts_setup()
1519 if (ddi_intr_get_cap(vio->vio_interrupts[0], in virtio_interrupts_setup()
1520 &vio->vio_interrupt_cap) != DDI_SUCCESS) { in virtio_interrupts_setup()
1525 if (vio->vio_interrupt_type == DDI_INTR_TYPE_FIXED) { in virtio_interrupts_setup()
1526 VERIFY3S(vio->vio_ninterrupts, ==, 1); in virtio_interrupts_setup()
1531 if (ddi_intr_add_handler(vio->vio_interrupts[0], in virtio_interrupts_setup()
1532 virtio_shared_isr, (caddr_t)vio, NULL) != DDI_SUCCESS) { in virtio_interrupts_setup()
1535 vio->vio_interrupt_type)); in virtio_interrupts_setup()
1542 VERIFY3S(vio->vio_ninterrupts, ==, count); in virtio_interrupts_setup()
1547 if (vio->vio_cfgchange_handler != NULL) { in virtio_interrupts_setup()
1548 if (ddi_intr_add_handler(vio->vio_interrupts[n], in virtio_interrupts_setup()
1549 vio->vio_cfgchange_handler, in virtio_interrupts_setup()
1550 (caddr_t)vio->vio_cfgchange_handlerarg, in virtio_interrupts_setup()
1551 (caddr_t)vio) != DDI_SUCCESS) { in virtio_interrupts_setup()
1556 vio->vio_cfgchange_handler_added = B_TRUE; in virtio_interrupts_setup()
1557 vio->vio_cfgchange_handler_index = n; in virtio_interrupts_setup()
1561 for (virtio_queue_t *viq = list_head(&vio->vio_queues); viq != NULL; in virtio_interrupts_setup()
1562 viq = list_next(&vio->vio_queues, viq)) { in virtio_interrupts_setup()
1567 if (ddi_intr_add_handler(vio->vio_interrupts[n], in virtio_interrupts_setup()
1569 (caddr_t)vio) != DDI_SUCCESS) { in virtio_interrupts_setup()
1581 vio->vio_initlevel |= VIRTIO_INITLEVEL_INT_ADDED; in virtio_interrupts_setup()
1582 mutex_exit(&vio->vio_mutex); in virtio_interrupts_setup()
1586 virtio_interrupts_teardown(vio); in virtio_interrupts_setup()
1587 mutex_exit(&vio->vio_mutex); in virtio_interrupts_setup()
1592 virtio_interrupts_teardown(virtio_t *vio) in virtio_interrupts_teardown() argument
1594 VERIFY(MUTEX_HELD(&vio->vio_mutex)); in virtio_interrupts_teardown()
1596 virtio_interrupts_disable_locked(vio); in virtio_interrupts_teardown()
1598 if (vio->vio_interrupt_type == DDI_INTR_TYPE_FIXED) { in virtio_interrupts_teardown()
1602 if (vio->vio_initlevel & VIRTIO_INITLEVEL_INT_ADDED) { in virtio_interrupts_teardown()
1605 VERIFY3S(vio->vio_ninterrupts, ==, 1); in virtio_interrupts_teardown()
1608 vio->vio_interrupts[0])) != DDI_SUCCESS) { in virtio_interrupts_teardown()
1609 dev_err(vio->vio_dip, CE_WARN, "removing " in virtio_interrupts_teardown()
1617 if (vio->vio_cfgchange_handler_added) { in virtio_interrupts_teardown()
1621 vio->vio_interrupts[0])) != DDI_SUCCESS) { in virtio_interrupts_teardown()
1622 dev_err(vio->vio_dip, CE_WARN, in virtio_interrupts_teardown()
1626 vio->vio_cfgchange_handler_added = B_FALSE; in virtio_interrupts_teardown()
1629 for (virtio_queue_t *viq = list_head(&vio->vio_queues); in virtio_interrupts_teardown()
1630 viq != NULL; viq = list_next(&vio->vio_queues, viq)) { in virtio_interrupts_teardown()
1638 vio->vio_interrupts[viq->viq_handler_index])) != in virtio_interrupts_teardown()
1640 dev_err(vio->vio_dip, CE_WARN, "removing " in virtio_interrupts_teardown()
1648 vio->vio_initlevel &= ~VIRTIO_INITLEVEL_INT_ADDED; in virtio_interrupts_teardown()
1650 if (vio->vio_initlevel & VIRTIO_INITLEVEL_INT_ALLOC) { in virtio_interrupts_teardown()
1651 for (int i = 0; i < vio->vio_ninterrupts; i++) { in virtio_interrupts_teardown()
1654 if ((r = ddi_intr_free(vio->vio_interrupts[i])) != in virtio_interrupts_teardown()
1656 dev_err(vio->vio_dip, CE_WARN, "freeing " in virtio_interrupts_teardown()
1660 kmem_free(vio->vio_interrupts, in virtio_interrupts_teardown()
1661 sizeof (ddi_intr_handle_t) * vio->vio_ninterrupts); in virtio_interrupts_teardown()
1662 vio->vio_interrupts = NULL; in virtio_interrupts_teardown()
1663 vio->vio_ninterrupts = 0; in virtio_interrupts_teardown()
1664 vio->vio_interrupt_type = 0; in virtio_interrupts_teardown()
1665 vio->vio_interrupt_cap = 0; in virtio_interrupts_teardown()
1666 vio->vio_interrupt_priority = 0; in virtio_interrupts_teardown()
1668 vio->vio_initlevel &= ~VIRTIO_INITLEVEL_INT_ALLOC; in virtio_interrupts_teardown()
1673 virtio_interrupts_unwind(virtio_t *vio) in virtio_interrupts_unwind() argument
1675 VERIFY(MUTEX_HELD(&vio->vio_mutex)); in virtio_interrupts_unwind()
1677 if (vio->vio_interrupt_type == DDI_INTR_TYPE_MSIX) { in virtio_interrupts_unwind()
1678 for (virtio_queue_t *viq = list_head(&vio->vio_queues); in virtio_interrupts_unwind()
1679 viq != NULL; viq = list_next(&vio->vio_queues, viq)) { in virtio_interrupts_unwind()
1684 virtio_put16(vio, VIRTIO_LEGACY_QUEUE_SELECT, in virtio_interrupts_unwind()
1686 virtio_put16(vio, VIRTIO_LEGACY_MSIX_QUEUE, in virtio_interrupts_unwind()
1690 if (vio->vio_cfgchange_handler_added) { in virtio_interrupts_unwind()
1691 virtio_put16(vio, VIRTIO_LEGACY_MSIX_CONFIG, in virtio_interrupts_unwind()
1696 if (vio->vio_interrupt_cap & DDI_INTR_FLAG_BLOCK) { in virtio_interrupts_unwind()
1697 (void) ddi_intr_block_disable(vio->vio_interrupts, in virtio_interrupts_unwind()
1698 vio->vio_ninterrupts); in virtio_interrupts_unwind()
1700 for (int i = 0; i < vio->vio_ninterrupts; i++) { in virtio_interrupts_unwind()
1701 (void) ddi_intr_disable(vio->vio_interrupts[i]); in virtio_interrupts_unwind()
1709 vio->vio_config_offset = VIRTIO_LEGACY_CFG_OFFSET; in virtio_interrupts_unwind()
1713 virtio_interrupts_enable(virtio_t *vio) in virtio_interrupts_enable() argument
1715 mutex_enter(&vio->vio_mutex); in virtio_interrupts_enable()
1716 if (vio->vio_initlevel & VIRTIO_INITLEVEL_INT_ENABLED) { in virtio_interrupts_enable()
1717 mutex_exit(&vio->vio_mutex); in virtio_interrupts_enable()
1722 if (vio->vio_interrupt_cap & DDI_INTR_FLAG_BLOCK) { in virtio_interrupts_enable()
1723 r = ddi_intr_block_enable(vio->vio_interrupts, in virtio_interrupts_enable()
1724 vio->vio_ninterrupts); in virtio_interrupts_enable()
1726 for (int i = 0; i < vio->vio_ninterrupts; i++) { in virtio_interrupts_enable()
1727 if ((r = ddi_intr_enable(vio->vio_interrupts[i])) != in virtio_interrupts_enable()
1735 vio->vio_interrupts[i]); in virtio_interrupts_enable()
1743 mutex_exit(&vio->vio_mutex); in virtio_interrupts_enable()
1747 if (vio->vio_interrupt_type == DDI_INTR_TYPE_MSIX) { in virtio_interrupts_enable()
1755 vio->vio_config_offset = VIRTIO_LEGACY_CFG_OFFSET_MSIX; in virtio_interrupts_enable()
1757 for (virtio_queue_t *viq = list_head(&vio->vio_queues); in virtio_interrupts_enable()
1758 viq != NULL; viq = list_next(&vio->vio_queues, viq)) { in virtio_interrupts_enable()
1770 virtio_put16(vio, VIRTIO_LEGACY_QUEUE_SELECT, qi); in virtio_interrupts_enable()
1771 virtio_put16(vio, VIRTIO_LEGACY_MSIX_QUEUE, msi); in virtio_interrupts_enable()
1779 if (virtio_get16(vio, VIRTIO_LEGACY_MSIX_QUEUE) != in virtio_interrupts_enable()
1781 dev_err(vio->vio_dip, CE_WARN, in virtio_interrupts_enable()
1786 virtio_interrupts_unwind(vio); in virtio_interrupts_enable()
1787 mutex_exit(&vio->vio_mutex); in virtio_interrupts_enable()
1792 if (vio->vio_cfgchange_handler_added) { in virtio_interrupts_enable()
1793 virtio_put16(vio, VIRTIO_LEGACY_MSIX_CONFIG, in virtio_interrupts_enable()
1794 vio->vio_cfgchange_handler_index); in virtio_interrupts_enable()
1797 if (virtio_get16(vio, VIRTIO_LEGACY_MSIX_CONFIG) != in virtio_interrupts_enable()
1798 vio->vio_cfgchange_handler_index) { in virtio_interrupts_enable()
1799 dev_err(vio->vio_dip, CE_WARN, in virtio_interrupts_enable()
1803 virtio_interrupts_unwind(vio); in virtio_interrupts_enable()
1804 mutex_exit(&vio->vio_mutex); in virtio_interrupts_enable()
1810 vio->vio_initlevel |= VIRTIO_INITLEVEL_INT_ENABLED; in virtio_interrupts_enable()
1812 mutex_exit(&vio->vio_mutex); in virtio_interrupts_enable()
1817 virtio_interrupts_disable_locked(virtio_t *vio) in virtio_interrupts_disable_locked() argument
1819 VERIFY(MUTEX_HELD(&vio->vio_mutex)); in virtio_interrupts_disable_locked()
1821 if (!(vio->vio_initlevel & VIRTIO_INITLEVEL_INT_ENABLED)) { in virtio_interrupts_disable_locked()
1825 virtio_interrupts_unwind(vio); in virtio_interrupts_disable_locked()
1827 vio->vio_initlevel &= ~VIRTIO_INITLEVEL_INT_ENABLED; in virtio_interrupts_disable_locked()
1831 virtio_interrupts_disable(virtio_t *vio) in virtio_interrupts_disable() argument
1833 mutex_enter(&vio->vio_mutex); in virtio_interrupts_disable()
1834 virtio_interrupts_disable_locked(vio); in virtio_interrupts_disable()
1835 mutex_exit(&vio->vio_mutex); in virtio_interrupts_disable()