From patchwork Wed Jun 30 14:11:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alain Volmat X-Patchwork-Id: 1498919 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-i2c-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=foss.st.com header.i=@foss.st.com header.a=rsa-sha256 header.s=selector1 header.b=OzlaYzzC; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4GFNc21MQWz9sT6 for ; Thu, 1 Jul 2021 00:13:22 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235216AbhF3OPp (ORCPT ); Wed, 30 Jun 2021 10:15:45 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:26818 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235133AbhF3OPl (ORCPT ); Wed, 30 Jun 2021 10:15:41 -0400 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 15UECxYD020784; Wed, 30 Jun 2021 16:12:59 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=5I8tQSLMXAAujkR8soP/b4U1k8eGZouqFSb3xx1crDs=; b=OzlaYzzC8Qdgb+NmR6xBHm2yf14Kpc9X+zqnTpeneVzw79d7aT9y1ugWNRtcIqncSzTi liXCD9JeH20nqncXJHBARvv08O6vJErYRxf25wA8KAhQRFyWbIK8PXHqIbhfdbpGzmzI zsxFjgmC7/RyxqIhRAu/iuI8tom7PIyr7UZYRmCAnKxDPOjsBDPp441/0MaPwLYeCu5+ jf3Z2Yae10PnFwpG1Nv081LQfowbG2h0DT4x7KoP3cVxk/TIV6kj56yaKJrg/t/SrnGe vFUg2Vv7ukPLXtWoanu6CWoTbKEeTc8F0gsrcpbQDX/hodZbP8fTPMB9u1VRi8weIBEn LA== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 39gn11a5gn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 30 Jun 2021 16:12:58 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 253C510002A; Wed, 30 Jun 2021 16:12:57 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node3.st.com [10.75.127.6]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 1A5E523151C; Wed, 30 Jun 2021 16:12:57 +0200 (CEST) Received: from localhost (10.75.127.50) by SFHDAG2NODE3.st.com (10.75.127.6) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Jun 2021 16:12:56 +0200 From: Alain Volmat To: , CC: , , , , , , , Subject: [PATCH 1/3] i2c: stm32f7: recover the bus on access timeout Date: Wed, 30 Jun 2021 16:11:41 +0200 Message-ID: <1625062303-15327-2-git-send-email-alain.volmat@foss.st.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1625062303-15327-1-git-send-email-alain.volmat@foss.st.com> References: <1625062303-15327-1-git-send-email-alain.volmat@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.50] X-ClientProxiedBy: SFHDAG2NODE1.st.com (10.75.127.4) To SFHDAG2NODE3.st.com (10.75.127.6) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-06-30_06:2021-06-29,2021-06-30 signatures=0 Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org When getting an access timeout, ensure that the bus is in a proper state prior to returning the error. Fixes: aeb068c57214 ("i2c: i2c-stm32f7: add driver") Signed-off-by: Alain Volmat --- drivers/i2c/busses/i2c-stm32f7.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c index b9b19a2a2ffa..d596733136c3 100644 --- a/drivers/i2c/busses/i2c-stm32f7.c +++ b/drivers/i2c/busses/i2c-stm32f7.c @@ -1702,6 +1702,7 @@ static int stm32f7_i2c_xfer(struct i2c_adapter *i2c_adap, i2c_dev->msg->addr); if (i2c_dev->use_dma) dmaengine_terminate_all(dma->chan_using); + stm32f7_i2c_wait_free_bus(i2c_dev); ret = -ETIMEDOUT; } @@ -1751,6 +1752,7 @@ static int stm32f7_i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, dev_dbg(dev, "Access to slave 0x%x timed out\n", f7_msg->addr); if (i2c_dev->use_dma) dmaengine_terminate_all(dma->chan_using); + stm32f7_i2c_wait_free_bus(i2c_dev); ret = -ETIMEDOUT; goto pm_free; } From patchwork Wed Jun 30 14:11:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alain Volmat X-Patchwork-Id: 1498918 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-i2c-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=foss.st.com header.i=@foss.st.com header.a=rsa-sha256 header.s=selector1 header.b=WYTNDmsf; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4GFNbx3qqtz9sT6 for ; Thu, 1 Jul 2021 00:13:17 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234851AbhF3OPn (ORCPT ); Wed, 30 Jun 2021 10:15:43 -0400 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:38192 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S235116AbhF3OPk (ORCPT ); Wed, 30 Jun 2021 10:15:40 -0400 Received: from pps.filterd (m0046661.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 15UEClFe019668; Wed, 30 Jun 2021 16:12:58 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=vwmnhmTHKfjU0Z6OnQKzznj0YzS9IAT39KjKpR8LzIE=; b=WYTNDmsfCzL/d7MHJKqishFkpACc0qMLpR2ZaXvqw2vMsyNoNfW7LrCsBzEJScTPmqie wjx/rLtgq9xTWyi58xMp7RJZ1GzFEaHyYl+8TCmrZXB9CZfqQZAPwPM9Tzo2p21Jsb5V pbvqx+Pg7louPI2JzsI0Z5uwsPKisbE4ayw1M8mwQKIt1vo098h0qFO2Wow1sNoujCHj NRpngEOr1XHAjBOZnjnh0ltokYKV98icUHRT6UiFJcGuAjg2ytlpVX17DmENYM2SrQL5 IHXHvPs4ZR0UhCTlsPdxk3Whr2pYCvSEs6e3AX0xiF/jGT76QxbeWFIuothuyJBQwQWU hw== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 39gnbpjpf3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 30 Jun 2021 16:12:58 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 88C93100039; Wed, 30 Jun 2021 16:12:57 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node3.st.com [10.75.127.6]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 7B22923151F; Wed, 30 Jun 2021 16:12:57 +0200 (CEST) Received: from localhost (10.75.127.48) by SFHDAG2NODE3.st.com (10.75.127.6) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Jun 2021 16:12:56 +0200 From: Alain Volmat To: , CC: , , , , , , , Subject: [PATCH 2/3] i2c: stm32f7: flush TX FIFO upon transfer errors Date: Wed, 30 Jun 2021 16:11:42 +0200 Message-ID: <1625062303-15327-3-git-send-email-alain.volmat@foss.st.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1625062303-15327-1-git-send-email-alain.volmat@foss.st.com> References: <1625062303-15327-1-git-send-email-alain.volmat@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.48] X-ClientProxiedBy: SFHDAG2NODE1.st.com (10.75.127.4) To SFHDAG2NODE3.st.com (10.75.127.6) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-06-30_06:2021-06-29,2021-06-30 signatures=0 Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org While handling an error during transfer (ex: NACK), it could happen that the driver has already written data into the TX Fifo before the transfer get stopped. This commit add FIFO Flush after end of transfer in case of error to avoid sending a wrong data on any other slave upon next transfer. Fixes: aeb068c57214 ("i2c: i2c-stm32f7: add driver") Signed-off-by: Alain Volmat --- drivers/i2c/busses/i2c-stm32f7.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c index d596733136c3..0d99c075deb2 100644 --- a/drivers/i2c/busses/i2c-stm32f7.c +++ b/drivers/i2c/busses/i2c-stm32f7.c @@ -1696,6 +1696,15 @@ static int stm32f7_i2c_xfer(struct i2c_adapter *i2c_adap, time_left = wait_for_completion_timeout(&i2c_dev->complete, i2c_dev->adap.timeout); ret = f7_msg->result; + if (ret) { + /* + * It is possible that some unsent data have already been + * written in the TX Fifo. To avoid sending old data in a + * further transfer, flush FIFO in case of any error + */ + writel_relaxed(STM32F7_I2C_ISR_TXE, + i2c_dev->base + STM32F7_I2C_ISR); + } if (!time_left) { dev_dbg(i2c_dev->dev, "Access to slave 0x%x timed out\n", @@ -1745,8 +1754,16 @@ static int stm32f7_i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, timeout = wait_for_completion_timeout(&i2c_dev->complete, i2c_dev->adap.timeout); ret = f7_msg->result; - if (ret) + if (ret) { + /* + * It is possible that some unsent data have already been + * written in the TX Fifo. To avoid sending old data in a + * further transfer, flush FIFO in case of any error + */ + writel_relaxed(STM32F7_I2C_ISR_TXE, + i2c_dev->base + STM32F7_I2C_ISR); goto pm_free; + } if (!timeout) { dev_dbg(dev, "Access to slave 0x%x timed out\n", f7_msg->addr); From patchwork Wed Jun 30 14:11:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alain Volmat X-Patchwork-Id: 1498920 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-i2c-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=foss.st.com header.i=@foss.st.com header.a=rsa-sha256 header.s=selector1 header.b=Z1d9v2V2; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4GFNc30qPQz9sRf for ; Thu, 1 Jul 2021 00:13:23 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235271AbhF3OPt (ORCPT ); Wed, 30 Jun 2021 10:15:49 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:49320 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235088AbhF3OPl (ORCPT ); Wed, 30 Jun 2021 10:15:41 -0400 Received: from pps.filterd (m0241204.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 15UEAY0h002860; Wed, 30 Jun 2021 16:12:58 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=2vk0SM1w1rYwBoKsGyRqoKEvl040SvG0KTlIbUrKgsc=; b=Z1d9v2V2HDrqhk0MZUnAz3mbRajKOrOhUStToRb4SFG4plLLFkABzrzbvm3vF6p2ZJkQ 8mAL1QZXGXVJerZ4E94/hRGdgTANjyqGNo1RgAfvE+24aa92S3mMwmuTizzuiIcXAttR Q2zBtFHhBxr1OliAftxJELttwA7le6qd6X/vNKKoww+qhcHkChQXm8FX2ldCrORgh8l1 nJiW3SRWXnHeZThK3CD184V/9oQNUwSnCeeFpye+x+HmhpoPJ951VWP+fQ/RPFmcSFHu cngiVrGseXFTM0rryX7Y7yi2sHLNmdoPama/w4SJaeuSZve1zKvxtJtVhB3AVMMIgU5l Ow== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 39g4kpy7f2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 30 Jun 2021 16:12:58 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id EF43810003A; Wed, 30 Jun 2021 16:12:57 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node3.st.com [10.75.127.6]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id E465F23151D; Wed, 30 Jun 2021 16:12:57 +0200 (CEST) Received: from localhost (10.75.127.48) by SFHDAG2NODE3.st.com (10.75.127.6) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Jun 2021 16:12:57 +0200 From: Alain Volmat To: , CC: , , , , , , , Subject: [PATCH 3/3] i2c: stm32f7: prevent calling slave handling if no slave running Date: Wed, 30 Jun 2021 16:11:43 +0200 Message-ID: <1625062303-15327-4-git-send-email-alain.volmat@foss.st.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1625062303-15327-1-git-send-email-alain.volmat@foss.st.com> References: <1625062303-15327-1-git-send-email-alain.volmat@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.48] X-ClientProxiedBy: SFHDAG1NODE2.st.com (10.75.127.2) To SFHDAG2NODE3.st.com (10.75.127.6) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-06-30_06:2021-06-29,2021-06-30 signatures=0 Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Slave interrupt handler should only be called if there is actually a slave registered and running to avoid accessing an invalid pointer. Without this commit, an OOPS can be generated due to a NULL ptr dereference while receiving an IT when there is no master transfer and no slave running: - stm32f7_i2c_isr_event - no master_mode hence calling stm32f7_i2c_slave_isr_event - access to i2c_dev->slave_running leading to oops due to slave_running being NULL. Fixes: 60d609f30de2 ("i2c: i2c-stm32f7: Add slave support") Signed-off-by: Alain Volmat --- drivers/i2c/busses/i2c-stm32f7.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c index 0d99c075deb2..2cc9bb0f6d7f 100644 --- a/drivers/i2c/busses/i2c-stm32f7.c +++ b/drivers/i2c/busses/i2c-stm32f7.c @@ -1497,10 +1497,14 @@ static irqreturn_t stm32f7_i2c_isr_event(int irq, void *data) u32 status, mask; int ret = IRQ_HANDLED; - /* Check if the interrupt if for a slave device */ + /* Check if the interrupt is for a slave device */ if (!i2c_dev->master_mode) { - ret = stm32f7_i2c_slave_isr_event(i2c_dev); - return ret; + if (i2c_dev->slave_running) + return stm32f7_i2c_slave_isr_event(i2c_dev); + + dev_warn_ratelimited(i2c_dev->dev, + "Unexpected IT received: ISR:0x%x\n", + readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR)); } status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);