Updated LUN handling

This commit is contained in:
Uwe Seimet 2021-08-23 09:30:09 +02:00
parent abcfcf73a2
commit edc3bab07a
7 changed files with 18 additions and 39 deletions

View File

@ -245,30 +245,39 @@ void SCSIDEV::Execute()
ctrl.status = 0; ctrl.status = 0;
} }
LOGDEBUG("++++ CMD ++++ %s Executing command $%02X", __PRETTY_FUNCTION__, (unsigned int)ctrl.cmd[0]);
int lun;
try { try {
// TODO Verify LUN handling
if ((SCSIDEV::scsi_command)ctrl.cmd[0] == eCmdInquiry) { if ((SCSIDEV::scsi_command)ctrl.cmd[0] == eCmdInquiry) {
// Use LUN0 for INQUIRY because LUN0 is assumed to be always available // Use LUN0 for INQUIRY because LUN0 is assumed to be always available
ctrl.device = ctrl.unit[0]; lun = 0;
} }
else { else {
ctrl.device = ctrl.unit[GetLun()]; lun = GetLun();
} }
} }
catch (const lun_exception& e) { catch (const lun_exception& e) {
LOGINFO("%s Invalid LUN %d for ID %d", __PRETTY_FUNCTION__, e.getlun(), GetSCSIID()); LOGINFO("Invalid LUN %d for ID %d", e.getlun(), GetSCSIID());
Error(ERROR_CODES::sense_key::ILLEGAL_REQUEST, ERROR_CODES::asc::INVALID_LUN); Error(ERROR_CODES::sense_key::ILLEGAL_REQUEST, ERROR_CODES::asc::INVALID_LUN);
return; return;
} }
LOGDEBUG("++++ CMD ++++ %s Dispatching command $%02X", __PRETTY_FUNCTION__, (unsigned int)ctrl.cmd[0]); ctrl.device = ctrl.unit[lun];
if (!ctrl.device->Dispatch(this)) { if (!ctrl.device->Dispatch(this)) {
LOGWARN("%s ID %d received unsupported command: $%02X", __PRETTY_FUNCTION__, GetSCSIID(), (BYTE)ctrl.cmd[0]); LOGWARN("ID %d LUN %d received unsupported command: $%02X", GetSCSIID(), lun, (BYTE)ctrl.cmd[0]);
Error(ERROR_CODES::sense_key::ILLEGAL_REQUEST, ERROR_CODES::asc::INVALID_COMMAND_OPERATION_CODE); Error(ERROR_CODES::sense_key::ILLEGAL_REQUEST, ERROR_CODES::asc::INVALID_COMMAND_OPERATION_CODE);
} }
if ((SCSIDEV::scsi_command)ctrl.cmd[0] == eCmdInquiry) {
// SCSI-2 p.104 4.4.3 Incorrect logical unit handling
if (((ctrl.cmd[1] >> 5) & 0x07) != ctrl.device->GetLun()) {
ctrl.buffer[0] = 0x7f;
}
}
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -337,14 +346,11 @@ void SCSIDEV::Error(ERROR_CODES::sense_key sense_key, ERROR_CODES::asc asc)
return; return;
} }
// Logical Unit
DWORD lun = (ctrl.cmd[1] >> 5) & 0x07; DWORD lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun] || asc == ERROR_CODES::INVALID_LUN) { if (!ctrl.unit[lun] || asc == ERROR_CODES::INVALID_LUN) {
lun = 0; lun = 0;
} }
LOGDEBUG("%s Sense Key and ASC: $%02X, $%02X", __PRETTY_FUNCTION__, sense_key, asc);
if (sense_key || asc) { if (sense_key || asc) {
// Set Sense Key and ASC for a subsequent REQUEST SENSE // Set Sense Key and ASC for a subsequent REQUEST SENSE
ctrl.unit[lun]->SetStatusCode((sense_key << 16) | (asc << 8)); ctrl.unit[lun]->SetStatusCode((sense_key << 16) | (asc << 8));

View File

@ -111,7 +111,9 @@ const string Device::GetPaddedName() const
void Device::SetStatusCode(int status_code) void Device::SetStatusCode(int status_code)
{ {
LOGDEBUG("Setting status: Sense Key: $%02X, ASC: $%02X, ASCQ: $%02X", status_code >> 16, (status_code >> 8 &0xff), status_code & 0xff); if (status_code) {
LOGDEBUG("Error status: Sense Key $%02X, ASC $%02X, ASCQ $%02X", status_code >> 16, (status_code >> 8 &0xff), status_code & 0xff);
}
this->status_code = status_code; this->status_code = status_code;
} }

View File

@ -179,11 +179,6 @@ int SCSIDaynaPort::Inquiry(const DWORD *cdb, BYTE *buffer)
memcpy(&buffer[8], GetPaddedName().c_str(), 28); memcpy(&buffer[8], GetPaddedName().c_str(), 28);
} }
// SCSI-2 p.104 4.4.3 Incorrect logical unit handling
if ((cdb[1] >> 5) & 0x07) {
buffer[0] |= 0x7f;
}
LOGTRACE("response size is %d", (int)allocation_length); LOGTRACE("response size is %d", (int)allocation_length);
return allocation_length; return allocation_length;

