Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2994134AbbEEQIL (ORCPT ); Tue, 5 May 2015 12:08:11 -0400 Received: from iolanthe.rowland.org ([192.131.102.54]:50649 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S2993251AbbEEOuW (ORCPT ); Tue, 5 May 2015 10:50:22 -0400 Date: Tue, 5 May 2015 10:50:21 -0400 (EDT) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: "Lu, Baolu" cc: Greg Kroah-Hartman , Mathias Nyman , , Subject: Re: [RFC][PATCH 1/3] usb: add a hcd notify entry in hc_driver In-Reply-To: <5548176C.7040502@linux.intel.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1616 Lines: 49 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/