From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7524DC54E76 for ; Mon, 20 Nov 2023 09:18:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=M1teruFP9i9kfuvWPBeTZLEBjhF5w2GLdhl60Ttma8g=; b=PnNVhO4uh0F0/G 3mlBbnnA0FYFiIpmUwQN0QysmE16IpNiuQjWqznZ4kcqbJNglVtmGpUunYGYa/HqT6klo59z0JDId 1MlBPRtCreocky5oyR7kn0D2uVEiskn9ejIjx9vzd1rezfTC6mKtkoEO9lRSVqESlEtA6lUxhb4ne baCoSl0Sswkqk2clIKRB3nANrlzPdzEXf1Gk/RLdtpimGx7a3kp2l3Buy3LRamZU2gFuDr5iD1zhg YJ8g4oCTI0GPeUutNlJLa+lOQjJiPBPrmipHKg+/xb9KkpC+8h532fK1CmXLwii/MhzHsBab0pMhp N6bfXXSJ2ZDiK0Kd8TfA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r50Pp-00Bd0b-1z; Mon, 20 Nov 2023 09:18:01 +0000 Received: from mail-pg1-x532.google.com ([2607:f8b0:4864:20::532]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r50Pm-00Bcyh-00 for linux-arm-kernel@lists.infradead.org; Mon, 20 Nov 2023 09:17:59 +0000 Received: by mail-pg1-x532.google.com with SMTP id 41be03b00d2f7-5bdbe2de25fso3167726a12.3 for ; Mon, 20 Nov 2023 01:17:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1700471873; x=1701076673; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=tdiBbtmZINpiK2wrkr8560HBNxLICLlfhPzVnTah2sg=; b=fqBZqJrvG0KS6YPIAVDsxO+/XuPJD+fsij6BRy00JnOvPrsVFZ5F1/8lfyyeOcIJGM ywicodWPXxFbT1p+RlyFPU3ucEtHq0YQqatODL2bIqYs591t6owJGYTc3utqDMylQPXm eX8w5UrA041z13BZITQTH+GdqZCzPFnAuUlznGZQfeG0EeAqABSI85LGMaJJP176Qnvo gSkt0c9bAOHkqWMMsXa5i8odrrNPzE2zipMbMkdwtApPLknaBf/Vj9Yn79LwXiBEeUh+ epamMuCbFm9nku7eL7GD4SdLG7HuTODjw+0tlcSckdbAtTS+QeZS+pq69/O+pIAnBpZ1 wt4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700471873; x=1701076673; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=tdiBbtmZINpiK2wrkr8560HBNxLICLlfhPzVnTah2sg=; b=YGFQUJvvfiyPQk6PZU881IxthS/c3HKZsArc6guyNLt9KY2+iGPwOrToL9moLrurWD fm/HHDXWqBJFfD3trAb+sgw1KQP+f+G4dlWBKctxJv1zvgBOU85zNOiKiG1Y785h6AfE MpHtFPGHXJIXWlmDXymv+8Py4h+c8wBgOWE+EK11IEuoGJOz2yh46S5229Ad1Hbges/r 1cy829ZqCvZZVadO+/wm9l75033EC8EFQOF7cdthbG47r9RMAYaI4A936+6BEFQD6urH cC41FGUVB9kIf+jsK7LA6+z9ZA6U3bnfV1L5smECcKrFvM4TC38vbg6RZTY1JaARfbX8 bk2Q== X-Gm-Message-State: AOJu0YxEqF9RVZIkRt8Er2x/Sr4NhtWyOgSD0mSC4zBHwMU3cCInHX07 ldw81jnBYUxCqSKYev13aXfglpC+2Xo= X-Google-Smtp-Source: AGHT+IEp+cuTi7iFRTT+hATic2jTuRdHoJOGZ8nbXlJYs561PX9JAj/1CEyo7iX6uiwbF8PlbiVoTA== X-Received: by 2002:a05:6a20:4429:b0:188:75c:e69a with SMTP id ce41-20020a056a20442900b00188075ce69amr10006442pzb.4.1700471872866; Mon, 20 Nov 2023 01:17:52 -0800 (PST) Received: from cosmo-ubuntu-2204.dhcpserver.bu9bmc.local (1-34-21-66.hinet-ip.hinet.net. [1.34.21.66]) by smtp.gmail.com with ESMTPSA id j12-20020a056a00130c00b0068fece22469sm5582116pfu.4.2023.11.20.01.17.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Nov 2023 01:17:52 -0800 (PST) From: Cosmo Chou To: brendan.higgins@linux.dev, benh@kernel.crashing.org, joel@jms.id.au, andi.shyti@kernel.org, andrew@codeconstruct.com.au, linux@roeck-us.net, wsa@kernel.org, jae.hyun.yoo@linux.intel.com Cc: linux-i2c@vger.kernel.org, openbmc@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, linux-kernel@vger.kernel.org, chou.cosmo@gmail.com, cosmo.chou@quantatw.com Subject: [PATCH] i2c: aspeed: Acknowledge Tx ack late when in SLAVE_READ_PROCESSED Date: Mon, 20 Nov 2023 17:17:46 +0800 Message-Id: <20231120091746.2866232-1-chou.cosmo@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231120_011758_134575_F774A42A X-CRM114-Status: GOOD ( 14.41 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org commit 2be6b47211e1 ("i2c: aspeed: Acknowledge most interrupts early in interrupt handler") moved most interrupt acknowledgments to the start of the interrupt handler to avoid race conditions. However, slave Tx ack status shouldn't be cleared before SLAVE_READ_PROCESSED is handled. Acknowledge Tx ack status after handling SLAVE_READ_PROCESSED to fix the problem that the next byte is not sent correctly. Fixes: 2be6b47211e1 ("i2c: aspeed: Acknowledge most interrupts early in interrupt handler") Signed-off-by: Cosmo Chou --- drivers/i2c/busses/i2c-aspeed.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c index 28e2a5fc4528..c2d74e4b7e50 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -337,6 +337,12 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) break; } + /* Ack Tx ack */ + if (irq_handled & ASPEED_I2CD_INTR_TX_ACK) { + writel(ASPEED_I2CD_INTR_TX_ACK, bus->base + ASPEED_I2C_INTR_STS_REG); + readl(bus->base + ASPEED_I2C_INTR_STS_REG); + } + return irq_handled; } #endif /* CONFIG_I2C_SLAVE */ @@ -602,13 +608,18 @@ static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id) { struct aspeed_i2c_bus *bus = dev_id; - u32 irq_received, irq_remaining, irq_handled; + u32 irq_received, irq_remaining, irq_handled, irq_acked; spin_lock(&bus->lock); irq_received = readl(bus->base + ASPEED_I2C_INTR_STS_REG); /* Ack all interrupts except for Rx done */ - writel(irq_received & ~ASPEED_I2CD_INTR_RX_DONE, - bus->base + ASPEED_I2C_INTR_STS_REG); + irq_acked = irq_received & ~ASPEED_I2CD_INTR_RX_DONE; +#if IS_ENABLED(CONFIG_I2C_SLAVE) + /* shouldn't ack Slave Tx Ack before it's handled */ + if (bus->slave_state == ASPEED_I2C_SLAVE_READ_PROCESSED) + irq_acked &= ~ASPEED_I2CD_INTR_TX_ACK; +#endif + writel(irq_acked, bus->base + ASPEED_I2C_INTR_STS_REG); readl(bus->base + ASPEED_I2C_INTR_STS_REG); irq_received &= ASPEED_I2CD_INTR_RECV_MASK; irq_remaining = irq_received; -- 2.34.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel