|
@@ -275,18 +275,6 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
|
|
|
/* ---------------------------------------------------------------------- */
|
|
|
/* interface to cdrom.c */
|
|
|
|
|
|
-static int test_unit_ready(Scsi_CD *cd)
|
|
|
-{
|
|
|
- struct packet_command cgc;
|
|
|
-
|
|
|
- memset(&cgc, 0, sizeof(struct packet_command));
|
|
|
- cgc.cmd[0] = GPCMD_TEST_UNIT_READY;
|
|
|
- cgc.quiet = 1;
|
|
|
- cgc.data_direction = DMA_NONE;
|
|
|
- cgc.timeout = IOCTL_TIMEOUT;
|
|
|
- return sr_do_ioctl(cd, &cgc);
|
|
|
-}
|
|
|
-
|
|
|
int sr_tray_move(struct cdrom_device_info *cdi, int pos)
|
|
|
{
|
|
|
Scsi_CD *cd = cdi->handle;
|
|
@@ -310,14 +298,46 @@ int sr_lock_door(struct cdrom_device_info *cdi, int lock)
|
|
|
|
|
|
int sr_drive_status(struct cdrom_device_info *cdi, int slot)
|
|
|
{
|
|
|
+ struct scsi_cd *cd = cdi->handle;
|
|
|
+ struct scsi_sense_hdr sshdr;
|
|
|
+ struct media_event_desc med;
|
|
|
+
|
|
|
if (CDSL_CURRENT != slot) {
|
|
|
/* we have no changer support */
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
- if (0 == test_unit_ready(cdi->handle))
|
|
|
+ if (0 == scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES,
|
|
|
+ &sshdr))
|
|
|
return CDS_DISC_OK;
|
|
|
|
|
|
- return CDS_TRAY_OPEN;
|
|
|
+ if (!cdrom_get_media_event(cdi, &med)) {
|
|
|
+ if (med.media_present)
|
|
|
+ return CDS_DISC_OK;
|
|
|
+ else if (med.door_open)
|
|
|
+ return CDS_TRAY_OPEN;
|
|
|
+ else
|
|
|
+ return CDS_NO_DISC;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 0x04 is format in progress .. but there must be a disc present!
|
|
|
+ */
|
|
|
+ if (sshdr.sense_key == NOT_READY && sshdr.asc == 0x04)
|
|
|
+ return CDS_DISC_OK;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If not using Mt Fuji extended media tray reports,
|
|
|
+ * just return TRAY_OPEN since ATAPI doesn't provide
|
|
|
+ * any other way to detect this...
|
|
|
+ */
|
|
|
+ if (scsi_sense_valid(&sshdr) &&
|
|
|
+ /* 0x3a is medium not present */
|
|
|
+ sshdr.asc == 0x3a)
|
|
|
+ return CDS_NO_DISC;
|
|
|
+ else
|
|
|
+ return CDS_TRAY_OPEN;
|
|
|
+
|
|
|
+ return CDS_DRIVE_NOT_READY;
|
|
|
}
|
|
|
|
|
|
int sr_disk_status(struct cdrom_device_info *cdi)
|