|
@@ -293,6 +293,41 @@ static inline void ufshcd_remove_non_printable(char *val)
|
|
|
*val = ' ';
|
|
|
}
|
|
|
|
|
|
+static void ufshcd_add_command_trace(struct ufs_hba *hba,
|
|
|
+ unsigned int tag, const char *str)
|
|
|
+{
|
|
|
+ sector_t lba = -1;
|
|
|
+ u8 opcode = 0;
|
|
|
+ u32 intr, doorbell;
|
|
|
+ struct ufshcd_lrb *lrbp;
|
|
|
+ int transfer_len = -1;
|
|
|
+
|
|
|
+ if (!trace_ufshcd_command_enabled())
|
|
|
+ return;
|
|
|
+
|
|
|
+ lrbp = &hba->lrb[tag];
|
|
|
+
|
|
|
+ if (lrbp->cmd) { /* data phase exists */
|
|
|
+ opcode = (u8)(*lrbp->cmd->cmnd);
|
|
|
+ if ((opcode == READ_10) || (opcode == WRITE_10)) {
|
|
|
+ /*
|
|
|
+ * Currently we only fully trace read(10) and write(10)
|
|
|
+ * commands
|
|
|
+ */
|
|
|
+ if (lrbp->cmd->request && lrbp->cmd->request->bio)
|
|
|
+ lba =
|
|
|
+ lrbp->cmd->request->bio->bi_iter.bi_sector;
|
|
|
+ transfer_len = be32_to_cpu(
|
|
|
+ lrbp->ucd_req_ptr->sc.exp_data_transfer_len);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ intr = ufshcd_readl(hba, REG_INTERRUPT_STATUS);
|
|
|
+ doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);
|
|
|
+ trace_ufshcd_command(dev_name(hba->dev), str, tag,
|
|
|
+ doorbell, transfer_len, intr, lba, opcode);
|
|
|
+}
|
|
|
+
|
|
|
static void ufshcd_print_host_regs(struct ufs_hba *hba)
|
|
|
{
|
|
|
/*
|
|
@@ -1166,6 +1201,7 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag)
|
|
|
ufshcd_writel(hba, 1 << task_tag, REG_UTP_TRANSFER_REQ_DOOR_BELL);
|
|
|
/* Make sure that doorbell is committed immediately */
|
|
|
wmb();
|
|
|
+ ufshcd_add_command_trace(hba, task_tag, "send");
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -3955,6 +3991,7 @@ static void __ufshcd_transfer_req_compl(struct ufs_hba *hba,
|
|
|
lrbp = &hba->lrb[index];
|
|
|
cmd = lrbp->cmd;
|
|
|
if (cmd) {
|
|
|
+ ufshcd_add_command_trace(hba, index, "complete");
|
|
|
result = ufshcd_transfer_rsp_status(hba, lrbp);
|
|
|
scsi_dma_unmap(cmd);
|
|
|
cmd->result = result;
|
|
@@ -3966,8 +4003,11 @@ static void __ufshcd_transfer_req_compl(struct ufs_hba *hba,
|
|
|
__ufshcd_release(hba);
|
|
|
} else if (lrbp->command_type == UTP_CMD_TYPE_DEV_MANAGE ||
|
|
|
lrbp->command_type == UTP_CMD_TYPE_UFS_STORAGE) {
|
|
|
- if (hba->dev_cmd.complete)
|
|
|
+ if (hba->dev_cmd.complete) {
|
|
|
+ ufshcd_add_command_trace(hba, index,
|
|
|
+ "dev_complete");
|
|
|
complete(hba->dev_cmd.complete);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|