Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 65c7e3c9 authored by Wen Xiong's avatar Wen Xiong Committed by Greg Kroah-Hartman
Browse files

scsi: ses: Retry failed Send/Receive Diagnostic commands

[ Upstream commit fbdac19e642899455b4e64c63aafe2325df7aafa ]

Setting SCSI logging level with error=3, we saw some errors from enclosues:

[108017.360833] ses 0:0:9:0: tag#641 Done: NEEDS_RETRY Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK cmd_age=0s
[108017.360838] ses 0:0:9:0: tag#641 CDB: Receive Diagnostic 1c 01 01 00 20 00
[108017.427778] ses 0:0:9:0: Power-on or device reset occurred
[108017.427784] ses 0:0:9:0: tag#641 Done: SUCCESS Result: hostbyte=DID_OK driverbyte=DRIVER_OK cmd_age=0s
[108017.427788] ses 0:0:9:0: tag#641 CDB: Receive Diagnostic 1c 01 01 00 20 00
[108017.427791] ses 0:0:9:0: tag#641 Sense Key : Unit Attention [current]
[108017.427793] ses 0:0:9:0: tag#641 Add. Sense: Bus device reset function occurred
[108017.427801] ses 0:0:9:0: Failed to get diagnostic page 0x1
[108017.427804] ses 0:0:9:0: Failed to bind enclosure -19
[108017.427895] ses 0:0:10:0: Attached Enclosure device
[108017.427942] ses 0:0:10:0: Attached scsi generic sg18 type 13

Retry if the Send/Receive Diagnostic commands complete with a transient
error status (NOT_READY or UNIT_ATTENTION with ASC 0x29).

Link: https://lore.kernel.org/r/1631849061-10210-2-git-send-email-wenxiong@linux.ibm.com


Reviewed-by: default avatarBrian King <brking@linux.ibm.com>
Reviewed-by: default avatarJames Bottomley <jejb@linux.ibm.com>
Signed-off-by: default avatarWen Xiong <wenxiong@linux.ibm.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent e4e75605
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -87,9 +87,16 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,
		0
	};
	unsigned char recv_page_code;
	unsigned int retries = SES_RETRIES;
	struct scsi_sense_hdr sshdr;

	do {
		ret = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
				NULL, SES_TIMEOUT, SES_RETRIES, NULL);
				       &sshdr, SES_TIMEOUT, 1, NULL);
	} while (ret > 0 && --retries && scsi_sense_valid(&sshdr) &&
		 (sshdr.sense_key == NOT_READY ||
		  (sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));

	if (unlikely(ret))
		return ret;

@@ -121,9 +128,16 @@ static int ses_send_diag(struct scsi_device *sdev, int page_code,
		bufflen & 0xff,
		0
	};
	struct scsi_sense_hdr sshdr;
	unsigned int retries = SES_RETRIES;

	do {
		result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
				  NULL, SES_TIMEOUT, SES_RETRIES, NULL);
					  &sshdr, SES_TIMEOUT, 1, NULL);
	} while (result > 0 && --retries && scsi_sense_valid(&sshdr) &&
		 (sshdr.sense_key == NOT_READY ||
		  (sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));

	if (result)
		sdev_printk(KERN_ERR, sdev, "SEND DIAGNOSTIC result: %8x\n",
			    result);