On Sun, 6 Jan 2013, Lan Tianyu wrote:
> This patch is to add usb port auto power off mechanism.
> When usb device is suspending, usb core will suspend usb port and
> usb port runtime pm callback will clear PORT_POWER feature to
> power off port if all conditions were met. These conditions are
> remote wakeup disable, pm qos NO_POWER_OFF flag clear and persist
> enable. When it resumes, power on port again. Add did_runtime_put
> in the struct usb_port in order to call pm_runtime_get/put(portdev)
> paired during suspending and resuming.
> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c
> @@ -1509,7 +1525,6 @@ static void hub_disconnect(struct usb_interface *intf)
> kfree(hub->status);
> kfree(hub->buffer);
>
> - pm_suspend_ignore_children(&intf->dev, false);
> kref_put(&hub->kref, hub_release);
> }
This looks like a mistake. Either that line shouldn't have been added
in the first place or else it shouldn't be removed here.
> @@ -1940,7 +1955,8 @@ void usb_disconnect(struct usb_device **pdev)
> sysfs_remove_link(&udev->dev.kobj, "port");
> sysfs_remove_link(&port_dev->dev.kobj, "device");
>
> - pm_runtime_put(&port_dev->dev);
> + if (!port_dev->did_runtime_put)
> + pm_runtime_put(&port_dev->dev);
> }
You need to set port_dev->did_runtime_put to false here, so that it
will have the correct value the next time a device is plugged into the
port.
> --- a/drivers/usb/core/hub.h
> +++ b/drivers/usb/core/hub.h
> @@ -80,6 +80,8 @@ struct usb_hub {
> * @port_owner: port's owner
> * @connect_type: port's connect type
> * @portnum: port index num based one
> + * @power_is_on: port's power state
> + * @did_runtime_put: port has done pm_runtime_put().
> */
> struct usb_port {
> struct usb_device *child;
> @@ -87,6 +89,8 @@ struct usb_port {
> struct dev_state *port_owner;
> enum usb_port_connect_type connect_type;
> u8 portnum;
> + bool power_is_on;
> + bool did_runtime_put;
> };
Should these be power_is_on:1 and did_runtime_put:1?
Alan Stern
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html