From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935758AbdKPPpN (ORCPT ); Thu, 16 Nov 2017 10:45:13 -0500 Received: from mail1.bemta5.messagelabs.com ([195.245.231.146]:54235 "EHLO mail1.bemta5.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933811AbdKPPpD (ORCPT ); Thu, 16 Nov 2017 10:45:03 -0500 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrMIsWRWlGSWpSXmKPExsUSt3OpsW7VJt4 og72zFCyaF69ns3hzfDqTRdfqnSwWl3fNYbNYtKyV2eLJwjNMFo0L3rNY/Hl+i82Bw2PnrLvs HvNOBnrsn7uG3eP9vqtsHju/N7B7fN4kF8AWxZqZl5RfkcCasXnaJcaCp8IVF2fMYWpgXC/Qx cjFISSwnlHi05997F2MnEBOhcThlo1MIDabgIXE5BMP2EBsFgFViYl/p7J0MXJwCAv4SHy+EQ 3SKyLwj1Fi3uPPYDXMAkkSa9/2MIPYvAIOEr+3L2eEsAUlTs58wgJRIyFx8MULZohdBhKnFzS CxSUE7CWmv7/KDDJfQkBfovFYLETYUOL7rG9QJeYSnduusU5g5J+FZOosJFMXMDKtYtQoTi0q Sy3SNTLSSyrKTM8oyU3MzNE1NDDVy00tLk5MT81JTCrWS87P3cQIDPB6BgbGHYx72v0OMUpyM CmJ8jr/5o4S4kvKT6nMSCzOiC8qzUktPsQow8GhJMFru5E3SkiwKDU9tSItMwcYazBpCQ4eJR HeYJA0b3FBYm5xZjpE6hSjLsezma8bmIVY8vLzUqXEeXVBigRAijJK8+BGwOL+EqOslDAvIwM DgxBPQWpRbmYJqvwrRnEORiVhXjuQKTyZeSVwm14BHcEEdITNDW6QI0oSEVJSDYzJX9outTxe cLIrJMS8K+Tr2SUJ+wJ+/v820ZTbT/Dut3Pyx/p+pPNnpb+dJx2geefdhNgKXonnTWHGv16qt wtqWHvOfvjdaH33M+2CySy9zdtPLND+1GAtpu87ufpqZN+0/hsNHwITtB9dTD83a/q9BmuPXq WvjB3clq94+HanOdgdNQv3W6HEUpyRaKjFXFScCACJJy9t9gIAAA== X-Env-Sender: Adam.Thomson.Opensource@diasemi.com X-Msg-Ref: server-12.tower-178.messagelabs.com!1510847094!112723427!2 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 15:44:48 +0000 Subject: [PATCH] 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: <20171116154448.C9EC23FBE0@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 09:32: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. Patch is based on Linux next-20171114 to include move out of staging. Signed-off-by: Adam Thomson --- drivers/usb/typec/fusb302/fusb302.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/usb/typec/fusb302/fusb302.c b/drivers/usb/typec/fusb302/fusb302.c index 72cb060..48a7ff4 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,23 @@ 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_msg.header & PD_HEADER_EXT_HDR)) && + (!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