* Re: [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() [not found] <CGME20260421110151epcas2p40628a13eb86c5c9b90626d14efc3b3ba@epcas2p4.samsung.com> @ 2026-04-21 11:01 ` hoyoung seo 2026-04-23 12:55 ` Can Guo 0 siblings, 1 reply; 8+ messages in thread From: hoyoung seo @ 2026-04-21 11:01 UTC (permalink / raw) To: can.guo Cc: James.Bottomley, adrian.hunter, alim.akhtar, avri.altman, beanhuo, bvanassche, chullee, huobean, keosung.park, linux-kernel, linux-scsi, liu.song13, mani, martin.petersen, peter.wang, rafael.j.wysocki, ram.dwivedi, tanghuan, vamshigajjela, kwangwon.min, kwmad.kim, cpgs, h10.kim, alim.akhtar Hi, How about you to add EXPORT_SYMBOL at ufshcd_query_attr_qword() function. In the case of ufshcd_query_attr(), there is export_symbol so it can be used in vendor driver. Likewise, if export_symbol is registered in ufshcd_query_attr_qword(), it can be used in the vendor driver and the pair will be correct. Thanks. SEO. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() 2026-04-21 11:01 ` [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() hoyoung seo @ 2026-04-23 12:55 ` Can Guo 0 siblings, 0 replies; 8+ messages in thread From: Can Guo @ 2026-04-23 12:55 UTC (permalink / raw) To: hoyoung seo Cc: James.Bottomley, adrian.hunter, alim.akhtar, avri.altman, beanhuo, bvanassche, chullee, huobean, keosung.park, linux-kernel, linux-scsi, liu.song13, mani, martin.petersen, peter.wang, rafael.j.wysocki, ram.dwivedi, tanghuan, vamshigajjela, kwangwon.min, kwmad.kim, cpgs, h10.kim Hi, On 4/21/2026 7:01 PM, hoyoung seo wrote: > Hi, > > How about you to add EXPORT_SYMBOL at ufshcd_query_attr_qword() function. > In the case of ufshcd_query_attr(), there is export_symbol so it can be used in vendor driver. > Likewise, if export_symbol is registered in ufshcd_query_attr_qword(), it can be used in the vendor driver and the pair will be correct. One should export a symbol only if there is a module *really* using it... Thanks, Can Guo. > > Thanks. > > SEO. > > ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <20260419135229.1036926-1-can.guo@oss.qualcomm.com>]
* [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() [not found] <20260419135229.1036926-1-can.guo@oss.qualcomm.com> @ 2026-04-19 13:52 ` Can Guo 2026-04-20 12:31 ` Peter Wang (王信友) ` (2 more replies) 0 siblings, 3 replies; 8+ messages in thread From: Can Guo @ 2026-04-19 13:52 UTC (permalink / raw) To: avri.altman, bvanassche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Can Guo, Alim Akhtar, James E.J. Bottomley, Keoseong Park, Daniel Lee, Ram Kumar Dwivedi, Huan Tang, Liu Song, Bean Huo, vamshi gajjela, Rafael J. Wysocki, Adrian Hunter, open list Introduce a new generic function ufshcd_query_attr_qword() to handle quad-word (64-bit) UFS attribute operations. This consolidates the handling of 64-bit attributes which was previously scattered across multiple specialized functions. Signed-off-by: Can Guo <can.guo@oss.qualcomm.com> --- drivers/ufs/core/ufs-sysfs.c | 30 ++++++-- drivers/ufs/core/ufshcd-priv.h | 3 +- drivers/ufs/core/ufshcd.c | 126 +++++++++++++++++---------------- 3 files changed, 94 insertions(+), 65 deletions(-) diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c index 99af3c73f1af..61052df2915c 100644 --- a/drivers/ufs/core/ufs-sysfs.c +++ b/drivers/ufs/core/ufs-sysfs.c @@ -594,8 +594,13 @@ static ssize_t device_lvl_exception_id_show(struct device *dev, u64 exception_id; int err; + if (hba->dev_info.wspecversion < 0x410) + return -EOPNOTSUPP; + ufshcd_rpm_get_sync(hba); - err = ufshcd_read_device_lvl_exception_id(hba, &exception_id); + err = ufshcd_query_attr_qword(hba, UPIU_QUERY_OPCODE_READ_ATTR, + QUERY_ATTR_IDN_DEV_LVL_EXCEPTION_ID, + 0, 0, &exception_id); ufshcd_rpm_put_sync(hba); if (err) @@ -1670,6 +1675,12 @@ static inline bool ufshcd_is_wb_attrs(enum attr_idn idn) idn <= QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE; } +static inline bool ufshcd_is_qword_attrs(enum attr_idn idn) +{ + return idn == QUERY_ATTR_IDN_TIMESTAMP || + idn == QUERY_ATTR_IDN_DEV_LVL_EXCEPTION_ID; +} + static int wb_read_resize_attrs(struct ufs_hba *hba, enum attr_idn idn, u32 *attr_val) { @@ -1736,6 +1747,7 @@ static ssize_t _name##_show(struct device *dev, \ struct device_attribute *attr, char *buf) \ { \ struct ufs_hba *hba = dev_get_drvdata(dev); \ + u64 qword_value; \ u32 value; \ int ret; \ u8 index = 0; \ @@ -1748,14 +1760,24 @@ static ssize_t _name##_show(struct device *dev, \ if (ufshcd_is_wb_attrs(QUERY_ATTR_IDN##_uname)) \ index = ufshcd_wb_get_query_index(hba); \ ufshcd_rpm_get_sync(hba); \ - ret = ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, \ - QUERY_ATTR_IDN##_uname, index, 0, &value); \ + if (ufshcd_is_qword_attrs(QUERY_ATTR_IDN##_uname)) \ + ret = ufshcd_query_attr_qword(hba, \ + UPIU_QUERY_OPCODE_READ_ATTR, \ + QUERY_ATTR_IDN##_uname, \ + index, 0, &qword_value); \ + else \ + ret = ufshcd_query_attr(hba, \ + UPIU_QUERY_OPCODE_READ_ATTR, \ + QUERY_ATTR_IDN##_uname, index, 0, &value); \ ufshcd_rpm_put_sync(hba); \ if (ret) { \ ret = -EINVAL; \ goto out; \ } \ - ret = sysfs_emit(buf, "0x%08X\n", value); \ + if (ufshcd_is_qword_attrs(QUERY_ATTR_IDN##_uname)) \ + ret = sysfs_emit(buf, "0x%016llX\n", qword_value); \ + else \ + ret = sysfs_emit(buf, "0x%08X\n", value); \ out: \ up(&hba->host_sem); \ return ret; \ diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h index 0a72148cb053..ed1adeb22ec6 100644 --- a/drivers/ufs/core/ufshcd-priv.h +++ b/drivers/ufs/core/ufshcd-priv.h @@ -60,6 +60,8 @@ int ufshcd_query_attr_retry(struct ufs_hba *hba, enum query_opcode opcode, u32 *attr_val); int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode, enum attr_idn idn, u8 index, u8 selector, u32 *attr_val); +int ufshcd_query_attr_qword(struct ufs_hba *hba, enum query_opcode opcode, + enum attr_idn idn, u8 index, u8 sel, u64 *attr_val); int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, enum flag_idn idn, u8 index, bool *flag_res); void ufshcd_auto_hibern8_update(struct ufs_hba *hba, u32 ahit); @@ -106,7 +108,6 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba, enum query_opcode desc_op); int ufshcd_wb_toggle(struct ufs_hba *hba, bool enable); -int ufshcd_read_device_lvl_exception_id(struct ufs_hba *hba, u64 *exception_id); int ufshcd_uic_tx_eqtr(struct ufs_hba *hba, int gear); void ufshcd_apply_valid_tx_eq_settings(struct ufs_hba *hba); diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 4805e40ed4d7..e5e22adcbbc3 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -3611,6 +3611,67 @@ int ufshcd_query_attr_retry(struct ufs_hba *hba, return ret; } +/** + * ufshcd_query_attr_qword - API function of sending query requests for quad-word attributes + * @hba: per-adapter instance + * @opcode: attribute opcode + * @idn: attribute idn to access + * @index: index field + * @sel: selector field + * @attr_val: the attribute value after the query request completes + * + * Return: 0 for success, non-zero in case of failure. + */ +int ufshcd_query_attr_qword(struct ufs_hba *hba, enum query_opcode opcode, + enum attr_idn idn, u8 index, u8 sel, u64 *attr_val) +{ + struct utp_upiu_query_v4_0 *upiu_req; + struct utp_upiu_query_v4_0 *upiu_resp; + struct ufs_query_req *request = NULL; + struct ufs_query_res *response = NULL; + int err; + + if (!attr_val) { + dev_err(hba->dev, "%s: attribute value required for opcode 0x%x\n", + __func__, opcode); + return -EINVAL; + } + + ufshcd_dev_man_lock(hba); + + ufshcd_init_query(hba, &request, &response, opcode, idn, index, sel); + + switch (opcode) { + case UPIU_QUERY_OPCODE_WRITE_ATTR: + request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST; + upiu_req = (struct utp_upiu_query_v4_0 *)&request->upiu_req; + put_unaligned_be64(*attr_val, &upiu_req->osf3); + break; + case UPIU_QUERY_OPCODE_READ_ATTR: + request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST; + break; + default: + dev_err(hba->dev, "%s: Expected query attr opcode but got = 0x%.2x\n", + __func__, opcode); + err = -EINVAL; + goto out_unlock; + } + + err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, dev_cmd_timeout); + if (err) { + dev_err(hba->dev, "%s: opcode 0x%.2x for idn %d failed, index %d, selector %d, err = %d\n", + __func__, opcode, idn, index, sel, err); + goto out_unlock; + } + + upiu_resp = (struct utp_upiu_query_v4_0 *)response; + *attr_val = get_unaligned_be64(&upiu_resp->osf3); + +out_unlock: + ufshcd_dev_man_unlock(hba); + return err; +} + /* * Return: 0 upon success; > 0 in case the UFS device reported an OCS error; * < 0 if another error occurred. @@ -6224,46 +6285,6 @@ static void ufshcd_bkops_exception_event_handler(struct ufs_hba *hba) __func__, err); } -/* - * Return: 0 upon success; > 0 in case the UFS device reported an OCS error; - * < 0 if another error occurred. - */ -int ufshcd_read_device_lvl_exception_id(struct ufs_hba *hba, u64 *exception_id) -{ - struct utp_upiu_query_v4_0 *upiu_resp; - struct ufs_query_req *request = NULL; - struct ufs_query_res *response = NULL; - int err; - - if (hba->dev_info.wspecversion < 0x410) - return -EOPNOTSUPP; - - ufshcd_hold(hba); - mutex_lock(&hba->dev_cmd.lock); - - ufshcd_init_query(hba, &request, &response, - UPIU_QUERY_OPCODE_READ_ATTR, - QUERY_ATTR_IDN_DEV_LVL_EXCEPTION_ID, 0, 0); - - request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST; - - err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, dev_cmd_timeout); - - if (err) { - dev_err(hba->dev, "%s: failed to read device level exception %d\n", - __func__, err); - goto out; - } - - upiu_resp = (struct utp_upiu_query_v4_0 *)response; - *exception_id = get_unaligned_be64(&upiu_resp->osf3); -out: - mutex_unlock(&hba->dev_cmd.lock); - ufshcd_release(hba); - - return err; -} - static int __ufshcd_wb_toggle(struct ufs_hba *hba, bool set, enum flag_idn idn) { u8 index; @@ -9113,35 +9134,20 @@ static int ufshcd_device_params_init(struct ufs_hba *hba) static void ufshcd_set_timestamp_attr(struct ufs_hba *hba) { - int err; - struct ufs_query_req *request = NULL; - struct ufs_query_res *response = NULL; struct ufs_dev_info *dev_info = &hba->dev_info; - struct utp_upiu_query_v4_0 *upiu_data; + u64 ts_ns; + int err; if (dev_info->wspecversion < 0x400 || hba->dev_quirks & UFS_DEVICE_QUIRK_NO_TIMESTAMP_SUPPORT) return; - ufshcd_dev_man_lock(hba); - - ufshcd_init_query(hba, &request, &response, - UPIU_QUERY_OPCODE_WRITE_ATTR, - QUERY_ATTR_IDN_TIMESTAMP, 0, 0); - - request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST; - - upiu_data = (struct utp_upiu_query_v4_0 *)&request->upiu_req; - - put_unaligned_be64(ktime_get_real_ns(), &upiu_data->osf3); - - err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, dev_cmd_timeout); - + ts_ns = ktime_get_real_ns(); + err = ufshcd_query_attr_qword(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, + QUERY_ATTR_IDN_TIMESTAMP, 0, 0, &ts_ns); if (err) dev_err(hba->dev, "%s: failed to set timestamp %d\n", __func__, err); - - ufshcd_dev_man_unlock(hba); } /** -- 2.34.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() 2026-04-19 13:52 ` Can Guo @ 2026-04-20 12:31 ` Peter Wang (王信友) 2026-04-20 16:58 ` Bart Van Assche 2026-04-20 22:04 ` Bean Huo 2 siblings, 0 replies; 8+ messages in thread From: Peter Wang (王信友) @ 2026-04-20 12:31 UTC (permalink / raw) To: beanhuo@micron.com, mani@kernel.org, can.guo@oss.qualcomm.com, avri.altman@wdc.com, bvanassche@acm.org, martin.petersen@oracle.com Cc: liu.song13@zte.com.cn, huobean@gmail.com, vamshigajjela@google.com, tanghuan@vivo.com, ram.dwivedi@oss.qualcomm.com, linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, alim.akhtar@samsung.com, chullee@google.com, keosung.park@samsung.com, adrian.hunter@intel.com, James.Bottomley@HansenPartnership.com, rafael.j.wysocki@intel.com On Sun, 2026-04-19 at 06:52 -0700, Can Guo wrote: > Introduce a new generic function ufshcd_query_attr_qword() to handle > quad-word (64-bit) UFS attribute operations. This consolidates the > handling of 64-bit attributes which was previously scattered across > multiple specialized functions. > > Signed-off-by: Can Guo <can.guo@oss.qualcomm.com> > --- Reviewed-by: Peter Wang <peter.wang@mediatek.com> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() 2026-04-19 13:52 ` Can Guo 2026-04-20 12:31 ` Peter Wang (王信友) @ 2026-04-20 16:58 ` Bart Van Assche 2026-04-23 12:59 ` Can Guo 2026-04-20 22:04 ` Bean Huo 2 siblings, 1 reply; 8+ messages in thread From: Bart Van Assche @ 2026-04-20 16:58 UTC (permalink / raw) To: Can Guo, avri.altman, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Alim Akhtar, James E.J. Bottomley, Keoseong Park, Daniel Lee, Ram Kumar Dwivedi, Huan Tang, Liu Song, Bean Huo, vamshi gajjela, Rafael J. Wysocki, Adrian Hunter, open list On 4/19/26 6:52 AM, Can Guo wrote: > +static inline bool ufshcd_is_qword_attrs(enum attr_idn idn) > +{ > + return idn == QUERY_ATTR_IDN_TIMESTAMP || > + idn == QUERY_ATTR_IDN_DEV_LVL_EXCEPTION_ID; > +} Please change "ufshcd_is_qword_attrs()" into "ufshcd_is_qword_attr()". > +/** > + * ufshcd_query_attr_qword - API function of sending query requests for quad-word attributes > + * @hba: per-adapter instance > + * @opcode: attribute opcode > + * @idn: attribute idn to access > + * @index: index field > + * @sel: selector field > + * @attr_val: the attribute value after the query request completes > + * > + * Return: 0 for success, non-zero in case of failure. > + */ The word "API" is uncommon in the first line of kernel-doc headers. Please remove it. Otherwise this patch looks good to me. Thanks, Bart. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() 2026-04-20 16:58 ` Bart Van Assche @ 2026-04-23 12:59 ` Can Guo 0 siblings, 0 replies; 8+ messages in thread From: Can Guo @ 2026-04-23 12:59 UTC (permalink / raw) To: Bart Van Assche, avri.altman, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Alim Akhtar, James E.J. Bottomley, Keoseong Park, Daniel Lee, Ram Kumar Dwivedi, Huan Tang, Liu Song, Bean Huo, vamshi gajjela, Rafael J. Wysocki, Adrian Hunter, open list On 4/21/2026 12:58 AM, Bart Van Assche wrote: > On 4/19/26 6:52 AM, Can Guo wrote: >> +static inline bool ufshcd_is_qword_attrs(enum attr_idn idn) >> +{ >> + return idn == QUERY_ATTR_IDN_TIMESTAMP || >> + idn == QUERY_ATTR_IDN_DEV_LVL_EXCEPTION_ID; >> +} > > Please change "ufshcd_is_qword_attrs()" into "ufshcd_is_qword_attr()". Done. > >> +/** >> + * ufshcd_query_attr_qword - API function of sending query requests >> for quad-word attributes >> + * @hba: per-adapter instance >> + * @opcode: attribute opcode >> + * @idn: attribute idn to access >> + * @index: index field >> + * @sel: selector field >> + * @attr_val: the attribute value after the query request completes >> + * >> + * Return: 0 for success, non-zero in case of failure. >> + */ > > The word "API" is uncommon in the first line of kernel-doc headers. > Please remove it. Done. Thanks, Can Guo. > > Otherwise this patch looks good to me. > > Thanks, > > Bart. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() 2026-04-19 13:52 ` Can Guo 2026-04-20 12:31 ` Peter Wang (王信友) 2026-04-20 16:58 ` Bart Van Assche @ 2026-04-20 22:04 ` Bean Huo 2026-04-23 13:30 ` Can Guo 2 siblings, 1 reply; 8+ messages in thread From: Bean Huo @ 2026-04-20 22:04 UTC (permalink / raw) To: Can Guo, avri.altman, bvanassche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Alim Akhtar, James E.J. Bottomley, Keoseong Park, Daniel Lee, Ram Kumar Dwivedi, Huan Tang, Liu Song, vamshi gajjela, Rafael J. Wysocki, Adrian Hunter, open list Can, On Sun, 2026-04-19 at 06:52 -0700, Can Guo wrote: > static int wb_read_resize_attrs(struct ufs_hba *hba, > enum attr_idn idn, u32 *attr_val) > { > @@ -1736,6 +1747,7 @@ static ssize_t _name##_show(struct device > *dev, \ > struct device_attribute *attr, char *buf) \ > { \ > struct ufs_hba *hba = dev_get_drvdata(dev); \ > + u64 > qword_value; \ u64 qword_value __maybe_unused; > u32 value; \ > int ret; \ > u8 index = 0; \ > @@ -1748,14 +1760,24 @@ static ssize_t _name##_show(struct device > *dev, \ > if (ufshcd_is_wb_attrs(QUERY_ATTR_IDN##_uname)) \ > index = ufshcd_wb_get_query_index(hba); \ > ufshcd_rpm_get_sync(hba); \ > - ret = ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, \ > - QUERY_ATTR_IDN##_uname, index, 0, &value); \ > + if (ufshcd_is_qword_attrs(QUERY_ATTR_IDN##_uname)) \ > + ret = ufshcd_query_attr_qword(hba, \ > + UPIU_QUERY_OPCODE_READ_ATTR, \ > + QUERY_ATTR_IDN##_uname, \ > + index, 0, > &qword_value); \ > + else \ > + ret = ufshcd_query_attr(hba, \ > + UPIU_QUERY_OPCODE_READ_ATTR, \ > + QUERY_ATTR_IDN##_uname, index, 0, &value); \ > ufshcd_rpm_put_sync(hba); \ > if (ret) { \ > ret = -EINVAL; \ > goto out; \ > } \ > - ret = sysfs_emit(buf, "0x%08X\n", value); \ > + if (ufshcd_is_qword_attrs(QUERY_ATTR_IDN##_uname)) \ > + ret = sysfs_emit(buf, "0x%016llX\n", > qword_value); \ > + else \ > + ret = sysfs_emit(buf, "0x%08X\n", value); \ > out: \ > up(&hba->host_sem); \ > return ret; \ > ... > > +/** > + * ufshcd_query_attr_qword - API function of sending query requests for quad- > word attributes > + * @hba: per-adapter instance > + * @opcode: attribute opcode > + * @idn: attribute idn to access > + * @index: index field > + * @sel: selector field > + * @attr_val: the attribute value after the query request completes > + * > + * Return: 0 for success, non-zero in case of failure. > + */ > +int ufshcd_query_attr_qword(struct ufs_hba *hba, enum query_opcode opcode, > + enum attr_idn idn, u8 index, u8 sel, u64 > *attr_val) > +{ > + struct utp_upiu_query_v4_0 *upiu_req; > + struct utp_upiu_query_v4_0 *upiu_resp; > + struct ufs_query_req *request = NULL; > + struct ufs_query_res *response = NULL; > + int err; > + > + if (!attr_val) { > + dev_err(hba->dev, "%s: attribute value required for opcode > 0x%x\n", > + __func__, opcode); > + return -EINVAL; > + } > + > + ufshcd_dev_man_lock(hba); > + > + ufshcd_init_query(hba, &request, &response, opcode, idn, index, sel); > + > + switch (opcode) { > + case UPIU_QUERY_OPCODE_WRITE_ATTR: > + request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST; > + upiu_req = (struct utp_upiu_query_v4_0 *)&request->upiu_req; > + put_unaligned_be64(*attr_val, &upiu_req->osf3); > + break; > + case UPIU_QUERY_OPCODE_READ_ATTR: > + request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST; > + break; > + default: > + dev_err(hba->dev, "%s: Expected query attr opcode but got = > 0x%.2x\n", > + __func__, opcode); > + err = -EINVAL; > + goto out_unlock; > + } > + > + err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, dev_cmd_timeout); > + if (err) { > + dev_err(hba->dev, "%s: opcode 0x%.2x for idn %d failed, index > %d, selector %d, err = %d\n", > + __func__, opcode, idn, index, sel, err); > + goto out_unlock; > + } > + > + upiu_resp = (struct utp_upiu_query_v4_0 *)response; > + *attr_val = get_unaligned_be64(&upiu_resp->osf3); > + > +out_unlock: > + ufshcd_dev_man_unlock(hba); > + return err; > +} > + this needs a wrapper for retry? In ufshcd_extract_tx_eq_settings_attrs(), the 32-bit dTxEQGnSettingsExt read uses ufshcd_query_attr_retry(), but the 64-bit qTxEQGnSettings read uses bare ufshcd_query_attr_qword() with no retries. Kind regards, Bean ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() 2026-04-20 22:04 ` Bean Huo @ 2026-04-23 13:30 ` Can Guo 0 siblings, 0 replies; 8+ messages in thread From: Can Guo @ 2026-04-23 13:30 UTC (permalink / raw) To: Bean Huo, avri.altman, bvanassche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Alim Akhtar, James E.J. Bottomley, Keoseong Park, Daniel Lee, Ram Kumar Dwivedi, Huan Tang, Liu Song, vamshi gajjela, Rafael J. Wysocki, Adrian Hunter, open list On 4/21/2026 6:04 AM, Bean Huo wrote: > Can, > > > On Sun, 2026-04-19 at 06:52 -0700, Can Guo wrote: >> static int wb_read_resize_attrs(struct ufs_hba *hba, >> enum attr_idn idn, u32 *attr_val) >> { >> @@ -1736,6 +1747,7 @@ static ssize_t _name##_show(struct device >> *dev, \ >> struct device_attribute *attr, char *buf) \ >> { \ >> struct ufs_hba *hba = dev_get_drvdata(dev); \ >> + u64 >> qword_value; \ > u64 qword_value __maybe_unused; > > >> u32 value; \ >> int ret; \ >> u8 index = 0; \ >> @@ -1748,14 +1760,24 @@ static ssize_t _name##_show(struct device >> *dev, \ >> if (ufshcd_is_wb_attrs(QUERY_ATTR_IDN##_uname)) \ >> index = ufshcd_wb_get_query_index(hba); \ >> ufshcd_rpm_get_sync(hba); \ >> - ret = ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, \ >> - QUERY_ATTR_IDN##_uname, index, 0, &value); \ >> + if (ufshcd_is_qword_attrs(QUERY_ATTR_IDN##_uname)) \ >> + ret = ufshcd_query_attr_qword(hba, \ >> + UPIU_QUERY_OPCODE_READ_ATTR, \ >> + QUERY_ATTR_IDN##_uname, \ >> + index, 0, >> &qword_value); \ >> + else \ >> + ret = ufshcd_query_attr(hba, \ >> + UPIU_QUERY_OPCODE_READ_ATTR, \ >> + QUERY_ATTR_IDN##_uname, index, 0, &value); \ >> ufshcd_rpm_put_sync(hba); \ >> if (ret) { \ >> ret = -EINVAL; \ >> goto out; \ >> } \ >> - ret = sysfs_emit(buf, "0x%08X\n", value); \ >> + if (ufshcd_is_qword_attrs(QUERY_ATTR_IDN##_uname)) \ >> + ret = sysfs_emit(buf, "0x%016llX\n", >> qword_value); \ >> + else \ >> + ret = sysfs_emit(buf, "0x%08X\n", value); \ >> out: \ >> up(&hba->host_sem); \ >> return ret; \ >> > ... > > >> >> +/** >> + * ufshcd_query_attr_qword - API function of sending query requests for quad- >> word attributes >> + * @hba: per-adapter instance >> + * @opcode: attribute opcode >> + * @idn: attribute idn to access >> + * @index: index field >> + * @sel: selector field >> + * @attr_val: the attribute value after the query request completes >> + * >> + * Return: 0 for success, non-zero in case of failure. >> + */ >> +int ufshcd_query_attr_qword(struct ufs_hba *hba, enum query_opcode opcode, >> + enum attr_idn idn, u8 index, u8 sel, u64 >> *attr_val) >> +{ >> + struct utp_upiu_query_v4_0 *upiu_req; >> + struct utp_upiu_query_v4_0 *upiu_resp; >> + struct ufs_query_req *request = NULL; >> + struct ufs_query_res *response = NULL; >> + int err; >> + >> + if (!attr_val) { >> + dev_err(hba->dev, "%s: attribute value required for opcode >> 0x%x\n", >> + __func__, opcode); >> + return -EINVAL; >> + } >> + >> + ufshcd_dev_man_lock(hba); >> + >> + ufshcd_init_query(hba, &request, &response, opcode, idn, index, sel); >> + >> + switch (opcode) { >> + case UPIU_QUERY_OPCODE_WRITE_ATTR: >> + request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST; >> + upiu_req = (struct utp_upiu_query_v4_0 *)&request->upiu_req; >> + put_unaligned_be64(*attr_val, &upiu_req->osf3); >> + break; >> + case UPIU_QUERY_OPCODE_READ_ATTR: >> + request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST; >> + break; >> + default: >> + dev_err(hba->dev, "%s: Expected query attr opcode but got = >> 0x%.2x\n", >> + __func__, opcode); >> + err = -EINVAL; >> + goto out_unlock; >> + } >> + >> + err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, dev_cmd_timeout); >> + if (err) { >> + dev_err(hba->dev, "%s: opcode 0x%.2x for idn %d failed, index >> %d, selector %d, err = %d\n", >> + __func__, opcode, idn, index, sel, err); >> + goto out_unlock; >> + } >> + >> + upiu_resp = (struct utp_upiu_query_v4_0 *)response; >> + *attr_val = get_unaligned_be64(&upiu_resp->osf3); >> + >> +out_unlock: >> + ufshcd_dev_man_unlock(hba); >> + return err; >> +} >> + > this needs a wrapper for retry? In ufshcd_extract_tx_eq_settings_attrs(), the > 32-bit dTxEQGnSettingsExt read uses ufshcd_query_attr_retry(), but the 64-bit > qTxEQGnSettings read uses bare ufshcd_query_attr_qword() with no retries. I will use the non-retry version in ufs_txeq.c to be symmetrical, because I don't really need retry - retry never helped in real cases. Thanks, Can Guo. > > Kind regards, > Bean ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-04-23 13:31 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20260421110151epcas2p40628a13eb86c5c9b90626d14efc3b3ba@epcas2p4.samsung.com>
2026-04-21 11:01 ` [PATCH 1/2] scsi: ufs: core: Introduce function ufshcd_query_attr_qword() hoyoung seo
2026-04-23 12:55 ` Can Guo
[not found] <20260419135229.1036926-1-can.guo@oss.qualcomm.com>
2026-04-19 13:52 ` Can Guo
2026-04-20 12:31 ` Peter Wang (王信友)
2026-04-20 16:58 ` Bart Van Assche
2026-04-23 12:59 ` Can Guo
2026-04-20 22:04 ` Bean Huo
2026-04-23 13:30 ` Can Guo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox