Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Feb 2013 12:22:41 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r246789 - in head: lib/libusb sys/dev/usb usr.sbin/usbconfig
Message-ID:  <201302141222.r1ECMfme002000@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Thu Feb 14 12:22:40 2013
New Revision: 246789
URL: http://svnweb.freebsd.org/changeset/base/246789

Log:
  Add USB API to read power draw on USB devices.
  Update usbconfig to print power draw on USB devices.
  
  MFC after:	2 weeks
  Submitted by:	Matt Burke @ icritical.com

Modified:
  head/lib/libusb/Makefile
  head/lib/libusb/libusb20.3
  head/lib/libusb/libusb20.c
  head/lib/libusb/libusb20.h
  head/lib/libusb/libusb20_int.h
  head/lib/libusb/libusb20_ugen20.c
  head/sys/dev/usb/usb_generic.c
  head/sys/dev/usb/usb_ioctl.h
  head/usr.sbin/usbconfig/dump.c

Modified: head/lib/libusb/Makefile
==============================================================================
--- head/lib/libusb/Makefile	Thu Feb 14 11:29:57 2013	(r246788)
+++ head/lib/libusb/Makefile	Thu Feb 14 12:22:40 2013	(r246789)
@@ -190,6 +190,7 @@ MLINKS += libusb20.3 libusb20_dev_reset.
 MLINKS += libusb20.3 libusb20_dev_check_connected.3
 MLINKS += libusb20.3 libusb20_dev_set_power_mode.3
 MLINKS += libusb20.3 libusb20_dev_get_power_mode.3
+MLINKS += libusb20.3 libusb20_dev_get_power_usage.3
 MLINKS += libusb20.3 libusb20_dev_set_alt_index.3
 MLINKS += libusb20.3 libusb20_dev_get_device_desc.3
 MLINKS += libusb20.3 libusb20_dev_alloc_config.3

Modified: head/lib/libusb/libusb20.3
==============================================================================
--- head/lib/libusb/libusb20.3	Thu Feb 14 11:29:57 2013	(r246788)
+++ head/lib/libusb/libusb20.3	Thu Feb 14 12:22:40 2013	(r246789)
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd August 13, 2012
+.Dd February 14, 2013
 .Dt LIBUSB20 3
 .Os
 .Sh NAME
@@ -149,6 +149,8 @@ USB access library (libusb -lusb)
 .Fn libusb20_dev_set_power_mode "struct libusb20_device *pdev" "uint8_t power_mode"
 .Ft uint8_t
 .Fn libusb20_dev_get_power_mode "struct libusb20_device *pdev"
+.Ft uint16_t
+.Fn libusb20_dev_get_power_usage "struct libusb20_device *pdev"
 .Ft int
 .Fn libusb20_dev_set_alt_index "struct libusb20_device *pdev" "uint8_t iface_index" "uint8_t alt_index"
 .Ft struct LIBUSB20_DEVICE_DESC_DECODED *
@@ -740,6 +742,12 @@ USB device.
 .
 .Pp
 .
+.Fn libusb20_dev_get_power_usage
+returns the reported power usage in milliamps for the given USB device.
+A power usage of zero typically means that the device is self powered.
+.
+.Pp
+.
 .Fn libusb20_dev_set_alt_index
 will try to set the given alternate index for the given
 USB interface index.

