scsi: ufs: export hibern8 entry and exit
Subsystems (2)
PATCH v3 1/2 scsi: ufs: export hibern8 entry and exit
Qualcomm controllers need to be in hibern8 before scaling up or down the clocks. Hence, export the hibern8 entry and exit functions.
--- drivers/scsi/ufs/ufshcd.c | 8 ++++---- drivers/scsi/ufs/ufshcd.h | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-)
drivers/scsi/ufs/ufshcd.c +4 -4
@@ -250,8 +250,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba);static int __ufshcd_setup_clocks (struct ufs_hba *hba,bool on,bool skip_ref_clk);static int ufshcd_setup_clocks (struct ufs_hba *hba,bool on); -static int ufshcd_uic_hibern8_exit (struct ufs_hba *hba); -static int ufshcd_uic_hibern8_enter (struct ufs_hba *hba);static inline void ufshcd_add_delay_before_dme_cmd (struct ufs_hba *hba);static int ufshcd_host_reset_and_restore (struct ufs_hba *hba);static void ufshcd_resume_clkscaling (struct ufs_hba *hba);
@@ -3904,7 +3902,7 @@ static int __ufshcd_uic_hibern8_enter(struct ufs_hba *hba)return ret; } -static int ufshcd_uic_hibern8_enter (struct ufs_hba *hba) +int ufshcd_uic_hibern8_enter (struct ufs_hba *hba) {int ret =0 , retries;
@@ -3916,8 +3914,9 @@ static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba) out:return ret; } +EXPORT_SYMBOL_GPL (ufshcd_uic_hibern8_enter); -static int ufshcd_uic_hibern8_exit (struct ufs_hba *hba) +int ufshcd_uic_hibern8_exit (struct ufs_hba *hba) {struct uic_command uic_cmd = {0 };int ret;
@@ -3943,6 +3942,7 @@ static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba)return ret; } +EXPORT_SYMBOL_GPL (ufshcd_uic_hibern8_exit);static void ufshcd_auto_hibern8_enable (struct ufs_hba *hba) {
drivers/scsi/ufs/ufshcd.h +2 -1
@@ -1107,5 +1107,6 @@ static inline u8 ufshcd_scsi_to_upiu_lun(unsigned int scsi_lun)int ufshcd_dump_regs (struct ufs_hba *hba,size_t offset,size_t len,const char *prefix); - +int ufshcd_uic_hibern8_enter (struct ufs_hba *hba); +int ufshcd_uic_hibern8_exit (struct ufs_hba *hba);#endif /* End of Header */
Signature · 1 line
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
PATCH v3 2/2 scsi: ufs-qcom: enter and exit hibern8 during clock scaling
Qualcomm controller needs to be in hibern8 before scaling clocks. This change puts the controller in hibern8 state before scaling and brings it out after scaling of clocks.
--- drivers/scsi/ufs/ufs-qcom.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/scsi/ufs/ufs-qcom.c +11 -1
@@ -1305,18 +1305,27 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba,int err =0 ;if (status ==PRE_CHANGE ) { + err =ufshcd_uic_hibern8_enter (hba); +if (err) +return err;if (scale_up) err =ufs_qcom_clk_scale_up_pre_change (hba);else err =ufs_qcom_clk_scale_down_pre_change (hba); +if (err) +ufshcd_uic_hibern8_exit (hba); + }else {if (scale_up) err =ufs_qcom_clk_scale_up_post_change (hba);else err =ufs_qcom_clk_scale_down_post_change (hba); -if (err || !dev_req_params) + +if (err || !dev_req_params) { +ufshcd_uic_hibern8_exit (hba); goto out; + } ufs_qcom_cfg_timers(hba, dev_req_params->gear_rx,
@@ -1324,6 +1333,7 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba, dev_req_params->hs_rate, false);ufs_qcom_update_bus_bw_vote (host); +ufshcd_uic_hibern8_exit (hba); } out:
Signature · 1 line
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
RE: [PATCH v3 2/2] scsi: ufs-qcom: enter and exit hibern8 during clock scaling
Hi Asutosh,
Please check comments.
-----Original Message-----
From: Asutosh Das <[email protected]>
Sent: Wednesday, October 23, 2019 5:49 PM
To: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Cc: [email protected]; [email protected]; [email protected]; [email protected]; Asutosh Das <[email protected]>; Andy Gross <[email protected]>; Alim Akhtar <[email protected]>; Avri Altman <[email protected]>; Pedro Sousa <[email protected]>; James E.J. Bottomley <[email protected]>; open list:ARM/QUALCOMM SUPPORT <[email protected]>; open list <[email protected]>
Subject: [PATCH v3 2/2] scsi: ufs-qcom: enter and exit hibern8 during clock scaling
Qualcomm controller needs to be in hibern8 before scaling clocks. This change puts the controller in hibern8 state before scaling and brings it out after scaling of clocks.
--- drivers/scsi/ufs/ufs-qcom.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/scsi/ufs/ufs-qcom.c +11 -1
@@ -1305,18 +1305,27 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba,int err =0 ;if (status ==PRE_CHANGE ) { + err =ufshcd_uic_hibern8_enter (hba); +if (err) +return err;if (scale_up) err =ufs_qcom_clk_scale_up_pre_change (hba);else err =ufs_qcom_clk_scale_down_pre_change (hba); +if (err) +ufshcd_uic_hibern8_exit (hba); + }else {if (scale_up) err =ufs_qcom_clk_scale_up_post_change (hba);else err =ufs_qcom_clk_scale_down_post_change (hba); -if (err || !dev_req_params) + +if (err || !dev_req_params) { +ufshcd_uic_hibern8_exit (hba); goto out; + } ufs_qcom_cfg_timers(hba, dev_req_params->gear_rx,
@@ -1324,6 +1333,7 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba, dev_req_params->hs_rate, false);ufs_qcom_update_bus_bw_vote (host); +ufshcd_uic_hibern8_exit (hba);
Here you are creating the possibility of returning a success even if hibern8 exit fails. If hibern8 exit fails the ufs recovery will be triggered and "err" variable will not get updated in this function, how is this handled? Did you tested this possibility?
}
out:
Signature · 6 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project. This is just a doubt, it might make sense in this use case, please give me your thoughts. Thank you, Pedro Sousa
Re: [PATCH v3 2/2] scsi: ufs-qcom: enter and exit hibern8 during clock scaling
Hi Pedro,
Quoted 3 lines · Pedro Sousa
Hi Asutosh,
Please check comments.
Sorry for missing out on this and thanks for your review.
Quoted 60 lines
-----Original Message-----
From: Asutosh Das <[email protected]>
Sent: Wednesday, October 23, 2019 5:49 PM
To: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Cc: [email protected]; [email protected]; [email protected]; [email protected]; Asutosh Das <[email protected]>; Andy Gross <[email protected]>; Alim Akhtar <[email protected]>; Avri Altman <[email protected]>; Pedro Sousa <[email protected]>; James E.J. Bottomley <[email protected]>; open list:ARM/QUALCOMM SUPPORT <[email protected]>; open list <[email protected]>
Subject: [PATCH v3 2/2] scsi: ufs-qcom: enter and exit hibern8 during clock scalingQualcomm controller needs to be in hibern8 before scaling clocks. This change puts the controller in hibern8 state before scaling and brings it out after scaling of clocks.
Signed-off-by Asutosh Das <[email protected]>--- drivers/scsi/ufs/ufs-qcom.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)drivers/scsi/ufs/ufs-qcom.c +11
-1@@ -1305,18 +1305,27 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba,int err =0 ;if (status ==PRE_CHANGE ) { + err =ufshcd_uic_hibern8_enter (hba); +if (err) +return err;if (scale_up) err =ufs_qcom_clk_scale_up_pre_change (hba);else err =ufs_qcom_clk_scale_down_pre_change (hba); +if (err) +ufshcd_uic_hibern8_exit (hba); + }else {if (scale_up) err =ufs_qcom_clk_scale_up_post_change (hba);else err =ufs_qcom_clk_scale_down_post_change (hba); -if (err || !dev_req_params) + +if (err || !dev_req_params) { +ufshcd_uic_hibern8_exit (hba); goto out; + } ufs_qcom_cfg_timers(hba, dev_req_params->gear_rx,@@ -1324,6 +1333,7 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba, dev_req_params->hs_rate, false);ufs_qcom_update_bus_bw_vote (host); +ufshcd_uic_hibern8_exit (hba);Here you are creating the possibility of returning a success even if hibern8 exit fails. If hibern8 exit fails the ufs recovery will be triggered and "err" variable will not get updated in this function, how is this handled? Did you tested this possibility?
Quoted 4 lines
}out:
Yes - I agree with your comment. The error should be propagated from this function correctly to the caller. I'll push another version.
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, Linux Foundation Collaborative Project
Hi Asutosh,
Thanks!
Pedro Sousa
-----Original Message-----
From: Asutosh Das <[email protected]>
Sent: Wednesday, October 23, 2019 5:49 PM
To: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]
Cc: [email protected]; [email protected]; [email protected]; [email protected]; Asutosh Das <[email protected]>; Alim Akhtar <[email protected]>; Avri Altman <[email protected]>; Pedro Sousa <[email protected]>; James E.J. Bottomley <[email protected]>; Stanley Chu <[email protected]>; Bean Huo <[email protected]>; Tomas Winkler <[email protected]>; Subhash Jadavani <[email protected]>; Bjorn Andersson <[email protected]>; Arnd Bergmann <[email protected]>; open list <[email protected]>
Subject: [PATCH v3 1/2] scsi: ufs: export hibern8 entry and exit
Qualcomm controllers need to be in hibern8 before scaling up or down the clocks. Hence, export the hibern8 entry and exit functions.
--- drivers/scsi/ufs/ufshcd.c | 8 ++++---- drivers/scsi/ufs/ufshcd.h | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-)
drivers/scsi/ufs/ufshcd.c +4 -4
@@ -250,8 +250,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba);static int __ufshcd_setup_clocks (struct ufs_hba *hba,bool on,bool skip_ref_clk);static int ufshcd_setup_clocks (struct ufs_hba *hba,bool on); -static int ufshcd_uic_hibern8_exit (struct ufs_hba *hba); -static int ufshcd_uic_hibern8_enter (struct ufs_hba *hba);static inline void ufshcd_add_delay_before_dme_cmd (struct ufs_hba *hba);static int ufshcd_host_reset_and_restore (struct ufs_hba *hba);static void ufshcd_resume_clkscaling (struct ufs_hba *hba);
@@ -3904,7 +3902,7 @@ static int __ufshcd_uic_hibern8_enter(struct ufs_hba *hba)return ret; } -static int ufshcd_uic_hibern8_enter (struct ufs_hba *hba) +int ufshcd_uic_hibern8_enter (struct ufs_hba *hba) {int ret =0 , retries;
@@ -3916,8 +3914,9 @@ static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba) out:return ret; } +EXPORT_SYMBOL_GPL (ufshcd_uic_hibern8_enter); -static int ufshcd_uic_hibern8_exit (struct ufs_hba *hba) +int ufshcd_uic_hibern8_exit (struct ufs_hba *hba) {struct uic_command uic_cmd = {0 };int ret;
@@ -3943,6 +3942,7 @@ static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba)return ret; } +EXPORT_SYMBOL_GPL (ufshcd_uic_hibern8_exit);static void ufshcd_auto_hibern8_enable (struct ufs_hba *hba) {
drivers/scsi/ufs/ufshcd.h +2 -1
@@ -1107,5 +1107,6 @@ static inline u8 ufshcd_scsi_to_upiu_lun(unsigned int scsi_lun)int ufshcd_dump_regs (struct ufs_hba *hba,size_t offset,size_t len,const char *prefix); - +int ufshcd_uic_hibern8_enter (struct ufs_hba *hba); +int ufshcd_uic_hibern8_exit (struct ufs_hba *hba);#endif /* End of Header */
Signature · 1 line
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.