From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935110AbdKPQ2f (ORCPT ); Thu, 16 Nov 2017 11:28:35 -0500 Received: from mail1.bemta6.messagelabs.com ([193.109.254.108]:11399 "EHLO mail1.bemta6.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750784AbdKPQ2Z (ORCPT ); Thu, 16 Nov 2017 11:28:25 -0500 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrEIsWRWlGSWpSXmKPExsUSt3Opse7yPbx RBo+fClk0L17PZvHm+HQmi67VO1ksLu+aw2axaFkrs8WThWeYLBoXvGex+PP8FpsDh8fOWXfZ PeadDPTYP3cNu8f7fVfZPHZ+b2D3+LxJLoAtijUzLym/IoE1Y+mSk0wFb4UrPt3cxNTAuE2gi 5GLQ0hgPaPEjYZHbF2MnEBOhcS5h0eZQWw2AQuJyScegMVZBFQl5t7ayQpiCwv4S3Q/6AezRQ R+MUoc/1QFYjMLJEmsfdsD1ssr4CDx/08jG4QtKHFy5hMWiBoJiYMvXjBD7DKQOL2gESwuIWA vMf39VaA4B5CtL9F4LBYibCjxfdY3qBJzicWrDrJNYOSfhWTqLCRTFzAyrWJUL04tKkst0jXU SyrKTM8oyU3MzNE1NDDTy00tLk5MT81JTCrWS87P3cQIDG8GINjBuPO50yFGSQ4mJVFe59/cU UJ8SfkplRmJxRnxRaU5qcWHGGU4OJQkeGV280YJCRalpqdWpGXmACMNJi3BwaMkwvsYJM1bXJ CYW5yZDpE6xajL8Wzm6wZmIZa8/LxUKXFeBZAiAZCijNI8uBGwqL/EKCslzMsIdJQQT0FqUW5 mCar8K0ZxDkYlYV55kCk8mXklcJteAR3BBHSEzQ1ukCNKEhFSUg2Mdbd/z31sWhq0pJxrRy77 9Fy3B4Fr6sIy/RT5i2y+GzvtTe/Z1GYU92vShO1RjxWuufgx/T0pF/bIey7z2XL2u0ezJJ65O cpyshncu2utfMhnd/z7xqf+9rFc574v2aSef7Vg+TQ+CU9tP/7G9AvWN2e/0eaM+cT48KNi6a qurGV/p2+8zi2kxFKckWioxVxUnAgA9RxkyPUCAAA= X-Env-Sender: Adam.Thomson.Opensource@diasemi.com X-Msg-Ref: server-9.tower-193.messagelabs.com!1510849703!64217109!1 X-Originating-IP: [94.185.165.51] X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked From: Adam Thomson Date: Thu, 16 Nov 2017 16:28:11 +0000 Subject: [PATCH v2] typec: tcpm: fusb302: Resolve out of order messaging events To: Heikki Krogerus , Guenter Roeck , Greg Kroah-Hartman , Hans de Goede , Yueyao Zhu , Rui Miguel Silva CC: , , Message-ID: <20171116162811.A5D673FBDF@swsrvapps-01.diasemi.com> MIME-Version: 1.0 Content-Type: text/plain X-KSE-AttachmentFiltering-Interceptor-Info: protection disabled X-KSE-ServerInfo: sw-ex-cashub01.diasemi.com, 9 X-KSE-Antivirus-Interceptor-Info: scan successful X-KSE-Antivirus-Info: Clean, bases: 16/11/2017 14:22:00 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The expectation in the FUSB302 driver is that a TX_SUCCESS event should occur after a message has been sent, but before a GCRCSENT event is raised to indicate successful receipt of a message from the partner. However in some circumstances it is possible to see the hardware raise a GCRCSENT event before a TX_SUCCESS event is raised. The upshot of this is that the GCRCSENT handling portion of code ends up reporting the GoodCRC message to TCPM because the TX_SUCCESS event hasn't yet arrived to trigger a consumption of it. When TX_SUCCESS is then raised by the chip it ends up consuming the actual message that was meant for TCPM, and this incorrect sequence results in a hard reset from TCPM. To avoid this problem, this commit moves all FIFO reading to be done based on a GCRCSENT event, and when reading from the FIFO any GoodCRC messages read in are discarded so only valid messages are reported to TCPM. Changes in v2: - Remove erroneous extended header check Patch is based on Linux next-20171114 to include move out of staging. Signed-off-by: Adam Thomson --- drivers/usb/typec/fusb302/fusb302.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/usb/typec/fusb302/fusb302.c b/drivers/usb/typec/fusb302/fusb302.c index 72cb060..ddf88f0 100644 --- a/drivers/usb/typec/fusb302/fusb302.c +++ b/drivers/usb/typec/fusb302/fusb302.c @@ -1650,12 +1650,6 @@ static irqreturn_t fusb302_irq_intn(int irq, void *dev_id) if (interrupta & FUSB_REG_INTERRUPTA_TX_SUCCESS) { fusb302_log(chip, "IRQ: PD tx success"); - /* read out the received good CRC */ - ret = fusb302_pd_read_message(chip, &pd_msg); - if (ret < 0) { - fusb302_log(chip, "cannot read in GCRC, ret=%d", ret); - goto done; - } tcpm_pd_transmit_complete(chip->tcpm_port, TCPC_TX_SUCCESS); } @@ -1671,12 +1665,22 @@ static irqreturn_t fusb302_irq_intn(int irq, void *dev_id) if (interruptb & FUSB_REG_INTERRUPTB_GCRCSENT) { fusb302_log(chip, "IRQ: PD sent good CRC"); +retry: ret = fusb302_pd_read_message(chip, &pd_msg); if (ret < 0) { fusb302_log(chip, "cannot read in PD message, ret=%d", ret); goto done; } + + /* + * Check to make sure we've not read off a GoodCRC message. + * If so then read again to retrieve expected message + */ + if ((!pd_header_cnt_le(pd_msg.header)) && + (pd_header_type_le(pd_msg.header) == PD_CTRL_GOOD_CRC)) + goto retry; + tcpm_pd_receive(chip->tcpm_port, &pd_msg); } done: -- 1.9.1