scsi: ufs: Have midlayer retry start stop errors
authorMike Christie <michael.christie@oracle.com>
Tue, 23 Jan 2024 00:22:19 +0000 (18:22 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 30 Jan 2024 02:20:54 +0000 (21:20 -0500)
This has the SCSI midlayer retry errors instead of driving them itself.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
Link: https://lore.kernel.org/r/20240123002220.129141-19-michael.christie@oracle.com
Acked-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c

index 029d017fc1b66b5c6695096016b54983e26b3e5f..5cd9509e0c31b1dfc72029d4d9a36f664febda90 100644 (file)
@@ -9475,7 +9475,17 @@ static int ufshcd_execute_start_stop(struct scsi_device *sdev,
                                     struct scsi_sense_hdr *sshdr)
 {
        const unsigned char cdb[6] = { START_STOP, 0, 0, 0, pwr_mode << 4, 0 };
+       struct scsi_failure failure_defs[] = {
+               {
+                       .allowed = 2,
+                       .result = SCMD_FAILURE_RESULT_ANY,
+               },
+       };
+       struct scsi_failures failures = {
+               .failure_definitions = failure_defs,
+       };
        const struct scsi_exec_args args = {
+               .failures = &failures,
                .sshdr = sshdr,
                .req_flags = BLK_MQ_REQ_PM,
                .scmd_flags = SCMD_FAIL_IF_RECOVERING,
@@ -9501,7 +9511,7 @@ static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba,
        struct scsi_sense_hdr sshdr;
        struct scsi_device *sdp;
        unsigned long flags;
-       int ret, retries;
+       int ret;
 
        spin_lock_irqsave(hba->host->host_lock, flags);
        sdp = hba->ufs_device_wlun;
@@ -9527,15 +9537,7 @@ static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba,
         * callbacks hence set the RQF_PM flag so that it doesn't resume the
         * already suspended childs.
         */
-       for (retries = 3; retries > 0; --retries) {
-               ret = ufshcd_execute_start_stop(sdp, pwr_mode, &sshdr);
-               /*
-                * scsi_execute() only returns a negative value if the request
-                * queue is dying.
-                */
-               if (ret <= 0)
-                       break;
-       }
+       ret = ufshcd_execute_start_stop(sdp, pwr_mode, &sshdr);
        if (ret) {
                sdev_printk(KERN_WARNING, sdp,
                            "START_STOP failed for power mode: %d, result %x\n",