scsi: ufs: Add retry flow for failed HBA enabling
authorStanley Chu <stanley.chu@mediatek.com>
Thu, 12 Nov 2020 05:45:37 +0000 (13:45 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 17 Nov 2020 04:31:39 +0000 (23:31 -0500)
Once HBA enabling has failed, add retry mechanism and allow vendors to
apply specific tweaks before the next retry. For example, vendors can do
vendor-specific host reset flow in variant function
"ufshcd_vops_hce_enable_notify()".

Link: https://lore.kernel.org/r/20201112054537.22494-1-stanley.chu@mediatek.com
Reviewed-by: Can Guo <cang@codeaurora.org>
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufshcd.c

index 8001bbf..9186ee0 100644 (file)
@@ -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);