From: Asutosh Das <quic_asutoshd@quicinc.com>
To: <quic_cang@quicinc.com>, <quic_nitirawa@quicinc.com>,
<quic_rampraka@quicinc.com>, <quic_bhaskarv@quicinc.com>,
<quic_richardp@quicinc.com>, <linux-scsi@vger.kernel.org>
Cc: Asutosh Das <quic_asutoshd@quicinc.com>,
<linux-arm-msm@vger.kernel.org>, <quic_nguyenb@quicinc.com>,
<quic_xiaosenh@quicinc.com>, <bvanassche@acm.org>,
<avri.altman@wdc.com>, <mani@kernel.org>, <beanhuo@micron.com>
Subject: [PATCH v2 13/17] ufs: core: Prepare for completion in mcq
Date: Wed, 5 Oct 2022 18:06:12 -0700 [thread overview]
Message-ID: <627ab3a2c626d458af12904d34a086b0a5189509.1665017636.git.quic_asutoshd@quicinc.com> (raw)
In-Reply-To: <cover.1665017636.git.quic_asutoshd@quicinc.com>
Modifies completion path APIs and adds completion queue
entry.
Co-developed-by: Can Guo <quic_cang@quicinc.com>
Signed-off-by: Can Guo <quic_cang@quicinc.com>
Signed-off-by: Asutosh Das <quic_asutoshd@quicinc.com>
---
drivers/ufs/core/ufshcd-priv.h | 2 ++
drivers/ufs/core/ufshcd.c | 80 ++++++++++++++++++++++++++----------------
2 files changed, 52 insertions(+), 30 deletions(-)
diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index 44ef266..62ae7e51 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -50,6 +50,8 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
enum flag_idn idn, u8 index, bool *flag_res);
void ufshcd_auto_hibern8_update(struct ufs_hba *hba, u32 ahit);
+void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
+ struct cq_entry *cqe);
int ufshcd_mcq_init(struct ufs_hba *hba);
u32 ufshcd_mcq_decide_queue_depth(struct ufs_hba *hba);
int ufshcd_mcq_memory_alloc(struct ufs_hba *hba);
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index e514c20..ac3b498 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -752,12 +752,17 @@ static inline bool ufshcd_is_device_present(struct ufs_hba *hba)
/**
* ufshcd_get_tr_ocs - Get the UTRD Overall Command Status
* @lrbp: pointer to local command reference block
+ * @cqe: pointer to the completion queue entry
*
* This function is used to get the OCS field from UTRD
* Returns the OCS field in the UTRD
*/
-static enum utp_ocs ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp)
+static enum utp_ocs ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp,
+ struct cq_entry *cqe)
{
+ if (cqe)
+ return le32_to_cpu(cqe->status) & MASK_OCS;
+
return le32_to_cpu(lrbp->utr_descriptor_ptr->header.dword_2) & MASK_OCS;
}
@@ -3009,7 +3014,7 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
spin_lock_irqsave(hba->host->host_lock, flags);
hba->dev_cmd.complete = NULL;
if (likely(time_left)) {
- err = ufshcd_get_tr_ocs(lrbp);
+ err = ufshcd_get_tr_ocs(lrbp, hba->dev_cmd.cqe);
if (!err)
err = ufshcd_dev_cmd_completion(hba, lrbp);
}
@@ -5199,18 +5204,20 @@ ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int scsi_status)
* ufshcd_transfer_rsp_status - Get overall status of the response
* @hba: per adapter instance
* @lrbp: pointer to local reference block of completed command
+ * @cqe: pointer to the completion queue entry
*
* Returns result of the command to notify SCSI midlayer
*/
static inline int
-ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
+ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
+ struct cq_entry *cqe)
{
int result = 0;
int scsi_status;
enum utp_ocs ocs;
/* overall command status of utrd */
- ocs = ufshcd_get_tr_ocs(lrbp);
+ ocs = ufshcd_get_tr_ocs(lrbp, cqe);
if (hba->quirks & UFSHCD_QUIRK_BROKEN_OCS_FATAL_ERROR) {
if (be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_1) &
@@ -5375,41 +5382,54 @@ static void ufshcd_release_scsi_cmd(struct ufs_hba *hba,
}
/**
- * __ufshcd_transfer_req_compl - handle SCSI and query command completion
+ * ufshcd_compl_one_cqe - handle a completion queue entry
* @hba: per adapter instance
- * @completed_reqs: bitmask that indicates which requests to complete
+ * @task_tag: the task tag of the request to be completed
+ * @cqe: pointer to the completion queue entry
*/
-static void __ufshcd_transfer_req_compl(struct ufs_hba *hba,
- unsigned long completed_reqs)
+void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
+ struct cq_entry *cqe)
{
struct ufshcd_lrb *lrbp;
struct scsi_cmnd *cmd;
- int index;
-
- for_each_set_bit(index, &completed_reqs, hba->nutrs) {
- lrbp = &hba->lrb[index];
- lrbp->compl_time_stamp = ktime_get();
- cmd = lrbp->cmd;
- if (cmd) {
- if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
- ufshcd_update_monitor(hba, lrbp);
- ufshcd_add_command_trace(hba, index, UFS_CMD_COMP);
- cmd->result = ufshcd_transfer_rsp_status(hba, lrbp);
- ufshcd_release_scsi_cmd(hba, lrbp);
- /* Do not touch lrbp after scsi done */
- scsi_done(cmd);
- } else if (lrbp->command_type == UTP_CMD_TYPE_DEV_MANAGE ||
- lrbp->command_type == UTP_CMD_TYPE_UFS_STORAGE) {
- if (hba->dev_cmd.complete) {
- ufshcd_add_command_trace(hba, index,
- UFS_DEV_COMP);
- complete(hba->dev_cmd.complete);
- ufshcd_clk_scaling_update_busy(hba);
- }
+
+ lrbp = &hba->lrb[task_tag];
+ lrbp->compl_time_stamp = ktime_get();
+ cmd = lrbp->cmd;
+ if (cmd) {
+ if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
+ ufshcd_update_monitor(hba, lrbp);
+ ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP);
+ cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
+ ufshcd_release_scsi_cmd(hba, lrbp);
+ /* Do not touch lrbp after scsi done */
+ scsi_done(cmd);
+ } else if (lrbp->command_type == UTP_CMD_TYPE_DEV_MANAGE ||
+ lrbp->command_type == UTP_CMD_TYPE_UFS_STORAGE) {
+ if (hba->dev_cmd.complete) {
+ hba->dev_cmd.cqe = cqe;
+ ufshcd_add_command_trace(hba, task_tag, UFS_DEV_COMP);
+ complete(hba->dev_cmd.complete);
+ ufshcd_clk_scaling_update_busy(hba);
}
}
}
+
+/**
+ * __ufshcd_transfer_req_compl - handle SCSI and query command completion
+ * @hba: per adapter instance
+ * @completed_reqs: bitmask that indicates which requests to complete
+ */
+static void __ufshcd_transfer_req_compl(struct ufs_hba *hba,
+ unsigned long completed_reqs)
+{
+ int tag;
+
+ for_each_set_bit(tag, &completed_reqs, hba->nutrs)
+ ufshcd_compl_one_cqe(hba, tag, NULL);
+}
+
/*
* Returns > 0 if one or more commands have been completed or 0 if no
* requests have been completed.
--
2.7.4
next prev parent reply other threads:[~2022-10-06 1:06 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-06 1:05 [PATCH v2 00/17] Add Multi Circular Queue Support Asutosh Das
2022-10-06 1:06 ` [PATCH v2 01/17] ufs: core: Probe for ext_iid support Asutosh Das
2022-10-06 1:06 ` [PATCH v2 02/17] ufs: core: Optimize duplicate code to read extended feature Asutosh Das
2022-10-06 1:06 ` [PATCH v2 03/17] ufs: core: Introduce Multi-circular queue capability Asutosh Das
2022-10-06 1:06 ` [PATCH v2 04/17] ufs: core: Defer adding host to scsi if mcq is supported Asutosh Das
2022-10-06 1:06 ` [PATCH v2 05/17] ufs: core: mcq: Introduce Multi Circular Queue Asutosh Das
2022-10-18 5:29 ` Eddie Huang
2022-10-18 16:00 ` Asutosh Das
2022-10-19 10:28 ` Eddie Huang
2022-10-06 1:06 ` [PATCH v2 06/17] ufs: core: mcq: Configure resource regions Asutosh Das
[not found] ` <5bd645ba24e1dc17343dd8d7b52fe6ea1eb6333d.camel@medaitek.com>
2022-10-14 9:31 ` Can Guo
[not found] ` <6592c7fe-0828-6bb3-17a8-9db53aac1873@quicinc.com>
2022-10-17 9:27 ` Fwd: " Eddie Huang
2022-10-18 1:47 ` Asutosh Das
2022-10-18 2:56 ` Eddie Huang
2022-10-19 19:50 ` Asutosh Das
2022-10-19 21:06 ` Bart Van Assche
2022-10-19 22:11 ` Asutosh Das
2022-10-20 1:13 ` Eddie Huang
2022-10-06 1:06 ` [PATCH v2 07/17] ufs: core: mcq: Calculate queue depth Asutosh Das
2022-10-06 1:06 ` [PATCH v2 08/17] ufs: core: mcq: Allocate memory for mcq mode Asutosh Das
[not found] ` <813a86729b42693d2ac0b6e29ab7867feef69e23.camel@medaitek.com>
2022-10-17 21:17 ` Asutosh Das
2022-10-06 1:06 ` [PATCH v2 09/17] ufs: core: mcq: Configure operation and runtime interface Asutosh Das
2022-10-06 1:06 ` [PATCH v2 10/17] ufs: core: mcq: Use shared tags for MCQ mode Asutosh Das
2022-10-06 1:06 ` [PATCH v2 11/17] ufs: core: Prepare ufshcd_send_command for mcq Asutosh Das
2022-10-06 1:06 ` [PATCH v2 12/17] ufs: core: mcq: Find hardware queue to queue request Asutosh Das
2022-10-06 1:06 ` Asutosh Das [this message]
2022-10-06 1:06 ` [PATCH v2 14/17] ufs: mcq: Add completion support of a cqe Asutosh Das
2022-10-06 1:06 ` [PATCH v2 15/17] ufs: core: mcq: Add completion support in poll Asutosh Das
2022-10-06 1:06 ` [PATCH v2 16/17] ufs: core: mcq: Enable Multi Circular Queue Asutosh Das
2022-10-06 1:06 ` [PATCH v2 17/17] ufs: qcom-host: Enable multi circular queue capability Asutosh Das
[not found] ` <CGME20221006010736epcas2p20777225a537d4f2124e9a7264b2fffcf@epcms2p3>
2022-10-06 3:50 ` [PATCH v2 01/17] ufs: core: Probe for ext_iid support Daejun Park
2022-10-17 21:03 ` Asutosh Das
[not found] ` <CGME20221006010745epcas2p38b37890b7e1fefb45b8fbb0e14ab0a82@epcms2p7>
2022-10-07 2:41 ` [PATCH v2 06/17] ufs: core: mcq: Configure resource regions Daejun Park
2022-10-17 20:54 ` Asutosh Das
[not found] ` <CGME20221006010745epcas2p38b37890b7e1fefb45b8fbb0e14ab0a82@epcms2p8>
2022-10-07 3:44 ` Daejun Park
2022-10-17 21:03 ` (2) " Asutosh Das
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=627ab3a2c626d458af12904d34a086b0a5189509.1665017636.git.quic_asutoshd@quicinc.com \
--to=quic_asutoshd@quicinc.com \
--cc=avri.altman@wdc.com \
--cc=beanhuo@micron.com \
--cc=bvanassche@acm.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=mani@kernel.org \
--cc=quic_bhaskarv@quicinc.com \
--cc=quic_cang@quicinc.com \
--cc=quic_nguyenb@quicinc.com \
--cc=quic_nitirawa@quicinc.com \
--cc=quic_rampraka@quicinc.com \
--cc=quic_richardp@quicinc.com \
--cc=quic_xiaosenh@quicinc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).