On Tue, Jan 07, 2014 at 12:29:28PM -0800, Dan Williams wrote: > Alan, Sarah, > > This revision boils down the port power control fixes to the > bare minimum to get the implementation functional and reliable. > Data structure changes are constrained to struct usb_port and > gone are the clumsier attempts at wider reworks from v1 [1] and > v2 [2]. No device model changes to consider or changes to the > meaning of 'runtime_status' for port devices. Three disconnect > bugs are fixed: > > 1/ Superspeed devices downgrade to their hi-speed connection: fix this by > preventing superspeed poweroff until the peer port is suspended. See > patch 5. > > 2/ khubd taking disconnect action on ports that are in the process of > being recovered: khubd now ignores ports in the pm-runtime-suspended > state. Alan, per your comment [3] this effectively uses the pm_usage > counter and state as a lock against khubd. See patch 7. Does that mean this patchset does not depend on the four warm port reset patches you sent on 12/20? http://marc.info/?l=linux-usb&m=138759482824618&w=2 Sarah Sharp > 3/ Superspeed devices fail to reconnect: Seen during repeated toggles of > the port power state. Fixed by forcing a full recovery cycle of the > device before allowing the next suspend, and blocking khubd while the > resume is in progress. See patch 9. > > Patch overview: > [PATCH 01/10] usb: assign default peer ports for root hubs > [PATCH 02/10] usb: find external hub port peers > [PATCH 03/10] usb: find internal hub tier mismatch via acpi > [PATCH 04/10] usb: sysfs link peer ports > * Per our discussions of v1 these patches implement a > simple algorithm for associating peer ports across > internal and external hubs. > > [PATCH 05/10] usb: defer suspension of superspeed port while peer is powered > * Fix case 1 > > [PATCH 06/10] usb: gate clearing FEAT_C_ENABLE to usb2 hubs > * Cleanup misuse of ClearPortFeature(PORT_C_ENABLE) > > [PATCH 07/10] usb: synchronize port poweroff and khubd > * Fix case 2 > > [PATCH 08/10] usb: cleanup straggling C_PORT_RESET C_PORT_LINK_STATE notifications > * Handle some unexpected hub events encountered during testing > > [PATCH 09/10] usb: make khubd and subsequent suspension wait for port recovery > * Fix case 3 > > [PATCH 10/10] usb: documentation for usb port power off mechanisms > > These patches were tested by repeatedly power toggling all > 35 ports in the following topology: > /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M > |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/4p, 5000M > |__ Port 1: Dev 3, If 0, Class=vend., Driver=ax88179_178a, 5000M > |__ Port 2: Dev 4, If 0, Class=stor., Driver=usb-storage, 5000M > |__ Port 4: Dev 5, If 0, Class=stor., Driver=usb-storage, 5000M > /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/9p, 480M > |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/4p, 480M > |__ Port 3: Dev 4, If 0, Class=HID, Driver=usbhid, 12M > |__ Port 2: Dev 3, If 0, Class=hub, Driver=hub/4p, 480M > |__ Port 1: Dev 5, If 0, Class=HID, Driver=usbhid, 1.5M > |__ Port 2: Dev 6, If 0, Class=HID, Driver=usbhid, 1.5M > /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M > |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/8p, 480M > > Each iteration of the test verifies that no disconnects occur and that > all ports reach the 'suspended' state. To force device suspension > interface drivers are unbound for power-off and then rebound. Note that > since the hub drivers are never unbound their parent ports remain active > due to ->do_remote_wakeup for the hub device, but the the 30 other ports > reliably suspend and resume now with these patches. The proposed warm > reset changes [4] do not appear to be required as long as superspeed hub > parent ports remain powered. > > [1] http://marc.info/?l=linux-usb&m=138260013707007&w=2 > [2] http://marc.info/?l=linux-usb&m=138511124910669&w=2 > [3] http://marc.info/?l=linux-usb&m=138775577717546&w=2 > [4] http://marc.info/?l=linux-usb&m=138759482824618&w=2 > > --- > > Dan Williams (9): > usb: assign default peer ports for root hubs > usb: find external hub port peers > usb: find internal hub tier mismatch via acpi > usb: sysfs link peer ports > usb: don't suspend port while peer is powered > usb: gate clearing FEAT_C_ENABLE to usb2 hubs > usb: synchronize port poweroff and khubd > usb: cleanup straggling C_PORT_RESET C_PORT_LINK_STATE notifications > usb: make khubd and subsequent suspension wait for port recovery > > Lan Tianyu (1): > USB: Documentation for USB port power off mechanisms > > > Documentation/usb/power-management.txt | 210 +++++++++++++++++++++++++++ > drivers/usb/core/hub.c | 112 ++++++++++---- > drivers/usb/core/hub.h | 14 ++ > drivers/usb/core/port.c | 252 +++++++++++++++++++++++++++++++- > drivers/usb/core/usb-acpi.c | 35 ++++ > drivers/usb/core/usb.h | 2 > 6 files changed, 574 insertions(+), 51 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html