Modified: head/lib/libusb/libusb20.c
==============================================================================
--- head/lib/libusb/libusb20.c	Thu Feb 14 11:29:57 2013	(r246788)
+++ head/lib/libusb/libusb20.c	Thu Feb 14 12:22:40 2013	(r246789)
@@ -71,6 +71,7 @@ dummy_callback(struct libusb20_transfer 
 #define	dummy_check_connected (void *)dummy_int
 #define	dummy_set_power_mode (void *)dummy_int
 #define	dummy_get_power_mode (void *)dummy_int
+#define	dummy_get_power_usage (void *)dummy_int
 #define	dummy_kernel_driver_active (void *)dummy_int
 #define	dummy_detach_kernel_driver (void *)dummy_int
 #define	dummy_do_request_sync (void *)dummy_int
@@ -717,6 +718,18 @@ libusb20_dev_get_power_mode(struct libus
 	return (power_mode);
 }
 
+uint16_t
+libusb20_dev_get_power_usage(struct libusb20_device *pdev)
+{
+	int error;
+	uint16_t power_usage;
+
+	error = pdev->methods->get_power_usage(pdev, &power_usage);
+	if (error)
+		power_usage = 0;
+	return (power_usage);
+}
+
 int
 libusb20_dev_set_alt_index(struct libusb20_device *pdev, uint8_t ifaceIndex, uint8_t altIndex)
 {

Modified: head/lib/libusb/libusb20.h
==============================================================================
--- head/lib/libusb/libusb20.h	Thu Feb 14 11:29:57 2013	(r246788)
+++ head/lib/libusb/libusb20.h	Thu Feb 14 12:22:40 2013	(r246789)
@@ -255,6 +255,7 @@ int	libusb20_dev_reset(struct libusb20_d
 int	libusb20_dev_check_connected(struct libusb20_device *pdev);
 int	libusb20_dev_set_power_mode(struct libusb20_device *pdev, uint8_t power_mode);
 uint8_t	libusb20_dev_get_power_mode(struct libusb20_device *pdev);
+uint16_t	libusb20_dev_get_power_usage(struct libusb20_device *pdev);
 int	libusb20_dev_set_alt_index(struct libusb20_device *pdev, uint8_t iface_index, uint8_t alt_index);
 int	libusb20_dev_get_info(struct libusb20_device *pdev, struct usb_device_info *pinfo);
 int	libusb20_dev_get_iface_desc(struct libusb20_device *pdev, uint8_t iface_index, char *buf, uint8_t len);

Modified: head/lib/libusb/libusb20_int.h
==============================================================================
--- head/lib/libusb/libusb20_int.h	Thu Feb 14 11:29:57 2013	(r246788)
+++ head/lib/libusb/libusb20_int.h	Thu Feb 14 12:22:40 2013	(r246789)
@@ -105,6 +105,7 @@ typedef int (libusb20_process_t)(struct 
 typedef int (libusb20_reset_device_t)(struct libusb20_device *pdev);
 typedef int (libusb20_set_power_mode_t)(struct libusb20_device *pdev, uint8_t power_mode);
 typedef int (libusb20_get_power_mode_t)(struct libusb20_device *pdev, uint8_t *power_mode);
+typedef int (libusb20_get_power_usage_t)(struct libusb20_device *pdev, uint16_t *power_usage);
 typedef int (libusb20_set_alt_index_t)(struct libusb20_device *pdev, uint8_t iface_index, uint8_t alt_index);
 typedef int (libusb20_set_config_index_t)(struct libusb20_device *pdev, uint8_t index);
 typedef int (libusb20_check_connected_t)(struct libusb20_device *pdev);
@@ -127,6 +128,7 @@ typedef void (libusb20_tr_cancel_async_t
   m(n, check_connected) \
   m(n, set_power_mode) \
   m(n, get_power_mode) \
+  m(n, get_power_usage) \
   m(n, set_alt_index) \
   m(n, set_config_index) \
   m(n, tr_cancel_async) \

Modified: head/lib/libusb/libusb20_ugen20.c
==============================================================================
--- head/lib/libusb/libusb20_ugen20.c	Thu Feb 14 11:29:57 2013	(r246788)
+++ head/lib/libusb/libusb20_ugen20.c	Thu Feb 14 12:22:40 2013	(r246789)
@@ -69,6 +69,7 @@ static libusb20_reset_device_t ugen20_re
 static libusb20_check_connected_t ugen20_check_connected;
 static libusb20_set_power_mode_t ugen20_set_power_mode;
 static libusb20_get_power_mode_t ugen20_get_power_mode;
+static libusb20_get_power_usage_t ugen20_get_power_usage;
 static libusb20_kernel_driver_active_t ugen20_kernel_driver_active;
 static libusb20_detach_kernel_driver_t ugen20_detach_kernel_driver;
 static libusb20_do_request_sync_t ugen20_do_request_sync;
@@ -639,6 +640,18 @@ ugen20_get_power_mode(struct libusb20_de
 }
 
 static int
+ugen20_get_power_usage(struct libusb20_device *pdev, uint16_t *power_usage)
+{
+	int temp;
+
+	if (ioctl(pdev->file_ctrl, USB_GET_POWER_USAGE, &temp)) {
+		return (LIBUSB20_ERROR_OTHER);
+	}
+	*power_usage = temp;
+	return (0);			/* success */
+}
+
+static int
 ugen20_kernel_driver_active(struct libusb20_device *pdev,
     uint8_t iface_index)
 {

Modified: head/sys/dev/usb/usb_generic.c
==============================================================================
--- head/sys/dev/usb/usb_generic.c	Thu Feb 14 11:29:57 2013	(r246788)
+++ head/sys/dev/usb/usb_generic.c	Thu Feb 14 12:22:40 2013	(r246789)
@@ -1841,6 +1841,17 @@ ugen_get_power_mode(struct usb_fifo *f)
 }
 
 static int
+ugen_get_power_usage(struct usb_fifo *f)
+{
+	struct usb_device *udev = f->udev;
+
+	if (udev == NULL)
+		return (0);
+
+	return (udev->power);
+}
+
+static int
 ugen_do_port_feature(struct usb_fifo *f, uint8_t port_no,
     uint8_t set, uint16_t feature)
 {
@@ -2202,6 +2213,10 @@ ugen_ioctl_post(struct usb_fifo *f, u_lo
 		*u.pint = ugen_get_power_mode(f);
 		break;
 
+	case USB_GET_POWER_USAGE:
+		*u.pint = ugen_get_power_usage(f);
+		break;
+
 	case USB_SET_PORT_ENABLE:
 		error = ugen_do_port_feature(f,
 		    *u.pint, 1, UHF_PORT_ENABLE);

Modified: head/sys/dev/usb/usb_ioctl.h
==============================================================================
--- head/sys/dev/usb/usb_ioctl.h	Thu Feb 14 11:29:57 2013	(r246788)
+++ head/sys/dev/usb/usb_ioctl.h	Thu Feb 14 12:22:40 2013	(r246789)
@@ -277,7 +277,8 @@ struct usb_gen_quirk {
 #define	USB_IFACE_DRIVER_DETACH	_IOW ('U', 125, int)
 #define	USB_GET_PLUGTIME	_IOR ('U', 126, uint32_t)
 #define	USB_READ_DIR		_IOW ('U', 127, struct usb_read_dir)
-/* 128 - 135 unused */
+/* 128 - 134 unused */
+#define	USB_GET_POWER_USAGE	_IOR ('U', 135, int)
 #define	USB_SET_TX_FORCE_SHORT	_IOW ('U', 136, int)
 #define	USB_SET_TX_TIMEOUT	_IOW ('U', 137, int)
 #define	USB_GET_TX_FRAME_SIZE	_IOR ('U', 138, int)

Modified: head/usr.sbin/usbconfig/dump.c
==============================================================================
--- head/usr.sbin/usbconfig/dump.c	Thu Feb 14 11:29:57 2013	(r246788)
+++ head/usr.sbin/usbconfig/dump.c	Thu Feb 14 12:22:40 2013	(r246789)
@@ -225,13 +225,17 @@ dump_device_info(struct libusb20_device 
 {
 	char buf[128];
 	uint8_t n;
+	unsigned int usage;
 
-	printf("%s, cfg=%u md=%s spd=%s pwr=%s\n",
+	usage = libusb20_dev_get_power_usage(pdev);
+
+	printf("%s, cfg=%u md=%s spd=%s pwr=%s (%umA)\n",
 	    libusb20_dev_get_desc(pdev),
 	    libusb20_dev_get_config_index(pdev),
 	    dump_mode(libusb20_dev_get_mode(pdev)),
 	    dump_speed(libusb20_dev_get_speed(pdev)),
-	    dump_power_mode(libusb20_dev_get_power_mode(pdev)));
+	    dump_power_mode(libusb20_dev_get_power_mode(pdev)),
+	    usage);
 
 	if (!show_ifdrv)
 		return;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302141222.r1ECMfme002000>