Lines Matching defs:usb_mid

46 #include <sys/usb/usb_mid/usb_midvar.h>
205 static void usb_mid_create_children(usb_mid_t *usb_mid);
206 static int usb_mid_cleanup(dev_info_t *dip, usb_mid_t *usb_mid);
237 rval = ddi_soft_state_init(&usb_mid_statep, sizeof (struct usb_mid),
280 usb_mid_t *usb_mid;
287 if ((usb_mid = ddi_get_soft_state(usb_mid_statep,
289 *result = (void *)usb_mid->mi_dip;
314 usb_mid_post_attach(usb_mid_t *usb_mid, uint8_t ifno, struct attachspec *as)
316 USB_DPRINTF_L2(DPRINT_MASK_PM, usb_mid->mi_log_handle,
328 mutex_enter(&usb_mid->mi_mutex);
329 usb_mid->mi_attach_count++;
330 mutex_exit(&usb_mid->mi_mutex);
336 usb_mid_post_detach(usb_mid_t *usb_mid, uint8_t ifno, struct detachspec *ds)
338 USB_DPRINTF_L2(DPRINT_MASK_PM, usb_mid->mi_log_handle,
347 usba_get_usba_device(usb_mid->mi_dip);
349 mutex_enter(&usb_mid->mi_mutex);
353 (--usb_mid->mi_attach_count == 0) && usba_device &&
354 (usb_mid->mi_ugen_open_count == 0)) {
357 mutex_exit(&usb_mid->mi_mutex);
376 usb_mid_t *usb_mid;
380 usb_mid = usb_mid_obtain_state(dip);
382 USB_DPRINTF_L2(DPRINT_MASK_PM, usb_mid->mi_log_handle,
394 USB_DPRINTF_L2(DPRINT_MASK_PM, usb_mid->mi_log_handle,
398 usb_mid_post_attach(usb_mid, usba_get_ifno(rdip),
410 USB_DPRINTF_L2(DPRINT_MASK_PM, usb_mid->mi_log_handle,
414 usb_mid_post_detach(usb_mid, usba_get_ifno(rdip),
437 usb_mid_t *usb_mid = usb_mid_obtain_state(dip);
439 USB_DPRINTF_L2(DPRINT_MASK_ALL, usb_mid->mi_log_handle,
449 mutex_enter(&usb_mid->mi_mutex);
450 usb_mid_create_children(usb_mid);
451 mutex_exit(&usb_mid->mi_mutex);
464 usb_mid_t *usb_mid = usb_mid_obtain_state(dip);
470 USB_DPRINTF_L4(DPRINT_MASK_ALL, usb_mid->mi_log_handle,
495 mutex_enter(&usb_mid->mi_mutex);
496 for (interface = 0; usb_mid->mi_children_dips &&
497 (interface < usb_mid->mi_n_ifs) &&
498 (usb_mid->mi_children_ifs[interface]); interface++) {
499 mdip = usb_mid->mi_children_dips[interface];
507 usb_mid->mi_children_dips[interface] = NULL;
516 mutex_exit(&usb_mid->mi_mutex);
520 USB_DPRINTF_L4(DPRINT_MASK_ALL, usb_mid->mi_log_handle,
532 usb_mid_t *usb_mid;
536 usb_mid = usb_mid_obtain_state(dip);
538 USB_DPRINTF_L4(DPRINT_MASK_PM, usb_mid->mi_log_handle,
539 "usb_mid_power: Begin: usb_mid = %p, level = %d",
540 (void *)usb_mid, level);
542 mutex_enter(&usb_mid->mi_mutex);
543 midpm = usb_mid->mi_pm;
547 USB_DPRINTF_L2(DPRINT_MASK_PM, usb_mid->mi_log_handle,
551 mutex_exit(&usb_mid->mi_mutex);
557 &(usb_mid->mi_dev_state), level);
559 mutex_exit(&usb_mid->mi_mutex);
572 usb_mid_t *usb_mid = NULL;
581 usb_mid = (usb_mid_t *)ddi_get_soft_state(usb_mid_statep,
583 (void) usb_mid_restore_device_state(dip, usb_mid);
585 if (usb_mid->mi_ugen_hdl) {
586 (void) usb_ugen_attach(usb_mid->mi_ugen_hdl,
605 usb_mid = ddi_get_soft_state(usb_mid_statep, instance);
606 if (usb_mid == NULL) {
612 usb_mid->mi_log_handle = usb_alloc_log_hdl(dip, "mid",
617 usb_mid->mi_usba_device = usba_get_usba_device(dip);
618 usb_mid->mi_dip = dip;
619 usb_mid->mi_instance = instance;
620 usb_mid->mi_n_ifs = usb_mid->mi_usba_device->usb_n_ifs;
624 USB_DPRINTF_L2(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
628 if (usb_get_dev_data(dip, &usb_mid->mi_dev_data, USB_PARSE_LVL_NONE,
630 USB_DPRINTF_L2(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
635 mutex_init(&usb_mid->mi_mutex, NULL, MUTEX_DRIVER,
636 usb_mid->mi_dev_data->dev_iblock_cookie);
638 usb_free_dev_data(dip, usb_mid->mi_dev_data);
639 usb_mid->mi_dev_data = NULL;
641 usb_mid->mi_init_state |= USB_MID_LOCK_INIT;
643 if (ddi_create_minor_node(dip, "usb_mid", S_IFCHR,
646 USB_DPRINTF_L2(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
651 usb_mid->mi_init_state |= USB_MID_MINOR_NODE_CREATED;
656 n_ifs = usb_mid->mi_n_ifs;
657 usb_mid->mi_cd_list_length = size = (sizeof (dev_info_t *)) * n_ifs;
659 usb_mid->mi_children_dips = kmem_zalloc(size, KM_SLEEP);
660 usb_mid->mi_child_events = kmem_zalloc(sizeof (uint8_t) * n_ifs,
662 usb_mid->mi_children_ifs = kmem_zalloc(sizeof (uint_t) * n_ifs,
665 usb_mid->mi_children_ifs[i] = 1;
672 (void) ndi_event_alloc_hdl(dip, 0, &usb_mid->mi_ndi_event_hdl,
676 if (ndi_event_bind_set(usb_mid->mi_ndi_event_hdl, &usb_mid_ndi_events,
678 USB_DPRINTF_L2(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
684 usb_mid->mi_dev_state = USB_DEV_ONLINE;
690 usb_mid_create_pm_components(dip, usb_mid);
693 usba_common_register_events(usb_mid->mi_dip, 1, usb_mid_event_cb);
695 usb_mid->mi_init_state |= USB_MID_EVENTS_REGISTERED;
702 USB_DPRINTF_L2(DPRINT_MASK_ATTA, NULL, "usb_mid%d cannot attach",
705 if (usb_mid) {
706 (void) usb_mid_cleanup(dip, usb_mid);
717 usb_mid_t *usb_mid = usb_mid_obtain_state(dip);
719 USB_DPRINTF_L4(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
725 return (usb_mid_cleanup(dip, usb_mid));
728 mutex_enter(&usb_mid->mi_mutex);
729 usb_mid->mi_dev_state = USB_DEV_SUSPENDED;
730 mutex_exit(&usb_mid->mi_mutex);
732 if (usb_mid->mi_ugen_hdl) {
733 int rval = usb_ugen_detach(usb_mid->mi_ugen_hdl,
751 * cleanup usb_mid and deallocate. this function is called for
757 usb_mid_cleanup(dev_info_t *dip, usb_mid_t *usb_mid)
762 USB_DPRINTF_L4(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
765 if ((usb_mid->mi_init_state & USB_MID_LOCK_INIT) == 0) {
774 if (usb_mid->mi_ndi_event_hdl &&
775 (ndi_event_free_hdl(usb_mid->mi_ndi_event_hdl) != NDI_SUCCESS)) {
777 USB_DPRINTF_L2(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
791 if (usb_mid->mi_init_state & USB_MID_EVENTS_REGISTERED) {
792 usba_common_unregister_events(usb_mid->mi_dip, 1);
795 midpm = usb_mid->mi_pm;
797 mutex_enter(&usb_mid->mi_mutex);
799 if ((midpm) && (usb_mid->mi_dev_state != USB_DEV_DISCONNECTED)) {
801 mutex_exit(&usb_mid->mi_mutex);
814 usb_mid->mi_log_handle,
820 (void) pm_lower_power(usb_mid->mi_dip, 0, USB_DEV_OS_PWR_OFF);
823 mutex_exit(&usb_mid->mi_mutex);
831 if (usb_mid->mi_children_dips) {
832 kmem_free(usb_mid->mi_children_dips,
833 usb_mid->mi_cd_list_length);
836 if (usb_mid->mi_child_events) {
837 kmem_free(usb_mid->mi_child_events, sizeof (uint8_t) *
838 usb_mid->mi_n_ifs);
841 if (usb_mid->mi_children_ifs) {
842 kmem_free(usb_mid->mi_children_ifs, sizeof (uint_t) *
843 usb_mid->mi_n_ifs);
846 if (usb_mid->mi_init_state & USB_MID_MINOR_NODE_CREATED) {
850 mutex_destroy(&usb_mid->mi_mutex);
853 usb_client_detach(dip, usb_mid->mi_dev_data);
855 if (usb_mid->mi_ugen_hdl) {
856 (void) usb_ugen_detach(usb_mid->mi_ugen_hdl, DDI_DETACH);
857 usb_ugen_release_hdl(usb_mid->mi_ugen_hdl);
860 usb_free_log_hdl(usb_mid->mi_log_handle);
870 usb_mid_ugen_attach(usb_mid_t *usb_mid, boolean_t remove_children)
874 if (usb_mid->mi_ugen_hdl == NULL) {
879 USB_DPRINTF_L4(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
891 mutex_exit(&usb_mid->mi_mutex);
892 hdl = usb_ugen_get_hdl(usb_mid->mi_dip,
896 USB_DPRINTF_L4(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
900 mutex_enter(&usb_mid->mi_mutex);
902 mutex_enter(&usb_mid->mi_mutex);
903 usb_mid->mi_ugen_hdl = hdl;
917 usb_mid_create_children(usb_mid_t *usb_mid)
926 usba_device = usba_get_usba_device(usb_mid->mi_dip);
928 USB_DPRINTF_L4(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
932 if (usb_mid->mi_removed_children) {
937 n_ifs = usb_mid->mi_n_ifs;
940 USB_DPRINTF_L4(DPRINT_MASK_ATTA, usb_mid->mi_log_handle,
949 if (usb_mid->mi_children_ifs[i] == 0) {
954 if (usb_mid->mi_children_dips[i] != NULL) {
956 usb_mid->mi_children_dips[i]) >=
964 mutex_exit(&usb_mid->mi_mutex);
965 ia_dip = usba_ready_interface_association_node(usb_mid->mi_dip,
981 mutex_enter(&usb_mid->mi_mutex);
982 usb_mid->mi_children_dips[i] = ia_dip;
983 usb_mid->mi_children_ifs[i] = if_count;
985 usb_mid->mi_children_ifs[j] = 0;
991 cdip = usba_ready_interface_node(usb_mid->mi_dip, i);
1006 mutex_enter(&usb_mid->mi_mutex);
1007 usb_mid->mi_children_dips[i] = cdip;
1008 usb_mid->mi_children_ifs[i] = 1;
1009 mutex_exit(&usb_mid->mi_mutex);
1013 mutex_enter(&usb_mid->mi_mutex);
1016 usb_mid->mi_removed_children = (bound_children ? B_FALSE : B_TRUE);
1023 if ((ugen_bound == 0) && (usb_mid->mi_ugen_hdl == NULL)) {
1029 if ((usb_mid->mi_removed_children == B_FALSE) &&
1032 usb_mid->mi_log_handle,
1037 usb_mid_ugen_attach(usb_mid,
1038 usb_mid->mi_removed_children);
1051 usb_mid_t *usb_mid = usb_mid_obtain_state(dip);
1053 USB_DPRINTF_L3(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1056 USB_DPRINTF_L3(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1062 return (ndi_event_retrieve_cookie(usb_mid->mi_ndi_event_hdl,
1076 usb_mid_t *usb_mid = usb_mid_obtain_state(dip);
1079 USB_DPRINTF_L3(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1083 USB_DPRINTF_L3(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1087 ndi_event_cookie_to_name(usb_mid->mi_ndi_event_hdl, cookie));
1090 switch (ndi_event_cookie_to_tag(usb_mid->mi_ndi_event_hdl, cookie)) {
1092 mutex_enter(&usb_mid->mi_mutex);
1093 usb_mid->mi_child_events[ifno] |=
1095 mutex_exit(&usb_mid->mi_mutex);
1099 mutex_enter(&usb_mid->mi_mutex);
1100 usb_mid->mi_child_events[ifno] |=
1102 mutex_exit(&usb_mid->mi_mutex);
1110 return (ndi_event_add_callback(usb_mid->mi_ndi_event_hdl,
1118 usb_mid_t *usb_mid = usb_mid_obtain_state(dip);
1123 USB_DPRINTF_L3(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1127 USB_DPRINTF_L3(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1132 ndi_event_cookie_to_name(usb_mid->mi_ndi_event_hdl,
1136 return (ndi_event_remove_callback(usb_mid->mi_ndi_event_hdl, cb_id));
1146 usb_mid_t *usb_mid = usb_mid_obtain_state(dip);
1148 USB_DPRINTF_L3(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1152 USB_DPRINTF_L3(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1156 ndi_event_cookie_to_name(usb_mid->mi_ndi_event_hdl, cookie));
1159 return (ndi_event_run_callbacks(usb_mid->mi_ndi_event_hdl, rdip,
1169 usb_mid_restore_device_state(dev_info_t *dip, usb_mid_t *usb_mid)
1173 USB_DPRINTF_L4(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1174 "usb_mid_restore_device_state: usb_mid = %p", (void *)usb_mid);
1176 mutex_enter(&usb_mid->mi_mutex);
1177 midpm = usb_mid->mi_pm;
1178 mutex_exit(&usb_mid->mi_mutex);
1184 if (usb_check_same_device(dip, usb_mid->mi_log_handle, USB_LOG_L0,
1188 mutex_enter(&usb_mid->mi_mutex);
1189 usb_mid->mi_dev_state = USB_DEV_DISCONNECTED;
1190 mutex_exit(&usb_mid->mi_mutex);
1201 (void) usb_handle_remote_wakeup(usb_mid->mi_dip,
1205 mutex_enter(&usb_mid->mi_mutex);
1206 usb_mid->mi_dev_state = USB_DEV_ONLINE;
1207 mutex_exit(&usb_mid->mi_mutex);
1224 usb_mid_t *usb_mid = usb_mid_obtain_state(dip);
1228 USB_DPRINTF_L4(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1232 USB_DPRINTF_L4(DPRINT_MASK_EVENTS, usb_mid->mi_log_handle,
1235 ndi_event_cookie_to_name(usb_mid->mi_ndi_event_hdl, cookie));
1239 usb_mid->mi_ndi_event_hdl, USBA_EVENT_TAG_HOT_REMOVAL);
1241 usb_mid->mi_ndi_event_hdl, USBA_EVENT_TAG_PRE_SUSPEND);
1243 usb_mid->mi_ndi_event_hdl, USBA_EVENT_TAG_HOT_INSERTION);
1245 usb_mid->mi_ndi_event_hdl, USBA_EVENT_TAG_POST_RESUME);
1247 mutex_enter(&usb_mid->mi_mutex);
1250 if (usb_mid->mi_dev_state == USB_DEV_DISCONNECTED) {
1252 usb_mid->mi_log_handle,
1256 usb_mid->mi_dev_state = USB_DEV_DISCONNECTED;
1257 for (i = 0; i < usb_mid->mi_n_ifs; i++) {
1258 usb_mid->mi_child_events[i] &= ~
1261 mutex_exit(&usb_mid->mi_mutex);
1265 usb_mid->mi_ndi_event_hdl, NULL,
1268 if (usb_mid->mi_ugen_hdl) {
1270 usb_mid->mi_ugen_hdl);
1272 mutex_enter(&usb_mid->mi_mutex);
1277 mutex_exit(&usb_mid->mi_mutex);
1280 (void) ndi_event_run_callbacks(usb_mid->mi_ndi_event_hdl,
1283 mutex_enter(&usb_mid->mi_mutex);
1284 for (i = 0; i < usb_mid->mi_n_ifs; i++) {
1285 usb_mid->mi_child_events[i] &= ~
1290 mutex_exit(&usb_mid->mi_mutex);
1291 if (usb_mid_restore_device_state(dip, usb_mid) == USB_SUCCESS) {
1297 mutex_enter(&usb_mid->mi_mutex);
1298 for (i = 0; i < usb_mid->mi_n_ifs; i++) {
1299 if ((usb_mid->mi_child_events[i] &
1301 usb_mid->mi_children_ifs[i]) {
1302 usb_mid->mi_child_events[i] &=
1305 usb_mid->mi_children_dips[i];
1306 mutex_exit(&usb_mid->mi_mutex);
1310 usb_mid->mi_ndi_event_hdl,
1314 mutex_enter(&usb_mid->mi_mutex);
1317 mutex_exit(&usb_mid->mi_mutex);
1321 usb_mid->mi_ndi_event_hdl, NULL,
1324 if (usb_mid->mi_ugen_hdl) {
1326 usb_mid->mi_ugen_hdl);
1329 mutex_enter(&usb_mid->mi_mutex);
1336 for (i = 0; i < usb_mid->mi_n_ifs; i++) {
1337 if ((usb_mid->mi_child_events[i] &
1339 usb_mid->mi_children_ifs[i]) {
1340 usb_mid->mi_child_events[i] &=
1342 child_dip = usb_mid->mi_children_dips[i];
1343 mutex_exit(&usb_mid->mi_mutex);
1347 usb_mid->mi_ndi_event_hdl,
1350 mutex_enter(&usb_mid->mi_mutex);
1353 mutex_exit(&usb_mid->mi_mutex);
1356 (void) ndi_event_run_callbacks(usb_mid->mi_ndi_event_hdl,
1359 mutex_enter(&usb_mid->mi_mutex);
1362 mutex_exit(&usb_mid->mi_mutex);
1371 usb_mid_create_pm_components(dev_info_t *dip, usb_mid_t *usb_mid)
1376 USB_DPRINTF_L4(DPRINT_MASK_PM, usb_mid->mi_log_handle,
1382 mutex_enter(&usb_mid->mi_mutex);
1383 usb_mid->mi_pm = midpm;
1384 midpm->uc_usb_statep = usb_mid;
1387 mutex_exit(&usb_mid->mi_mutex);
1391 * "strict parental dependency" meaning, usb_mid won't
1399 * wakes up, usb_mid will wake up
1402 * the interfaces wakes up and usb_mid wakes up
1406 * In this case usb_mid should also go to sleep shortly
1414 USB_DPRINTF_L3(DPRINT_MASK_PM, usb_mid->mi_log_handle,
1426 USB_DPRINTF_L4(DPRINT_MASK_PM, usb_mid->mi_log_handle,
1453 struct usb_mid *usb_mid;
1456 if ((usb_mid = ddi_get_soft_state(usb_mid_statep,
1462 USB_DPRINTF_L4(DPRINT_MASK_CBOPS, usb_mid->mi_log_handle,
1463 "usb_mid_open: usb_mid = 0x%p *devp = 0x%lx",
1464 (void *)usb_mid, *devp);
1467 (void) pm_busy_component(usb_mid->mi_dip, 0);
1468 (void) pm_raise_power(usb_mid->mi_dip, 0, USB_DEV_OS_FULL_PWR);
1471 rval = usb_ugen_open(usb_mid->mi_ugen_hdl, devp, flags, otyp,
1474 (void) pm_idle_component(usb_mid->mi_dip, 0);
1480 mutex_enter(&usb_mid->mi_mutex);
1481 usb_mid->mi_ugen_open_count++;
1482 mutex_exit(&usb_mid->mi_mutex);
1493 struct usb_mid *usb_mid;
1496 if ((usb_mid = ddi_get_soft_state(usb_mid_statep,
1502 rval = usb_ugen_close(usb_mid->mi_ugen_hdl, dev, flag, otyp,
1505 (void) pm_idle_component(usb_mid->mi_dip, 0);
1506 mutex_enter(&usb_mid->mi_mutex);
1507 usb_mid->mi_ugen_open_count--;
1508 mutex_exit(&usb_mid->mi_mutex);
1518 struct usb_mid *usb_mid;
1520 if ((usb_mid = ddi_get_soft_state(usb_mid_statep,
1526 return (usb_ugen_read(usb_mid->mi_ugen_hdl, dev, uio, credp));
1533 struct usb_mid *usb_mid;
1535 if ((usb_mid = ddi_get_soft_state(usb_mid_statep,
1541 return (usb_ugen_write(usb_mid->mi_ugen_hdl, dev, uio, credp));
1549 struct usb_mid *usb_mid;
1551 if ((usb_mid = ddi_get_soft_state(usb_mid_statep,
1557 return (usb_ugen_poll(usb_mid->mi_ugen_hdl, dev, events,