USB: Set wakeup bits for all children hubs.
authorSarah Sharp <sarah.a.sharp@linux.intel.com>
Tue, 24 Jan 2012 19:46:50 +0000 (11:46 -0800)
committerSarah Sharp <sarah.a.sharp@linux.intel.com>
Tue, 14 Feb 2012 20:12:27 +0000 (12:12 -0800)
commit72937e1e342f5631d08df4ef0629e55bdcf74c76
tree3e8138fbb3746f0c1d7112f67c06b0d424be050a
parent4ee823b83bc9851743fab756c76b27d6a1e2472b
USB: Set wakeup bits for all children hubs.

This patch takes care of the race condition between the Function Wake
Device Notification and the auto-suspend timeout for this situation:

Roothub
  | (U3)
hub A
  | (U3)
hub B
  | (U3)
device C

When device C signals a resume, the xHCI driver will set the wakeup_bits
for the roothub port that hub A is attached to.  However, since USB 3.0
hubs do not set a link state change bit on device-initiated resume, hub
A will not indicate a port event when polled.  Without this patch, khubd
will notice the wakeup-bits are set for the roothub port, it will resume
hub A, and then it will poll the events bits for hub A and notice that
nothing has changed.  Then it will be suspended after 2 seconds.

Change hub_activate() to look at the port link state for each USB 3.0
hub port, and set hub->change_bits if the link state is U0, indicating
the device has finished resume.  Change the resume function called by
hub_events(), hub_handle_remote_wakeup(), to check the link status
for resume instead of just the port's wakeup_bits.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
drivers/usb/core/hub.c