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