ufshcd_wb_buf_resize is used to enable WB buffer resize. It first blocks
the upper layer from issuing reqs, then waits for the cmd queue to be
empty, and then issues the command to enable WB buffer resize.
It may be called anywhere, such as ufs-sysfs.c, so it needs to be declared
in the header files.
Signed-off-by: Lu Hongfei <luhongfei@vivo.com>
---
drivers/ufs/core/ufshcd-priv.h | 1 +
drivers/ufs/core/ufshcd.c | 21 +++++++++++++++++++++
include/ufs/ufshcd.h | 1 +
3 files changed, 23 insertions(+)
diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index f42d99ce5bf1..85caefa421f7 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -98,6 +98,7 @@ 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_wb_buf_resize(struct ufs_hba *hba, u32 resize_op);
/* Wrapper functions for safely calling variant operations */
static inline const char *ufshcd_get_var_name(struct ufs_hba *hba)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 93417518c04d..7e4461360cbd 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -6045,6 +6045,27 @@ static bool ufshcd_wb_need_flush(struct ufs_hba *hba)
return ufshcd_wb_presrv_usrspc_keep_vcc_on(hba, avail_buf);
}
+int ufshcd_wb_buf_resize(struct ufs_hba *hba, u32 resize_op)
+{
+ int ret;
+ u8 index;
+
+ ufshcd_scsi_block_requests(hba);
+ if (ufshcd_wait_for_doorbell_clr(hba, 1 * USEC_PER_SEC))
+ goto out;
+
+ index = ufshcd_wb_get_query_index(hba);
+ ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
+ QUERY_ATTR_IDN_WB_BUF_RESIZE_EN, index, 0, &resize_op);
+ if (ret)
+ dev_err(hba->dev,
+ "%s: Enable WB buf resize operation failed %d\n",
+ __func__, ret);
+out:
+ ufshcd_scsi_unblock_requests(hba);
+ return ret;
+}
+
static void ufshcd_rpm_dev_flush_recheck_work(struct work_struct *work)
{
struct ufs_hba *hba = container_of(to_delayed_work(work),
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 7d07b256e906..7dd560dc22c6 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -1381,6 +1381,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
struct ufs_ehs *ehs_rsp, int sg_cnt,
struct scatterlist *sg_list, enum dma_data_direction dir);
int ufshcd_wb_toggle(struct ufs_hba *hba, bool enable);
+int ufshcd_wb_buf_resize(struct ufs_hba *hba, u32 resize_op);
int ufshcd_wb_toggle_buf_flush(struct ufs_hba *hba, bool enable);
int ufshcd_suspend_prepare(struct device *dev);
int __ufshcd_suspend_prepare(struct device *dev, bool rpm_ok_for_spm);
--
2.39.0
Hi Lu,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Lu-Hongfei/scsi-ufs-core-add-wb-buffer-resize-related-attr_idn/20230908-182656
base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
patch link: https://lore.kernel.org/r/20230908102113.547-3-luhongfei%40vivo.com
patch subject: [PATCH v2 2/3] scsi: ufs: core: Add ufshcd_wb_buf_resize function to enable WB buffer resize
config: i386-randconfig-141-20230909 (https://download.01.org/0day-ci/archive/20230909/202309091536.TRk3mftu-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20230909/202309091536.TRk3mftu-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202309091536.TRk3mftu-lkp@intel.com/
New smatch warnings:
drivers/ufs/core/ufshcd.c:6067 ufshcd_wb_buf_resize() error: uninitialized symbol 'ret'.
Old smatch warnings:
drivers/ufs/core/ufshcd.c:5353 ufshcd_uic_cmd_compl() error: we previously assumed 'hba->active_uic_cmd' could be null (see line 5341)
vim +/ret +6067 drivers/ufs/core/ufshcd.c
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6049 int ufshcd_wb_buf_resize(struct ufs_hba *hba, u32 resize_op)
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6050 {
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6051 int ret;
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6052 u8 index;
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6053
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6054 ufshcd_scsi_block_requests(hba);
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6055 if (ufshcd_wait_for_doorbell_clr(hba, 1 * USEC_PER_SEC))
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6056 goto out;
ret is unitialized.
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6057
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6058 index = ufshcd_wb_get_query_index(hba);
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6059 ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6060 QUERY_ATTR_IDN_WB_BUF_RESIZE_EN, index, 0, &resize_op);
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6061 if (ret)
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6062 dev_err(hba->dev,
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6063 "%s: Enable WB buf resize operation failed %d\n",
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6064 __func__, ret);
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6065 out:
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6066 ufshcd_scsi_unblock_requests(hba);
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 @6067 return ret;
^^^
7b70b34c503067 drivers/ufs/core/ufshcd.c Lu Hongfei 2023-09-08 6068 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
On 9/8/23 03:20, Lu Hongfei wrote:
> diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
> index f42d99ce5bf1..85caefa421f7 100644
> --- a/drivers/ufs/core/ufshcd-priv.h
> +++ b/drivers/ufs/core/ufshcd-priv.h
> @@ -98,6 +98,7 @@ 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_wb_buf_resize(struct ufs_hba *hba, u32 resize_op);
>
> /* Wrapper functions for safely calling variant operations */
> static inline const char *ufshcd_get_var_name(struct ufs_hba *hba)
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 93417518c04d..7e4461360cbd 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -6045,6 +6045,27 @@ static bool ufshcd_wb_need_flush(struct ufs_hba *hba)
> return ufshcd_wb_presrv_usrspc_keep_vcc_on(hba, avail_buf);
> }
>
> +int ufshcd_wb_buf_resize(struct ufs_hba *hba, u32 resize_op)
> +{
> + int ret;
> + u8 index;
> +
> + ufshcd_scsi_block_requests(hba);
> + if (ufshcd_wait_for_doorbell_clr(hba, 1 * USEC_PER_SEC))
> + goto out;
> +
> + index = ufshcd_wb_get_query_index(hba);
> + ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
> + QUERY_ATTR_IDN_WB_BUF_RESIZE_EN, index, 0, &resize_op);
> + if (ret)
> + dev_err(hba->dev,
> + "%s: Enable WB buf resize operation failed %d\n",
> + __func__, ret);
> +out:
> + ufshcd_scsi_unblock_requests(hba);
> + return ret;
> +}
> +
> static void ufshcd_rpm_dev_flush_recheck_work(struct work_struct *work)
> {
> struct ufs_hba *hba = container_of(to_delayed_work(work),
> diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
> index 7d07b256e906..7dd560dc22c6 100644
> --- a/include/ufs/ufshcd.h
> +++ b/include/ufs/ufshcd.h
> @@ -1381,6 +1381,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
> struct ufs_ehs *ehs_rsp, int sg_cnt,
> struct scatterlist *sg_list, enum dma_data_direction dir);
> int ufshcd_wb_toggle(struct ufs_hba *hba, bool enable);
> +int ufshcd_wb_buf_resize(struct ufs_hba *hba, u32 resize_op);
> int ufshcd_wb_toggle_buf_flush(struct ufs_hba *hba, bool enable);
> int ufshcd_suspend_prepare(struct device *dev);
> int __ufshcd_suspend_prepare(struct device *dev, bool rpm_ok_for_spm);
My feedback about this patch is as follows:
- If a new function (ufshcd_wb_buf_resize()) is introduced, a caller for
that function should be introduced in the same patch.
- Function declarations should be added either in the private header
file or in the public header file (include/ufs/ufshcd.h) but not in both.
- The name of the ufshcd_wb_buf_resize() function seems misleading to
me. To me that name suggests that this functions resizes the
WriteBooster buffer. That's not what that function does - what it does
it to configure whether or not the UFS device is allowed to resize the
WB buffer.
- Please remove the ufshcd_scsi_block_requests(),
ufshcd_wait_for_doorbell_clr() and ufshcd_scsi_unblock_requests() calls.
I'm not aware of any requirement to pause SCSI command submission while
changing whether or not WB buffer resizing is enabled or disabled.
Thanks,
Bart.
Hi Lu,
kernel test robot noticed the following build warnings:
[auto build test WARNING on mkp-scsi/for-next]
[also build test WARNING on jejb-scsi/for-next linus/master v6.5 next-20230908]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Lu-Hongfei/scsi-ufs-core-add-wb-buffer-resize-related-attr_idn/20230908-182656
base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
patch link: https://lore.kernel.org/r/20230908102113.547-3-luhongfei%40vivo.com
patch subject: [PATCH v2 2/3] scsi: ufs: core: Add ufshcd_wb_buf_resize function to enable WB buffer resize
config: s390-randconfig-001-20230908 (https://download.01.org/0day-ci/archive/20230908/202309082109.DPcrgu3e-lkp@intel.com/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230908/202309082109.DPcrgu3e-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202309082109.DPcrgu3e-lkp@intel.com/
All warnings (new ones prefixed by >>):
In file included from drivers/ufs/core/ufshcd.c:25:
In file included from include/linux/iopoll.h:14:
In file included from include/linux/io.h:13:
In file included from arch/s390/include/asm/io.h:75:
include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
547 | val = __raw_readb(PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
560 | val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
| ~~~~~~~~~~ ^
include/uapi/linux/byteorder/big_endian.h:37:59: note: expanded from macro '__le16_to_cpu'
37 | #define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x))
| ^
include/uapi/linux/swab.h:102:54: note: expanded from macro '__swab16'
102 | #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x))
| ^
In file included from drivers/ufs/core/ufshcd.c:25:
In file included from include/linux/iopoll.h:14:
In file included from include/linux/io.h:13:
In file included from arch/s390/include/asm/io.h:75:
include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
573 | val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
| ~~~~~~~~~~ ^
include/uapi/linux/byteorder/big_endian.h:35:59: note: expanded from macro '__le32_to_cpu'
35 | #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x))
| ^
include/uapi/linux/swab.h:115:54: note: expanded from macro '__swab32'
115 | #define __swab32(x) (__u32)__builtin_bswap32((__u32)(x))
| ^
In file included from drivers/ufs/core/ufshcd.c:25:
In file included from include/linux/iopoll.h:14:
In file included from include/linux/io.h:13:
In file included from arch/s390/include/asm/io.h:75:
include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
584 | __raw_writeb(value, PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
594 | __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
604 | __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:692:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
692 | readsb(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:700:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
700 | readsw(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:708:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
708 | readsl(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:717:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
717 | writesb(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:726:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
726 | writesw(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:735:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
735 | writesl(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
>> drivers/ufs/core/ufshcd.c:6055:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
6055 | if (ufshcd_wait_for_doorbell_clr(hba, 1 * USEC_PER_SEC))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/ufs/core/ufshcd.c:6067:9: note: uninitialized use occurs here
6067 | return ret;
| ^~~
drivers/ufs/core/ufshcd.c:6055:2: note: remove the 'if' if its condition is always false
6055 | if (ufshcd_wait_for_doorbell_clr(hba, 1 * USEC_PER_SEC))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6056 | goto out;
| ~~~~~~~~~~~~~~~~~~~~~~~~
drivers/ufs/core/ufshcd.c:6051:9: note: initialize the variable 'ret' to silence this warning
6051 | int ret;
| ^
| = 0
13 warnings generated.
vim +6055 drivers/ufs/core/ufshcd.c
6048
6049 int ufshcd_wb_buf_resize(struct ufs_hba *hba, u32 resize_op)
6050 {
6051 int ret;
6052 u8 index;
6053
6054 ufshcd_scsi_block_requests(hba);
> 6055 if (ufshcd_wait_for_doorbell_clr(hba, 1 * USEC_PER_SEC))
6056 goto out;
6057
6058 index = ufshcd_wb_get_query_index(hba);
6059 ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
6060 QUERY_ATTR_IDN_WB_BUF_RESIZE_EN, index, 0, &resize_op);
6061 if (ret)
6062 dev_err(hba->dev,
6063 "%s: Enable WB buf resize operation failed %d\n",
6064 __func__, ret);
6065 out:
6066 ufshcd_scsi_unblock_requests(hba);
6067 return ret;
6068 }
6069
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2025 Red Hat, Inc.