Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 05 Jan 2026 02:38:52 +0000
From:      Jaeyoon Choi <jaeyoon@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: ece6e062ae4b - main - ufshci: Enable admin command retry
Message-ID:  <695b243c.8e3c.40ba7032@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by jaeyoon:

URL: https://cgit.FreeBSD.org/src/commit/?id=ece6e062ae4b419736c8bb65874ece6be28c2100

commit ece6e062ae4b419736c8bb65874ece6be28c2100
Author:     Jaeyoon Choi <jaeyoon@FreeBSD.org>
AuthorDate: 2026-01-05 02:36:10 +0000
Commit:     Jaeyoon Choi <jaeyoon@FreeBSD.org>
CommitDate: 2026-01-05 02:36:10 +0000

    ufshci: Enable admin command retry
    
    Also, This patch fixes an issue where the admin command flag was not
    passed through.
    
    Sponsored by:           Samsung Electronic
    
    Reviewed by:    imp
    Differential Revision:  https://reviews.freebsd.org/D54244
---
 sys/dev/ufshci/ufshci_ctrlr.c     | 17 ++++-------------
 sys/dev/ufshci/ufshci_ctrlr_cmd.c |  6 ++++--
 sys/dev/ufshci/ufshci_dev.c       |  3 ++-
 sys/dev/ufshci/ufshci_private.h   |  6 ++----
 sys/dev/ufshci/ufshci_req_queue.c |  7 +++----
 sys/dev/ufshci/ufshci_sim.c       |  3 ++-
 6 files changed, 17 insertions(+), 25 deletions(-)

diff --git a/sys/dev/ufshci/ufshci_ctrlr.c b/sys/dev/ufshci/ufshci_ctrlr.c
index 0d7994a033c5..f011d03189e0 100644
--- a/sys/dev/ufshci/ufshci_ctrlr.c
+++ b/sys/dev/ufshci/ufshci_ctrlr.c
@@ -426,24 +426,15 @@ ufshci_ctrlr_submit_task_mgmt_request(struct ufshci_controller *ctrlr,
     struct ufshci_request *req)
 {
 	return (
-	    ufshci_req_queue_submit_request(&ctrlr->task_mgmt_req_queue, req,
-		/*is_admin*/ false));
+	    ufshci_req_queue_submit_request(&ctrlr->task_mgmt_req_queue, req));
 }
 
 int
-ufshci_ctrlr_submit_admin_request(struct ufshci_controller *ctrlr,
+ufshci_ctrlr_submit_transfer_request(struct ufshci_controller *ctrlr,
     struct ufshci_request *req)
 {
-	return (ufshci_req_queue_submit_request(&ctrlr->transfer_req_queue, req,
-	    /*is_admin*/ true));
-}
-
-int
-ufshci_ctrlr_submit_io_request(struct ufshci_controller *ctrlr,
-    struct ufshci_request *req)
-{
-	return (ufshci_req_queue_submit_request(&ctrlr->transfer_req_queue, req,
-	    /*is_admin*/ false));
+	return (
+	    ufshci_req_queue_submit_request(&ctrlr->transfer_req_queue, req));
 }
 
 int
diff --git a/sys/dev/ufshci/ufshci_ctrlr_cmd.c b/sys/dev/ufshci/ufshci_ctrlr_cmd.c
index 253f31a93c2e..cac01894c062 100644
--- a/sys/dev/ufshci/ufshci_ctrlr_cmd.c
+++ b/sys/dev/ufshci/ufshci_ctrlr_cmd.c
@@ -44,12 +44,13 @@ ufshci_ctrlr_cmd_send_nop(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn,
 
 	req->request_size = sizeof(struct ufshci_nop_out_upiu);
 	req->response_size = sizeof(struct ufshci_nop_in_upiu);
+	req->is_admin = true;
 
 	upiu = (struct ufshci_nop_out_upiu *)&req->request_upiu;
 	memset(upiu, 0, req->request_size);
 	upiu->header.trans_type = UFSHCI_UPIU_TRANSACTION_CODE_NOP_OUT;
 
-	ufshci_ctrlr_submit_admin_request(ctrlr, req);
+	ufshci_ctrlr_submit_transfer_request(ctrlr, req);
 }
 
 void
@@ -63,6 +64,7 @@ ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller *ctrlr,
 
 	req->request_size = sizeof(struct ufshci_query_request_upiu);
 	req->response_size = sizeof(struct ufshci_query_response_upiu);
+	req->is_admin = true;
 
 	upiu = (struct ufshci_query_request_upiu *)&req->request_upiu;
 	memset(upiu, 0, req->request_size);
@@ -75,5 +77,5 @@ ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller *ctrlr,
 	upiu->value_64 = param.value;
 	upiu->length = param.desc_size;
 
-	ufshci_ctrlr_submit_admin_request(ctrlr, req);
+	ufshci_ctrlr_submit_transfer_request(ctrlr, req);
 }
