From nobody Tue Nov 03 04:33:46 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4jJbLM0bg8z6xsRX for ; Tue, 03 Nov 2026 04:33:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jJbLL4wPFz4fm3 for ; Tue, 03 Nov 2026 04:33:46 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793680426; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1mHlOQe+luTG+Free2KKqbU1DVcdug31bZyIckozCds=; b=UmhoahyweIGkZ+J5TYt/yq3xssl6FTFy3Ofgl2RPRfqxui5E41vuGqOjpacMmOWWQDaBF8 r4dKyzcLT0HYHmy9aziRQ3odEbsc3Brnwp94Zsj5agz5LqDD+GunChRxnAehQghg/7JTuH MpRocfKxe21Wu8EZNjHGWD8qwXhMmVH4BxuRGoC1WfghPQBirptIfYZjEq5OuOLzelmn0U pKaOktE7p+064UbT/5j10SIInPPCoTY1zhWmVEQTaHaI4IGlZTEnPGwHVDtqlKzC+SpDCD Fm5KzjSZFnvttY6dXMAQeiXgd8qC5+cImWFYXxCB4a0JTlzFEUUZiFZpdgiS3w== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793680426; b=ogaEwN31pjmsFeKQyqTuUVrohqiWgZK6HMVMhltjxv/Sd2sBtVxMLklrUpsxwRKCZAPv3p 6oxxp5Kzo+tgwrDnFQPL+RaJnlqFAa2FCeCnVGUoDd0+rqck7xMr0ZgN7Gh17XOmKxQ/WY Mcq4M5xLzQqYecO7buJlGsdgWdGOXRnaBztFMFGhnwBdyK2pPLRBXuHllJl4+ZZyGi32jd ezAjUiJVa4QyUyqGK5PbR9ARPU7qPO1aTYXOezZgvOOQRFY/JOpuMbWh7cFFma+SJx7fRl qXqKrrNxoy7+3h5Xw3a07CuStJcnNCX6W9vlHeAJyYGc7MUPa0jxgMVQX+5TbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793680426; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1mHlOQe+luTG+Free2KKqbU1DVcdug31bZyIckozCds=; b=mVjTS3CdDI0FNPvV51TVmWqCWrNTPKJV0L2wQYdADOCA+DNrMWUnJs8xTZWZwozkOs8+1W L4tRfX1JWfxGVi0LUSI4G3x41mHHTXtG/ES6xq2evuPjrPYWVzgs/0FZOgiK3t8PN96nuu L4SDx4Tnof1yPvoObzieTAc1srZENZTdAlWX415R7CI58oFSbM2YagOenRs7uIApuMBBBr VR1grIFOr2Z3HRV6ThOpsTB5/BLAuFDtxcStw34wXBKg0AjWZJ0uFHkjHVOxv2nazvY4n/ ruLWgdHqOfPZEZtTlZZMBUxhRLvKtNVFmH54oHQvK/CuJGa3Avs8RgY0LFIYkw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4jJbLL4XCyz1GZv for ; Tue, 03 Nov 2026 04:33:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1fbd3 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 03 Nov 2026 04:33:46 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Jaeyoon Choi Subject: git: 3dbdcf937cf4 - main - ufshci: reclaim in-flight requests across a reset in SDB mode List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: Commit messages for the main branch of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jaeyoon X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3dbdcf937cf4689144666791c4113143b6dbc931 Auto-Submitted: auto-generated Date: Tue, 03 Nov 2026 04:33:46 +0000 Message-Id: <6ae9642a.1fbd3.1e1a07de@gitrepo.freebsd.org> The branch main has been updated by jaeyoon: URL: https://cgit.FreeBSD.org/src/commit/?id=3dbdcf937cf4689144666791c4113143b6dbc931 commit 3dbdcf937cf4689144666791c4113143b6dbc931 Author: Jaeyoon Choi AuthorDate: 2026-11-03 04:20:33 +0000 Commit: Jaeyoon Choi CommitDate: 2026-11-03 04:29:44 +0000 ufshci: reclaim in-flight requests across a reset in SDB mode A reset wipes the controller's request list, so a request that was in flight never completes. Its slot stayed scheduled, the watchdog timed it out again, and the next reset went round the same way. CAM never got the request back. Claim in-flight requests when the queue is disabled and return them as aborted once it is back. If the reset fails first, the failure path completes them instead. Reviewed by: imp Sponsored by: Samsung Electronics Differential Revision: https://reviews.freebsd.org/D61116 --- sys/dev/ufshci/ufshci_private.h | 1 + sys/dev/ufshci/ufshci_req_queue.c | 36 ++++++++++++++++++++++++++++++++++-- sys/dev/ufshci/ufshci_req_sdb.c | 19 +++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/sys/dev/ufshci/ufshci_private.h b/sys/dev/ufshci/ufshci_private.h index d38e7c66ff46..1a2179a30299 100644 --- a/sys/dev/ufshci/ufshci_private.h +++ b/sys/dev/ufshci/ufshci_private.h @@ -513,6 +513,7 @@ int ufshci_utmr_req_queue_enable(struct ufshci_controller *ctrlr); void ufshci_utr_req_queue_disable(struct ufshci_controller *ctrlr); int ufshci_utr_req_queue_enable(struct ufshci_controller *ctrlr); void ufshci_req_queue_stop_watchdog(struct ufshci_req_queue *req_queue); +void ufshci_req_queue_complete_aborted_hwq(struct ufshci_hw_queue *hwq); void ufshci_req_queue_fail(struct ufshci_controller *ctrlr, struct ufshci_req_queue *req_queue); int ufshci_req_queue_submit_request(struct ufshci_req_queue *req_queue, diff --git a/sys/dev/ufshci/ufshci_req_queue.c b/sys/dev/ufshci/ufshci_req_queue.c index c5a874018d0b..d9cb3ba510bc 100644 --- a/sys/dev/ufshci/ufshci_req_queue.c +++ b/sys/dev/ufshci/ufshci_req_queue.c @@ -220,6 +220,35 @@ ufshci_req_queue_manual_complete_tracker(struct ufshci_tracker *tr, uint8_t ocs, ufshci_req_queue_complete_tracker(tr); } +/* + * Complete every tracker the reset claimed. The claim keeps the + * completion scan away, so no tracker completes twice. + */ +void +ufshci_req_queue_complete_aborted_hwq(struct ufshci_hw_queue *hwq) +{ + struct ufshci_tracker *tr; + uint32_t i; + + mtx_lock(&hwq->qlock); + + for (i = 0; i < hwq->num_trackers; i++) { + tr = hwq->act_tr[i]; + + if (tr->slot_state != UFSHCI_SLOT_STATE_NEED_ERROR_HANDLING) + continue; + + tr->slot_state = UFSHCI_SLOT_STATE_COMPLETING; + mtx_unlock(&hwq->qlock); + ufshci_req_queue_manual_complete_tracker(tr, + UFSHCI_DESC_ABORTED, + UFSHCI_RESPONSE_CODE_GENERAL_FAILURE); + mtx_lock(&hwq->qlock); + } + + mtx_unlock(&hwq->qlock); +} + void ufshci_req_queue_fail(struct ufshci_controller *ctrlr, struct ufshci_req_queue *req_queue) @@ -240,9 +269,12 @@ ufshci_req_queue_fail(struct ufshci_controller *ctrlr, * A slot in UFSHCI_SLOT_STATE_RESERVED is visible here * only while its submit thread is failing a PRDT setup. * That thread completes the request, so leave the slot - * alone. + * alone. A reset that failed before it enabled the queue + * again leaves its claimed slots behind, and nothing + * else completes those. */ - if (tr->slot_state != UFSHCI_SLOT_STATE_SCHEDULED) + if (tr->slot_state != UFSHCI_SLOT_STATE_SCHEDULED && + tr->slot_state != UFSHCI_SLOT_STATE_NEED_ERROR_HANDLING) continue; /* diff --git a/sys/dev/ufshci/ufshci_req_sdb.c b/sys/dev/ufshci/ufshci_req_sdb.c index ed062c95bca6..34b12c0c0136 100644 --- a/sys/dev/ufshci/ufshci_req_sdb.c +++ b/sys/dev/ufshci/ufshci_req_sdb.c @@ -382,6 +382,20 @@ ufshci_req_sdb_disable(struct ufshci_controller *ctrlr, hwq->recovery_state = RECOVERY_WAITING; TAILQ_FOREACH_SAFE(tr, &hwq->outstanding_tr, tailq, tr_temp) { tr->deadline = SBT_MAX; + + /* + * A failed controller never enables the queue again, so + * the failure path owns the requests. + */ + if (ctrlr->is_failed) + continue; + + /* + * The reset wipes the request list, so nothing completes + * an unclaimed slot. + */ + if (tr->slot_state == UFSHCI_SLOT_STATE_SCHEDULED) + tr->slot_state = UFSHCI_SLOT_STATE_NEED_ERROR_HANDLING; } mtx_unlock(&hwq->qlock); @@ -485,6 +499,11 @@ ufshci_req_sdb_enable(struct ufshci_controller *ctrlr, out: mtx_unlock(&hwq->qlock); mtx_unlock(&hwq->recovery_lock); + + /* The queue is back, so an aborted request can retry right away. */ + if (error == 0) + ufshci_req_queue_complete_aborted_hwq(hwq); + return (error); }