diff --git a/src/raspberrypi/controllers/scsidev_ctrl.cpp b/src/raspberrypi/controllers/scsidev_ctrl.cpp index 033f2b0..db5b6da 100644 --- a/src/raspberrypi/controllers/scsidev_ctrl.cpp +++ b/src/raspberrypi/controllers/scsidev_ctrl.cpp @@ -17,6 +17,7 @@ #include "controllers/scsidev_ctrl.h" #include "gpiobus.h" #include "devices/scsi_host_bridge.h" +#include "devices/scsi_nuvolink.h" //=========================================================================== // @@ -263,44 +264,44 @@ void FASTCALL SCSIDEV::Execute() #endif // RASCSI // Process by command - switch (ctrl.cmd[0]) { + switch ((scsi_command)ctrl.cmd[0]) { // TEST UNIT READY - case 0x00: + case eCmdTestUnitReady: CmdTestUnitReady(); return; // REZERO - case 0x01: + case eCmdRezero: CmdRezero(); return; // REQUEST SENSE - case 0x03: + case eCmdRequestSense: CmdRequestSense(); return; // FORMAT UNIT - case 0x04: + case eCmdFormat: CmdFormat(); return; // REASSIGN BLOCKS - case 0x07: + case eCmdReassign: CmdReassign(); return; // READ(6) - case 0x08: + case eCmdRead6: CmdRead6(); return; // WRITE(6) - case 0x0a: + case eCmdWrite6: CmdWrite6(); return; // SEEK(6) - case 0x0b: + case eCmdSeek6: CmdSeek6(); return; @@ -310,115 +311,114 @@ void FASTCALL SCSIDEV::Execute() return; // INQUIRY - case 0x12: + case eCmdInquiry: CmdInquiry(); return; // MODE SELECT - case 0x15: + case eCmdModeSelect: CmdModeSelect(); return; // MDOE SENSE - case 0x1a: + case eCmdModeSense: CmdModeSense(); return; // START STOP UNIT - case 0x1b: + case eCmdStartStop: CmdStartStop(); return; // SEND DIAGNOSTIC - case 0x1d: + case eCmdSendDiag: CmdSendDiag(); return; // PREVENT/ALLOW MEDIUM REMOVAL - case 0x1e: + case eCmdRemoval: CmdRemoval(); return; // READ CAPACITY - case 0x25: + case eCmdReadCapacity: CmdReadCapacity(); return; // READ(10) - case 0x28: + case eCmdRead10: CmdRead10(); return; // WRITE(10) - case 0x2a: + case eCmdWrite10: + // WRITE and VERIFY(10) + case eCmdWriteAndVerify10: CmdWrite10(); return; // SEEK(10) - case 0x2b: + case eCmdSeek10: CmdSeek10(); return; - // WRITE and VERIFY - case 0x2e: - CmdWrite10(); - return; - // VERIFY - case 0x2f: + case eCmdVerify: CmdVerify(); return; // SYNCHRONIZE CACHE - case 0x35: + case eCmdSynchronizeCache: CmdSynchronizeCache(); return; // READ DEFECT DATA(10) - case 0x37: + case eCmdReadDefectData10: CmdReadDefectData10(); return; // READ TOC - case 0x43: + case eCmdReadToc: CmdReadToc(); return; // PLAY AUDIO(10) - case 0x45: + case eCmdPlayAudio10: CmdPlayAudio10(); return; // PLAY AUDIO MSF - case 0x47: + case eCmdPlayAudioMSF: CmdPlayAudioMSF(); return; // PLAY AUDIO TRACK - case 0x48: + case eCmdPlayAudioTrack: CmdPlayAudioTrack(); return; // MODE SELECT(10) - case 0x55: + case eCmdModeSelect10: CmdModeSelect10(); return; // MDOE SENSE(10) - case 0x5a: + case eCmdModeSense10: CmdModeSense10(); return; // SPECIFY (SASI only/Suppress warning when using SxSI) - case 0xc2: + case eCmdInvalid: CmdInvalid(); return; + default: + // No other support + Log(Log::Normal, "Unsupported command received: $%02X", ctrl.cmd[0]); + CmdInvalid(); } + return; - // No other support - Log(Log::Normal, "Unsupported command received: $%02X", ctrl.cmd[0]); - CmdInvalid(); } //--------------------------------------------------------------------------- @@ -1390,7 +1390,9 @@ void FASTCALL SCSIDEV::CmdSendMessage10() } // Error if not a host bridge - if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'B', 'R')) { + if ((ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'B', 'R')) && + (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'N', 'L'))) { + LOGERROR("Received CmdSendMessage10 for a non-bridge device"); Error(); return; } diff --git a/src/raspberrypi/controllers/scsidev_ctrl.h b/src/raspberrypi/controllers/scsidev_ctrl.h index f1b6be8..8c97e57 100644 --- a/src/raspberrypi/controllers/scsidev_ctrl.h +++ b/src/raspberrypi/controllers/scsidev_ctrl.h @@ -38,6 +38,44 @@ public: BYTE msb[256]; } scsi_t; + enum scsi_command : BYTE { + eCmdTestUnitReady = 0x00, + eCmdRezero = 0x01, + eCmdResetStatistics = 0x02, // Nuvolink specific command + eCmdRequestSense = 0x03, + eCmdFormat = 0x04, + eCmdSendPacket = 0x05, // Nuvolink specific command + eCmdChangeMacAddr = 0x06, // Nuvolink specific command + eCmdReassign = 0x07, + eCmdRead6 = 0x08, + eCmdSetMcastReg = 0x09, // Nuvolink specific command + eCmdWrite6 = 0x0A, + eCmdSeek6 = 0x0B, + eCmdMediaSense = 0x0C, // Nuvolink specific command + eCmdInquiry = 0x12, + eCmdModeSelect = 0x15, + eCmdModeSense = 0x1A, + eCmdStartStop = 0x1B, + eCmdRcvDiag = 0x1C, + eCmdSendDiag = 0x1D, + eCmdRemoval = 0x1E, + eCmdReadCapacity = 0x25, + eCmdRead10 = 0x28, + eCmdWrite10 = 0x2A, + eCmdSeek10 = 0x2B, + eCmdWriteAndVerify10 = 0x2E, + eCmdVerify = 0x2F, + eCmdSynchronizeCache = 0x35, + eCmdReadDefectData10 = 0x37, + eCmdReadToc = 0x43, + eCmdPlayAudio10 = 0x45, + eCmdPlayAudioMSF = 0x47, + eCmdPlayAudioTrack = 0x48, + eCmdModeSelect10 = 0x55, + eCmdModeSense10 = 0x5A, + eCmdInvalid = 0xC2, // (SASI only/Suppress warning when using SxSI) + }; + public: // Basic Functions #ifdef RASCSI diff --git a/src/raspberrypi/rascsi.cpp b/src/raspberrypi/rascsi.cpp index 7b34d30..6b51dd4 100644 --- a/src/raspberrypi/rascsi.cpp +++ b/src/raspberrypi/rascsi.cpp @@ -298,6 +298,8 @@ void ListDevice(FILE *fp) // mount status output if (pUnit->GetID() == MAKEID('S', 'C', 'B', 'R')) { FPRT(fp, "%s", "HOST BRIDGE"); + } else if (pUnit->GetID() == MAKEID('S', 'C', 'N', 'L')) { + FPRT(fp, "%s", "NuvoLink SC"); } else { pUnit->GetPath(filepath); FPRT(fp, "%s",