Retry of SSU is not working because of UNIT_ATTENTION if SSU is failed. So, more retry is needed. More than 3 times of SSU(START STOP UNIT) retries are needed to prevent a platform watchdog which is because of IO stuck. Host sends SSU to device during resume to wake-up UFS device. And system(host) can not do IO operations if SSU is failed. There are no responses from UFS device and ufshcd_eh_reset_handler() is called in the below log. We need to do 3 times of retries to clear UNIT ATTENTION which is because of HW RESET at this situation. <3>[ 636.089575] [0: kworker/u16:11: 3578] ufshcd-qcom 1d84000.ufshc: ufshcd_abort: tag:0, cmd:0x1b, retries 2 <3>[ 636.089898] [0: kworker/u16:11: 3578] ufshcd-qcom 1d84000.ufshc: ufshcd_eh_host_reset_handler: reset in progress - 2 ... <4>[ 638.271463] [1: kworker/1:1: 3552] scsi 0:0:0:49488: START_STOP failed for power mode: 1, result 30000 ... <6>[ 1056.481268] [3: msm_watchdog: 79] current proc : 79 msm_watchdog ... <4>[ 1056.576026] [3: msm_watchdog: 79] Call trace: <4>[ 1056.576138] [3: msm_watchdog: 79] __switch_to+0xb4/0xc0 <4>[ 1056.576267] [3: msm_watchdog: 79] __schedule+0x8d8/0xc70 <4>[ 1056.576404] [3: msm_watchdog: 79] io_schedule+0x8c/0xc0 <4>[ 1056.576530] [3: msm_watchdog: 79] bit_wait_io+0x14/0x60 <4>[ 1056.576658] [3: msm_watchdog: 79] out_of_line_wait_on_bit+0xd8/0x158 <4>[ 1056.576817] [3: msm_watchdog: 79] __wait_on_buffer+0x24/0x30 <4>[ 1056.576962] [3: msm_watchdog: 79] jbd2_journal_commit_transaction+0xf24/0x1970 <4>[ 1056.577134] [3: msm_watchdog: 79] kjournald2+0x1e0/0x258 <4>[ 1056.577264] [3: msm_watchdog: 79] kthread+0x110/0x120 <4>[ 1056.577389] [3: msm_watchdog: 79] ret_from_fork+0x10/0x18 ... <0>[ 1056.784682] [3: msm_watchdog: 79] Kernel panic - not syncing: Platform Watchdog can't update sync_cnt ... Change-Id: I933f774e04456226d760536200e9f079a5d5b987 Signed-off-by: Lee Sang Hyun <sh425.lee@xxxxxxxxxxx> --- drivers/scsi/ufs/ufshcd.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index ad4fc82..30cee8c 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -100,6 +100,9 @@ /* Default value of wait time before gating device ref clock */ #define UFSHCD_REF_CLK_GATING_WAIT_US 0xFF /* microsecs */ +/* SSU retries */ +#define SSU_RETRIES 3 + #define ufshcd_toggle_vreg(_dev, _vreg, _on) \ ({ \ int _ret; \ @@ -7977,6 +7980,7 @@ static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba, struct scsi_device *sdp; unsigned long flags; int ret; + int retries; spin_lock_irqsave(hba->host->host_lock, flags); sdp = hba->sdev_ufs_device; @@ -8016,14 +8020,18 @@ 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. */ - ret = scsi_execute(sdp, cmd, DMA_NONE, NULL, 0, NULL, &sshdr, - START_STOP_TIMEOUT, 0, 0, RQF_PM, NULL); - if (ret) { - sdev_printk(KERN_WARNING, sdp, - "START_STOP failed for power mode: %d, result %x\n", - pwr_mode, ret); - if (driver_byte(ret) == DRIVER_SENSE) - scsi_print_sense_hdr(sdp, NULL, &sshdr); + for (retries = 0; retries < SSU_RETRIES; retries++) { + ret = scsi_execute(sdp, cmd, DMA_NONE, NULL, 0, NULL, &sshdr, + START_STOP_TIMEOUT, 0, 0, RQF_PM, NULL); + if (ret) { + sdev_printk(KERN_WARNING, sdp, + "START_STOP failed for power mode: %d, result %x\n", + pwr_mode, ret); + if (driver_byte(ret) == DRIVER_SENSE) + scsi_print_sense_hdr(sdp, NULL, &sshdr); + } else { + break; + } } if (!ret) -- 2.7.4