From nobody Tue Oct 06 07:51:03 2026 X-Original-To: dev-commits-src-all@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 4hzT2w1tMBz6cW8S for ; Tue, 06 Oct 2026 07:51:04 +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 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hzT2v59D0z4GTp for ; Tue, 06 Oct 2026 07:51:03 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791273063; 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=vqD6UBiacGAbhZFXo8s26KfEndiV34lHTP1br/qw1kI=; b=mNvQyVHDzmRYyaP+UgNURekNi+lwW/H1S8USOuNce/GLdNClZFBWVnE240VWJptXKsgupO 3U2JKrqvGBB1aWh8rK6EB27+66aFJHFMBN0kycTpXBksjjcNFK56tsqoAp3bM8T2S9uhKP +zxsjWM5x4tew75PN7anop3BSnz6z9uPCy16OqDLplq3noHGmfq3H3IdgZCGeyApuMPrvk rRyNIxuy+VFKvdO1c9ckRZugORVgeVqCdFgwWX2wp1XohiwrHdaQ/E0O9edd/0qLzeVqz2 LzCocHPfJfJOGcR4/30vqr9xj+W0Eu+/Q6GSyYhaL+snbD7xxqmMXdO77MiHAg== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791273063; b=peaHBfFta8CntHqAIy650O29PNV9ujfMwvdlz9LpQ/D9MDlBb/Or7uXfuD0IhjUFOkqfwB lrEzvgIxWW1KWg4Y094iOEbjsCgBgdO0vtgxIjvvOgKZGdcfq2sySUxDq8t6QnQCV4iVBh 1saS3vL78EJKn0JX+Cta7n7B1mQhhI7qzdMDwXSh4Lz3/pC6Qv9d0inoQYS4IPMA12nngw 1t8omrP3T+MwLaak/QX9Al3W9Cbw3I7A8Zia/Z2TCWF+15fHneop6/MQcv9mDqeA6Ki4Ro rrDCqDzEue3A+Z+t4QnKgsxMD0IfbCtNxFQcrrEg97IuH9Smg4R276DLcq/XzA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791273063; 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=vqD6UBiacGAbhZFXo8s26KfEndiV34lHTP1br/qw1kI=; b=GUPGma/Pt9r8iGSn7Qv6TndOosK4gY8Pp/BTcK8/fMO/yBOcaBhwOvDFAB20+Hs4io4jxL W5l+6/Y5imbsNk90xAI+e1IgRDr3Ww+4OPtZvC7EXafocumwF0W6+g8QNYezCL5CRPsry5 Pfl+oMaQA2j6CICmXeLRStSdoSwYVhEyNEgsJrDrWlhnAMbwz1GaOWwvnKTej6WVCayil9 iLDPuwzQY0N934SThTUyWD342ajjhMwJMXfmeTn6fe+ygruMrzR1d32jpvvPtZydNAwDyQ t8DsNgCrmhyDGm/ncpWtspJmMspbybS8lx+iHgFrSJfQE4HruOftirwFns1SMQ== 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 4hzT2v3zsxzxZC for ; Tue, 06 Oct 2026 07:51:03 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 18729 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 06 Oct 2026 07:51:03 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Jaeyoon Choi Subject: git: 9997667c1b34 - stable/15 - ufshci: handle controller command submit failures List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: 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/stable/15 X-Git-Reftype: branch X-Git-Commit: 9997667c1b34eda8a1f3f1bd4c20e28d1144f07b Auto-Submitted: auto-generated Date: Tue, 06 Oct 2026 07:51:03 +0000 Message-Id: <6ac4a867.18729.39a51846@gitrepo.freebsd.org> The branch stable/15 has been updated by jaeyoon: URL: https://cgit.FreeBSD.org/src/commit/?id=9997667c1b34eda8a1f3f1bd4c20e28d1144f07b commit 9997667c1b34eda8a1f3f1bd4c20e28d1144f07b Author: Jaeyoon Choi AuthorDate: 2026-08-10 01:34:06 +0000 Commit: Jaeyoon Choi CommitDate: 2026-10-06 06:27:54 +0000 ufshci: handle controller command submit failures Return submission errors from the controller command helpers and propagate them to polled callers before waiting for completion. Free requests that never enter a hardware queue so failure paths do not leak or panic after the poll timeout. Sponsored by: Samsung Electronics Reviewed by: imp (mentor) Differential Revision: https://reviews.freebsd.org/D58655 (cherry picked from commit c9827f1528a69664f4031e1c511b2e7022601a7c) --- sys/dev/ufshci/ufshci_ctrlr.c | 7 +++++- sys/dev/ufshci/ufshci_ctrlr_cmd.c | 29 ++++++++++++++++++----- sys/dev/ufshci/ufshci_dev.c | 48 +++++++++++++++++++++++++++++---------- sys/dev/ufshci/ufshci_private.h | 6 ++--- sys/dev/ufshci/ufshci_req_queue.c | 16 +++++++++---- 5 files changed, 79 insertions(+), 27 deletions(-) diff --git a/sys/dev/ufshci/ufshci_ctrlr.c b/sys/dev/ufshci/ufshci_ctrlr.c index b271720efb52..cb5549f8e7c9 100644 --- a/sys/dev/ufshci/ufshci_ctrlr.c +++ b/sys/dev/ufshci/ufshci_ctrlr.c @@ -494,9 +494,14 @@ int ufshci_ctrlr_send_nop(struct ufshci_controller *ctrlr) { struct ufshci_completion_poll_status status; + int error; status.done = 0; - ufshci_ctrlr_cmd_send_nop(ctrlr, ufshci_completion_poll_cb, &status); + error = ufshci_ctrlr_cmd_send_nop(ctrlr, ufshci_completion_poll_cb, + &status); + if (error) + return (error); + ufshci_completion_poll(&status); if (status.error) { ufshci_printf(ctrlr, "ufshci_ctrlr_send_nop failed!\n"); diff --git a/sys/dev/ufshci/ufshci_ctrlr_cmd.c b/sys/dev/ufshci/ufshci_ctrlr_cmd.c index cac01894c062..2e85cfa4b5b0 100644 --- a/sys/dev/ufshci/ufshci_ctrlr_cmd.c +++ b/sys/dev/ufshci/ufshci_ctrlr_cmd.c @@ -7,15 +7,18 @@ #include "ufshci_private.h" -void +int ufshci_ctrlr_cmd_send_task_mgmt_request(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn, void *cb_arg, uint8_t function, uint8_t lun, uint8_t task_tag, uint8_t iid) { struct ufshci_request *req; struct ufshci_task_mgmt_request_upiu *upiu; + int error; req = ufshci_allocate_request_vaddr(NULL, 0, M_NOWAIT, cb_fn, cb_arg); + if (req == NULL) + return (ENOMEM); req->request_size = sizeof(struct ufshci_task_mgmt_request_upiu); req->response_size = sizeof(struct ufshci_task_mgmt_response_upiu); @@ -30,15 +33,20 @@ ufshci_ctrlr_cmd_send_task_mgmt_request(struct ufshci_controller *ctrlr, upiu->input_param2 = task_tag; upiu->input_param3 = iid; - ufshci_ctrlr_submit_task_mgmt_request(ctrlr, req); + error = ufshci_ctrlr_submit_task_mgmt_request(ctrlr, req); + if (error) + ufshci_free_request(req); + + return (error); } -void +int ufshci_ctrlr_cmd_send_nop(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn, void *cb_arg) { struct ufshci_request *req; struct ufshci_nop_out_upiu *upiu; + int error; req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg); @@ -50,15 +58,20 @@ ufshci_ctrlr_cmd_send_nop(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn, memset(upiu, 0, req->request_size); upiu->header.trans_type = UFSHCI_UPIU_TRANSACTION_CODE_NOP_OUT; - ufshci_ctrlr_submit_transfer_request(ctrlr, req); + error = ufshci_ctrlr_submit_transfer_request(ctrlr, req); + if (error) + ufshci_free_request(req); + + return (error); } -void +int ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn, void *cb_arg, struct ufshci_query_param param) { struct ufshci_request *req; struct ufshci_query_request_upiu *upiu; + int error; req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg); @@ -77,5 +90,9 @@ ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller *ctrlr, upiu->value_64 = param.value; upiu->length = param.desc_size; - ufshci_ctrlr_submit_transfer_request(ctrlr, req); + error = ufshci_ctrlr_submit_transfer_request(ctrlr, req); + if (error) + ufshci_free_request(req); + + return (error); } diff --git a/sys/dev/ufshci/ufshci_dev.c b/sys/dev/ufshci/ufshci_dev.c index 0fedbca9a90e..c53d9b71ba2c 100644 --- a/sys/dev/ufshci/ufshci_dev.c +++ b/sys/dev/ufshci/ufshci_dev.c @@ -19,6 +19,7 @@ ufshci_dev_read_descriptor(struct ufshci_controller *ctrlr, { struct ufshci_completion_poll_status status; struct ufshci_query_param param; + int error; param.function = UFSHCI_QUERY_FUNC_STANDARD_READ_REQUEST; param.opcode = UFSHCI_QUERY_OPCODE_READ_DESCRIPTOR; @@ -29,8 +30,11 @@ ufshci_dev_read_descriptor(struct ufshci_controller *ctrlr, param.desc_size = desc_size; status.done = 0; - ufshci_ctrlr_cmd_send_query_request(ctrlr, ufshci_completion_poll_cb, - &status, param); + error = ufshci_ctrlr_cmd_send_query_request(ctrlr, + ufshci_completion_poll_cb, &status, param); + if (error) + return (error); + ufshci_completion_poll(&status); if (status.error) { ufshci_printf(ctrlr, @@ -74,6 +78,7 @@ ufshci_dev_read_flag(struct ufshci_controller *ctrlr, { struct ufshci_completion_poll_status status; struct ufshci_query_param param; + int error; param.function = UFSHCI_QUERY_FUNC_STANDARD_READ_REQUEST; param.opcode = UFSHCI_QUERY_OPCODE_READ_FLAG; @@ -83,8 +88,11 @@ ufshci_dev_read_flag(struct ufshci_controller *ctrlr, param.value = 0; status.done = 0; - ufshci_ctrlr_cmd_send_query_request(ctrlr, ufshci_completion_poll_cb, - &status, param); + error = ufshci_ctrlr_cmd_send_query_request(ctrlr, + ufshci_completion_poll_cb, &status, param); + if (error) + return (error); + ufshci_completion_poll(&status); if (status.error) { ufshci_printf(ctrlr, "ufshci_dev_read_flag failed!\n"); @@ -102,6 +110,7 @@ ufshci_dev_set_flag(struct ufshci_controller *ctrlr, { struct ufshci_completion_poll_status status; struct ufshci_query_param param; + int error; param.function = UFSHCI_QUERY_FUNC_STANDARD_WRITE_REQUEST; param.opcode = UFSHCI_QUERY_OPCODE_SET_FLAG; @@ -111,8 +120,11 @@ ufshci_dev_set_flag(struct ufshci_controller *ctrlr, param.value = 0; status.done = 0; - ufshci_ctrlr_cmd_send_query_request(ctrlr, ufshci_completion_poll_cb, - &status, param); + error = ufshci_ctrlr_cmd_send_query_request(ctrlr, + ufshci_completion_poll_cb, &status, param); + if (error) + return (error); + ufshci_completion_poll(&status); if (status.error) { ufshci_printf(ctrlr, "ufshci_dev_set_flag failed!\n"); @@ -128,6 +140,7 @@ ufshci_dev_clear_flag(struct ufshci_controller *ctrlr, { struct ufshci_completion_poll_status status; struct ufshci_query_param param; + int error; param.function = UFSHCI_QUERY_FUNC_STANDARD_WRITE_REQUEST; param.opcode = UFSHCI_QUERY_OPCODE_CLEAR_FLAG; @@ -137,8 +150,11 @@ ufshci_dev_clear_flag(struct ufshci_controller *ctrlr, param.value = 0; status.done = 0; - ufshci_ctrlr_cmd_send_query_request(ctrlr, ufshci_completion_poll_cb, - &status, param); + error = ufshci_ctrlr_cmd_send_query_request(ctrlr, + ufshci_completion_poll_cb, &status, param); + if (error) + return (error); + ufshci_completion_poll(&status); if (status.error) { ufshci_printf(ctrlr, "ufshci_dev_clear_flag failed!\n"); @@ -155,6 +171,7 @@ ufshci_dev_read_attribute(struct ufshci_controller *ctrlr, { struct ufshci_completion_poll_status status; struct ufshci_query_param param; + int error; param.function = UFSHCI_QUERY_FUNC_STANDARD_READ_REQUEST; param.opcode = UFSHCI_QUERY_OPCODE_READ_ATTRIBUTE; @@ -164,8 +181,11 @@ ufshci_dev_read_attribute(struct ufshci_controller *ctrlr, param.value = 0; status.done = 0; - ufshci_ctrlr_cmd_send_query_request(ctrlr, ufshci_completion_poll_cb, - &status, param); + error = ufshci_ctrlr_cmd_send_query_request(ctrlr, + ufshci_completion_poll_cb, &status, param); + if (error) + return (error); + ufshci_completion_poll(&status); if (status.error) { ufshci_printf(ctrlr, "ufshci_dev_read_attribute failed!\n"); @@ -184,6 +204,7 @@ ufshci_dev_write_attribute(struct ufshci_controller *ctrlr, { struct ufshci_completion_poll_status status; struct ufshci_query_param param; + int error; param.function = UFSHCI_QUERY_FUNC_STANDARD_WRITE_REQUEST; param.opcode = UFSHCI_QUERY_OPCODE_WRITE_ATTRIBUTE; @@ -193,8 +214,11 @@ ufshci_dev_write_attribute(struct ufshci_controller *ctrlr, param.value = value; status.done = 0; - ufshci_ctrlr_cmd_send_query_request(ctrlr, ufshci_completion_poll_cb, - &status, param); + error = ufshci_ctrlr_cmd_send_query_request(ctrlr, + ufshci_completion_poll_cb, &status, param); + if (error) + return (error); + ufshci_completion_poll(&status); if (status.error) { ufshci_printf(ctrlr, "ufshci_dev_write_attribute failed!\n"); diff --git a/sys/dev/ufshci/ufshci_private.h b/sys/dev/ufshci/ufshci_private.h index eab36e88525b..e7345fc5a410 100644 --- a/sys/dev/ufshci/ufshci_private.h +++ b/sys/dev/ufshci/ufshci_private.h @@ -493,12 +493,12 @@ int ufshci_dev_link_state_transition(struct ufshci_controller *ctrlr, enum ufshci_uic_link_state target_state); /* Controller Command */ -void ufshci_ctrlr_cmd_send_task_mgmt_request(struct ufshci_controller *ctrlr, +int ufshci_ctrlr_cmd_send_task_mgmt_request(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn, void *cb_arg, uint8_t function, uint8_t lun, uint8_t task_tag, uint8_t iid); -void ufshci_ctrlr_cmd_send_nop(struct ufshci_controller *ctrlr, +int ufshci_ctrlr_cmd_send_nop(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn, void *cb_arg); -void ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller *ctrlr, +int ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn, void *cb_arg, struct ufshci_query_param param); void ufshci_ctrlr_cmd_send_scsi_command(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn, void *cb_arg, uint8_t *cmd_ptr, uint8_t cmd_len, diff --git a/sys/dev/ufshci/ufshci_req_queue.c b/sys/dev/ufshci/ufshci_req_queue.c index 395801274f0e..371b9c520979 100644 --- a/sys/dev/ufshci/ufshci_req_queue.c +++ b/sys/dev/ufshci/ufshci_req_queue.c @@ -632,11 +632,17 @@ ufshci_req_queue_timeout(void *arg) ufshci_printf(ctrlr, "Recovery step 1: Timeout occurred. aborting the task(%d).\n", tr->req->request_upiu.header.task_tag); - ufshci_ctrlr_cmd_send_task_mgmt_request(ctrlr, - ufshci_abort_complete, tr, - UFSHCI_TASK_MGMT_FUNCTION_ABORT_TASK, - tr->req->request_upiu.header.lun, - tr->req->request_upiu.header.task_tag, 0); + if (ufshci_ctrlr_cmd_send_task_mgmt_request(ctrlr, + ufshci_abort_complete, tr, + UFSHCI_TASK_MGMT_FUNCTION_ABORT_TASK, + tr->req->request_upiu.header.lun, + tr->req->request_upiu.header.task_tag, + 0) != 0) { + ufshci_req_queue_timeout_recovery(ctrlr, + hwq); + idle = false; + break; + } } else { /* Recovery Step 2-5 */ ufshci_req_queue_timeout_recovery(ctrlr, hwq);