[RFC 05/13] USB: Allow drivers to disable hub-initiated LPM.

Sarah Sharp sarah.a.sharp at linux.intel.com
Wed May 16 18:45:26 EDT 2012

[[Resending with a smaller Cc list]

USB 3.0 Link Power Management (LPM) is designed to allow individual
links in the bus to go into lower power states.  There are two ways a
link can enter a lower power state:

1. Device-initiated LPM.  When a USB device decides it can go into a
lower power link state, it sends a message to the parent hub, telling it
to go into either U1 or U2.  Device-initiated LPM is good for devices
that send data to the host, like communications devices.

2. Hub-initiated LPM.  After the link has been idle for a specific
amount of time, the parent hub will request that the child go into a
lower power state.  The child can refuse that request.  For example, a
USB modem may want to refuse the LPM request if it is in the middle of
receiving a text message.  Hub-initiated LPM is good for devices where
only the host initiates the data transfer, like USB printers or USB mass
storage devices.

Links will be automatically placed into higher power states by the USB
hubs and roothubs whenever the host starts a USB transmission.

Introduce a new usb_driver flag, disable_hub_initiated_lpm, that allows
drivers to disable hub-initiated LPM.

Signed-off-by: Sarah Sharp <sarah.a.sharp at linux.intel.com>
Cc: Marcel Holtmann <marcel at holtmann.org>
Cc: Gustavo Padovan <gustavo at padovan.org>
Cc: Johan Hedberg <johan.hedberg at gmail.com>
Cc: Hansjoerg Lipp <hjlipp at web.de>
Cc: Tilman Schmidt <tilman at imap.cc>
Cc: Karsten Keil <isdn at linux-pingi.de>
Cc: Oliver Neukum <oliver at neukum.name>
Cc: Peter Korsgaard <jacmet at sunsite.dk>
Cc: Jan Dumon <j.dumon at option.com>
Cc: Petko Manolov <petkan at users.sourceforge.net>
Cc: Steve Glendinning <steve.glendinning at smsc.com>
Cc: "John W. Linville" <linville at tuxdriver.com>
Cc: Kalle Valo <kvalo at qca.qualcomm.com>
Cc: "Luis R. Rodriguez" <mcgrof at qca.qualcomm.com>
Cc: Jouni Malinen <jouni at qca.qualcomm.com>
Cc: Vasanthakumar Thiagarajan <vthiagar at qca.qualcomm.com>
Cc: Senthil Balasubramanian <senthilb at qca.qualcomm.com>
Cc: Christian Lamparter <chunkeey at googlemail.com>
Cc: Brett Rudley <brudley at broadcom.com>
Cc: Roland Vossen <rvossen at broadcom.com>
Cc: Arend van Spriel <arend at broadcom.com>
Cc: "Franky (Zhenhui) Lin" <frankyl at broadcom.com>
Cc: Kan Yan <kanyan at broadcom.com>
Cc: Dan Williams <dcbw at redhat.com>
Cc: Jussi Kivilinna <jussi.kivilinna at mbnet.fi>
Cc: Ivo van Doorn <IvDoorn at gmail.com>
Cc: Gertjan van Wingerde <gwingerde at gmail.com>
Cc: Helmut Schaa <helmut.schaa at googlemail.com>
Cc: Herton Ronaldo Krzesinski <herton at canonical.com>
Cc: Hin-Tak Leung <htl10 at users.sourceforge.net>
Cc: Larry Finger <Larry.Finger at lwfinger.net>
Cc: Chaoming Li <chaoming_li at realsil.com.cn>
Cc: Daniel Drake <dsd at gentoo.org>
Cc: Ulrich Kunitz <kune at deine-taler.de>
Cc: linux-bluetooth at vger.kernel.org
Cc: gigaset307x-common at lists.sourceforge.net
Cc: netdev at vger.kernel.org
Cc: linux-usb at vger.kernel.org
Cc: linux-wireless at vger.kernel.org
Cc: ath9k-devel at lists.ath9k.org
Cc: libertas-dev at lists.infradead.org
Cc: users at rt2x00.serialmonkey.com
 include/linux/usb.h |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/include/linux/usb.h b/include/linux/usb.h
index eb46077..998c276 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -875,6 +875,9 @@ struct usbdrv_wrap {
  *	for interfaces bound to this driver.
  * @soft_unbind: if set to 1, the USB core will not kill URBs and disable
  *	endpoints before calling the driver's disconnect method.
+ * @disable_hub_initiated_lpm: if set to 0, the USB core will not allow hubs
+ *	to initiate lower power link state transitions when an idle timeout
+ *	occurs.  Device-initiated USB 3.0 link PM will still be allowed.
  * USB interface drivers must provide a name, probe() and disconnect()
  * methods, and an id_table.  Other driver fields are optional.
@@ -915,6 +918,7 @@ struct usb_driver {
 	struct usbdrv_wrap drvwrap;
 	unsigned int no_dynamic_id:1;
 	unsigned int supports_autosuspend:1;
+	unsigned int disable_hub_initiated_lpm:1;
 	unsigned int soft_unbind:1;
 #define	to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver)

More information about the libertas-dev mailing list