From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751329AbdKUOMR (ORCPT ); Tue, 21 Nov 2017 09:12:17 -0500 Received: from mail1.bemta5.messagelabs.com ([195.245.231.139]:10737 "EHLO mail1.bemta5.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751235AbdKUOMP (ORCPT ); Tue, 21 Nov 2017 09:12:15 -0500 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrMIsWRWlGSWpSXmKPExsUSt3Opsa6tiUi UwbqH/BbNi9ezWbw5Pp3Jomv1ThaLy7vmsFksWtbKbPFk4Rkmi8YF71ks/jy/xebA4bFz1l12 j3knAz32z13D7vF+31U2j53fG9g9Pm+SC2CLYs3MS8qvSGDNWP39BWNBn3TFjx0N7A2Mm8W6G Lk4hATWM0r8PPifsYuRE8ipkFi55wsziM0mYCEx+cQDNhCbRUBVYvq0H2BxYQF/iYN/v7CC2C ICvxgljn+qArGZBZIk1r7tAavhFXCQuL2onw3CFpQ4OfMJC0SNhMTBFy+YIXYZSJxe0AgWlxC wl5j+/ipQnAPI1pdoPBYLETaU+D7rG1SJucTx0z3MExj5ZyGZOgvJ1AWMTKsYNYpTi8pSi3QN jfSSijLTM0pyEzNzdA0NTPVyU4uLE9NTcxKTivWS83M3MQIDnAEIdjD2zXI+xCjJwaQkyltRI BwlxJeUn1KZkVicEV9UmpNafIhRhoNDSYLX3lgkSkiwKDU9tSItMwcYazBpCQ4eJRFeK5A0b3 FBYm5xZjpE6hSjLsezma8bmIVY8vLzUqXEeRNAigRAijJK8+BGwOL+EqOslDAvI9BRQjwFqUW 5mSWo8q8YxTkYlYR5+0Gm8GTmlcBtegV0BBPQET+PC4McUZKIkJJqYHRMuWbWFPzR+0yvDP+L sx3mut/s5nKKiXsZ/rLLjsydlrlAYG97luiVfo5nYSc7YhLfc7FwTHA8tu6N9aryD4szN4Yuv Fyw9qxqhtPf2VuepNXNXeo18fcq5bhI3slMG/JsWJs1Pf+v2Rwnu7z1fktiw6lNUrGu93eH20 +6OjlfcpWMyXLVf0osxRmJhlrMRcWJANSJMen2AgAA X-Env-Sender: Adam.Thomson.Opensource@diasemi.com X-Msg-Ref: server-9.tower-179.messagelabs.com!1511273532!92621453!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: Tue, 21 Nov 2017 14:12:12 +0000 Subject: [PATCH v3] 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: <20171121141212.481DE3FBAC@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: 21/11/2017 12:36: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 updates the message reading code to check whether a GoodCRC message was received or not. Based on this check it will either report that the previous transmission has completed or it will pass the msg data to TCPM for futher processing. This way the incorrect ordering of the events no longer matters. Signed-off-by: Adam Thomson --- Changes in v3: - Always read from FIFO on TX_SUCCES and GCRCSENT events, but decision on how to report to TCPM is no longer based on these event types but instead on type of message read in from FIFO. Changes in v2: - Remove erroneous extended header check Patch is based on Linux next-20171114 to include move out of staging. drivers/usb/typec/fusb302/fusb302.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/usb/typec/fusb302/fusb302.c b/drivers/usb/typec/fusb302/fusb302.c index 72cb060..d200085 100644 --- a/drivers/usb/typec/fusb302/fusb302.c +++ b/drivers/usb/typec/fusb302/fusb302.c @@ -1543,6 +1543,21 @@ static int fusb302_pd_read_message(struct fusb302_chip *chip, fusb302_log(chip, "PD message header: %x", msg->header); fusb302_log(chip, "PD message len: %d", len); + /* + * Check if we've read off a GoodCRC message. If so then indicate to + * TCPM that the previous transmission has completed. Otherwise we pass + * the received message over to TCPM for processing. + * + * We make this check here instead of basing the reporting decision on + * the IRQ event type, as it's possible for the chip to report the + * TX_SUCCESS and GCRCSENT events out of order on occasion, so we need + * to check the message type to ensure correct reporting to TCPM. + */ + if ((!len) && (pd_header_type_le(msg->header) == PD_CTRL_GOOD_CRC)) + tcpm_pd_transmit_complete(chip->tcpm_port, TCPC_TX_SUCCESS); + else + tcpm_pd_receive(chip->tcpm_port, msg); + return ret; } @@ -1650,13 +1665,12 @@ 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); + fusb302_log(chip, + "cannot read in PD message, ret=%d", ret); goto done; } - tcpm_pd_transmit_complete(chip->tcpm_port, TCPC_TX_SUCCESS); } if (interrupta & FUSB_REG_INTERRUPTA_HARDRESET) { @@ -1677,7 +1691,6 @@ static irqreturn_t fusb302_irq_intn(int irq, void *dev_id) "cannot read in PD message, ret=%d", ret); goto done; } - tcpm_pd_receive(chip->tcpm_port, &pd_msg); } done: mutex_unlock(&chip->lock); -- 1.9.1