Received: by 10.192.165.148 with SMTP id m20csp315373imm; Fri, 20 Apr 2018 07:14:35 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/YAeYu+oOhi1CGE8a+KCtQJ9mdS005YAtmdLpofwidH67LE903oQI/domU+XXRPAUdnwCt X-Received: by 10.98.62.87 with SMTP id l84mr9843639pfa.135.1524233675313; Fri, 20 Apr 2018 07:14:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524233675; cv=none; d=google.com; s=arc-20160816; b=ZUhSZj39pI0DpC2l7qZZfM49+WeqECbPWWpW5GNoBX3A4Sy6kx0L6err+VFmlpmlC1 3GLZPhQ1tphm+YTiwJICV2hBWL6OBCwGm4uKNYiEFrnD00D5z05EKcImShdMOHyyVONO tcjDgHDYBdOSwvIwgg9bikLj/7o95uXi0qDSTHhpe+OAoju2DF3/POAac0HIiOsZA8wg UfErZXM1KiBBt8JvdwD2enAMOaGyX5YKmyyvbLFieVq61WsX1rCBXrBgFi6hN9gK4g4E In0TTWqgCVQG3R95EdVCZyaxBb+diYcyjGQbu0E/REE2HT0VoKvfliaZrmRgFU1Fie5Q AMcA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:in-reply-to :subject:cc:to:from:date:arc-authentication-results; bh=irfsgFrbApVaFhCm/1jrXs7eCnWBVUjD3sJsRuoYFAU=; b=i4BhSY1xLRfQqpXddaZd5Rj5SUiQ4inx1OtevecQoHZTBhSxTtHo6muAA9atN4apa6 X6TdqyqM1ejCkWjrlwPMfemax6q8KOhbCnfX39se1HRrN/YbfwUtwP63yoDU06brxK1i dcn60nbcYihGqq5oHesCynwTMeWINWuAdTJUf9Q2YLt+pWHW/b1zBrVpfs3MPLh4noag HykOQCZ1XYfEu7q4PvnYpjQGNhcWs8GmY3bt9vNOnSMHk/KG0wRYQuk9FHt2Jk2YI8A6 /MG+mTYrTVxOKQ0bq7CZYT6/g12cqREkQHtRdjaUqXly4hOJ/VfSoTFwEkqUgiwZfHF8 Ju9g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i198si2999341pgc.340.2018.04.20.07.14.20; Fri, 20 Apr 2018 07:14:35 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755235AbeDTOM5 (ORCPT + 99 others); Fri, 20 Apr 2018 10:12:57 -0400 Received: from iolanthe.rowland.org ([192.131.102.54]:48810 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1755190AbeDTOMx (ORCPT ); Fri, 20 Apr 2018 10:12:53 -0400 Received: (qmail 2309 invoked by uid 2102); 20 Apr 2018 10:12:52 -0400 Received: from localhost (sendmail-bs@127.0.0.1) by localhost with SMTP; 20 Apr 2018 10:12:52 -0400 Date: Fri, 20 Apr 2018 10:12:52 -0400 (EDT) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: Ravi Chandra Sadineni cc: gregkh@linuxfoundation.org, , , , , , , , , , , , , , , , , , , Subject: Re: [PATCH V2] USB: Increment wakeup count on remote wakeup. In-Reply-To: <20180420002752.181261-1-ravisadineni@chromium.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 19 Apr 2018, Ravi Chandra Sadineni wrote: > On chromebooks we depend on wakeup count to identify the wakeup source. > But currently USB devices do not increment the wakeup count when they > trigger the remote wake. This patch addresses the same. > > Resume condition is reported differently on USB 2.0 and USB 3.0 devices. > > On USB 2.0 devices, a wake capable device, if wake enabled, drives > resume signal to indicate a remote wake (USB 2.0 spec section 7.1.7.7). > The upstream facing port then sets C_PORT_SUSPEND bit and reports a > port change event (USB 2.0 spec section 11.24.2.7.2.3). Thus if a port > has resumed before driving the resume signal from the host and > C_PORT_SUSPEND is set, then the device attached to the given port might > be the reason for the last system wakeup. Increment the wakeup count for > the same. > > On USB 3.0 devices, a function may signal that it wants to exit from device > suspend by sending a Function Wake Device Notification to the host (USB3.0 > spec section 8.5.6.4) Thus on receiving the Function Wake, increment the > wakeup count. > > Signed-off-by: Ravi Chandra Sadineni > --- > drivers/usb/core/hcd.c | 2 ++ > drivers/usb/core/hub.c | 10 +++++++++- > 2 files changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c > index 777036ae63674..ee0f3ec57ce49 100644 > --- a/drivers/usb/core/hcd.c > +++ b/drivers/usb/core/hcd.c > @@ -2374,7 +2374,9 @@ static void hcd_resume_work(struct work_struct *work) > void usb_hcd_resume_root_hub (struct usb_hcd *hcd) > { > unsigned long flags; > + struct device *dev = &hcd->self.root_hub->dev; > > + pm_wakeup_event(dev, 0); > spin_lock_irqsave (&hcd_root_hub_lock, flags); > if (hcd->rh_registered) { > set_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags); In general, hcd->self.root_hub is guaranteed to be non-NULL only when hcd->rh_registered is set. Therefore the assignment to dev and the call to pm_wakeup_event() should be moved within this "if" statement. The rest of the patch looks okay. Alan Stern > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c > index f6ea16e9f6bb9..aa9968d90a48c 100644 > --- a/drivers/usb/core/hub.c > +++ b/drivers/usb/core/hub.c > @@ -653,12 +653,17 @@ void usb_wakeup_notification(struct usb_device *hdev, > unsigned int portnum) > { > struct usb_hub *hub; > + struct usb_port *port_dev; > > if (!hdev) > return; > > hub = usb_hub_to_struct_hub(hdev); > if (hub) { > + port_dev = hub->ports[portnum - 1]; > + if (port_dev && port_dev->child) > + pm_wakeup_event(&port_dev->child->dev, 0); > + > set_bit(portnum, hub->wakeup_bits); > kick_hub_wq(hub); > } > @@ -3434,8 +3439,11 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) > > /* Skip the initial Clear-Suspend step for a remote wakeup */ > status = hub_port_status(hub, port1, &portstatus, &portchange); > - if (status == 0 && !port_is_suspended(hub, portstatus)) > + if (status == 0 && !port_is_suspended(hub, portstatus)) { > + if (portchange & USB_PORT_STAT_C_SUSPEND) > + pm_wakeup_event(&udev->dev, 0); > goto SuspendCleared; > + } > > /* see 7.1.7.7; affects power usage, but not budgeting */ > if (hub_is_superspeed(hub->hdev)) >