View File

@ -140,12 +140,6 @@ int SCSIBR::Inquiry(const DWORD *cdb, BYTE *buf)
// buf[4] ... Inquiry additional data // buf[4] ... Inquiry additional data
memset(buf, 0, 8); memset(buf, 0, 8);
buf[0] = 0x09; buf[0] = 0x09;
// SCSI-2 p.104 4.4.3 Incorrect logical unit handling
if (((cdb[1] >> 5) & 0x07) != GetLun()) {
buf[0] = 0x7f;
}
buf[2] = 0x02; buf[2] = 0x02;
buf[3] = 0x02; buf[3] = 0x02;
buf[4] = 36 - 5 + 8; // required + 8 byte extension buf[4] = 36 - 5 + 8; // required + 8 byte extension

View File

@ -583,12 +583,6 @@ int SCSICD::Inquiry(const DWORD *cdb, BYTE *buf)
// buf[4] ... Inquiry additional data // buf[4] ... Inquiry additional data
memset(buf, 0, 8); memset(buf, 0, 8);
buf[0] = 0x05; buf[0] = 0x05;
// SCSI-2 p.104 4.4.3 Incorrect logical unit handling
if (((cdb[1] >> 5) & 0x07) != GetLun()) {
buf[0] = 0x7f;
}
buf[1] = 0x80; buf[1] = 0x80;
buf[2] = 0x02; buf[2] = 0x02;
buf[3] = 0x02; buf[3] = 0x02;

View File

@ -126,12 +126,6 @@ int SCSIHD::Inquiry(const DWORD *cdb, BYTE *buf)
// buf[3] ... SCSI-2 compliant Inquiry response // buf[3] ... SCSI-2 compliant Inquiry response
// buf[4] ... Inquiry additional data // buf[4] ... Inquiry additional data
memset(buf, 0, 8); memset(buf, 0, 8);
// SCSI-2 p.104 4.4.3 Incorrect logical unit handling
if (((cdb[1] >> 5) & 0x07) != GetLun()) {
buf[0] = 0x7f;
}
buf[1] = IsRemovable() ? 0x80 : 0x00; buf[1] = IsRemovable() ? 0x80 : 0x00;
buf[2] = 0x02; buf[2] = 0x02;
buf[3] = 0x02; buf[3] = 0x02;

View File

@ -125,12 +125,6 @@ int SCSIMO::Inquiry(const DWORD *cdb, BYTE *buf)
// buf[4] ... Inquiry additional data // buf[4] ... Inquiry additional data
memset(buf, 0, 8); memset(buf, 0, 8);
buf[0] = 0x07; buf[0] = 0x07;
// SCSI-2 p.104 4.4.3 Incorrect logical unit handling
if (((cdb[1] >> 5) & 0x07) != GetLun()) {
buf[0] = 0x7f;
}
buf[1] = 0x80; buf[1] = 0x80;
buf[2] = 0x02; buf[2] = 0x02;
buf[3] = 0x02; buf[3] = 0x02;