|
|
@@ -26,7 +26,8 @@
|
|
|
#include "scsi2sd_time.h"
|
|
|
#include "bsp.h"
|
|
|
#include "cdrom.h"
|
|
|
-//#include "debug.h"
|
|
|
+// #include "debug.h"
|
|
|
+// #include "log.h"
|
|
|
#include "network.h"
|
|
|
#include "tape.h"
|
|
|
#include "mo.h"
|
|
|
@@ -412,7 +413,14 @@ static void process_Command()
|
|
|
}
|
|
|
else if (command == 0x12)
|
|
|
{
|
|
|
- s2s_scsiInquiry();
|
|
|
+ if(scsiDev.lun)
|
|
|
+ {
|
|
|
+ scsiDev.target->sense.code = ILLEGAL_REQUEST;
|
|
|
+ scsiDev.target->sense.asc = LOGICAL_UNIT_NOT_SUPPORTED;
|
|
|
+ enter_Status(CHECK_CONDITION);
|
|
|
+ } else {
|
|
|
+ s2s_scsiInquiry();
|
|
|
+ }
|
|
|
}
|
|
|
else if (command == 0x03)
|
|
|
{
|
|
|
@@ -545,14 +553,33 @@ static void process_Command()
|
|
|
// Newer initiators won't be specifying 0 anyway.
|
|
|
if (allocLength == 0) allocLength = 4;
|
|
|
|
|
|
+ // If we receve a stand alone REQUEST SENSE to a bad LUN we still need to respond
|
|
|
+ // with LUN not supported. SCSI-2 Spec 7.5.3.
|
|
|
+ if (scsiDev.lun && scsiDev.lastStatus != CHECK_CONDITION)
|
|
|
+ {
|
|
|
+ scsiDev.target->sense.code = ILLEGAL_REQUEST;
|
|
|
+ scsiDev.target->sense.asc = LOGICAL_UNIT_NOT_SUPPORTED;
|
|
|
+ }
|
|
|
memset(scsiDev.data, 0, 256); // Max possible alloc length
|
|
|
scsiDev.data[0] = 0xF0;
|
|
|
scsiDev.data[2] = scsiDev.target->sense.code & 0x0F;
|
|
|
|
|
|
- scsiDev.data[3] = transfer.lba >> 24;
|
|
|
- scsiDev.data[4] = transfer.lba >> 16;
|
|
|
- scsiDev.data[5] = transfer.lba >> 8;
|
|
|
- scsiDev.data[6] = transfer.lba;
|
|
|
+ if (scsiDev.target->cfg->deviceType != S2S_CFG_SEQUENTIAL)
|
|
|
+ {
|
|
|
+ // LBA is Valid Information for direct access devices.
|
|
|
+ scsiDev.data[3] = transfer.lba >> 24;
|
|
|
+ scsiDev.data[4] = transfer.lba >> 16;
|
|
|
+ scsiDev.data[5] = transfer.lba >> 8;
|
|
|
+ scsiDev.data[6] = transfer.lba;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Set Valid field to false.
|
|
|
+ scsiDev.data[0] &= 0b01111111;
|
|
|
+ // TODO:
|
|
|
+ // For S2S_CFG_SEQUENTIAL use the difference of the requested length minus the actual length
|
|
|
+ // in either bytes or blocks, as determined by the command.
|
|
|
+ }
|
|
|
|
|
|
// Additional bytes if there are errors to report
|
|
|
scsiDev.data[7] = 10; // additional length
|