Also test for the "no medium persent" case and don't tell B_DEV_MEDIA_CHANGED in
such a case as that would try to read info about a non-present medium. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32862 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -426,7 +426,8 @@ usb_disk_request_sense(device_lun *lun)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parameter.sense_key > SCSI_SENSE_KEY_NOT_READY) {
|
if (parameter.sense_key > SCSI_SENSE_KEY_NOT_READY
|
||||||
|
&& parameter.sense_key != SCSI_SENSE_KEY_UNIT_ATTENTION) {
|
||||||
TRACE_ALWAYS("request_sense: key: 0x%02x; asc: 0x%02x; ascq: 0x%02x;\n",
|
TRACE_ALWAYS("request_sense: key: 0x%02x; asc: 0x%02x; ascq: 0x%02x;\n",
|
||||||
parameter.sense_key, parameter.additional_sense_code,
|
parameter.sense_key, parameter.additional_sense_code,
|
||||||
parameter.additional_sense_code_qualifier);
|
parameter.additional_sense_code_qualifier);
|
||||||
@@ -437,14 +438,6 @@ usb_disk_request_sense(device_lun *lun)
|
|||||||
case SCSI_SENSE_KEY_RECOVERED_ERROR:
|
case SCSI_SENSE_KEY_RECOVERED_ERROR:
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
case SCSI_SENSE_KEY_NOT_READY:
|
|
||||||
TRACE("request_sense: device not ready (asc 0x%02x ascq 0x%02x)\n",
|
|
||||||
parameter.additional_sense_code,
|
|
||||||
parameter.additional_sense_code_qualifier);
|
|
||||||
lun->media_present = false;
|
|
||||||
usb_disk_reset_capacity(lun);
|
|
||||||
return B_DEV_NO_MEDIA;
|
|
||||||
|
|
||||||
case SCSI_SENSE_KEY_HARDWARE_ERROR:
|
case SCSI_SENSE_KEY_HARDWARE_ERROR:
|
||||||
case SCSI_SENSE_KEY_MEDIUM_ERROR:
|
case SCSI_SENSE_KEY_MEDIUM_ERROR:
|
||||||
TRACE_ALWAYS("request_sense: media or hardware error\n");
|
TRACE_ALWAYS("request_sense: media or hardware error\n");
|
||||||
@@ -455,10 +448,21 @@ usb_disk_request_sense(device_lun *lun)
|
|||||||
return B_DEV_INVALID_IOCTL;
|
return B_DEV_INVALID_IOCTL;
|
||||||
|
|
||||||
case SCSI_SENSE_KEY_UNIT_ATTENTION:
|
case SCSI_SENSE_KEY_UNIT_ATTENTION:
|
||||||
TRACE_ALWAYS("request_sense: media changed\n");
|
if (parameter.additional_sense_code != SCSI_ASC_MEDIUM_NOT_PRESENT) {
|
||||||
lun->media_changed = true;
|
TRACE_ALWAYS("request_sense: media changed\n");
|
||||||
lun->media_present = true;
|
lun->media_changed = true;
|
||||||
return B_DEV_MEDIA_CHANGED;
|
lun->media_present = true;
|
||||||
|
return B_DEV_MEDIA_CHANGED;
|
||||||
|
}
|
||||||
|
// fall through
|
||||||
|
|
||||||
|
case SCSI_SENSE_KEY_NOT_READY:
|
||||||
|
TRACE("request_sense: device not ready (asc 0x%02x ascq 0x%02x)\n",
|
||||||
|
parameter.additional_sense_code,
|
||||||
|
parameter.additional_sense_code_qualifier);
|
||||||
|
lun->media_present = false;
|
||||||
|
usb_disk_reset_capacity(lun);
|
||||||
|
return B_DEV_NO_MEDIA;
|
||||||
|
|
||||||
case SCSI_SENSE_KEY_DATA_PROTECT:
|
case SCSI_SENSE_KEY_DATA_PROTECT:
|
||||||
TRACE_ALWAYS("request_sense: write protected\n");
|
TRACE_ALWAYS("request_sense: write protected\n");
|
||||||
|
|||||||
@@ -99,6 +99,9 @@ typedef enum {
|
|||||||
SCSI_SENSE_KEY_ABORTED_COMMAND = 0x0b,
|
SCSI_SENSE_KEY_ABORTED_COMMAND = 0x0b,
|
||||||
} scsi_sense_key;
|
} scsi_sense_key;
|
||||||
|
|
||||||
|
// request sense additional sense codes
|
||||||
|
#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3a
|
||||||
|
|
||||||
// mode sense page code/parameter
|
// mode sense page code/parameter
|
||||||
#define SCSI_MODE_PAGE_DEVICE_CONFIGURATION 0x10
|
#define SCSI_MODE_PAGE_DEVICE_CONFIGURATION 0x10
|
||||||
#define SCSI_DEVICE_SPECIFIC_WRITE_PROTECT 0x80
|
#define SCSI_DEVICE_SPECIFIC_WRITE_PROTECT 0x80
|
||||||
|
|||||||
Reference in New Issue
Block a user