scsi: ufs: Have midlayer retry start stop errors
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>
This commit is contained in:
parent
b72f2d149e
commit
b8c3a7bac9
@ -9475,7 +9475,17 @@ static int ufshcd_execute_start_stop(struct scsi_device *sdev,
|
|||||||
struct scsi_sense_hdr *sshdr)
|
struct scsi_sense_hdr *sshdr)
|
||||||
{
|
{
|
||||||
const unsigned char cdb[6] = { START_STOP, 0, 0, 0, pwr_mode << 4, 0 };
|
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 = {
|
const struct scsi_exec_args args = {
|
||||||
|
.failures = &failures,
|
||||||
.sshdr = sshdr,
|
.sshdr = sshdr,
|
||||||
.req_flags = BLK_MQ_REQ_PM,
|
.req_flags = BLK_MQ_REQ_PM,
|
||||||
.scmd_flags = SCMD_FAIL_IF_RECOVERING,
|
.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_sense_hdr sshdr;
|
||||||
struct scsi_device *sdp;
|
struct scsi_device *sdp;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret, retries;
|
int ret;
|
||||||
|
|
||||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||||
sdp = hba->ufs_device_wlun;
|
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
|
* callbacks hence set the RQF_PM flag so that it doesn't resume the
|
||||||
* already suspended childs.
|
* already suspended childs.
|
||||||
*/
|
*/
|
||||||
for (retries = 3; retries > 0; --retries) {
|
ret = ufshcd_execute_start_stop(sdp, pwr_mode, &sshdr);
|
||||||
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;
|
|
||||||
}
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
sdev_printk(KERN_WARNING, sdp,
|
sdev_printk(KERN_WARNING, sdp,
|
||||||
"START_STOP failed for power mode: %d, result %x\n",
|
"START_STOP failed for power mode: %d, result %x\n",
|
||||||
|
Loading…
Reference in New Issue
Block a user