On 2020-11-12 13:45, Stanley Chu wrote:
Once hba enabling is failed, add retry mechanism and in the
meanwhile allow vendors to apply specific handlings before
the next retry. For example, vendors can do vendor-specific
host reset flow in variant function "ufshcd_vops_hce_enable_notify()".

Signed-off-by: Stanley Chu <stanley....@mediatek.com>

Reviewed-by: Can Guo <c...@codeaurora.org>

---
 drivers/scsi/ufs/ufshcd.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 8001bbfec5c0..9186ee01379a 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -4328,8 +4328,10 @@ static inline void ufshcd_hba_stop(struct ufs_hba *hba)
  */
 static int ufshcd_hba_execute_hce(struct ufs_hba *hba)
 {
-       int retry;
+       int retry_outer = 3;
+       int retry_inner;

+start:
        if (!ufshcd_is_hba_active(hba))
                /* change controller state to "reset state" */
                ufshcd_hba_stop(hba);
@@ -4355,13 +4357,17 @@ static int ufshcd_hba_execute_hce(struct ufs_hba *hba)
        ufshcd_delay_us(hba->vps->hba_enable_delay_us, 100);

        /* wait for the host controller to complete initialization */
-       retry = 50;
+       retry_inner = 50;
        while (ufshcd_is_hba_active(hba)) {
-               if (retry) {
-                       retry--;
+               if (retry_inner) {
+                       retry_inner--;
                } else {
                        dev_err(hba->dev,
                                "Controller enable failed\n");
+                       if (retry_outer) {
+                               retry_outer--;
+                               goto start;
+                       }
                        return -EIO;
                }
                usleep_range(1000, 1100);

Reply via email to