示例#1
0
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));
}
示例#2
0
/*
 * 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");

}
示例#3
0
/*
 * 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);
}