diff --git a/sys/dev/ufshci/ufshci_dev.c b/sys/dev/ufshci/ufshci_dev.c
index 38c6de9731a4..406130c537a7 100644
--- a/sys/dev/ufshci/ufshci_dev.c
+++ b/sys/dev/ufshci/ufshci_dev.c
@@ -33,7 +33,8 @@ ufshci_dev_read_descriptor(struct ufshci_controller *ctrlr,
 	    &status, param);
 	ufshci_completion_poll(&status);
 	if (status.error) {
-		ufshci_printf(ctrlr, "ufshci_dev_read_descriptor failed!\n");
+		ufshci_printf(ctrlr,
+		    "Failed to send Read Descriptor query request!\n");
 		return (ENXIO);
 	}
 
diff --git a/sys/dev/ufshci/ufshci_private.h b/sys/dev/ufshci/ufshci_private.h
index 0665f29d3896..b57142bf58fc 100644
--- a/sys/dev/ufshci/ufshci_private.h
+++ b/sys/dev/ufshci/ufshci_private.h
@@ -451,9 +451,7 @@ void ufshci_ctrlr_poll(struct ufshci_controller *ctrlr);
 
 int ufshci_ctrlr_submit_task_mgmt_request(struct ufshci_controller *ctrlr,
     struct ufshci_request *req);
-int ufshci_ctrlr_submit_admin_request(struct ufshci_controller *ctrlr,
-    struct ufshci_request *req);
-int ufshci_ctrlr_submit_io_request(struct ufshci_controller *ctrlr,
+int ufshci_ctrlr_submit_transfer_request(struct ufshci_controller *ctrlr,
     struct ufshci_request *req);
 int ufshci_ctrlr_send_nop(struct ufshci_controller *ctrlr);
 
@@ -501,7 +499,7 @@ int ufshci_utr_req_queue_enable(struct ufshci_controller *ctrlr);
 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,
-    struct ufshci_request *req, bool is_admin);
+    struct ufshci_request *req);
 void ufshci_req_queue_complete_tracker(struct ufshci_tracker *tr);
 
 /* Request Single Doorbell Queue */
diff --git a/sys/dev/ufshci/ufshci_req_queue.c b/sys/dev/ufshci/ufshci_req_queue.c
index 33008c6b1230..4c82b79d0e26 100644
--- a/sys/dev/ufshci/ufshci_req_queue.c
+++ b/sys/dev/ufshci/ufshci_req_queue.c
@@ -268,9 +268,8 @@ ufshci_req_queue_complete_tracker(struct ufshci_tracker *tr)
 	error = ufshci_req_queue_response_is_error(req_queue, ocs,
 	    &cpl.response_upiu);
 
-	/* TODO: Implement retry */
-	// retriable = ufshci_completion_is_retry(cpl);
-	retriable = false;
+	/* Retry for admin commands */
+	retriable = req->is_admin;
 	retry = error && retriable &&
 	    req->retries < req_queue->ctrlr->retry_count;
 	if (retry)
@@ -778,7 +777,7 @@ _ufshci_req_queue_submit_request(struct ufshci_req_queue *req_queue,
 
 int
 ufshci_req_queue_submit_request(struct ufshci_req_queue *req_queue,
-    struct ufshci_request *req, bool is_admin)
+    struct ufshci_request *req)
 {
 	struct ufshci_hw_queue *hwq;
 	uint32_t error;
diff --git a/sys/dev/ufshci/ufshci_sim.c b/sys/dev/ufshci/ufshci_sim.c
index 1589e7475ad4..bee1fff858ff 100644
--- a/sys/dev/ufshci/ufshci_sim.c
+++ b/sys/dev/ufshci/ufshci_sim.c
@@ -165,6 +165,7 @@ ufshchi_sim_scsiio(struct cam_sim *sim, union ccb *ccb)
 		data_direction = UFSHCI_DATA_DIRECTION_NO_DATA_TRANSFER;
 	}
 	req->data_direction = data_direction;
+	req->is_admin = false;
 
 	upiu = (struct ufshci_cmd_command_upiu *)&req->request_upiu;
 	memset(upiu, 0, req->request_size);
@@ -191,7 +192,7 @@ ufshchi_sim_scsiio(struct cam_sim *sim, union ccb *ccb)
 	}
 	memcpy(upiu->cdb, cdb, csio->cdb_len);
 
-	error = ufshci_ctrlr_submit_io_request(ctrlr, req);
+	error = ufshci_ctrlr_submit_transfer_request(ctrlr, req);
 	if (error == EBUSY) {
 		ccb->ccb_h.status = CAM_SCSI_BUSY;
 		xpt_done(ccb);


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?695b243c.8e3c.40ba7032>