|
102 | 102 | /* Default RTC update every 10 seconds */
|
103 | 103 | #define UFS_RTC_UPDATE_INTERVAL_MS (10 * MSEC_PER_SEC)
|
104 | 104 |
|
| 105 | +/* bMaxNumOfRTT is equal to two after device manufacturing */ |
| 106 | +#define DEFAULT_MAX_NUM_RTT 2 |
| 107 | + |
105 | 108 | /* UFSHC 4.0 compliant HC support this mode. */
|
106 | 109 | static bool use_mcq_mode = true;
|
107 | 110 |
|
@@ -2405,6 +2408,8 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
|
2405 | 2408 | ((hba->capabilities & MASK_TASK_MANAGEMENT_REQUEST_SLOTS) >> 16) + 1;
|
2406 | 2409 | hba->reserved_slot = hba->nutrs - 1;
|
2407 | 2410 |
|
| 2411 | + hba->nortt = FIELD_GET(MASK_NUMBER_OUTSTANDING_RTT, hba->capabilities) + 1; |
| 2412 | + |
2408 | 2413 | /* Read crypto capabilities */
|
2409 | 2414 | err = ufshcd_hba_init_crypto_capabilities(hba);
|
2410 | 2415 | if (err) {
|
@@ -8121,6 +8126,35 @@ static void ufshcd_ext_iid_probe(struct ufs_hba *hba, u8 *desc_buf)
|
8121 | 8126 | dev_info->b_ext_iid_en = ext_iid_en;
|
8122 | 8127 | }
|
8123 | 8128 |
|
| 8129 | +static void ufshcd_set_rtt(struct ufs_hba *hba) |
| 8130 | +{ |
| 8131 | + struct ufs_dev_info *dev_info = &hba->dev_info; |
| 8132 | + u32 rtt = 0; |
| 8133 | + u32 dev_rtt = 0; |
| 8134 | + |
| 8135 | + /* RTT override makes sense only for UFS-4.0 and above */ |
| 8136 | + if (dev_info->wspecversion < 0x400) |
| 8137 | + return; |
| 8138 | + |
| 8139 | + if (ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_READ_ATTR, |
| 8140 | + QUERY_ATTR_IDN_MAX_NUM_OF_RTT, 0, 0, &dev_rtt)) { |
| 8141 | + dev_err(hba->dev, "failed reading bMaxNumOfRTT\n"); |
| 8142 | + return; |
| 8143 | + } |
| 8144 | + |
| 8145 | + /* do not override if it was already written */ |
| 8146 | + if (dev_rtt != DEFAULT_MAX_NUM_RTT) |
| 8147 | + return; |
| 8148 | + |
| 8149 | + rtt = min_t(int, dev_info->rtt_cap, hba->nortt); |
| 8150 | + if (rtt == dev_rtt) |
| 8151 | + return; |
| 8152 | + |
| 8153 | + if (ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, |
| 8154 | + QUERY_ATTR_IDN_MAX_NUM_OF_RTT, 0, 0, &rtt)) |
| 8155 | + dev_err(hba->dev, "failed writing bMaxNumOfRTT\n"); |
| 8156 | +} |
| 8157 | + |
8124 | 8158 | void ufshcd_fixup_dev_quirks(struct ufs_hba *hba,
|
8125 | 8159 | const struct ufs_dev_quirk *fixups)
|
8126 | 8160 | {
|
@@ -8256,6 +8290,8 @@ static int ufs_get_device_desc(struct ufs_hba *hba)
|
8256 | 8290 | desc_buf[DEVICE_DESC_PARAM_SPEC_VER + 1];
|
8257 | 8291 | dev_info->bqueuedepth = desc_buf[DEVICE_DESC_PARAM_Q_DPTH];
|
8258 | 8292 |
|
| 8293 | + dev_info->rtt_cap = desc_buf[DEVICE_DESC_PARAM_RTT_CAP]; |
| 8294 | + |
8259 | 8295 | model_index = desc_buf[DEVICE_DESC_PARAM_PRDCT_NAME];
|
8260 | 8296 |
|
8261 | 8297 | err = ufshcd_read_string_desc(hba, model_index,
|
@@ -8508,6 +8544,8 @@ static int ufshcd_device_params_init(struct ufs_hba *hba)
|
8508 | 8544 | goto out;
|
8509 | 8545 | }
|
8510 | 8546 |
|
| 8547 | + ufshcd_set_rtt(hba); |
| 8548 | + |
8511 | 8549 | ufshcd_get_ref_clk_gating_wait(hba);
|
8512 | 8550 |
|
8513 | 8551 | if (!ufshcd_query_flag_retry(hba, UPIU_QUERY_OPCODE_READ_FLAG,
|
|
0 commit comments