History

scsi: ufs: core: Add support for qTimestamp attribute

The new qTimestamp attribute was added to UFS 4.0 spec, in order to synchronize timestamp between device logs and the host. The spec recommends to send this attribute upon device power-on Reset/HW reset or when switching to Active state (using SSU command). Due to this attribute, the attribute's max value was extended to 8 bytes. As a result, the new definition of struct utp_upiu_query_v4_0 was added. Signed-off-by: Arthur Simchaev <Arthur.Simchaev@wdc.com> ----------------- Changes to v2: - Adressed Bart's comments - Add missed response variable to ufshcd_set_timestamp_attr

Arthur Simchaev committed 3 years ago

Commit 24befa91 parent 47699a23 files · +64 −0Browse files

Unified · Split

3 files
  1. drivers/ufs/core/ufshcd.c +38 −0
  2. include/uapi/scsi/scsi_bsg_ufs.h +25 −0
  3. include/ufs/ufs.h +1 −0
drivers/ufs/core/ufshcd.c+38−0
@@ -8520,6 +8520,41 @@ out: · 8519 unmodified lines
8520 return ret;8520 return ret;
8521}8521}
8522 8522
8523static void ufshcd_set_timestamp_attr(struct ufs_hba *hba)
8524{
8525 int err;
8526 struct ufs_query_req *request = NULL;
8527 struct ufs_query_res *response = NULL;
8528 struct ufs_dev_info *dev_info = &hba->dev_info;
8529 struct utp_upiu_query_v4_0 *upiu_data;
8530
8531 if (dev_info->wspecversion < 0x400)
8532 return;
8533
8534 ufshcd_hold(hba);
8535
8536 mutex_lock(&hba->dev_cmd.lock);
8537
8538 ufshcd_init_query(hba, &request, &response,
8539 UPIU_QUERY_OPCODE_WRITE_ATTR,
8540 QUERY_ATTR_IDN_TIMESTAMP, 0, 0);
8541
8542 request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST;
8543
8544 upiu_data = (struct utp_upiu_query_v4_0 *)&request->upiu_req;
8545
8546 put_unaligned_be64(ktime_get_real_ns(), &upiu_data->osf3);
8547
8548 err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, QUERY_REQ_TIMEOUT);
8549
8550 if (err)
8551 dev_err(hba->dev, "%s: failed to set timestamp %d\n",
8552 __func__, err);
8553
8554 mutex_unlock(&hba->dev_cmd.lock);
8555 ufshcd_release(hba);
8556}
8557
8523/**8558/**
8524 * ufshcd_add_lus - probe and add UFS logical units8559 * ufshcd_add_lus - probe and add UFS logical units
8525 * @hba: per-adapter instance8560 * @hba: per-adapter instance
@@ -8708,6 +8743,8 @@ static int ufshcd_device_init(struct ufs_hba *hba, bool init_dev_params) · 182 unmodified lines
8708 ufshcd_set_ufs_dev_active(hba);8743 ufshcd_set_ufs_dev_active(hba);
8709 ufshcd_force_reset_auto_bkops(hba);8744 ufshcd_force_reset_auto_bkops(hba);
8710 8745
8746 ufshcd_set_timestamp_attr(hba);
8747
8711 /* Gear up to HS gear if supported */8748 /* Gear up to HS gear if supported */
8712 if (hba->max_pwr_info.is_valid) {8749 if (hba->max_pwr_info.is_valid) {
8713 /*8750 /*
@@ -9741,6 +9778,7 @@ static int __ufshcd_wl_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) · 1027 unmodified lines
9741 ret = ufshcd_set_dev_pwr_mode(hba, UFS_ACTIVE_PWR_MODE);9778 ret = ufshcd_set_dev_pwr_mode(hba, UFS_ACTIVE_PWR_MODE);
9742 if (ret)9779 if (ret)
9743 goto set_old_link_state;9780 goto set_old_link_state;
9781 ufshcd_set_timestamp_attr(hba);
9744 }9782 }
9745 9783
9746 if (ufshcd_keep_autobkops_enabled_except_suspend(hba))9784 if (ufshcd_keep_autobkops_enabled_except_suspend(hba))
include/uapi/scsi/scsi_bsg_ufs.h+25−0
@@ -70,6 +70,31 @@ struct utp_upiu_query { · 69 unmodified lines
70 __be32 reserved[2];70 __be32 reserved[2];
71};71};
72 72
73/**
74 * struct utp_upiu_query_v4_0 - upiu request buffer structure for
75 * query request >= UFS 4.0 spec.
76 * @opcode: command to perform B-0
77 * @idn: a value that indicates the particular type of data B-1
78 * @index: Index to further identify data B-2
79 * @selector: Index to further identify data B-3
80 * @osf4: spec field B-5
81 * @osf5: spec field B 6,7
82 * @osf6: spec field DW 8,9
83 * @osf7: spec field DW 10,11
84 */
85struct utp_upiu_query_v4_0 {
86 __u8 opcode;
87 __u8 idn;
88 __u8 index;
89 __u8 selector;
90 __u8 osf3;
91 __u8 osf4;
92 __be16 osf5;
93 __be32 osf6;
94 __be32 osf7;
95 __be32 reserved;
96};
97
73/**98/**
74 * struct utp_upiu_cmd - Command UPIU structure99 * struct utp_upiu_cmd - Command UPIU structure
75 * @data_transfer_len: Data Transfer Length DW-3100 * @data_transfer_len: Data Transfer Length DW-3
include/ufs/ufs.h+1−0
@@ -170,6 +170,7 @@ enum attr_idn { · 169 unmodified lines
170 QUERY_ATTR_IDN_WB_BUFF_LIFE_TIME_EST = 0x1E,170 QUERY_ATTR_IDN_WB_BUFF_LIFE_TIME_EST = 0x1E,
171 QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE = 0x1F,171 QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE = 0x1F,
172 QUERY_ATTR_IDN_EXT_IID_EN = 0x2A,172 QUERY_ATTR_IDN_EXT_IID_EN = 0x2A,
173 QUERY_ATTR_IDN_TIMESTAMP = 0x30
173};174};
174 175
175/* Descriptor idn for Query requests */176/* Descriptor idn for Query requests */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t