diff options
| author | Andrew Thompson <thompsa@FreeBSD.org> | 2009-04-25 21:10:06 +0000 | 
|---|---|---|
| committer | Andrew Thompson <thompsa@FreeBSD.org> | 2009-04-25 21:10:06 +0000 | 
| commit | bd21677868b80d655792c711cf1f21dcf8c24052 (patch) | |
| tree | 6204fa982868a9530323799ccff1606ec998c2ba /sys/dev/usb/usb_device.c | |
| parent | d73b356abc7726add53ec08ecf53d30cf51de2e1 (diff) | |
Notes
Diffstat (limited to 'sys/dev/usb/usb_device.c')
| -rw-r--r-- | sys/dev/usb/usb_device.c | 41 | 
1 files changed, 36 insertions, 5 deletions
diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c index 56dc7ae2cb89..2cd55e259c74 100644 --- a/sys/dev/usb/usb_device.c +++ b/sys/dev/usb/usb_device.c @@ -457,6 +457,8 @@ usb2_set_config_index(struct usb2_device *udev, uint8_t index)  		 * the current config number and index.  		 */  		err = usb2_req_set_config(udev, NULL, USB_UNCONFIG_NO); +		if (udev->state == USB_STATE_CONFIGURED) +			usb2_set_device_state(udev, USB_STATE_ADDRESSED);  		goto done;  	}  	/* get the full config descriptor */ @@ -524,6 +526,7 @@ usb2_set_config_index(struct usb2_device *udev, uint8_t index)  	udev->power = power;  	udev->curr_config_no = cdp->bConfigurationValue;  	udev->curr_config_index = index; +	usb2_set_device_state(udev, USB_STATE_CONFIGURED);  	/* Set the actual configuration value. */  	err = usb2_req_set_config(udev, NULL, cdp->bConfigurationValue); @@ -980,7 +983,7 @@ usb2_detach_device_sub(struct usb2_device *udev, device_t *ppdev,  		    udev->port_no, udev->address);  		if (device_is_attached(dev)) { -			if (udev->flags.suspended) { +			if (udev->state == USB_STATE_SUSPENDED) {  				err = DEVICE_RESUME(dev);  				if (err) {  					device_printf(dev, "Resume failed!\n"); @@ -1120,7 +1123,7 @@ usb2_probe_and_attach_sub(struct usb2_device *udev,  		uaa->temp_dev = NULL;  		device_set_ivars(iface->subdev, NULL); -		if (udev->flags.suspended) { +		if (udev->state == USB_STATE_SUSPENDED) {  			err = DEVICE_SUSPEND(iface->subdev);  			if (err)  				device_printf(iface->subdev, "Suspend failed\n"); @@ -1341,12 +1344,12 @@ usb2_suspend_resume(struct usb2_device *udev, uint8_t do_suspend)  	USB_BUS_LOCK(udev->bus);  	/* filter the suspend events */ -	if (udev->flags.suspended == do_suspend) { +	if ((udev->state == USB_STATE_SUSPENDED && do_suspend) || +	    (udev->state != USB_STATE_SUSPENDED && !do_suspend)) {  		USB_BUS_UNLOCK(udev->bus);  		/* nothing to do */  		return (0);  	} -	udev->flags.suspended = do_suspend;  	USB_BUS_UNLOCK(udev->bus);  	/* do the suspend or resume */ @@ -1471,6 +1474,7 @@ usb2_alloc_device(device_t parent_dev, struct usb2_bus *bus,  	udev->bus = bus;  	udev->address = USB_START_ADDR;	/* default value */  	udev->plugtime = (usb2_ticks_t)ticks; +	usb2_set_device_state(udev, USB_STATE_POWERED);  	/*  	 * We need to force the power mode to "on" because there are plenty  	 * of USB devices out there that do not work very well with @@ -1572,6 +1576,7 @@ usb2_alloc_device(device_t parent_dev, struct usb2_bus *bus,  			goto done;  		}  	} +	usb2_set_device_state(udev, USB_STATE_ADDRESSED);  	/*  	 * Get the first 8 bytes of the device descriptor ! @@ -1927,7 +1932,8 @@ usb2_free_device(struct usb2_device *udev, uint8_t flag)  	DPRINTFN(4, "udev=%p port=%d\n", udev, udev->port_no); -	bus = udev->bus;; +	bus = udev->bus; +	usb2_set_device_state(udev, USB_STATE_DETACHED);  #if USB_HAVE_UGEN  	usb2_notify_addq("-", udev); @@ -2438,3 +2444,28 @@ usb2_peer_can_wakeup(struct usb2_device *udev)  	}  	return (0);			/* not supported */  } + +void +usb2_set_device_state(struct usb2_device *udev, enum usb_dev_state state) +{ +	static const char* statestr[USB_STATE_MAX] = { +		[USB_STATE_DETACHED]	= "DETACHED", +		[USB_STATE_ATTACHED]	= "ATTACHED", +		[USB_STATE_POWERED]	= "POWERED", +		[USB_STATE_ADDRESSED]	= "ADDRESSED", +		[USB_STATE_CONFIGURED]	= "CONFIGURED", +		[USB_STATE_SUSPENDED]	= "SUSPENDED" +	}; + +	KASSERT(state < USB_STATE_MAX, ("invalid udev state")); + +	DPRINTF("udev %p state %s -> %s\n", udev, +	    statestr[udev->state], statestr[state]); +	udev->state = state; +} + +int +usb2_device_attached(struct usb2_device *udev) +{ +	return (udev->state > USB_STATE_DETACHED); +}  | 
