From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751346AbdKUOHw (ORCPT ); Tue, 21 Nov 2017 09:07:52 -0500 Received: from mail1.bemta6.messagelabs.com ([193.109.254.114]:42572 "EHLO mail1.bemta6.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750794AbdKUOHu (ORCPT ); Tue, 21 Nov 2017 09:07:50 -0500 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrEIsWRWlGSWpSXmKPExsUSt3Opsa6xsUi UwYuVJhbNi9ezWbw5Pp3Jomv1ThaLy7vmsFksWtbKbPFk4Rkmi8YF71ks/jy/xebA4bFz1l12 j3knAz32z13D7vF+31U2j53fG9g9Pm+SC2CLYs3MS8qvSGDNWP39BWNBn3TFjx0N7A2Mm8W6G Lk4hATWM0rcXXGAtYuRE8ipkHj8fC8TiM0mYCEx+cQDNhCbRUBVYv6SM4xdjBwcwgI+Ep9vRI OERQR+MUoc/1QFYjMLJEmsfdvDDGLzCjhIzDr0kBHCFpQ4OfMJC0SNhMTBFy+YIVYZSJxe0Ag WlxCwl5j+/iozyHgJAX2JxmOxEGFDie+zvkGVmEscP93DPIGRfxaSqbOQTF3AyLSKUaM4tags tUjXyEgvqSgzPaMkNzEzR9fQwEwvN7W4ODE9NScxqVgvOT93EyMwvBmAYAfjmvmBhxglOZiUR HkrCoSjhPiS8lMqMxKLM+KLSnNSiw8xynBwKEnw3jIUiRISLEpNT61Iy8wBRhpMWoKDR0mE18 sIKM1bXJCYW5yZDpE6xajL8Wzm6wZmIZa8/LxUKXHeZSAzBECKMkrz4EbAov4So6yUMC8j0FF CPAWpRbmZJajyrxjFORiVhHnXgEzhycwrgdv0CugIJqAjfh4XBjmiJBEhJdXAKO3+xNwtmbN0 nqPC6fL9jH+ezk5n/GH2mr9nxm7Rud9uPmk7rrWz9HVJScZ6y0e9MqdTN23IyT2uY2VUvruyQ /IVh46Jq6j662lMsZmWdZtjD6yNDP5u+s9u8RqGlQaHlW/9zPvQ3DRHW2DSESFtpZJpnxasUb uW5Pxy/fXDmy9fKjmhfKysS4mlOCPRUIu5qDgRAC/NqBb1AgAA X-Env-Sender: Adam.Thomson.Opensource@diasemi.com X-Msg-Ref: server-12.tower-193.messagelabs.com!1511273267!111995091!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:07:46 +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: <20171121140746.E26F33FBAC@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