|
@@ -276,6 +276,35 @@ static inline void ufshcd_remove_non_printable(char *val)
|
|
|
*val = ' ';
|
|
|
}
|
|
|
|
|
|
+static void ufshcd_add_cmd_upiu_trace(struct ufs_hba *hba, unsigned int tag,
|
|
|
+ const char *str)
|
|
|
+{
|
|
|
+ struct utp_upiu_req *rq = hba->lrb[tag].ucd_req_ptr;
|
|
|
+
|
|
|
+ trace_ufshcd_upiu(dev_name(hba->dev), str, &rq->header, &rq->sc.cdb);
|
|
|
+}
|
|
|
+
|
|
|
+static void ufshcd_add_query_upiu_trace(struct ufs_hba *hba, unsigned int tag,
|
|
|
+ const char *str)
|
|
|
+{
|
|
|
+ struct utp_upiu_req *rq = hba->lrb[tag].ucd_req_ptr;
|
|
|
+
|
|
|
+ trace_ufshcd_upiu(dev_name(hba->dev), str, &rq->header, &rq->qr);
|
|
|
+}
|
|
|
+
|
|
|
+static void ufshcd_add_tm_upiu_trace(struct ufs_hba *hba, unsigned int tag,
|
|
|
+ const char *str)
|
|
|
+{
|
|
|
+ struct utp_task_req_desc *descp;
|
|
|
+ struct utp_upiu_task_req *task_req;
|
|
|
+ int off = (int)tag - hba->nutrs;
|
|
|
+
|
|
|
+ descp = &hba->utmrdl_base_addr[off];
|
|
|
+ task_req = (struct utp_upiu_task_req *)descp->task_req_upiu;
|
|
|
+ trace_ufshcd_upiu(dev_name(hba->dev), str, &task_req->header,
|
|
|
+ &task_req->input_param1);
|
|
|
+}
|
|
|
+
|
|
|
static void ufshcd_add_command_trace(struct ufs_hba *hba,
|
|
|
unsigned int tag, const char *str)
|
|
|
{
|
|
@@ -285,6 +314,9 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba,
|
|
|
struct ufshcd_lrb *lrbp;
|
|
|
int transfer_len = -1;
|
|
|
|
|
|
+ /* trace UPIU also */
|
|
|
+ ufshcd_add_cmd_upiu_trace(hba, tag, str);
|
|
|
+
|
|
|
if (!trace_ufshcd_command_enabled())
|
|
|
return;
|
|
|
|
|
@@ -2550,6 +2582,7 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
|
|
|
|
|
|
hba->dev_cmd.complete = &wait;
|
|
|
|
|
|
+ ufshcd_add_query_upiu_trace(hba, tag, "query_send");
|
|
|
/* Make sure descriptors are ready before ringing the doorbell */
|
|
|
wmb();
|
|
|
spin_lock_irqsave(hba->host->host_lock, flags);
|
|
@@ -2559,6 +2592,9 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
|
|
|
|
|
|
err = ufshcd_wait_for_dev_cmd(hba, lrbp, timeout);
|
|
|
|
|
|
+ ufshcd_add_query_upiu_trace(hba, tag,
|
|
|
+ err ? "query_complete_err" : "query_complete");
|
|
|
+
|
|
|
out_put_tag:
|
|
|
ufshcd_put_dev_cmd_tag(hba, tag);
|
|
|
wake_up(&hba->dev_cmd.tag_wq);
|
|
@@ -5443,11 +5479,14 @@ static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id,
|
|
|
|
|
|
spin_unlock_irqrestore(host->host_lock, flags);
|
|
|
|
|
|
+ ufshcd_add_tm_upiu_trace(hba, task_tag, "tm_send");
|
|
|
+
|
|
|
/* wait until the task management command is completed */
|
|
|
err = wait_event_timeout(hba->tm_wq,
|
|
|
test_bit(free_slot, &hba->tm_condition),
|
|
|
msecs_to_jiffies(TM_CMD_TIMEOUT));
|
|
|
if (!err) {
|
|
|
+ ufshcd_add_tm_upiu_trace(hba, task_tag, "tm_complete_err");
|
|
|
dev_err(hba->dev, "%s: task management cmd 0x%.2x timed-out\n",
|
|
|
__func__, tm_function);
|
|
|
if (ufshcd_clear_tm_cmd(hba, free_slot))
|
|
@@ -5456,6 +5495,7 @@ static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id,
|
|
|
err = -ETIMEDOUT;
|
|
|
} else {
|
|
|
err = ufshcd_task_req_compl(hba, free_slot, tm_response);
|
|
|
+ ufshcd_add_tm_upiu_trace(hba, task_tag, "tm_complete");
|
|
|
}
|
|
|
|
|
|
clear_bit(free_slot, &hba->tm_condition);
|