svn commit: r187169 - head/sys/dev/usb2/core
Andrew Thompson
thompsa at FreeBSD.org
Tue Jan 13 11:02:32 PST 2009
Author: thompsa
Date: Tue Jan 13 19:02:30 2009
New Revision: 187169
URL: http://svn.freebsd.org/changeset/base/187169
Log:
MFp4: //depot/projects/usb at 155810
Usability improvement. Make sure that setting
power mode ON resurrects the device if powered OFF.
Reported by: Alexander Best.
Submitted by: Hans Petter Selasky
Modified:
head/sys/dev/usb2/core/usb2_generic.c
Modified: head/sys/dev/usb2/core/usb2_generic.c
==============================================================================
--- head/sys/dev/usb2/core/usb2_generic.c Tue Jan 13 19:02:17 2009 (r187168)
+++ head/sys/dev/usb2/core/usb2_generic.c Tue Jan 13 19:02:30 2009 (r187169)
@@ -1688,15 +1688,23 @@ ugen_set_power_mode(struct usb2_fifo *f,
{
struct usb2_device *udev = f->udev;
int err;
+ uint8_t old_mode;
if ((udev == NULL) ||
(udev->parent_hub == NULL)) {
return (EINVAL);
}
err = priv_check(curthread, PRIV_ROOT);
- if (err) {
+ if (err)
return (err);
- }
+
+ /* get old power mode */
+ old_mode = udev->power_mode;
+
+ /* if no change, then just return */
+ if (old_mode == mode)
+ return (0);
+
switch (mode) {
case USB_POWER_MODE_OFF:
/* get the device unconfigured */
@@ -1734,6 +1742,13 @@ ugen_set_power_mode(struct usb2_fifo *f,
if (err)
return (ENXIO); /* I/O failure */
+ /* if we are powered off we need to re-enumerate first */
+ if (old_mode == USB_POWER_MODE_OFF) {
+ err = ugen_re_enumerate(f);
+ if (err)
+ return (err);
+ }
+
/* set new power mode */
usb2_set_power_mode(udev, mode);
More information about the svn-src-all
mailing list