From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4E567399CFD for ; Thu, 9 Jul 2026 04:21:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783570867; cv=none; b=rFHROBWeh0Dp27ZHESS7uVxjaYMH+J2wGT5jyiz6X+lmn2M3s0G1JBIt7kShoj5s+pnxi7rxw47haTL3ELj30Axgz5Mpbz1AeeFAMZenXJ4qVwtLDcl7LYrmI2T2C8Rob1eIouV/jWj1IEbngHRDt4XFAyc5BrGIMSY/Y6Lx+04= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783570867; c=relaxed/simple; bh=x/+r0WCxXhtvsxLk0MJfIGA9DJGnCC94KwQw1Pqe8RE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rDZM3nPhbBLCzRUCJY4BbxuJ11GPdSdapSroZXv+49UIZJiglouiRMeWYKAeGpsMZKH2o53psEm6ynnYLPhdmyMC+ZKr4iM+uabPL5RBpa14H+3ECbSGs73RXQs4E/LXbFQd/ntzZUz4D01XqBURHKL0M6l9TPun6/NjHjLsYVA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ETWhkHh/; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=khLjsrV5; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ETWhkHh/"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="khLjsrV5" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 668N8rBB000664 for ; Thu, 9 Jul 2026 04:21:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= qdxbWtKb1vLZTfYD2ty+3H1szGedPOtaWbhOclXrueQ=; b=ETWhkHh/zslQr61a vNwiAk4RxaPhhieDbVwzKuxyF50idQ2B+hZqj1ZJMGiS/WpCh7EovF7VVNKCZwVb FlCjdKOTfENW0ynXfoqjF5BXBZVbxKhGDtMOcB1uve2/MOQqagPNd57DFSa1190R Q4RNopiTVKK6qHVrrW7GNikVkYIE/7e3/HUU2h+I4IPdcBJmuQYJlyKXcMp2c2zL WxOV6AuY8B5luBNKXFlwapLUGkFu8lq2EDy4uYFT3C1CTrN571nu0tacpQ+kevVz nLXuYWbvXjTIxQ/hoTa1Q0+0QwLwCmSm3IvS5MrUmHF+0qPA5n/pW9XAZBdObW+A SPkIBQ== Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4f9urvsqtu-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 09 Jul 2026 04:21:04 +0000 (GMT) Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-c891ed872ddso2487646a12.2 for ; Wed, 08 Jul 2026 21:21:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1783570863; x=1784175663; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=qdxbWtKb1vLZTfYD2ty+3H1szGedPOtaWbhOclXrueQ=; b=khLjsrV5SFGrr9qzuit/BsX+ShB+4rq52xYvkkxU5mm8E+iyMbnZHQiWu1OIHUjlkn aTD+Cu3z8pj/VQHW6jfOhsD3tGSsItw4auv1NcIpwdK2rhNjvpxeBgYxYQq77RnBQWC1 dElo94yyNoHi6ZLA6Ze8iKKLtHMhWGMsL3ZQB3TkvJBxuW9F2HKMiQTtLnVxuibwi0ON Fce5gZEHz/rryAGHWUX5ZJEhhlyE9Hui46km2pM98Du64cx76bWGZ9+hcf4RRD0RbkW0 REEbxajG/A/Qw7UuZNF/U45fmZnL8yt71OkoJEXKFut56IHKlfrCphOR16fhfH1rd48x AjAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783570863; x=1784175663; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=qdxbWtKb1vLZTfYD2ty+3H1szGedPOtaWbhOclXrueQ=; b=rc37E+HEP7B7rWO92abdBLZyhyZUOiaYbTcjv+mAilsxkQH4YcBL6DDIRfmjx4xnlA HGl1Uo0/IbJroTYJIDCV22XZJanrWFHBEfsSdjBsokYeAST4/lP7VyXlWqvWXavDUpmn ljGVapTisSoHNVrKxPU9FqegcvKgIzV4LxzUlEee/siYsHE8JnZsgXsyBMBf5gvfdU8X GBza1dzH3tjypWS/LVzdmObpiY6DV4rUQ7wUz/HwNPCMzCKWMEztg2XP9k0pxFisdGQm VAv/dZ9NCD5cmYrJPIgVcTQ3FAJMae8GjHUtpvTqaV6OuWTSa+qHFFoBcDZp1HdO4kPr 31Ig== X-Forwarded-Encrypted: i=1; AHgh+Rqi5+m6GGFs8MlmPtCw3FmCTOBklzhNuekF9sEF5QQSZehsM5y8NZ9lGx3stBs8b7E1/SwlD3/He4PeOSE=@vger.kernel.org X-Gm-Message-State: AOJu0Yzo9kYFotdWvIPspUj8jPROPI29xSGfuDYeqan2AuTyln/zUDRz KWSRvyPXNejYsvD7bmr3CigX4HQAaPGGeA71843W6dd9Wusf9u8z12p/WykgOigeG5adG6uJdE5 C50L3FghXCmaydLWtRCBht/PvXl3G937hHnKqvberqBOTk9ouN3mq/OKNzb7Hf54Rqqk= X-Gm-Gg: AfdE7ckEuvkIHeXFWTbF3+rlQaKz1UPsiGiN7dc74sQkJ00r+SB/KlT3cHbAlqtLm3D Kye6hH485++maFeZXj1v0mRwSTDdiOHVn4w4Ao85PtxOQu/y4SBucUJM14SrZI1EVJPvfXoWYae SUjW0+eSRKxUnN4XCfSVi0oAAWi17WhmoZGNXJwwChLUR5gCP4MO0mWEXJKqEZnZPAeDV0w9YZk vSulitBION8pvQ1iXuInP7mGvnmS5P4Pkni4uSEjglAZpCQMtEClb+WS5U3222YfwH20U9yka11 rwkOMcuiqJD16RQKWMFyfJJ6GU4ZzdjCB+lJcLQ+qz1HgA0/Vmc0Y3OCtLWzQokyJQP02ZF15Au rzSJtmAeQtKpHy3/7BF3b0IgCn9Vve9sTGbP9RimDE0vX X-Received: by 2002:a05:6a21:7482:b0:3b4:669c:ee32 with SMTP id adf61e73a8af0-3c0bcbc1353mr6751627637.37.1783570863213; Wed, 08 Jul 2026 21:21:03 -0700 (PDT) X-Received: by 2002:a05:6a21:7482:b0:3b4:669c:ee32 with SMTP id adf61e73a8af0-3c0bcbc1353mr6751582637.37.1783570862650; Wed, 08 Jul 2026 21:21:02 -0700 (PDT) Received: from hu-ptalari-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-311747f596asm25490098eec.2.2026.07.08.21.20.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jul 2026 21:21:02 -0700 (PDT) From: Praveen Talari Date: Thu, 09 Jul 2026 09:50:42 +0530 Subject: [PATCH v2 3/3] i2c: qcom-geni: distinguish address-phase and data-phase NACK Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260709-fix_cancel_sequence_on_failure_for_i2c-v2-3-1db178c695bb@oss.qualcomm.com> References: <20260709-fix_cancel_sequence_on_failure_for_i2c-v2-0-1db178c695bb@oss.qualcomm.com> In-Reply-To: <20260709-fix_cancel_sequence_on_failure_for_i2c-v2-0-1db178c695bb@oss.qualcomm.com> To: Mukesh Kumar Savaliya , Viken Dadhaniya , Andi Shyti Cc: linux-arm-msm@vger.kernel.org, linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Praveen Talari , Naresh Maramaina X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1783570849; l=4782; i=praveen.talari@oss.qualcomm.com; s=20251114; h=from:subject:message-id; bh=x/+r0WCxXhtvsxLk0MJfIGA9DJGnCC94KwQw1Pqe8RE=; b=Oo938cWNx5pvZgK8W1p87S7pXAl/lGcTpZBp5riU+IBimPSduPLPbIKl6d96vZI0q6OIHZLFn n/FfwrpDK15A3965ibUOSic2+UnKGOFGY92ZRIFjyxgSkdykzMWDS3n X-Developer-Key: i=praveen.talari@oss.qualcomm.com; a=ed25519; pk=NGK/88fjyHXgfhIKwag7+uIytOmyOypvZ/hDFaYPEss= X-Proofpoint-Spam-Info: AW1haW4tMjYwNzA5MDAzNyBTYWx0ZWRfX8VIAc3AXJaOf 4Xivs7MRA8BwmWIP+hMn567+6SSIdzIO9XB86DFBlC1HYbps0AfQPvNwY8s8HM8ackWZm/3MdCd KnjBGOyxAsRhBc/M4b9noUGCaxJcjEE= X-Proofpoint-GUID: mgTdcVbdLp3M4VwlfPaBG7vaqwA1N8xf X-Proofpoint-ORIG-GUID: mgTdcVbdLp3M4VwlfPaBG7vaqwA1N8xf X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzA5MDAzNyBTYWx0ZWRfX27rKu9zMlWtf j2z2lw0gReaBoqw+Rjl78ZRYNDdB5yBWB46MdiSuFjWZq216xY82d8K8YOQGlKPsbXeFAc1o88C CmdYtcE7jR1ZJ0WtYDxseJ1IrFS82A5MJ2iBJkknRyEAMi6ve+Fxwj0Pde/lZa9ntbUvpVysYJo OvoGnPj27UFli/ey/cyvjWyj8VpxJ1hqXP8IogaQ5RYvpgR/4oj/E0ewC0vCL7CHKYROYSbBpRH H2TXi/l01Gj4Bv9IF7Tw74roHkhvHE8vnWRXyjKPyqrlHzR4RAx4wBa+Rz0N7coiETMqDY3O2mS 3Cq7Y0jb8/KZHQFX1TXUe1PK8PHVUyVVuIWs40tiFdZ6QHYgtfsK0FayWDYz1OsaT4AvKWNESL6 jHTvZgdmye2i5K/cVg9aW2yMy64FUVnv8YyaQg97jYKlxWKFkD+dShL+GcA+k2ODe08Xv6tfd6R lwIhcOSKLEy8XTmN4dg== X-Authority-Analysis: v=2.4 cv=H43rBeYi c=1 sm=1 tr=0 ts=6a4f21b0 cx=c_pps a=oF/VQ+ItUULfLr/lQ2/icg==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=wcK_sNrN2goZDBkbqrQA:9 a=QEXdDO2ut3YA:10 a=3WC7DwWrALyhR5TkjVHa:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-08_05,2026-07-08_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 impostorscore=0 adultscore=0 spamscore=0 phishscore=0 bulkscore=0 priorityscore=1501 malwarescore=0 lowpriorityscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607090037 The M_GP_IRQ_1 interrupt signals a NACK condition, but does not distinguish whether it occurred during the address phase or the data phase. The driver always attempted cancel and DMA FSM reset on any NACK, which is incorrect for an address NACK since the DMA engine was never armed and the hardware requires no recovery. Add geni_i2c_check_addr_data_nack() to distinguish the two cases by reading SE_GENI_M_GP_LENGTH after the NACK event. A zero value means the address phase was NACKed (ADDR_NACK) and no DMA recovery is needed. A non-zero value on a write transfer means a data byte was NACKed (DATA_NACK) and the normal cancel and DMA FSM reset path must run. Co-developed-by: Naresh Maramaina Signed-off-by: Naresh Maramaina Signed-off-by: Praveen Talari --- drivers/i2c/busses/i2c-qcom-geni.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c index 9490aee4928c..b1cd027b5ff2 100644 --- a/drivers/i2c/busses/i2c-qcom-geni.c +++ b/drivers/i2c/busses/i2c-qcom-geni.c @@ -56,7 +56,8 @@ enum geni_i2c_err_code { GP_IRQ0, - NACK, + ADDR_NACK, + DATA_NACK, GP_IRQ2, BUS_PROTO, ARB_LOST, @@ -67,7 +68,7 @@ enum geni_i2c_err_code { GENI_TIMEOUT, }; -#define DM_I2C_CB_ERR ((BIT(NACK) | BIT(BUS_PROTO) | BIT(ARB_LOST)) \ +#define DM_I2C_CB_ERR ((BIT(ADDR_NACK) | BIT(BUS_PROTO) | BIT(ARB_LOST)) \ << 5) #define I2C_AUTO_SUSPEND_DELAY 250 @@ -143,7 +144,8 @@ struct geni_i2c_err_log { static const struct geni_i2c_err_log gi2c_log[] = { [GP_IRQ0] = {-EIO, "Unknown I2C err GP_IRQ0"}, - [NACK] = {-ENXIO, "NACK: slv unresponsive, check its power/reset-ln"}, + [ADDR_NACK] = {-ENXIO, "NACK: slv unresponsive, check its power/reset-ln"}, + [DATA_NACK] = {-EIO, "Data NACK: device NACK before end of TX"}, [GP_IRQ2] = {-EIO, "Unknown I2C err GP IRQ2"}, [BUS_PROTO] = {-EPROTO, "Bus proto err, noisy/unexpected start/stop"}, [ARB_LOST] = {-EAGAIN, "Bus arbitration lost, clock line undriveable"}, @@ -258,7 +260,8 @@ static void geni_i2c_err(struct geni_i2c_dev *gi2c, int err) switch (err) { case GENI_ABORT_DONE: - case NACK: + case ADDR_NACK: + case DATA_NACK: case GENI_TIMEOUT: dev_dbg(gi2c->se.dev, "%s\n", gi2c_log[err].msg); break; @@ -269,6 +272,14 @@ static void geni_i2c_err(struct geni_i2c_dev *gi2c, int err) } } +static void geni_i2c_check_addr_data_nack(struct geni_i2c_dev *gi2c) +{ + if (!readl_relaxed(gi2c->se.base + SE_GENI_M_GP_LENGTH)) + geni_i2c_err(gi2c, ADDR_NACK); + else if (!(gi2c->cur->flags & I2C_M_RD)) + geni_i2c_err(gi2c, DATA_NACK); +} + static irqreturn_t geni_i2c_irq(int irq, void *dev) { struct geni_i2c_dev *gi2c = dev; @@ -294,7 +305,7 @@ static irqreturn_t geni_i2c_irq(int irq, void *dev) m_stat & (M_CMD_FAILURE_EN | M_CMD_ABORT_EN) || dm_rx_st & (DM_I2C_CB_ERR)) { if (m_stat & M_GP_IRQ_1_EN) - geni_i2c_err(gi2c, NACK); + geni_i2c_check_addr_data_nack(gi2c); if (m_stat & M_GP_IRQ_3_EN) geni_i2c_err(gi2c, BUS_PROTO); if (m_stat & M_GP_IRQ_4_EN) @@ -443,7 +454,7 @@ static void geni_i2c_rx_msg_cleanup(struct geni_i2c_dev *gi2c, { gi2c->cur_rd = 0; if (gi2c->dma_buf) { - if (gi2c->err) + if (gi2c->err && gi2c->err != gi2c_log[ADDR_NACK].err) geni_i2c_rx_fsm_rst(gi2c); geni_se_rx_dma_unprep(&gi2c->se, gi2c->dma_addr, gi2c->xfer_len); i2c_put_dma_safe_msg_buf(gi2c->dma_buf, cur, !gi2c->err); @@ -455,7 +466,7 @@ static void geni_i2c_tx_msg_cleanup(struct geni_i2c_dev *gi2c, { gi2c->cur_wr = 0; if (gi2c->dma_buf) { - if (gi2c->err) + if (gi2c->err && gi2c->err != gi2c_log[ADDR_NACK].err) geni_i2c_tx_fsm_rst(gi2c); geni_se_tx_dma_unprep(&gi2c->se, gi2c->dma_addr, gi2c->xfer_len); i2c_put_dma_safe_msg_buf(gi2c->dma_buf, cur, !gi2c->err); @@ -493,7 +504,7 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, cur = gi2c->cur; time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); - if (!time_left) + if (!time_left || (gi2c->err && gi2c->err != gi2c_log[ADDR_NACK].err)) geni_i2c_cancel_xfer(gi2c); geni_i2c_rx_msg_cleanup(gi2c, cur); @@ -535,7 +546,7 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, cur = gi2c->cur; time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); - if (!time_left) + if (!time_left || (gi2c->err && gi2c->err != gi2c_log[ADDR_NACK].err)) geni_i2c_cancel_xfer(gi2c); geni_i2c_tx_msg_cleanup(gi2c, cur); -- 2.34.1