int usba10_usb_check_same_device( dev_info_t *dip, usb_log_handle_t log_handle, int log_level, int log_mask, uint_t check_mask, char *device_string) { return (usb_check_same_device( dip, log_handle, log_level, log_mask, check_mask, device_string)); }
/* * wusb_df_restore_device_state: * Called during hotplug-reconnect and resume. * reenable power management * Verify the device is the same as before the disconnect/suspend. * Restore device state * Thaw any IO which was frozen. * Quiesce device. (Other routines will activate if thawed IO.) * Set device online. * Leave device disconnected if there are problems. */ static void wusb_df_restore_device_state(dev_info_t *dip, wusb_df_state_t *wusb_dfp) { USB_DPRINTF_L2(PRINT_MASK_PM, wusb_dfp->wusb_df_log_hdl, "wusb_df_restore_device_state: enter"); ASSERT(mutex_owned(&wusb_dfp->wusb_df_mutex)); ASSERT((wusb_dfp->wusb_df_dev_state == USB_DEV_DISCONNECTED) || (wusb_dfp->wusb_df_dev_state == USB_DEV_SUSPENDED)); mutex_exit(&wusb_dfp->wusb_df_mutex); /* Check if we are talking to the same device */ if (usb_check_same_device(dip, wusb_dfp->wusb_df_log_hdl, USB_LOG_L0, PRINT_MASK_ALL, USB_CHK_ALL, NULL) != USB_SUCCESS) { /* change the device state from suspended to disconnected */ mutex_enter(&wusb_dfp->wusb_df_mutex); wusb_dfp->wusb_df_dev_state = USB_DEV_SUSPENDED; USB_DPRINTF_L2(PRINT_MASK_PM, wusb_dfp->wusb_df_log_hdl, "wusb_df_restore_device_state: check same device failed"); return; } mutex_enter(&wusb_dfp->wusb_df_mutex); wusb_dfp->wusb_df_dev_state = USB_DEV_ONLINE; if (wusb_dfp->wusb_df_pm && wusb_dfp->wusb_df_pm->wusb_df_wakeup_enabled) { /* Failure here means device disappeared again. */ mutex_exit(&wusb_dfp->wusb_df_mutex); if (usb_handle_remote_wakeup(dip, USB_REMOTE_WAKEUP_ENABLE) != USB_SUCCESS) { USB_DPRINTF_L2(PRINT_MASK_PM, wusb_dfp->wusb_df_log_hdl, "device may or may not be accessible. " "Please verify reconnection"); } mutex_enter(&wusb_dfp->wusb_df_mutex); } USB_DPRINTF_L4(PRINT_MASK_PM, wusb_dfp->wusb_df_log_hdl, "wusb_df_restore_device_state: end"); }
/* * restore device state after CPR resume or reconnect */ static int uftdi_restore_device_state(uftdi_state_t *uf) { int state; mutex_enter(&uf->uf_lock); state = uf->uf_dev_state; mutex_exit(&uf->uf_lock); if (state != USB_DEV_DISCONNECTED && state != USB_DEV_SUSPENDED) return (state); if (usb_check_same_device(uf->uf_dip, uf->uf_lh, USB_LOG_L0, DPRINT_MASK_ALL, USB_CHK_ALL, NULL) != USB_SUCCESS) { mutex_enter(&uf->uf_lock); state = uf->uf_dev_state = USB_DEV_DISCONNECTED; mutex_exit(&uf->uf_lock); return (state); } if (state == USB_DEV_DISCONNECTED) { USB_DPRINTF_L0(DPRINT_HOTPLUG, uf->uf_lh, "Device has been reconnected but data may have been lost"); } if (uftdi_reconnect_pipes(uf) != USB_SUCCESS) return (state); /* * init device state */ mutex_enter(&uf->uf_lock); state = uf->uf_dev_state = USB_DEV_ONLINE; mutex_exit(&uf->uf_lock); if ((uftdi_restore_port_state(uf) != USB_SUCCESS)) { USB_DPRINTF_L2(DPRINT_HOTPLUG, uf->uf_lh, "uftdi_restore_device_state: failed"); } return (state); }