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 CCD4BFEFB5B for ; Fri, 27 Feb 2026 14:12:17 +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:References:In-Reply-To: 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: List-Owner; bh=B5KdITLpHeG0r3ky+ovTh47VEe3y2ts/ZvmWnMOdd+I=; b=tev+4lNEO+h+6/ 34nmHqbfF5PudGqen+tcCrzmef5MekpXyhIvGtmZQIdBxmQwxf8kzWDF/iEZKdlP2AZ9i+v2EzBJ+ bFLg0+kF2Sikd1Cv4oU13lPzqmftG5IeyqWV2h+j0AtYKvDrF0euccMg9Oq4dQXcDu58GPwvO8pcf S+KgQM7eDUjPY8XZw5ZTmSJV4MRvD5eLXOmezUFkNGdYqhTuDGKM6HoCtbIEOdpkQ018mVBme6YVO ScIwmdlEGDpkH4rSLVkzn/JqOP9twB3RoDQ2gY8f71iLLHG/AlTr0fmDK9Bbe9647AZgDPkHumHKZ HMvWXrtq3PlZN96F4wog==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vvyZl-00000008TX7-2Qxe; Fri, 27 Feb 2026 14:12:17 +0000 Received: from mgamail.intel.com ([192.198.163.7]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1vvyZh-00000008TRS-3UWp for linux-i3c@lists.infradead.org; Fri, 27 Feb 2026 14:12:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1772201534; x=1803737534; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=qKBg3PlaHQoGxLo0cK9ROAxj6+95EvSNJTVBY3FQt+o=; b=NHHCFDv5w3pCtUfEU1hufKD14+4OUqmSFVZPaS15H+rsOcMCia8o7VEG l3s0dT1VRNLHQ8WPmQ5jI+/mFO9iQ9chIAi/xDt89rNqEvrDUuuspXmet lXXucasXrRBBQPbqJbZPi7OdLk7jwN447ZqcMmU1orn3mhDZrZdTtAhwi sh47WfAEdE803BQcER/i7ALQtd0uDaeGORokHZGSBv0aOIG8CYTgtgBBg Igg5BE0CwzxU2PGJaorkoAtCz7sXY8R0KgGPfQ4q5LIYdN0qCDyDdBR+Y QgVg3f4jTk/xgMXrq1P949HhN29Nimf/eT9CEHXHHMF/tq9ITtFA7e9iN w==; X-CSE-ConnectionGUID: KLLHrnjoQXqYDJ11XQbz3Q== X-CSE-MsgGUID: DWJU7A7aT1S5K1MtjzR4jQ== X-IronPort-AV: E=McAfee;i="6800,10657,11714"; a="98750036" X-IronPort-AV: E=Sophos;i="6.21,314,1763452800"; d="scan'208";a="98750036" Received: from orviesa007.jf.intel.com ([10.64.159.147]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Feb 2026 06:12:10 -0800 X-CSE-ConnectionGUID: LFxjzuwoQSuAbj9Dht57oQ== X-CSE-MsgGUID: sXiam1TiSgq0E2Ee4rY7gw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,314,1763452800"; d="scan'208";a="217015676" Received: from egrumbac-mobl6.ger.corp.intel.com (HELO ahunter6-desk) ([10.245.245.80]) by orviesa007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Feb 2026 06:12:09 -0800 From: Adrian Hunter To: alexandre.belloni@bootlin.com Cc: Frank.Li@nxp.com, linux-i3c@lists.infradead.org Subject: [PATCH 06/12] i3c: mipi-i3c-hci: Correct RING_CTRL_ABORT handling in DMA dequeue Date: Fri, 27 Feb 2026 16:11:43 +0200 Message-ID: <20260227141149.184980-7-adrian.hunter@intel.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260227141149.184980-1-adrian.hunter@intel.com> References: <20260227141149.184980-1-adrian.hunter@intel.com> MIME-Version: 1.0 Organization: Intel Finland Oy, Registered Address: c/o Alberga Business Park, 6 krs, Bertel Jungin Aukio 5, 02600 Espoo, Business Identity Code: 0357606 - 4, Domiciled in Helsinki X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260227_061213_880985_AF8B72E8 X-CRM114-Status: GOOD ( 13.40 ) X-BeenThere: linux-i3c@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-i3c" Errors-To: linux-i3c-bounces+linux-i3c=archiver.kernel.org@lists.infradead.org The logic used to abort the DMA ring contains several flaws: 1. The driver unconditionally issues a ring abort even when the ring has already stopped. 2. The completion used to wait for abort completion is never re-initialized, resulting in incorrect wait behavior. 3. The abort sequence unintentionally clears RING_CTRL_ENABLE, which resets hardware ring pointers and disrupts the controller state. 4. If the ring is already stopped, the abort operation should be considered successful without attempting further action. Fix the abort handling by checking whether the ring is running before issuing an abort, reinitializing the completion when needed, ensuring that RING_CTRL_ENABLE remains asserted during abort, and treating an already stopped ring as a successful condition. Fixes: 9ad9a52cce282 ("i3c/master: introduce the mipi-i3c-hci driver") Cc: stable@vger.kernel.org Signed-off-by: Adrian Hunter --- drivers/i3c/master/mipi-i3c-hci/dma.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/i3c/master/mipi-i3c-hci/dma.c b/drivers/i3c/master/mipi-i3c-hci/dma.c index 8d5f808e03ea..dff96b84479e 100644 --- a/drivers/i3c/master/mipi-i3c-hci/dma.c +++ b/drivers/i3c/master/mipi-i3c-hci/dma.c @@ -550,18 +550,25 @@ static bool hci_dma_dequeue_xfer(struct i3c_hci *hci, struct hci_rh_data *rh = &rings->headers[xfer_list[0].ring_number]; unsigned int i; bool did_unqueue = false; + u32 ring_status; guard(mutex)(&rh->control_mutex); - /* stop the ring */ - rh_reg_write(RING_CONTROL, RING_CTRL_ABORT); - if (wait_for_completion_timeout(&rh->op_done, HZ) == 0) { - /* - * We're deep in it if ever this condition is ever met. - * Hardware might still be writing to memory, etc. - */ - dev_crit(&hci->master.dev, "unable to abort the ring\n"); - WARN_ON(1); + ring_status = rh_reg_read(RING_STATUS); + if (ring_status & RING_STATUS_RUNNING) { + /* stop the ring */ + reinit_completion(&rh->op_done); + rh_reg_write(RING_CONTROL, RING_CTRL_ENABLE | RING_CTRL_ABORT); + wait_for_completion_timeout(&rh->op_done, HZ); + ring_status = rh_reg_read(RING_STATUS); + if (ring_status & RING_STATUS_RUNNING) { + /* + * We're deep in it if ever this condition is ever met. + * Hardware might still be writing to memory, etc. + */ + dev_crit(&hci->master.dev, "unable to abort the ring\n"); + WARN_ON(1); + } } spin_lock_irq(&rh->lock); -- 2.51.0 -- linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c