eedev
VERIFY3P(dip, ==, eedev.eedev_dip);
mutex_enter(&eedev.eedev_mutex);
if (list_is_empty(&eedev.eedev_list)) {
mutex_exit(&eedev.eedev_mutex);
ddi_remove_minor_node(eedev.eedev_dip, NULL);
eedev.eedev_dip = NULL;
mutex_exit(&eedev.eedev_mutex);
eedev.eedev_idspace = id_space_create("eedev_minors", EEDEV_MINOR_MIN,
if (eedev.eedev_idspace == NULL) {
mutex_init(&eedev.eedev_mutex, NULL, MUTEX_DRIVER, NULL);
list_create(&eedev.eedev_list, sizeof (eedev_hdl_t),
list_create(&eedev.eedev_dips, sizeof (eedev_dip_t),
list_destroy(&eedev.eedev_dips);
list_destroy(&eedev.eedev_list);
mutex_destroy(&eedev.eedev_mutex);
id_space_destroy(eedev.eedev_idspace);
static eedev_t eedev;
VERIFY(MUTEX_HELD(&eedev.eedev_mutex));
for (eedev_dip_t *e = list_head(&eedev.eedev_dips); e != NULL;
e = list_next(&eedev.eedev_dips, e)) {
mutex_enter(&eedev.eedev_mutex);
for (eedev_hdl_t *h = list_head(&eedev.eedev_list); h != NULL;
h = list_next(&eedev.eedev_list, h)) {
mutex_exit(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_enter(&eedev.eedev_mutex);
for (eedev_hdl_t *h = list_head(&eedev.eedev_list); h != NULL;
h = list_next(&eedev.eedev_list, h)) {
mutex_exit(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
int cv = cv_wait_sig(&hdl->eh_cv, &eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_enter(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_enter(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
ddi_remove_minor_node(eedev.eedev_dip, eh->eh_name);
(void) ddi_prop_remove(eh->eh_dev, eedev.eedev_dip, "Size");
id_free(eedev.eedev_idspace, eh->eh_minor);
mutex_enter(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_enter(&eedev.eedev_mutex);
cv_wait(&hdl->eh_cv, &eedev.eedev_mutex);
(void) devfs_clean(ddi_get_parent(eedev.eedev_dip), NULL, 0);
mutex_exit(&eedev.eedev_mutex);
mutex_enter(&eedev.eedev_mutex);
list_remove(&eedev.eedev_dips, ed);
list_remove(&eedev.eedev_list, h);
mutex_exit(&eedev.eedev_mutex);
VERIFY(MUTEX_HELD(&eedev.eedev_mutex));
hdl->eh_dev = makedevice(ddi_driver_major(eedev.eedev_dip),
if (ddi_prop_update_int64(hdl->eh_dev, eedev.eedev_dip, "Size",
dev_err(eedev.eedev_dip, CE_WARN, "!failed to set Size "
if (ddi_create_minor_node(eedev.eedev_dip, hdl->eh_name,
dev_err(eedev.eedev_dip, CE_WARN, "!failed to create "
mutex_enter(&eedev.eedev_mutex);
list_insert_tail(&eedev.eedev_dips, dip);
hdl->eh_minor = id_alloc_nosleep(eedev.eedev_idspace);
for (eedev_hdl_t *h = list_head(&eedev.eedev_list); h != NULL;
h = list_next(&eedev.eedev_list, h)) {
mutex_exit(&eedev.eedev_mutex);
list_insert_tail(&eedev.eedev_list, hdl);
if (eedev.eedev_dip != NULL) {
list_remove(&eedev.eedev_list, hdl);
mutex_exit(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_enter(&eedev.eedev_mutex);
mutex_exit(&eedev.eedev_mutex);
mutex_enter(&eedev.eedev_mutex);
VERIFY3P(eedev.eedev_dip, ==, NULL);
eedev.eedev_dip = dip;
for (eedev_hdl_t *h = list_head(&eedev.eedev_list); h != NULL;
h = list_next(&eedev.eedev_list, h)) {
mutex_exit(&eedev.eedev_mutex);
VERIFY3P(eedev.eedev_dip, !=, NULL);
*outp = eedev.eedev_dip;
VERIFY3P(eedev.eedev_dip, !=, NULL);
*outp = eedev.eedev_dip;
*outp = (void *)(uintptr_t)ddi_get_instance(eedev.eedev_dip);