Re: [RFC][PATCH 1/3] usb: add a hcd notify entry in hc_driver

From: Alan Stern
Date: Tue May 05 2015 - 13:23:19 EST


On Tue, 5 May 2015, Lu, Baolu wrote:

> The order that software should do during device suspend/resume is
> defined in 4.15.1.1 of xHCI spec 1.1.
>
> Spec 4.15.1.1:
>
> Software shall stop all endpoints of a device using the Stop Endpoint
> Command and setting the Suspend
> (SP) flag to ‘1’ prior to selectively suspending a device.

But _after_ all the URBs sent to the device have completed, right?

> After the
> device is resumed software shall ring an
> endpoint’s doorbell to restart it.

The driver would ring the endpoint's doorbell anyway when a new URB is
submitted, wouldn't it? Which means the resume callback doesn't
actually have to do anything.

> --end--
>
> So the order looks like:
>
> tell hcd device suspend
> usb_port_suspend()

You have forgotten that usb_port_suspend() can send URBs to the device
(to enable remote wakeup, for example). Therefore you shouldn't notify
the HCD until usb_port_suspend() is partly or totally finished.

> usb_port_resume()
> tell hcd device resume

You have also forgotten that usb_port_resume() calls various functions
that send URBs to ep0 on the device. Therefore if the HCD's
device_resume callback needs to do something (like ringing ep0's
doorbell), you had better invoke the callback _before_ calling
usb_port_resume(). Or maybe you had better do this _within_
usb_port_resume().

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/