Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge patch series "scsi: ufs: core: Always read the descriptors with max length"

Arthur Simchaev <Arthur.Simchaev@wdc.com> says:

Read any descriptor with a maximum size of QUERY_DESC_MAX_SIZE.
According to the spec the device returns the actual size. Thus can
improve code readability and save CPU cycles. While at it, clean up
few leftovers around the descriptor size parameter.

Link: https://lore.kernel.org/r/1670763911-8695-1-git-send-email-Arthur.Simchaev@wdc.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

+27 -95
+1 -6
drivers/ufs/core/ufs_bsg.c
··· 17 17 struct utp_upiu_query *qr) 18 18 { 19 19 int desc_size = be16_to_cpu(qr->length); 20 - int desc_id = qr->idn; 21 20 22 21 if (desc_size <= 0) 23 22 return -EINVAL; 24 23 25 - ufshcd_map_desc_id_to_length(hba, desc_id, desc_len); 26 - if (!*desc_len) 27 - return -EINVAL; 28 - 29 - *desc_len = min_t(int, *desc_len, desc_size); 24 + *desc_len = min_t(int, QUERY_DESC_MAX_SIZE, desc_size); 30 25 31 26 return 0; 32 27 }
-3
drivers/ufs/core/ufshcd-priv.h
··· 70 70 int ufshcd_hold(struct ufs_hba *hba, bool async); 71 71 void ufshcd_release(struct ufs_hba *hba); 72 72 73 - void ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id, 74 - int *desc_length); 75 - 76 73 int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd); 77 74 78 75 int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
+25 -78
drivers/ufs/core/ufshcd.c
··· 3400 3400 } 3401 3401 3402 3402 /** 3403 - * ufshcd_map_desc_id_to_length - map descriptor IDN to its length 3404 - * @hba: Pointer to adapter instance 3405 - * @desc_id: descriptor idn value 3406 - * @desc_len: mapped desc length (out) 3407 - */ 3408 - void ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id, 3409 - int *desc_len) 3410 - { 3411 - if (desc_id >= QUERY_DESC_IDN_MAX || desc_id == QUERY_DESC_IDN_RFU_0 || 3412 - desc_id == QUERY_DESC_IDN_RFU_1) 3413 - *desc_len = 0; 3414 - else 3415 - *desc_len = hba->desc_size[desc_id]; 3416 - } 3417 - EXPORT_SYMBOL(ufshcd_map_desc_id_to_length); 3418 - 3419 - static void ufshcd_update_desc_length(struct ufs_hba *hba, 3420 - enum desc_idn desc_id, int desc_index, 3421 - unsigned char desc_len) 3422 - { 3423 - if (hba->desc_size[desc_id] == QUERY_DESC_MAX_SIZE && 3424 - desc_id != QUERY_DESC_IDN_STRING && desc_index != UFS_RPMB_UNIT) 3425 - /* For UFS 3.1, the normal unit descriptor is 10 bytes larger 3426 - * than the RPMB unit, however, both descriptors share the same 3427 - * desc_idn, to cover both unit descriptors with one length, we 3428 - * choose the normal unit descriptor length by desc_index. 3429 - */ 3430 - hba->desc_size[desc_id] = desc_len; 3431 - } 3432 - 3433 - /** 3434 3403 * ufshcd_read_desc_param - read the specified descriptor parameter 3435 3404 * @hba: Pointer to adapter instance 3436 3405 * @desc_id: descriptor idn value ··· 3419 3450 { 3420 3451 int ret; 3421 3452 u8 *desc_buf; 3422 - int buff_len; 3453 + int buff_len = QUERY_DESC_MAX_SIZE; 3423 3454 bool is_kmalloc = true; 3424 3455 3425 3456 /* Safety check */ 3426 3457 if (desc_id >= QUERY_DESC_IDN_MAX || !param_size) 3427 3458 return -EINVAL; 3428 - 3429 - /* Get the length of descriptor */ 3430 - ufshcd_map_desc_id_to_length(hba, desc_id, &buff_len); 3431 - if (!buff_len) { 3432 - dev_err(hba->dev, "%s: Failed to get desc length\n", __func__); 3433 - return -EINVAL; 3434 - } 3435 - 3436 - if (param_offset >= buff_len) { 3437 - dev_err(hba->dev, "%s: Invalid offset 0x%x in descriptor IDN 0x%x, length 0x%x\n", 3438 - __func__, param_offset, desc_id, buff_len); 3439 - return -EINVAL; 3440 - } 3441 3459 3442 3460 /* Check whether we need temp memory */ 3443 3461 if (param_offset != 0 || param_size < buff_len) { ··· 3438 3482 3439 3483 /* Request for full descriptor */ 3440 3484 ret = ufshcd_query_descriptor_retry(hba, UPIU_QUERY_OPCODE_READ_DESC, 3441 - desc_id, desc_index, 0, 3442 - desc_buf, &buff_len); 3443 - 3485 + desc_id, desc_index, 0, 3486 + desc_buf, &buff_len); 3444 3487 if (ret) { 3445 3488 dev_err(hba->dev, "%s: Failed reading descriptor. desc_id %d, desc_index %d, param_offset %d, ret %d\n", 3446 3489 __func__, desc_id, desc_index, param_offset, ret); 3447 3490 goto out; 3491 + } 3492 + 3493 + /* Update descriptor length */ 3494 + buff_len = desc_buf[QUERY_DESC_LENGTH_OFFSET]; 3495 + 3496 + if (param_offset >= buff_len) { 3497 + dev_err(hba->dev, "%s: Invalid offset 0x%x in descriptor IDN 0x%x, length 0x%x\n", 3498 + __func__, param_offset, desc_id, buff_len); 3499 + return -EINVAL; 3448 3500 } 3449 3501 3450 3502 /* Sanity check */ ··· 3462 3498 ret = -EINVAL; 3463 3499 goto out; 3464 3500 } 3465 - 3466 - /* Update descriptor length */ 3467 - buff_len = desc_buf[QUERY_DESC_LENGTH_OFFSET]; 3468 - ufshcd_update_desc_length(hba, desc_id, desc_index, buff_len); 3469 3501 3470 3502 if (is_kmalloc) { 3471 3503 /* Make sure we don't copy more data than available */ ··· 4900 4940 */ 4901 4941 static void ufshcd_lu_init(struct ufs_hba *hba, struct scsi_device *sdev) 4902 4942 { 4903 - int len = hba->desc_size[QUERY_DESC_IDN_UNIT]; 4943 + int len = QUERY_DESC_MAX_SIZE; 4904 4944 u8 lun = ufshcd_scsi_to_upiu_lun(sdev->lun); 4905 4945 u8 lun_qdepth = hba->nutrs; 4906 4946 u8 *desc_buf; ··· 7524 7564 * In case regulators are not initialized we'll return 0 7525 7565 * @hba: per-adapter instance 7526 7566 * @desc_buf: power descriptor buffer to extract ICC levels from. 7527 - * @len: length of desc_buff 7528 7567 * 7529 7568 * Returns calculated ICC level 7530 7569 */ 7531 7570 static u32 ufshcd_find_max_sup_active_icc_level(struct ufs_hba *hba, 7532 - const u8 *desc_buf, int len) 7571 + const u8 *desc_buf) 7533 7572 { 7534 7573 u32 icc_level = 0; 7535 7574 ··· 7570 7611 static void ufshcd_set_active_icc_lvl(struct ufs_hba *hba) 7571 7612 { 7572 7613 int ret; 7573 - int buff_len = hba->desc_size[QUERY_DESC_IDN_POWER]; 7574 7614 u8 *desc_buf; 7575 7615 u32 icc_level; 7576 7616 7577 - desc_buf = kmalloc(buff_len, GFP_KERNEL); 7617 + desc_buf = kzalloc(QUERY_DESC_MAX_SIZE, GFP_KERNEL); 7578 7618 if (!desc_buf) 7579 7619 return; 7580 7620 7581 7621 ret = ufshcd_read_desc_param(hba, QUERY_DESC_IDN_POWER, 0, 0, 7582 - desc_buf, buff_len); 7622 + desc_buf, QUERY_DESC_MAX_SIZE); 7583 7623 if (ret) { 7584 7624 dev_err(hba->dev, 7585 - "%s: Failed reading power descriptor.len = %d ret = %d", 7586 - __func__, buff_len, ret); 7625 + "%s: Failed reading power descriptor ret = %d", 7626 + __func__, ret); 7587 7627 goto out; 7588 7628 } 7589 7629 7590 - icc_level = ufshcd_find_max_sup_active_icc_level(hba, desc_buf, 7591 - buff_len); 7630 + icc_level = ufshcd_find_max_sup_active_icc_level(hba, desc_buf); 7592 7631 dev_dbg(hba->dev, "%s: setting icc_level 0x%x", __func__, icc_level); 7593 7632 7594 7633 ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, ··· 7696 7739 (hba->dev_quirks & UFS_DEVICE_QUIRK_SUPPORT_EXTENDED_FEATURES))) 7697 7740 goto wb_disabled; 7698 7741 7699 - if (hba->desc_size[QUERY_DESC_IDN_DEVICE] < 7700 - DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP + 4) 7701 - goto wb_disabled; 7702 - 7703 7742 ext_ufs_feature = get_unaligned_be32(desc_buf + 7704 7743 DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP); 7705 7744 ··· 7803 7850 u8 *desc_buf; 7804 7851 struct ufs_dev_info *dev_info = &hba->dev_info; 7805 7852 7806 - desc_buf = kmalloc(QUERY_DESC_MAX_SIZE, GFP_KERNEL); 7853 + desc_buf = kzalloc(QUERY_DESC_MAX_SIZE, GFP_KERNEL); 7807 7854 if (!desc_buf) { 7808 7855 err = -ENOMEM; 7809 7856 goto out; 7810 7857 } 7811 7858 7812 7859 err = ufshcd_read_desc_param(hba, QUERY_DESC_IDN_DEVICE, 0, 0, desc_buf, 7813 - hba->desc_size[QUERY_DESC_IDN_DEVICE]); 7860 + QUERY_DESC_MAX_SIZE); 7814 7861 if (err) { 7815 7862 dev_err(hba->dev, "%s: Failed reading Device Desc. err = %d\n", 7816 7863 __func__, err); ··· 8057 8104 static int ufshcd_device_geo_params_init(struct ufs_hba *hba) 8058 8105 { 8059 8106 int err; 8060 - size_t buff_len; 8061 8107 u8 *desc_buf; 8062 8108 8063 - buff_len = hba->desc_size[QUERY_DESC_IDN_GEOMETRY]; 8064 - desc_buf = kmalloc(buff_len, GFP_KERNEL); 8109 + desc_buf = kzalloc(QUERY_DESC_MAX_SIZE, GFP_KERNEL); 8065 8110 if (!desc_buf) { 8066 8111 err = -ENOMEM; 8067 8112 goto out; 8068 8113 } 8069 8114 8070 8115 err = ufshcd_read_desc_param(hba, QUERY_DESC_IDN_GEOMETRY, 0, 0, 8071 - desc_buf, buff_len); 8116 + desc_buf, QUERY_DESC_MAX_SIZE); 8072 8117 if (err) { 8073 8118 dev_err(hba->dev, "%s: Failed reading Geometry Desc. err = %d\n", 8074 8119 __func__, err); ··· 8078 8127 else if (desc_buf[GEOMETRY_DESC_PARAM_MAX_NUM_LUN] == 0) 8079 8128 hba->dev_info.max_lu_supported = 8; 8080 8129 8081 - if (hba->desc_size[QUERY_DESC_IDN_GEOMETRY] >= 8130 + if (desc_buf[QUERY_DESC_LENGTH_OFFSET] >= 8082 8131 GEOMETRY_DESC_PARAM_HPB_MAX_ACTIVE_REGS) 8083 8132 ufshpb_get_geo_info(hba, desc_buf); 8084 8133 ··· 8163 8212 static int ufshcd_device_params_init(struct ufs_hba *hba) 8164 8213 { 8165 8214 bool flag; 8166 - int ret, i; 8167 - 8168 - /* Init device descriptor sizes */ 8169 - for (i = 0; i < QUERY_DESC_IDN_MAX; i++) 8170 - hba->desc_size[i] = QUERY_DESC_MAX_SIZE; 8215 + int ret; 8171 8216 8172 8217 /* Init UFS geometry descriptor related parameters */ 8173 8218 ret = ufshcd_device_geo_params_init(hba);
+1 -3
drivers/ufs/core/ufshpb.c
··· 2382 2382 { 2383 2383 u16 max_active_rgns; 2384 2384 u8 lu_enable; 2385 - int size; 2385 + int size = QUERY_DESC_MAX_SIZE; 2386 2386 int ret; 2387 2387 char desc_buf[QUERY_DESC_MAX_SIZE]; 2388 - 2389 - ufshcd_map_desc_id_to_length(hba, QUERY_DESC_IDN_UNIT, &size); 2390 2388 2391 2389 ufshcd_rpm_get_sync(hba); 2392 2390 ret = ufshcd_query_descriptor_retry(hba, UPIU_QUERY_OPCODE_READ_DESC,
-1
include/ufs/ufs.h
··· 38 38 #define UFS_UPIU_MAX_UNIT_NUM_ID 0x7F 39 39 #define UFS_MAX_LUNS (SCSI_W_LUN_BASE + UFS_UPIU_MAX_UNIT_NUM_ID) 40 40 #define UFS_UPIU_WLUN_ID (1 << 7) 41 - #define UFS_RPMB_UNIT 0xC4 42 41 43 42 /* WriteBooster buffer is available only for the logical unit from 0 to 7 */ 44 43 #define UFS_UPIU_MAX_WB_LUN_ID 8
-4
include/ufs/ufshcd.h
··· 957 957 bool is_urgent_bkops_lvl_checked; 958 958 959 959 struct rw_semaphore clk_scaling_lock; 960 - unsigned char desc_size[QUERY_DESC_IDN_MAX]; 961 960 atomic_t scsi_block_reqs_cnt; 962 961 963 962 struct device bsg_dev; ··· 1215 1216 void ufshcd_release(struct ufs_hba *hba); 1216 1217 1217 1218 void ufshcd_clkgate_delay_set(struct device *dev, unsigned long value); 1218 - 1219 - void ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id, 1220 - int *desc_length); 1221 1219 1222 1220 u32 ufshcd_get_local_unipro_ver(struct ufs_hba *hba); 1223 1221