Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752142AbcKYD4m (ORCPT ); Thu, 24 Nov 2016 22:56:42 -0500 Received: from mail-sn1nam01on0072.outbound.protection.outlook.com ([104.47.32.72]:64448 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751499AbcKYD4d (ORCPT ); Thu, 24 Nov 2016 22:56:33 -0500 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; X-IncomingTopHeaderMarker: OriginalChecksum:;UpperCasedChecksum:;SizeAsReceived:666;Count:8 From: Changming Huang To: , CC: , , , , , Changming Huang Subject: [PATCH v2] fsl/usb: Workarourd for USB erratum-A005697 Date: Fri, 25 Nov 2016 11:24:08 +0800 Message-ID: <1480044248-6365-1-git-send-email-jerry.huang@nxp.com> X-Mailer: git-send-email 1.7.9.5 X-IncomingHeaderCount: 8 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131245188075700132;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1109001)(1110001)(336004)(339900001)(189002)(199003)(39450400002)(33646002)(92566002)(86362001)(85426001)(81166006)(48376002)(8676002)(8936002)(105606002)(50226002)(5001770100001)(81156014)(97736004)(77096005)(2906002)(39400400001)(4326007)(4720700003)(39380400001)(5660300001)(38730400001)(104016004)(2171001)(50466002)(626004)(49486002)(356003)(551934003)(7846002)(50986999)(8666005)(47776003)(305945005)(189998001)(39410400001)(106466001)(5003940100001)(36756003)(68736007)(7059030);DIR:OUT;SFP:1101;SCL:1;SRVR:BN6PR03MB2465;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11OLC004;1:fOIGRcPDid2jeKnuRBzabXzh28W0/5LhGcEVj9Y06YPUsSLO69CzGgXjg0H8S1+uomj4njUcF6wpXybgDoXoVaQ24sGHIN5NR/8emB5HKCCSji5tPtG30U9GMvs1GrDHUklPwT0xzNJSQR9kahePHV/k9pifGSlsqw8nWajL9IHBw+XcuqjIlmmi4Sie6nujPoju9aNFMB1qe3M3jmXpiMfKLbOEcC5tecBd0dGBjKEHoCNErsAtT3GzSh7X8fwlmz7n/F5BOylvaOlJaOeTG3nGBVvHqwpHU5fA/UbAfAd1HAp5/yM6rOrbU6DLmTGeqFsZJOEefHq4Psb+ht8XE82FoRy4UFnQyqp9cxKqK0XPBa096J5POcFDyWQQWfABFkHIRJnPh1jDZ7CTu9uUacr240udx9r9yxMOEu3aHfn6AZVrMZG/3SivzP76hNcCWs4bcQEGSTCjhn1RB8upQUytLJgPor3kEZ3TXjWsfhohVSDRJWYskg2GPdTfBuesC3e4lVAtfZbXyXCrlQ7ggaISIJ3aZwETOf2wP7rjyHvDbl7i43PUU/KQPhNNTRI2Ta0Y45f83qSa6tihfDQJorz6cFFMh1PeH0Tcs3MidIqOvSWpvrnjhlvPpTG+Y0ocAofFiGhVTliPpPVngaYSG/xMgQ5ePO/hwsrASuzID9VZRqj9rTaQywJt4k5ZPFY2wR4xQn6+ArVuAwC+lROWm866EGIy67yANjZcKZpZwVbXuzGEqg3gKhaq8X1YIpbM MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BN6PR03MB2465;2:znXKriz6MGeRsksYBt3JLg0P2gzOFmqDqzHrqaby1X5OZxakmCCSADx7RcrslODa9C/1IE92hpYOVkcQMvs4xz81QH5BF+SpghWclUk8gk3W+q08w75upxWsJXJT6Dt7NfQa/JrZOhwizekC/9Lv88OKhFI+MLpxbINVzrrcsY8=;3:kcRUYB7JOOKKnSX4odHEvqe5m/a1f9JfJpRC98fB0YaS76xw5+rF6PX2IVFhc9nOe5VVKJABX1nNW1OreEgU4swY85OCjeZ2xrvu4ruC6ZEq6RKcbXukFc4tZv/55Ih197orUD5NFjk7YJCF11sH1flSK0Cu9A+CLBcP149Sd0ewXMxVLCZdncxHc+lw89cs4YNn6gCvOEepGNKQkwDHd7TQQRoh7+EUWQWEjUL+pMOQcNtnLFMzJiaMLcEzE8VxYoUS0Xz0GNaPH0zP8hFjmA==;25:N5yUwh9TQNTIDdo7agUZ167qKS++b83LtmAbgZLjtKAJKFmGPf7zfNJkwYNXY1f8/842oHVSONfO0f9hDN//FiPGeku31hOFbjS2XjDC9Cy7HnDVWdN84o/GxRVunaymnPv3ns5kMsFPqIj9DCPpzY2RL6FzBihlBVJj2UAwAxMBCC+eYMB7wyc0KAlaNMWu7SC2MkAG4ZJdVDs1QqMCDTAfth/Yid6pG85tZOYbVFFc95eGiv8Uc007+eFbIb0KDDVUci/Y5B2LWPvyv53nIMrbxMgK/oc9mQktjVysszFRtcZAr4CqXR+uW9t43HNg2qjOyM4M+3dL1BceUyjN3me5BbGZixsPt5FT1IcXlrciHc58vaVHrBjL36BvpUd3HVmIR2iBJlU+6zik6UqIW/6X2VULD6Bo1Y6Tn3wwvzf9HRgrlPFtXt4MkNHfWlMC+NQi7v9RDvym8kLRlfWojA== X-MS-Office365-Filtering-Correlation-Id: 040df22f-b13b-4f84-de46-08d414e4c02f X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:BN6PR03MB2465; X-Microsoft-Exchange-Diagnostics: 1;BN6PR03MB2465;31:JBtDTypUOQ5wFf+OOZSYY+COvCqnCZ7VWS7rO4/dqen6e0X1cX2w/NibDlQC4F7uOJG2HeZTsqxjxPtOjgWH9uN844u/C5jlaBRQgwSBupmp8cspgWm8+bItVeqnbsl7Jf0NDdw/H6ELSE+h7d01b5vAhhxrB4Nb43qlOwoTJM5Fk8Zk+YYmnStIURLw3N517bdsFAoaeBr9D67Ur7SfHAiuWIqZVNeJ2pubx+synGk78LgwlViPEupNxIkEvEZFbZo66Jm9yoUrnPpbQlCQwCqnyIxr1iwg+QGaJ0KIrBY= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6095060)(601004)(2401047)(13015025)(8121501046)(13017025)(13018025)(5005006)(13024025)(13023025)(10201501046)(3002001)(6055026)(6096035)(20161123556025)(20161123561025)(20161123565025)(20161123559025)(20161123563025);SRVR:BN6PR03MB2465;BCL:0;PCL:0;RULEID:(400006);SRVR:BN6PR03MB2465; X-Microsoft-Exchange-Diagnostics: 1;BN6PR03MB2465;4:Dbtrm6EanCItjewB2HbkQc7ELT5jcGtA7eYA4l+KTwH16ku+Elqw8m9gExv+3geCR/u3l/zv3mFaT/48/tAdAQO2jwYttFDtv8kxhid5gBbVuJlyyAlLyDURr0v53K10caR/ipGibX+XZ1mOrUTIuOogt3KmpIbyjqjprbqu8sQqV4cCNYmq47uxxyVYN0FyOWjYg/IelGCjnemdA/wt1ziUyuYEsurXNCRZqLEX6JVdMVa6tWcUQjOfNIkPE+Am34smf95koMrVPXcanLGHm11yXSV7AqGH/wNDQeL0ADjHO3rt/vCgNnvPEuUYanqnAVx5MrUqXQf0hyzoc3VHXdLmK4eq8A8OjUo96sdCVgDbMpC7M2NY7EBt7GoAHVcgkxxdCG4gokzyjNLh0+oIkJUh1GueQ2raLqtqE2YORspzxyQ+ZpbUx5MIEe+Vx/qI7U77o2lbrokh0I+/ok3IKX/Z9URyvtBjRpZY9AWe4owSPbyKMhTRpeqxkGGFC5nTfQBh6WyoSxqqg3j22iROfxw2tn/kYMSYssZ2jAWY+XtEns1yOueqAwi4qAkckbuMW6koFTIITeHiDY8d3420k5bjDXl68FQnepC45fqSZCzeU8wX4nVLXYdQ7PEhvar5w6StKLHaNUclqsB0AI1vPtHCWvW5i6oIzNfCILTaLgJQPMeGwJby/eKBRfor/u/L5h8BtdywmrnvZ9sTTsgXy/QvN9PoMQyE61Ez8eK641vjavydMmUXyxEKOXenZ1+t X-Forefront-PRVS: 01371B902F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN6PR03MB2465;23:nMrY1WEVcQgwhT3ng+icjxu4P5Y02ajqEeLp81BeJ?= =?us-ascii?Q?Lt8zVfg/YoDBdkJsKw1raO4IqlUxBMsn61/rYOoMWUFSCl3OKzHVny4ZepRu?= =?us-ascii?Q?tMBilYpZKWuedlo1zQ0dau0aSw3cqP0+a6Im0pKWhm+eiblWg1z4gftUcA9z?= =?us-ascii?Q?q75VzThpmv7Iavnf3G8XNshURr1GDAvO6DtbqZspMlf5W1FTJ0/FAMgdkITk?= =?us-ascii?Q?x6zzloNhGYzzoH9LjVI377pddmCHamqWQcksLpIk7LgtNzLaWt1AnGVvh6yu?= =?us-ascii?Q?PR9DkCPOISUP5ybnhqSCQm5CxIEVBt4yzoFWWSP88H40jxZpbNFu+jHC+kzw?= =?us-ascii?Q?XxjpmjQYDvgh4dOrqzLz2dGk7TivaMOHrbZEOUIE/9EN2FrKsu1igoTzSkdk?= =?us-ascii?Q?iVUbTiaHBz2Us8r2lHjLZp5TudL1uvFOg8xU5iFgPrTJmfwsRF/koQ5n9R1F?= =?us-ascii?Q?0siY4VsBz2lPgohQodAssllHPCuS8qMgdGJ+XHFus/P+pdx5Pre9+zGn8oDQ?= =?us-ascii?Q?BPvWOotnBZDWJcrZA11vXZKRUa0y8j2IcYIxSyyTlfWD0icW2DsH3hWEv+Q3?= =?us-ascii?Q?oyguJkRnmsq48bS6tq1L2eFXOWKgtkn8AZuIHoGHKazsD5M5BjTmw09fA6hj?= =?us-ascii?Q?FvohLTlhuC0k3Hx+X6CbeE1g1Hhmftwp12JcpT+O1T9WwX7vPSJNly5e0kAN?= =?us-ascii?Q?1UEi2JfqKXgkXiZjWwg/6F5p9sx1tZj6KJ3shdJJpskat56slza11sOI7DQa?= =?us-ascii?Q?p1xqIsCHI+VYmkHgsnk6nwvTn9qLJiZvOGeICYzl1LSV175VaACP5Jg/0BHF?= =?us-ascii?Q?wDam0tlKmiF35Mdati1YQAsNB/YOa27NccTow7HIX36YQ1oxHjiZS7XJ+lSZ?= =?us-ascii?Q?NKQTUNYWah8dvU8ySCsPusZsUkFRwjH+2j4GSn1g9NNvHft4vCcCOHNmd7hm?= =?us-ascii?Q?CPheCGGOhDZnpl9Y0ZBL59N8hmWBKfCMCZ+EZOLtAuTriEDB0umlqECShCbi?= =?us-ascii?Q?A+/S/JXirXSH37asPZa0O5zD0eRqunzmwa1mDCue2Lm6qQYsOZzFbF6+50Cy?= =?us-ascii?Q?KTei55JT3iXYr3HJDcMOGY2MKOSrm+F8i55o3ZeAiFpiheK+/MBNJgV1zZWu?= =?us-ascii?Q?IV9eNJq/NzvNV9Ivw+ax6ZdX/xehZWl+RO+EXlcFl0Hycygwn+hIX1U/1WiS?= =?us-ascii?Q?ig2WwwXFboXeEVZj+gMPNDHZWm/ncVneIXlr/OuywgiDYKPHA1wolHYCA=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN6PR03MB2465;6:Q1xWhwN2Ps8kls/qn8CToCA8K6kuBJ6Z8q+Nfp4TzC0jmCgHpGr3NSExH4jVLL1+5USdw+qiMlDPozU7cYxkJLpZ13naeZxAXU+7LsDT1TUwaXND5sVbut1TWufekLtS9TpWr2wjemQsHf7pM6qUvq4mjcLgTohXI608i5Az8HSrmd4i715Uaz4YX9+i9DD8nsCm+SmIJ/OSae4uge1Bff5gWBqwaFmk9R3b2bfIB3P/3iHgzUH6jolNwkdlSZP+gXOUEmqNsCKo2xfp7cISh/+/gNhA7SKIXStXd59vI0pQwZtSvKJ/3Tc3kEDWYX7Y9uBK8JQqzqKFb//0iuW4uQ==;5:W6xj9bLdtTY4WiF+5jE6wNmwkQWKLTk584gJUJwCvFfqSjS3JghxTKUbxW+mxIsXXUtyiG0vKxnFjngU8hgQWG2UKz3lFBwUWGa/r7cMW7anmFfCaxV8f0dA6un4VF3cueSJNpKGnXivMEvr/pPOuVE5MnV93GpFTHGjBZG+1x9EkikFQEU2fvuboOyoZ7LL;24:6Uw1q7DRJn25GBJMVumUrMR7qEqmpaY0MJb7Q4a+2ORxuHMT04lgMZ+vWhPBq2un473JUfWJdwMzSsPaX3tqxK7waBsvVJDzO1v6ONI96oU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN6PR03MB2465;7:KXMd0tOdi3icZoV1O3LM7xX0RmDq5zMFnXm0MVTpjwMBue7K7azNqd4XOV1BFx0jB1SmoNjpfEKo//RSTeclCChiHdiPi8yo1xL5K7rHbJoeFym0TceKfwA7ZZiAja3pDv3iDaWNtJfMbGe7816bEl67xkNjq/9h/y+5OQVC3A6vxRWN0znM4Kaq1f3h4T+y/Fn1dtqjZnM4ygkeQsqw1X1UAU9ks3+2rxNq7YK+llwNVB4IprUDx4AYB4Ar8V+fYBnOE/UKtcT15vxHUaGb+BKRM0f2z9HxLYtTbVKpGboq6M8wmyzumnWToYVRfkWV0S82H5fhTazwJZ2L5++mWh+l0jQM5ZXCAeQyzwgYb+o= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2016 03:40:07.3672 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR03MB2465 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4596 Lines: 114 The EHCI specification states the following in the SUSP bit description: In the Suspend state, the port is senstive to resume detection. Note that the bit status does not change untile the port is suspended and that there may be a delay in susupending a port if there is a transaction currently in progress on the USB. However, in NXP USBDR controller, the PORTSCx[SUSP] bit changes immediately when the application sets it and not when the port is actually suspended. So the application must wait for at least 10 milliseconds after a port indicates that it is suspended, to make sure this port has entered suspended state before initiating this port resume using the Force Port Resume bit. This bit is for NXP controller, not EHCI compatible. Signed-off-by: Changming Huang Signed-off-by: Ramneek Mehresh --- Change in v2: - move sleep out of spin-lock and add more comment for this workaround drivers/usb/host/ehci-fsl.c | 3 +++ drivers/usb/host/ehci-hub.c | 7 +++++++ drivers/usb/host/ehci.h | 6 ++++++ drivers/usb/host/fsl-mph-dr-of.c | 2 ++ include/linux/fsl_devices.h | 1 + 5 files changed, 19 insertions(+) diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 9f5ffb6..91701cc 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -286,6 +286,9 @@ static int ehci_fsl_usb_setup(struct ehci_hcd *ehci) if (pdata->has_fsl_erratum_a005275 == 1) ehci->has_fsl_hs_errata = 1; + if (pdata->has_fsl_erratum_a005697 == 1) + ehci->has_fsl_susp_errata = 1; + if ((pdata->operating_mode == FSL_USB2_DR_HOST) || (pdata->operating_mode == FSL_USB2_DR_OTG)) if (ehci_fsl_setup_phy(hcd, pdata->phy_mode, 0)) diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 74f62d6..81e2310 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c @@ -310,6 +310,13 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) } spin_unlock_irq(&ehci->lock); + if (changed && ehci_has_fsl_susp_errata(ehci)) + /* Wait for at least 10 millisecondes to ensure the controller + * enter the suspend status before initiating a port resume + * using the Fore Port Resume bit (Not-EHCI compatible). + */ + usleep_range(10000, 20000); + if ((changed && ehci->has_tdi_phy_lpm) || fs_idle_delay) { /* * Wait for HCD to enter low-power mode or for the bus diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 3f3b74a..7706e4a 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -219,6 +219,7 @@ struct ehci_hcd { /* one per controller */ unsigned no_selective_suspend:1; unsigned has_fsl_port_bug:1; /* FreeScale */ unsigned has_fsl_hs_errata:1; /* Freescale HS quirk */ + unsigned has_fsl_susp_errata:1; /*Freescale SUSP quirk*/ unsigned big_endian_mmio:1; unsigned big_endian_desc:1; unsigned big_endian_capbase:1; @@ -703,10 +704,15 @@ struct ehci_tt { #if defined(CONFIG_PPC_85xx) /* Some Freescale processors have an erratum (USB A-005275) in which * incoming packets get corrupted in HS mode + * Some Freescale processors have an erratum (USB A-005697) in which + * we need to wait for 10ms for bus to fo into suspend mode after + * setting SUSP bit */ #define ehci_has_fsl_hs_errata(e) ((e)->has_fsl_hs_errata) +#define ehci_has_fsl_susp_errata(e) ((e)->has_fsl_susp_errata) #else #define ehci_has_fsl_hs_errata(e) (0) +#define ehci_has_fsl_susp_errata(e) (0) #endif /* diff --git a/drivers/usb/host/fsl-mph-dr-of.c b/drivers/usb/host/fsl-mph-dr-of.c index f07ccb2..e90ddb5 100644 --- a/drivers/usb/host/fsl-mph-dr-of.c +++ b/drivers/usb/host/fsl-mph-dr-of.c @@ -226,6 +226,8 @@ static int fsl_usb2_mph_dr_of_probe(struct platform_device *ofdev) of_property_read_bool(np, "fsl,usb-erratum-a007792"); pdata->has_fsl_erratum_a005275 = of_property_read_bool(np, "fsl,usb-erratum-a005275"); + pdata->has_fsl_erratum_a005697 = + of_property_read_bool(np, "fsl,usb_erratum-a005697"); /* * Determine whether phy_clk_valid needs to be checked diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index f291291..60cef82 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h @@ -100,6 +100,7 @@ struct fsl_usb2_platform_data { unsigned already_suspended:1; unsigned has_fsl_erratum_a007792:1; unsigned has_fsl_erratum_a005275:1; + unsigned has_fsl_erratum_a005697:1; unsigned check_phy_clk_valid:1; /* register save area for suspend/resume */ -- 1.7.9.5