From patchwork Fri Jun 2 08:56:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: AceLan Kao X-Patchwork-Id: 770202 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 3wfJ4221RWz9sDG; Fri, 2 Jun 2017 18:56:50 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AlmTdWIy"; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1dGiNy-0007yJ-LB; Fri, 02 Jun 2017 08:56:46 +0000 Received: from mail-it0-f65.google.com ([209.85.214.65]) by huckleberry.canonical.com with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1dGiNu-0007wR-2b for kernel-team@lists.ubuntu.com; Fri, 02 Jun 2017 08:56:42 +0000 Received: by mail-it0-f65.google.com with SMTP id d68so9432275ita.1 for ; Fri, 02 Jun 2017 01:56:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=RnR6Ab3r9SmPjhSJoOJ34Ubrn4J6CCy9jMkFUujSwhQ=; b=AlmTdWIy+bmrFfJosJQ42hd4/gfS/JniIgyY2VDl+CX7col6JsSv7xH81krJwGSXb8 oROJtmthI+5yu2GolheTPTSk+cO2OSlqRVW7RzzYcWphvBH05b2gEU/dtv98wHGszpZq K0tZn7+BoBKZI+hDP6p3RZSi43SKUnZq/DqvVdaiiUNd7AjNbBWVi0DbnofdhxhJq1sL v+W3SM3E1WLKBB+WOtk2fV/P+TQN0svdJPsasBtlKJ36kpsSFB+eY8huZF36+IdCZBZE zgCmT6/8mWU5Hd6fOmahJSE3upKhqPwIbbl4TPxh9yHA6QnRh/SXfnijQaR4o5Ab4CFi FpPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=RnR6Ab3r9SmPjhSJoOJ34Ubrn4J6CCy9jMkFUujSwhQ=; b=SiQOfiiaTapK2UiefKPgHNeOwBlMQ7XXdGbFztjDrZSMVrDsLFsvOOUQBNfkntEK4y Pv9EEj9R/hA2dfs4lNyvsB93XGSJFxXNA/ZJFxsTd6cE9h+qplSgXKxI7o4GR4lDU6LG jQyBPhTMknJLd/r7/y4dUDrdfL3H6YZLgq8hXlyV6cvYl6fHPj1QuLBotGLSjc84KWay ouFxNwobWJhTu5R3UnArnn8PbVw9CK1s3ffEctZ7jHeUBEWqp+bFczaZwabfsYIhENVI pcb3fcxrAdOOSlqVMBOMlBxg8TUPG1VB8YRXRWKQVVJpyqVQd/aMAYrNLBzqPfmrqfVH 70AQ== X-Gm-Message-State: AODbwcCzZ82dqWqCxDGWv7gKSW+FwZCs0QlOUGuHsg0VqBa6gfrAuO4u yR3t3D5ISczarI7tDcs= X-Received: by 10.99.124.3 with SMTP id x3mr6015839pgc.53.1496393800517; Fri, 02 Jun 2017 01:56:40 -0700 (PDT) Received: from localhost ([2001:67c:1562:8007::aac:4468]) by smtp.gmail.com with ESMTPSA id z11sm3512819pge.42.2017.06.02.01.56.38 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 02 Jun 2017 01:56:39 -0700 (PDT) From: AceLan Kao To: kernel-team@lists.ubuntu.com Subject: [PATCH][Xenial] xhci: AMD Promontory USB disable port support Date: Fri, 2 Jun 2017 16:56:29 +0800 Message-Id: <1496393789-18420-2-git-send-email-acelan.kao@canonical.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1496393789-18420-1-git-send-email-acelan.kao@canonical.com> References: <1496393789-18420-1-git-send-email-acelan.kao@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Jiahau Chang v3: Fix some checkpatch.pl warnings BugLink: http://bugs.launchpad.net/bugs/1695216 For AMD Promontory xHCI host, although you can disable USB 2.0 ports in BIOS settings, those ports will be enabled anyway after you remove a device on that port and re-plug it in again. It's a known limitation of the chip. As a workaround we can clear the PORT_WAKE_BITS. Signed-off-by: Jiahau Chang Signed-off-by: AceLan Kao --- drivers/usb/host/xhci-hub.c | 19 ++++++++++++++----- drivers/usb/host/xhci-pci.c | 13 +++++++++++++ drivers/usb/host/xhci.h | 2 ++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 7e2c0de..bc9349b 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -1105,12 +1105,19 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp); break; case USB_PORT_FEAT_REMOTE_WAKE_MASK: - xhci_set_remote_wake_mask(xhci, port_array, + if ((xhci->quirks & XHCI_U2_DISABLE_WAKE) && (hcd->speed < HCD_USB3)) { + temp = readl(port_array[wIndex]); + xhci_dbg(xhci, "skip set port remote wake mask, " + "actual port %d status = 0x%x\n", + wIndex, temp); + } else { + xhci_set_remote_wake_mask(xhci, port_array, wIndex, wake_mask); - temp = readl(port_array[wIndex]); - xhci_dbg(xhci, "set port remote wake mask, " - "actual port %d status = 0x%x\n", - wIndex, temp); + temp = readl(port_array[wIndex]); + xhci_dbg(xhci, "set port remote wake mask, " + "actual port %d status = 0x%x\n", + wIndex, temp); + } break; case USB_PORT_FEAT_BH_PORT_RESET: temp |= PORT_WR; @@ -1342,6 +1349,8 @@ int xhci_bus_suspend(struct usb_hcd *hcd) t2 |= PORT_WKOC_E | PORT_WKCONN_E; t2 &= ~PORT_WKDISC_E; } + if ((xhci->quirks & XHCI_U2_DISABLE_WAKE) && (hcd->speed < HCD_USB3)) + t2 &= ~PORT_WAKE_BITS; } else t2 &= ~PORT_WAKE_BITS; diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index dd262f4..e4369e8 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -53,6 +53,11 @@ #define PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI 0x1aa8 #define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8 +#define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 +#define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba +#define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb +#define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc + static const char hcd_name[] = "xhci_hcd"; static struct hc_driver __read_mostly xhci_pci_hc_driver; @@ -135,6 +140,14 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) if (pdev->vendor == PCI_VENDOR_ID_AMD) xhci->quirks |= XHCI_TRUST_TX_LENGTH; + if ((pdev->vendor == PCI_VENDOR_ID_AMD) && + ((pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4) || + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_3) || + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2) || + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_1))) + xhci->quirks |= XHCI_U2_DISABLE_WAKE; + + if (pdev->vendor == PCI_VENDOR_ID_INTEL) { xhci->quirks |= XHCI_LPM_SUPPORT; xhci->quirks |= XHCI_INTEL_HOST; diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 2e34c9f..d723fef 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1644,6 +1644,8 @@ struct xhci_hcd { #define XHCI_BROKEN_STREAMS (1 << 19) #define XHCI_PME_STUCK_QUIRK (1 << 20) #define XHCI_MISSING_CAS (1 << 24) +#define XHCI_U2_DISABLE_WAKE (1 << 27) + unsigned int num_active_eps; unsigned int limit_active_eps; /* There are two roothubs to keep track of bus suspend info for */