Received: by 10.192.165.148 with SMTP id m20csp4159399imm; Mon, 30 Apr 2018 12:54:59 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoVHduQntQ01oY5nC9owChk4V/m1SDdQdcU5jOcMwr5dgUUy6VNwRj24GDq9AcbO6xtaN/D X-Received: by 2002:a17:902:74c9:: with SMTP id f9-v6mr13855172plt.385.1525118098975; Mon, 30 Apr 2018 12:54:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525118098; cv=none; d=google.com; s=arc-20160816; b=ivGkMU0DUcUQWL2/impmSNkK1z1BAvh8pPhEShG3et0TwdOnWvb8d7w53jaaLoaCfl 7ZQ4xhIi3vGPE7pEjQgBxmj4UP76o42YqR3EnuokD5jOOmsC+nCY3HulW3FK0mcyh2H2 EpywNox1zX/HaSelUB1PULao6GrQtuLAaRUbr6KS2G+kHP50PKVph8ONKU49/Dbb2V+3 LnqycWc0LgneHcA5SmdeTNdB1t927K/M6YkMVdOq3uU9EAMXeLJzX9UaL29h2HIRDYWV oIpS4qWi+RlB8FwYvQZyrcG1qbsemAM02nqj7GO25RaIcLZOI7Dwf/LNat6F9sSjKxZx esRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dmarc-filter :arc-authentication-results; bh=FAS7kaD0CTFVAOGZBnZ2urpZzr64S3IEeGIGgakOAm0=; b=u6Lvh59nBs4p6QsgSjFUHl3/hX224ncEgN5EMBwDCjEoGBIrIoVdQu6SKQztlqklJ4 9yZKWB0PFuF+9KXeIUjEx0VYulowMJ/IKOYiy1Dqa5jvb1/0o+RNFdTCyokZdJbxYfQn uPfKp2ngRk0b1bas3gV4BsSzBLQkJbyIM2h5Z7vmjQlebFNZ9f5G4DwMaBAACsyxGpBk I3FyTSDY162WB2/VgUT8/Vb/MGqvb4shy7GC9n8Zj0M1e3v4cvm8QVN9Fdc9WqOPYWon fL6W5apIPjSfTPeopuWYKtJiMiHJA9iw9VusMfEioFvrpTzbNwZ0yV2k0tg585JzeQJ5 REiw== 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 o189si7979950pfo.20.2018.04.30.12.54.44; Mon, 30 Apr 2018 12:54:58 -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 S1756221AbeD3TxW (ORCPT + 99 others); Mon, 30 Apr 2018 15:53:22 -0400 Received: from mail.kernel.org ([198.145.29.99]:35236 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755593AbeD3T2B (ORCPT ); Mon, 30 Apr 2018 15:28:01 -0400 Received: from localhost (unknown [104.132.1.102]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DE07A22DC1; Mon, 30 Apr 2018 19:28:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DE07A22DC1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=linuxfoundation.org Authentication-Results: mail.kernel.org; spf=fail smtp.mailfrom=gregkh@linuxfoundation.org From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ravi Chandra Sadineni , Alan Stern Subject: [PATCH 4.16 022/113] USB: Increment wakeup count on remote wakeup. Date: Mon, 30 Apr 2018 12:23:53 -0700 Message-Id: <20180430184016.015198649@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180430184015.043892819@linuxfoundation.org> References: <20180430184015.043892819@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.16-stable review patch. If anyone has any objections, please let me know. ------------------ From: Ravi Chandra Sadineni commit 83a62c51ba7b3c0bf45150c4eac7aefc6c785e94 upstream. 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 Acked-by: Alan Stern Cc: stable Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/hcd.c | 1 + drivers/usb/core/hub.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -2365,6 +2365,7 @@ void usb_hcd_resume_root_hub (struct usb spin_lock_irqsave (&hcd_root_hub_lock, flags); if (hcd->rh_registered) { + pm_wakeup_event(&hcd->self.root_hub->dev, 0); set_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags); queue_work(pm_wq, &hcd->wakeup_work); } --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -653,12 +653,17 @@ void usb_wakeup_notification(struct usb_ 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); } @@ -3430,8 +3435,11 @@ int usb_port_resume(struct usb_device *u /* 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))