Received: by 10.192.165.148 with SMTP id m20csp522563imm; Fri, 20 Apr 2018 10:31:11 -0700 (PDT) X-Google-Smtp-Source: AIpwx48XgXu4vW+DCZXX0IPizP56ay2DvxGLRi13PhfTCxiGdZIXrxqKjbVWSgyNKXVhYwbOKDgU X-Received: by 2002:a17:902:748b:: with SMTP id h11-v6mr11373192pll.45.1524245471842; Fri, 20 Apr 2018 10:31:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524245471; cv=none; d=google.com; s=arc-20160816; b=n+ZcfEiOaRyGS2d5i7/sk84sC1ZWbPiALSMc639KkJD8/yRj/H9zbW6BnpY4nmwBIj vbGC/Wr/eKEYiTUkdhADSzYJdWsnJvosXfGW6CjnIA+wAfeum2IzIycN+T9rjNDzE1g8 90qqAwIpizGrTAqpswsM3ChHLGA4jaxUbcJhol9IUSi4PCAu67fn2ZtKiNTKD10ASP4z QUjSKcoWk9MN3Qb5Qcg0aJOllJfvE1S4/eOkGRjL1Bu9Puvo6IueYkvcWDF6i4Cru2vL EpHWks3fCqyevCWdyeQb+9AcxZtSSb/7FzVfAsvtYZahht0aLSS3apD0Tydg+egWdMRT a0+g== 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=ZbDz8ntVFQGfDTlEgxiyYCjzpPLD94bhlgYL1KspdNQ=; b=Yz2W1ReUcU7sZs+OT/pLq4gvyTuXi0g69AaDdLz2QEaxSfGrKr1bcVHf+4kW+OOtUb gPHHbXADu7oVI4BlIEKeU2rmSy7zGcmYET/p5h/9SNX7rQ5w9+xah4jCULH1MUAjRKQL Hb7xCSsK75pJlwEbtkFdiN+9BLfNSDI/+GdI4lEh8Dt1iU+VZBytACp4eCl3UE6xeJm9 YxfaTdcLDhaN4wJSqkwCtwV6LwYJnfLeQUjp8glRJhwYcBz1cGnv6DqA/gZ5gBbapuLI 0oAiMwKA0q8f8hlCGSskAv0P6QtQJsyT4dtfVP+OjL+Xh5rQByj/Tzd/BUurXsnjSYDR FpNg== 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 h193si2962632pgc.57.2018.04.20.10.30.56; Fri, 20 Apr 2018 10:31:11 -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 S1753092AbeDTR3n (ORCPT + 99 others); Fri, 20 Apr 2018 13:29:43 -0400 Received: from iolanthe.rowland.org ([192.131.102.54]:49562 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752738AbeDTR3m (ORCPT ); Fri, 20 Apr 2018 13:29:42 -0400 Received: (qmail 5716 invoked by uid 2102); 20 Apr 2018 13:29:41 -0400 Received: from localhost (sendmail-bs@127.0.0.1) by localhost with SMTP; 20 Apr 2018 13:29:41 -0400 Date: Fri, 20 Apr 2018 13:29:41 -0400 (EDT) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: Ravi Chandra Sadineni cc: gregkh@linuxfoundation.org, , , , , , , , , , , , , , , , , , , Subject: Re: [PATCH V3] USB: Increment wakeup count on remote wakeup. In-Reply-To: <20180420170527.143240-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 Fri, 20 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 > --- At this point you're supposed to list the differences between this patch and the preceding versions. > 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..b8024ae4fdcaa 100644 > --- a/drivers/usb/core/hcd.c > +++ b/drivers/usb/core/hcd.c > @@ -2375,6 +2375,8 @@ void usb_hcd_resume_root_hub (struct usb_hcd *hcd) > { > unsigned long flags; > > + if (hcd->rh_registered) > + pm_wakeup_event(&hcd->self.root_hub->dev, 0); > spin_lock_irqsave (&hcd_root_hub_lock, flags); > if (hcd->rh_registered) { > set_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags); This isn't good enough. hcd->rh_registered can change at any time; it is protected by the hcd_root_hub_lock spinlock. That's why I said your code should be moved inside the existing "if" statement. 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)) >