mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
scsi: sr: Use combined sense codes
Refactor the SCSI CDROM driver to use the 16-bit sense_code field of struct scsi_sense_hdr and replace all hard-coded additional sense codes and additional sense code qualifiers with the enum values defined in include/scsi/scsi_sense.h. This helps with code clarity as the sense codes being processed are easier to test and self-documented. No functional change intended. Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Hannes Reinecke <hare@kernel.org> Link: https://patch.msgid.link/20260908090308.1085097-10-dlemoal@kernel.org Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
This commit is contained in:
parent
b9d5da78ff
commit
b1d3523f87
|
|
@ -253,7 +253,8 @@ static unsigned int sr_check_events(struct cdrom_device_info *cdi,
|
|||
* (ASC 0x3a).
|
||||
*/
|
||||
cd->media_present = scsi_status_is_good(ret) ||
|
||||
(scsi_sense_valid(&sshdr) && sshdr.asc != 0x3a);
|
||||
(scsi_sense_valid(&sshdr) &&
|
||||
scsi_sense_asc(&sshdr) != ASC_MEDIUM_NOT_PRESENT);
|
||||
|
||||
if (last_present != cd->media_present)
|
||||
cd->device->changed = 1;
|
||||
|
|
|
|||
|
|
@ -226,9 +226,8 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
|
|||
err = -ENOMEDIUM;
|
||||
break;
|
||||
case NOT_READY: /* This happens if there is no disc in drive */
|
||||
if (sshdr->asc == 0x04 &&
|
||||
sshdr->ascq == 0x01) {
|
||||
/* sense: Logical unit is in process of becoming ready */
|
||||
if (sshdr->sense_code ==
|
||||
LU_IS_IN_PROCESS_OF_BECOMING_READY) {
|
||||
if (!cgc->quiet)
|
||||
sr_printk(KERN_INFO, cd,
|
||||
"CDROM not ready yet.\n");
|
||||
|
|
@ -250,9 +249,7 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
|
|||
break;
|
||||
case ILLEGAL_REQUEST:
|
||||
err = -EIO;
|
||||
if (sshdr->asc == 0x20 &&
|
||||
sshdr->ascq == 0x00)
|
||||
/* sense: Invalid command operation code */
|
||||
if (sshdr->sense_code == INVALID_COMMAND_OP_CODE)
|
||||
err = -EDRIVE_CANT_DO_THIS;
|
||||
break;
|
||||
default:
|
||||
|
|
@ -303,9 +300,8 @@ int sr_drive_status(struct cdrom_device_info *cdi, int slot)
|
|||
if (!scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr))
|
||||
return CDS_DISC_OK;
|
||||
|
||||
/* SK/ASC/ASCQ of 2/4/1 means "unit is becoming ready" */
|
||||
if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY
|
||||
&& sshdr.asc == 0x04 && sshdr.ascq == 0x01)
|
||||
if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY &&
|
||||
sshdr.sense_code == LU_IS_IN_PROCESS_OF_BECOMING_READY)
|
||||
return CDS_DRIVE_NOT_READY;
|
||||
|
||||
if (!cdrom_get_media_event(cdi, &med)) {
|
||||
|
|
@ -318,18 +314,18 @@ int sr_drive_status(struct cdrom_device_info *cdi, int slot)
|
|||
}
|
||||
|
||||
/*
|
||||
* SK/ASC/ASCQ of 2/4/2 means "initialization required"
|
||||
* Using CD_TRAY_OPEN results in an START_STOP_UNIT to close
|
||||
* the tray, which resolves the initialization requirement.
|
||||
*/
|
||||
if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY
|
||||
&& sshdr.asc == 0x04 && sshdr.ascq == 0x02)
|
||||
if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY &&
|
||||
sshdr.sense_code == LU_NOT_READY_INITIALIZING_COMMAND_REQUIRED)
|
||||
return CDS_TRAY_OPEN;
|
||||
|
||||
/*
|
||||
* 0x04 is format in progress .. but there must be a disc present!
|
||||
*/
|
||||
if (sshdr.sense_key == NOT_READY && sshdr.asc == 0x04)
|
||||
if (sshdr.sense_key == NOT_READY &&
|
||||
scsi_sense_asc(&sshdr) == ASC_LU_NOT_READY)
|
||||
return CDS_DISC_OK;
|
||||
|
||||
/*
|
||||
|
|
@ -338,13 +334,10 @@ int sr_drive_status(struct cdrom_device_info *cdi, int slot)
|
|||
* any other way to detect this...
|
||||
*/
|
||||
if (scsi_sense_valid(&sshdr) &&
|
||||
/* 0x3a is medium not present */
|
||||
sshdr.asc == 0x3a)
|
||||
scsi_sense_asc(&sshdr) == ASC_MEDIUM_NOT_PRESENT)
|
||||
return CDS_NO_DISC;
|
||||
else
|
||||
return CDS_TRAY_OPEN;
|
||||
|
||||
return CDS_DRIVE_NOT_READY;
|
||||
return CDS_TRAY_OPEN;
|
||||
}
|
||||
|
||||
int sr_disk_status(struct cdrom_device_info *cdi)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user