On 02/26/2013 11:11 AM, Alan Stern wrote:
On Tue, 26 Feb 2013, Tony Camuso wrote:
Then should I continue to pursue relocating calls to init and delete
the compliance mode recovery timer to xhci_bus_suspend/resume?
I don't know. If you think the scheme will work then pursue it,
otherwise don't.
Alan,
I was able to make the scheme work by adding the following
immediately upon entering compliance_recovery_node_timer_init()
if (timer_pending(&xhci->comp_mode_recovery_timer)) {
xhci_dbg(xhci, "Compliance Mode Recovery Timer already active.\n");
return;
}
However ...
I don't the bus level is the correct place to deal with this timer.
xhci_bus_suspend and xhci_bus_resume are called many times during boot,
and not always serially. Consider the following snippets taken from
boot with CONFIG_USB_DEBUG=y and CONFIG_USB_XHCI_HCD_DEBUGGING=y
and printk's at the entry of xhci_bus_suspend and xhci_bus_resume.
xhci_hcd 0000:08:00.0: Finished xhci_init
xhci_hcd 0000:08:00.0: Compliance Mode Recovery Timer Initialized.
:
hub 3-0:1.0: hub_suspend
usb usb3: bus auto-suspend, wakeup 1
*** xhci_bus_suspend: pci:0000:08:00.0 usb-bus:4 slot_id:0 port:0
xhci_hcd 0000:08:00.0: set port power, actual port 2 status = 0x2a0
xhci_hcd 0000:08:00.0: Compliance Mode Recovery Timer Deleted!
*** xhci_bus_suspend: completed normaly
xhci_hcd 0000:08:00.0: xhci_hub_status_data: stopping port polling.
:
hub 4-0:1.0: hub_suspend
usb usb4: bus auto-suspend, wakeup 1
*** xhci_bus_suspend: pci:0000:08:00.0 usb-bus:4 slot_id:0 port:0
xhci_hcd 0000:08:00.0: Compliance Mode Recovery Timer Deleted!
*** xhci_bus_suspend: completed normaly
xhci_hcd 0000:08:00.0: xhci_hub_status_data: stopping port polling.
:
usb usb4: usb auto-resume
*** xhci_bus_resume: pci:0000:08:00.0 usb-bus:4 slot_id:0 port:0
xhci_hcd 0000:08:00.0: Compliance Mode Recovery Timer Initialized.
*** xhci_bus_resume: completed normaly
hub 4-0:1.0: hub_resume
:
usb usb4: usb auto-resume
*** xhci_bus_resume: pci:0000:08:00.0 usb-bus:4 slot_id:0 port:0
xhci_hcd 0000:08:00.0: Compliance Mode Recovery Timer Initialized.
*** xhci_bus_resume: completed normaly
hub 4-0:1.0: hub_resume
:
hub 4-0:1.0: state 7 ports 4 chg 0000 evt 0000
usb usb3: usb auto-resume
*** xhci_bus_resume: pci:0000:08:00.0 usb-bus:4 slot_id:0 port:0
*** xhci: Compliance Mode Recovery Timer already active.
*** xhci_bus_resume: completed normaly
hub 3-0:1.0: hub_resume
:
etc, etc,
As far as I know, xhci_bus_resume is never called without
xhci_bus_suspend being called first. Hence the timer should not be on
the list when xhci_bus_resume runs.
See above.
Presently, the timer is added in xchi_init() and xhci_resume(). Our problem
emerges when xhci_resume tries to add the timer after it has been restored
by resuming from hibernate.
In the new scheme, the timer should not be added by xhci_resume.
It wasn't, yet I still encountered the problem.
As an aside, we may be able to leave the code as it is now and just add the
code snippet at the top of this post.
That solution introduces the least churn and solves the problem.
--
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