Skip to content

Commit 6667e6d

Browse files
Ohad Sharabimartinkpetersen
Ohad Sharabi
authored andcommitted
scsi: ufs: add trace event for ufs upiu
Add UFS Protocol Information Units(upiu) trace events for ufs driver, used to trace various ufs transaction types- command, task-management and device management. The trace-point format is generic and can be easily adapted to trace other upius if needed. Currently tracing ufs transaction of type 'device management', which this patch introduce, cannot be obtained from any other trace. Device management transactions are used for communication with the device such as reading and writing descriptor or attributes etc. Signed-off-by: Ohad Sharabi <[email protected]> Reviewed-by: Stanislav Nijnikov <[email protected]> Reviewed-by: Bart Van Assche <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 4d79e7d commit 6667e6d

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

drivers/scsi/ufs/ufshcd.c

+40
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,35 @@ static inline void ufshcd_remove_non_printable(char *val)
276276
*val = ' ';
277277
}
278278

279+
static void ufshcd_add_cmd_upiu_trace(struct ufs_hba *hba, unsigned int tag,
280+
const char *str)
281+
{
282+
struct utp_upiu_req *rq = hba->lrb[tag].ucd_req_ptr;
283+
284+
trace_ufshcd_upiu(dev_name(hba->dev), str, &rq->header, &rq->sc.cdb);
285+
}
286+
287+
static void ufshcd_add_query_upiu_trace(struct ufs_hba *hba, unsigned int tag,
288+
const char *str)
289+
{
290+
struct utp_upiu_req *rq = hba->lrb[tag].ucd_req_ptr;
291+
292+
trace_ufshcd_upiu(dev_name(hba->dev), str, &rq->header, &rq->qr);
293+
}
294+
295+
static void ufshcd_add_tm_upiu_trace(struct ufs_hba *hba, unsigned int tag,
296+
const char *str)
297+
{
298+
struct utp_task_req_desc *descp;
299+
struct utp_upiu_task_req *task_req;
300+
int off = (int)tag - hba->nutrs;
301+
302+
descp = &hba->utmrdl_base_addr[off];
303+
task_req = (struct utp_upiu_task_req *)descp->task_req_upiu;
304+
trace_ufshcd_upiu(dev_name(hba->dev), str, &task_req->header,
305+
&task_req->input_param1);
306+
}
307+
279308
static void ufshcd_add_command_trace(struct ufs_hba *hba,
280309
unsigned int tag, const char *str)
281310
{
@@ -285,6 +314,9 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba,
285314
struct ufshcd_lrb *lrbp;
286315
int transfer_len = -1;
287316

317+
/* trace UPIU also */
318+
ufshcd_add_cmd_upiu_trace(hba, tag, str);
319+
288320
if (!trace_ufshcd_command_enabled())
289321
return;
290322

@@ -2550,6 +2582,7 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
25502582

25512583
hba->dev_cmd.complete = &wait;
25522584

2585+
ufshcd_add_query_upiu_trace(hba, tag, "query_send");
25532586
/* Make sure descriptors are ready before ringing the doorbell */
25542587
wmb();
25552588
spin_lock_irqsave(hba->host->host_lock, flags);
@@ -2559,6 +2592,9 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
25592592

25602593
err = ufshcd_wait_for_dev_cmd(hba, lrbp, timeout);
25612594

2595+
ufshcd_add_query_upiu_trace(hba, tag,
2596+
err ? "query_complete_err" : "query_complete");
2597+
25622598
out_put_tag:
25632599
ufshcd_put_dev_cmd_tag(hba, tag);
25642600
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,
54435479

54445480
spin_unlock_irqrestore(host->host_lock, flags);
54455481

5482+
ufshcd_add_tm_upiu_trace(hba, task_tag, "tm_send");
5483+
54465484
/* wait until the task management command is completed */
54475485
err = wait_event_timeout(hba->tm_wq,
54485486
test_bit(free_slot, &hba->tm_condition),
54495487
msecs_to_jiffies(TM_CMD_TIMEOUT));
54505488
if (!err) {
5489+
ufshcd_add_tm_upiu_trace(hba, task_tag, "tm_complete_err");
54515490
dev_err(hba->dev, "%s: task management cmd 0x%.2x timed-out\n",
54525491
__func__, tm_function);
54535492
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,
54565495
err = -ETIMEDOUT;
54575496
} else {
54585497
err = ufshcd_task_req_compl(hba, free_slot, tm_response);
5498+
ufshcd_add_tm_upiu_trace(hba, task_tag, "tm_complete");
54595499
}
54605500

54615501
clear_bit(free_slot, &hba->tm_condition);

include/trace/events/ufs.h

+27
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,33 @@ TRACE_EVENT(ufshcd_command,
257257
)
258258
);
259259

260+
TRACE_EVENT(ufshcd_upiu,
261+
TP_PROTO(const char *dev_name, const char *str, void *hdr, void *tsf),
262+
263+
TP_ARGS(dev_name, str, hdr, tsf),
264+
265+
TP_STRUCT__entry(
266+
__string(dev_name, dev_name)
267+
__string(str, str)
268+
__array(unsigned char, hdr, 12)
269+
__array(unsigned char, tsf, 16)
270+
),
271+
272+
TP_fast_assign(
273+
__assign_str(dev_name, dev_name);
274+
__assign_str(str, str);
275+
memcpy(__entry->hdr, hdr, sizeof(__entry->hdr));
276+
memcpy(__entry->tsf, tsf, sizeof(__entry->tsf));
277+
),
278+
279+
TP_printk(
280+
"%s: %s: HDR:%s, CDB:%s",
281+
__get_str(str), __get_str(dev_name),
282+
__print_hex(__entry->hdr, sizeof(__entry->hdr)),
283+
__print_hex(__entry->tsf, sizeof(__entry->tsf))
284+
)
285+
);
286+
260287
#endif /* if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) */
261288

262289
/* This part must be outside protection */

0 commit comments

Comments
 (0)