Changes from V1:
- Updated commit description to explain the patch.
- Added Co-developed-by tag.
Nitin Rawat (2):
scsi: ufs: core: Export ufshcd_is_hba_active
scsi: ufs: ufs-qcom: check host controller state
drivers/ufs/core/ufshcd.c | 3 ++-
drivers/ufs/host/ufs-qcom.c | 4 ++++
include/ufs/ufshcd.h | 1 +
3 files changed, 7 insertions(+), 1 deletion(-)
--
2.17.1
Export ufshcd_is_hba_active() to allow vendor driver modules
to check the state of host controller.
Signed-off-by: Nitin Rawat <[email protected]>
---
drivers/ufs/core/ufshcd.c | 3 ++-
include/ufs/ufshcd.h | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 983fae84d9e8..962aa5c1fe69 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -995,10 +995,11 @@ static inline void ufshcd_hba_start(struct ufs_hba *hba)
*
* Returns true if and only if the controller is active.
*/
-static inline bool ufshcd_is_hba_active(struct ufs_hba *hba)
+bool ufshcd_is_hba_active(struct ufs_hba *hba)
{
return ufshcd_readl(hba, REG_CONTROLLER_ENABLE) & CONTROLLER_ENABLE;
}
+EXPORT_SYMBOL_GPL(ufshcd_is_hba_active);
u32 ufshcd_get_local_unipro_ver(struct ufs_hba *hba)
{
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 6dc11fa0ebb1..ef04c3363be8 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -1398,6 +1398,7 @@ 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);
void ufshcd_resume_complete(struct device *dev);
+bool ufshcd_is_hba_active(struct ufs_hba *hba);
/* Wrapper functions for safely calling variant operations */
static inline int ufshcd_vops_init(struct ufs_hba *hba)
--
2.17.1
Commit <52a518019ca1> (Fix missing clk change notification) added UFS
clock scaling notification to ufshcd_host_reset_and_restore. This
invokes hibern8 enter and exit on qualcomm platform which fails because
controller is in reset state.
Fix this by checking the Host controller state before sending
hibern8 command.
__ufshcd_wl_resume()
ufshcd_reset_and_restore()
ufshcd_host_reset_and_restore()
ufshcd_scale_clks()
ufshcd_vops_clk_scale_notify()
ufs_qcom_clk_scale_notify()
ufshcd_uic_hibern8_enter()
Fixes: 52a518019ca1 ("scsi: ufs: core: Fix missing clk change notification on host reset")
Co-developed-by: Manish Pandey <[email protected]>
Signed-off-by: Manish Pandey <[email protected]>
Signed-off-by: Nitin Rawat <[email protected]>
---
drivers/ufs/host/ufs-qcom.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 8d6fd4c3324f..95412e98a598 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -1254,6 +1254,10 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba,
struct ufs_pa_layer_attr *dev_req_params = &host->dev_req_params;
int err = 0;
+ /* check the host controller state before sending hibern8 cmd */
+ if (!ufshcd_is_hba_active(hba))
+ return 0;
+
if (status == PRE_CHANGE) {
err = ufshcd_uic_hibern8_enter(hba);
if (err)
--
2.17.1
On Wed, Jul 26, 2023 at 07:11:39PM +0530, Nitin Rawat wrote:
> Export ufshcd_is_hba_active() to allow vendor driver modules
> to check the state of host controller.
>
> Signed-off-by: Nitin Rawat <[email protected]>
Acked-by: Manivannan Sadhasivam <[email protected]>
- Mani
> ---
> drivers/ufs/core/ufshcd.c | 3 ++-
> include/ufs/ufshcd.h | 1 +
> 2 files changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 983fae84d9e8..962aa5c1fe69 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -995,10 +995,11 @@ static inline void ufshcd_hba_start(struct ufs_hba *hba)
> *
> * Returns true if and only if the controller is active.
> */
> -static inline bool ufshcd_is_hba_active(struct ufs_hba *hba)
> +bool ufshcd_is_hba_active(struct ufs_hba *hba)
> {
> return ufshcd_readl(hba, REG_CONTROLLER_ENABLE) & CONTROLLER_ENABLE;
> }
> +EXPORT_SYMBOL_GPL(ufshcd_is_hba_active);
>
> u32 ufshcd_get_local_unipro_ver(struct ufs_hba *hba)
> {
> diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
> index 6dc11fa0ebb1..ef04c3363be8 100644
> --- a/include/ufs/ufshcd.h
> +++ b/include/ufs/ufshcd.h
> @@ -1398,6 +1398,7 @@ 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);
> void ufshcd_resume_complete(struct device *dev);
> +bool ufshcd_is_hba_active(struct ufs_hba *hba);
>
> /* Wrapper functions for safely calling variant operations */
> static inline int ufshcd_vops_init(struct ufs_hba *hba)
> --
> 2.17.1
>
--
மணிவண்ணன் சதாசிவம்
On Wed, Jul 26, 2023 at 07:11:40PM +0530, Nitin Rawat wrote:
> Commit <52a518019ca1> (Fix missing clk change notification) added UFS
> clock scaling notification to ufshcd_host_reset_and_restore. This
> invokes hibern8 enter and exit on qualcomm platform which fails because
> controller is in reset state.
>
> Fix this by checking the Host controller state before sending
> hibern8 command.
>
> __ufshcd_wl_resume()
> ufshcd_reset_and_restore()
> ufshcd_host_reset_and_restore()
> ufshcd_scale_clks()
> ufshcd_vops_clk_scale_notify()
> ufs_qcom_clk_scale_notify()
> ufshcd_uic_hibern8_enter()
>
> Fixes: 52a518019ca1 ("scsi: ufs: core: Fix missing clk change notification on host reset")
>
Nit: No need of a newline here.
> Co-developed-by: Manish Pandey <[email protected]>
> Signed-off-by: Manish Pandey <[email protected]>
> Signed-off-by: Nitin Rawat <[email protected]>
Acked-by: Manivannan Sadhasivam <[email protected]>
- Mani
> ---
> drivers/ufs/host/ufs-qcom.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index 8d6fd4c3324f..95412e98a598 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -1254,6 +1254,10 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba,
> struct ufs_pa_layer_attr *dev_req_params = &host->dev_req_params;
> int err = 0;
>
> + /* check the host controller state before sending hibern8 cmd */
> + if (!ufshcd_is_hba_active(hba))
> + return 0;
> +
> if (status == PRE_CHANGE) {
> err = ufshcd_uic_hibern8_enter(hba);
> if (err)
> --
> 2.17.1
>
--
மணிவண்ணன் சதாசிவம்
Nitin,
> Nitin Rawat (2):
> scsi: ufs: core: Export ufshcd_is_hba_active
> scsi: ufs: ufs-qcom: check host controller state
Applied to 6.6/scsi-staging, thanks!
--
Martin K. Petersen Oracle Linux Engineering