From f375f7a8d26796c6605d11d4781dea7bff27b5a6 Mon Sep 17 00:00:00 2001 From: akuker Date: Sun, 20 Sep 2020 17:08:08 -0500 Subject: [PATCH] #27 Functionality will not transmit packets to the tap device ras0. Need to manually enable the link using 'ip link set dev ras0 up' --- src/raspberrypi/controllers/sasidev_ctrl.cpp | 225 +++++++++++----- src/raspberrypi/controllers/scsidev_ctrl.cpp | 146 +++++++++- src/raspberrypi/controllers/scsidev_ctrl.h | 3 + src/raspberrypi/devices/scsi_nuvolink.cpp | 264 +++++++++++-------- src/raspberrypi/devices/scsi_nuvolink.h | 11 +- src/raspberrypi/rascsi.cpp | 2 +- src/raspberrypi/rasctl.cpp | 4 +- 7 files changed, 468 insertions(+), 187 deletions(-) diff --git a/src/raspberrypi/controllers/sasidev_ctrl.cpp b/src/raspberrypi/controllers/sasidev_ctrl.cpp index 1f97d86..50ecf86 100644 --- a/src/raspberrypi/controllers/sasidev_ctrl.cpp +++ b/src/raspberrypi/controllers/sasidev_ctrl.cpp @@ -17,6 +17,8 @@ #include "filepath.h" #include "gpiobus.h" #include "devices/scsi_host_bridge.h" +#include "devices/scsi_nuvolink.h" +#include "controllers/scsidev_ctrl.h" //=========================================================================== // @@ -301,9 +303,7 @@ BUS::phase_t FASTCALL SASIDEV::Process() // For the monitor tool, we shouldn't need to reset. We're just logging information // Reset if (ctrl.bus->GetRST()) { -#if defined(DISK_LOG) - Log(Log::Normal, "RESET signal received"); -#endif // DISK_LOG + LOGINFO("RESET signal received"); // Reset the controller Reset(); @@ -371,9 +371,7 @@ void FASTCALL SASIDEV::BusFree() // Phase change if (ctrl.phase != BUS::busfree) { -#if defined(DISK_LOG) - Log(Log::Normal, "Bus free phase"); -#endif // DISK_LOG + LOGINFO("Bus free phase"); // Phase Setting ctrl.phase = BUS::busfree; @@ -552,65 +550,69 @@ void FASTCALL SASIDEV::Execute() #endif // RASCSI // Process by command - switch (ctrl.cmd[0]) { + switch ((SCSIDEV::scsi_command)ctrl.cmd[0]) { // TEST UNIT READY - case 0x00: + case SCSIDEV::eCmdTestUnitReady: CmdTestUnitReady(); return; // REZERO UNIT - case 0x01: + case SCSIDEV::eCmdRezero: CmdRezero(); return; // REQUEST SENSE - case 0x03: + case SCSIDEV::eCmdRequestSense: CmdRequestSense(); return; // FORMAT UNIT - case 0x04: - CmdFormat(); - return; - - // FORMAT UNIT + // This doesn't exist in the SCSI Spec, but was in the original RaSCSI code. + // leaving it here for now.... + case SCSIDEV::eCmdFormat: case 0x06: CmdFormat(); return; // REASSIGN BLOCKS - case 0x07: + case SCSIDEV::eCmdReassign: CmdReassign(); return; // READ(6) - case 0x08: + case SCSIDEV::eCmdRead6: CmdRead6(); return; // WRITE(6) - case 0x0a: + case SCSIDEV::eCmdWrite6: CmdWrite6(); return; // SEEK(6) - case 0x0b: + case SCSIDEV::eCmdSeek6: CmdSeek6(); return; // ASSIGN(SASIのみ) - case 0x0e: + // This doesn't exist in the SCSI Spec, but was in the original RaSCSI code. + // leaving it here for now.... + case SCSIDEV::eCmdSasiCmdAssign: CmdAssign(); return; // SPECIFY(SASIのみ) - case 0xc2: + // This doesn't exist in the SCSI Spec, but was in the original RaSCSI code. + // leaving it here for now.... + case SCSIDEV::eCmdInvalid: CmdSpecify(); return; + default: + break; } // Unsupported command - Log(Log::Warning, "Unsupported command $%02X", ctrl.cmd[0]); + LOGWARN("%s Unsupported command $%02X", __PRETTY_FUNCTION__, (WORD)ctrl.cmd[0]); CmdInvalid(); } @@ -872,9 +874,7 @@ void FASTCALL SASIDEV::DataOut() return; } -#if defined(DISK_LOG) - Log(Log::Normal, "Data out phase"); -#endif // DISK_LOG + LOGTRACE("%s Data out phase", __PRETTY_FUNCTION__); // Phase Setting ctrl.phase = BUS::dataout; @@ -893,11 +893,13 @@ void FASTCALL SASIDEV::DataOut() // Request data ctrl.bus->SetREQ(TRUE); #endif // RASCSI + LOGTRACE("%s returning.....",__PRETTY_FUNCTION__); return; } #ifdef RASCSI // Receive + LOGTRACE("%s transitioning to Receive()",__PRETTY_FUNCTION__); Receive(); #else // Requesting @@ -946,7 +948,7 @@ void FASTCALL SASIDEV::Error() } #if defined(DISK_LOG) - Log(Log::Warning, "Error occured (going to status phase)"); + LOGWARN("Error occured (going to status phase)"); #endif // DISK_LOG // Logical Unit @@ -1667,6 +1669,7 @@ void FASTCALL SASIDEV::ReceiveNext() // Data out phase case BUS::dataout: + LOGTRACE("%s transitioning to FlushUnit()",__PRETTY_FUNCTION__); // Flush FlushUnit(); @@ -1740,6 +1743,7 @@ BOOL FASTCALL SASIDEV::XferOut(BOOL cont) { DWORD lun; SCSIBR *bridge; + SCSINuvolink *nuvolink; ASSERT(this); ASSERT(ctrl.phase == BUS::dataout); @@ -1750,12 +1754,48 @@ BOOL FASTCALL SASIDEV::XferOut(BOOL cont) return FALSE; } - // MODE SELECT or WRITE system - switch (ctrl.cmd[0]) { - // MODE SELECT - case 0x15: - // MODE SELECT(10) - case 0x55: + switch ((SCSIDEV::scsi_command) ctrl.cmd[0]) { + case SCSIDEV::eCmdChangeMacAddr: + case SCSIDEV::eCmdSetMcastReg: + LOGTRACE("%s received multicast/mac address %02X", __PRETTY_FUNCTION__, (WORD)ctrl.cmd[0]); + // Replace the nuvolink with SEND MESSAGE 6 + if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'N', 'L')) { + nuvolink = (SCSINuvolink*)ctrl.unit[lun]; + if (!nuvolink->SendMessage6(ctrl.cmd, ctrl.buffer)) { + // write failed + return FALSE; + } + + // If normal, work setting + ctrl.offset = 0; + break; + } + else { + LOGERROR("%s Received an unexpected command that was not for nuvolink %02X", __PRETTY_FUNCTION__, (WORD)ctrl.cmd[0]); + break; + } + case SCSIDEV::eCmdSendPacket: + LOGTRACE("%s Send packet %02X", __PRETTY_FUNCTION__, (WORD)ctrl.cmd[0]); + // Replace the nuvolink with SEND MESSAGE 6 + if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'N', 'L')) { + nuvolink = (SCSINuvolink*)ctrl.unit[lun]; + if (!nuvolink->SendMessage6(ctrl.cmd, ctrl.buffer)) { + // write failed + return FALSE; + } + + // If normal, work setting + ctrl.offset = 0; + break; + } + else { + LOGERROR("%s Received an unexpected command that was not for nuvolink %02X", __PRETTY_FUNCTION__, (WORD)ctrl.cmd[0]); + break; + } + + + case SCSIDEV::eCmdModeSelect: + case SCSIDEV::eCmdModeSelect10: if (!ctrl.unit[lun]->ModeSelect( ctrl.cmd, ctrl.buffer, ctrl.offset)) { // MODE SELECT failed @@ -1763,10 +1803,8 @@ BOOL FASTCALL SASIDEV::XferOut(BOOL cont) } break; - // WRITE(6) - case 0x0a: - // WRITE(10) - case 0x2a: + case SCSIDEV::eCmdWrite6: + case SCSIDEV::eCmdWrite10: // Replace the host bridge with SEND MESSAGE 10 if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'B', 'R')) { bridge = (SCSIBR*)ctrl.unit[lun]; @@ -1780,8 +1818,7 @@ BOOL FASTCALL SASIDEV::XferOut(BOOL cont) break; } - // WRITE AND VERIFY - case 0x2e: + case SCSIDEV::eCmdWriteAndVerify10: // Write if (!ctrl.unit[lun]->Write(ctrl.buffer, ctrl.next - 1)) { // Write failed @@ -1806,10 +1843,11 @@ BOOL FASTCALL SASIDEV::XferOut(BOOL cont) break; // SPECIFY(SASI only) - case 0xc2: + case SCSIDEV::eCmdInvalid: break; default: + LOGWARN("Received an unexpected command (%02X) in %s", (WORD)ctrl.cmd[0] , __PRETTY_FUNCTION__) ASSERT(FALSE); break; } @@ -1826,6 +1864,8 @@ BOOL FASTCALL SASIDEV::XferOut(BOOL cont) void FASTCALL SASIDEV::FlushUnit() { DWORD lun; + DWORD len; + SCSINuvolink *nuvolink; ASSERT(this); ASSERT(ctrl.phase == BUS::dataout); @@ -1837,45 +1877,108 @@ void FASTCALL SASIDEV::FlushUnit() } // WRITE system only - switch (ctrl.cmd[0]) { - // WRITE(6) - case 0x0a: - // WRITE(10) - case 0x2a: - // WRITE AND VERIFY - case 0x2e: + switch ((SCSIDEV::scsi_command)ctrl.cmd[0]) { + case SCSIDEV::eCmdSetMcastReg: + LOGTRACE("%s received a eCmdSetMcastReg with size %d", __PRETTY_FUNCTION__, (WORD)ctrl.length); + // Get the number of bytes + len = ctrl.cmd [4]; + + LOGDEBUG("Mcast message len: %d (%08X)", (WORD)len, (WORD)len); + LOGDEBUG("Mcast contents: %02X %02X %02X %02X %02X %02X", \ + (WORD)ctrl.buffer[0],\ + (WORD)ctrl.buffer[1],\ + (WORD)ctrl.buffer[2],\ + (WORD)ctrl.buffer[3],\ + (WORD)ctrl.buffer[4],\ + (WORD)ctrl.buffer[5]); + break; + case SCSIDEV::eCmdChangeMacAddr: + LOGTRACE("%s received a eCmdChangeMacAddr with size %d", __PRETTY_FUNCTION__, (WORD)ctrl.length); + + // Get the number of bytes + len = ctrl.cmd [4]; + + LOGDEBUG("Mcast message len: %d (%08X)", (WORD)len, (WORD)len); + LOGDEBUG("Mcast contents: %02X %02X %02X %02X %02X %02X", \ + (WORD)ctrl.buffer[0],\ + (WORD)ctrl.buffer[1],\ + (WORD)ctrl.buffer[2],\ + (WORD)ctrl.buffer[3],\ + (WORD)ctrl.buffer[4],\ + (WORD)ctrl.buffer[5]); + + + break; + case SCSIDEV::eCmdSendPacket: + LOGTRACE("%s received a eCmdSendPacket with size %d", __PRETTY_FUNCTION__, (WORD)ctrl.length); + + // Get the number of bytes + len = ctrl.cmd [3]; + len <<= 8; + len += ctrl.cmd [4]; + + LOGDEBUG("Packet len: %d (%08X)", (WORD)len, (WORD)len) + if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'N', 'L')) { + nuvolink = (SCSINuvolink*)ctrl.unit[lun]; + LOGERROR("buffer addr %016lX", (DWORD)ctrl.buffer); + if (!nuvolink->SendPacket(ctrl.buffer,len)) { + // write failed + return; + } + + // If normal, work setting + ctrl.offset = 0; + break; + } + else { + LOGERROR("%s Received an unexpected command that was not for nuvolink %02X", __PRETTY_FUNCTION__, (WORD)ctrl.cmd[0]); + break; + } + + + + + + + + break; + case SCSIDEV::eCmdWrite6: + case SCSIDEV::eCmdWrite10: + case SCSIDEV::eCmdWriteAndVerify10: // Flush if (!ctrl.unit[lun]->IsCacheWB()) { ctrl.unit[lun]->Flush(); } break; - // Mode Select (6) - case 0x15: - // MODE SELECT(10) - case 0x55: + case SCSIDEV::eCmdModeSelect: + case SCSIDEV::eCmdModeSelect10: // Debug code related to Issue #2 on github, where we get an unhandled Model select when // the mac is rebooted // https://github.com/akuker/RASCSI/issues/2 - Log(Log::Warning, "Received \'Mode Select\'\n"); - Log(Log::Warning, " Operation Code: [%02X]\n", ctrl.cmd[0]); - Log(Log::Warning, " Logical Unit %01X, PF %01X, SP %01X [%02X]\n", ctrl.cmd[1] >> 5, 1 & (ctrl.cmd[1] >> 4), ctrl.cmd[1] & 1, ctrl.cmd[1]); - Log(Log::Warning, " Reserved: %02X\n", ctrl.cmd[2]); - Log(Log::Warning, " Reserved: %02X\n", ctrl.cmd[3]); - Log(Log::Warning, " Parameter List Len %02X\n", ctrl.cmd[4]); - Log(Log::Warning, " Reserved: %02X\n", ctrl.cmd[5]); - Log(Log::Warning, " Ctrl Len: %08X\n",ctrl.length); + LOGWARN("Received \'Mode Select\'\n"); + LOGWARN(" Operation Code: [%02X]\n", (WORD)ctrl.cmd[0]); + LOGWARN(" Logical Unit %01X, PF %01X, SP %01X [%02X]\n",\ + (WORD)ctrl.cmd[1] >> 5, 1 & ((WORD)ctrl.cmd[1] >> 4), \ + (WORD)ctrl.cmd[1] & 1, (WORD)ctrl.cmd[1]); + LOGWARN(" Reserved: %02X\n", (WORD)ctrl.cmd[2]); + LOGWARN(" Reserved: %02X\n", (WORD)ctrl.cmd[3]); + LOGWARN(" Parameter List Len %02X\n", (WORD)ctrl.cmd[4]); + LOGWARN(" Reserved: %02X\n",(WORD)ctrl.cmd[5]); + LOGWARN(" Ctrl Len: %08X\n",(WORD)ctrl.length); if (!ctrl.unit[lun]->ModeSelect( ctrl.cmd, ctrl.buffer, ctrl.offset)) { // MODE SELECT failed - Log(Log::Warning, "Error occured while processing Mode Select command %02X\n", (unsigned char)ctrl.cmd[0]); + LOGWARN("Error occured while processing Mode Select command %02X\n", (unsigned char)ctrl.cmd[0]); return; } break; default: - Log(Log::Warning, "Received an invalid flush command %02X!!!!!\n",ctrl.cmd[0]); - ASSERT(FALSE); + LOGWARN("Received an unexpected flush command %02X!!!!!\n",(WORD)ctrl.cmd[0]); + // The following statement makes debugging a huge pain. You can un-comment it + // if you're not trying to add new devices.... + // ASSERT(FALSE); break; } } diff --git a/src/raspberrypi/controllers/scsidev_ctrl.cpp b/src/raspberrypi/controllers/scsidev_ctrl.cpp index 89804ce..a13a00e 100644 --- a/src/raspberrypi/controllers/scsidev_ctrl.cpp +++ b/src/raspberrypi/controllers/scsidev_ctrl.cpp @@ -908,6 +908,13 @@ void FASTCALL SCSIDEV::CmdWrite10() return; } +// // Receive message with Nuvolink +// if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'N', 'L')) { +// CmdSendMessage10(); +// return; +// } +// TODO: .... I don't think this is needed (akuker) + // Get record number and block number record = ctrl.cmd[2]; record <<= 8; @@ -1157,7 +1164,7 @@ void FASTCALL SCSIDEV::CmdMediaSense(){ void FASTCALL SCSIDEV::CmdResetStatistics(){ - DWORD lun; + // DWORD lun; ASSERT(this); @@ -1168,25 +1175,84 @@ void FASTCALL SCSIDEV::CmdResetStatistics(){ void FASTCALL SCSIDEV::CmdSendPacket(){ + DWORD lun; ASSERT(this); LOGTRACE("<%d> Received CmdSendPacket command for Nuvolink (%s)", this->GetID(), __PRETTY_FUNCTION__); + // Logical Unit + lun = (ctrl.cmd[1] >> 5) & 0x07; + if (!ctrl.unit[lun]) { + LOGERROR("%s Invalid logical unit specified: %d", __PRETTY_FUNCTION__, (WORD)lun); + Error(); + return; + } + + // Send Packet with Nuvolink + if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'N', 'L')) { + LOGTRACE("%s Moving to CmdSendMessage6()", __PRETTY_FUNCTION__); + CmdSendMessage6(); + return; + } + else + { + LOGERROR("Received a CmdSendPacket command for a non-nuvolink device"); + } + + + Status(); } void FASTCALL SCSIDEV::CmdChangeMacAddr(){ + DWORD lun; ASSERT(this); LOGTRACE("<%d> Received CmdChangeMacAddr command for Nuvolink", this->GetID()); + // Logical Unit + lun = (ctrl.cmd[1] >> 5) & 0x07; + if (!ctrl.unit[lun]) { + LOGERROR("%s Invalid logical unit specified: %d", __PRETTY_FUNCTION__, (WORD)lun); + Error(); + return; + } + + // Receive message with Nuvolink + if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'N', 'L')) { + LOGTRACE("%s Moving to CmdSendMessage6()", __PRETTY_FUNCTION__); + CmdSendMessage6(); + return; + } + else + { + LOGERROR("Received a CmdChangeMacAddr command for a non-nuvolink device"); + } Status(); } -void SCSIDEV::FASTCALL CmdSetMcastReg(){ +void FASTCALL SCSIDEV::CmdSetMcastReg(){ DWORD lun; ASSERT(this); - LOGTRACE("<%d> Received CmdSetMcastReg command for Nuvolink", this->GetID()); + // Logical Unit + lun = (ctrl.cmd[1] >> 5) & 0x07; + if (!ctrl.unit[lun]) { + LOGERROR("%s Invalid logical unit specified: %d", __PRETTY_FUNCTION__, (WORD)lun); + Error(); + return; + } + + LOGTRACE("<%d> Received CmdSetMcastReg command for Nuvolink", this->GetID()); + // Receive message with Nuvolink + if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'N', 'L')) { + LOGTRACE("%s Moving to CmdSendMessage10()", __PRETTY_FUNCTION__); + CmdSendMessage6(); + return; + } + else + { + LOGERROR("Received a CmdSetMcastReg command for a non-nuvolink device"); + } Status(); } @@ -1414,6 +1480,8 @@ void FASTCALL SCSIDEV::CmdGetMessage10() // // SEND MESSAGE(10) // +// This Send Message command is used by the X68000 host driver +// //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdSendMessage10() { @@ -1429,8 +1497,7 @@ void FASTCALL SCSIDEV::CmdSendMessage10() } // Error if not a host bridge - if ((ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'B', 'R')) && - (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'N', 'L'))) { + if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'B', 'R')) { LOGERROR("Received CmdSendMessage10 for a non-bridge device"); Error(); return; @@ -1464,6 +1531,75 @@ void FASTCALL SCSIDEV::CmdSendMessage10() DataOut(); } + +//--------------------------------------------------------------------------- +// +// SEND MESSAGE(6) +// +// This Send Message command is used by the Nuvolink +// +//--------------------------------------------------------------------------- +void FASTCALL SCSIDEV::CmdSendMessage6() +{ + DWORD lun; + + ASSERT(this); + + // Logical Unit + lun = (ctrl.cmd[1] >> 5) & 0x07; + if (!ctrl.unit[lun]) { + Error(); + return; + } + + // Error if not a host bridge + if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'N', 'L')) { + LOGERROR("Received CmdSendMessage6 for a non-nuvolink device"); + Error(); + return; + } + + // Reallocate buffer (because it is not transfer for each block) + if (ctrl.bufsize < 0x1000000) { + LOGTRACE("%s Re-allocating ctrl buffer", __PRETTY_FUNCTION__); + free(ctrl.buffer); + ctrl.bufsize = 0x1000000; + ctrl.buffer = (BYTE *)malloc(ctrl.bufsize); + } + + // Set transfer amount + ctrl.length = ctrl.cmd[3]; + ctrl.length <<= 8; + ctrl.length += ctrl.cmd[4]; + + for(int i=0; i< 8; i++) + { + LOGDEBUG("ctrl.cmd Byte %d: %02X",i, (int)ctrl.cmd[i]); + } + + LOGTRACE("%s transfer %d bytes",__PRETTY_FUNCTION__, (unsigned int)ctrl.length); + + if (ctrl.length <= 0) { + // Failure (Error) + Error(); + return; + } + + // Set next block + ctrl.blocks = 1; + ctrl.next = 1; + + LOGTRACE("%s transitioning to DataOut()",__PRETTY_FUNCTION__); + // Light phase + DataOut(); +} + + + + + + + //=========================================================================== // // Data Transfer diff --git a/src/raspberrypi/controllers/scsidev_ctrl.h b/src/raspberrypi/controllers/scsidev_ctrl.h index 7275b13..898eb8e 100644 --- a/src/raspberrypi/controllers/scsidev_ctrl.h +++ b/src/raspberrypi/controllers/scsidev_ctrl.h @@ -74,6 +74,7 @@ public: eCmdModeSelect10 = 0x55, eCmdModeSense10 = 0x5A, eCmdInvalid = 0xC2, // (SASI only/Suppress warning when using SxSI) + eCmdSasiCmdAssign = 0x0e, // This isn't used by SCSI, and can probably be removed. }; public: @@ -157,6 +158,8 @@ private: // GET MESSAGE(10) command void FASTCALL CmdSendMessage10(); // SEND MESSAGE(10) command + void FASTCALL CmdSendMessage6(); + // SEND MESSAGE(6) command void FASTCALL CmdMediaSense(); // Nuvolink-specific command void FASTCALL CmdResetStatistics(); diff --git a/src/raspberrypi/devices/scsi_nuvolink.cpp b/src/raspberrypi/devices/scsi_nuvolink.cpp index cd2f663..7bd6b5d 100644 --- a/src/raspberrypi/devices/scsi_nuvolink.cpp +++ b/src/raspberrypi/devices/scsi_nuvolink.cpp @@ -62,13 +62,6 @@ SCSINuvolink::SCSINuvolink() : Disk() tap->GetMacAddr(mac_addr); mac_addr[5]++; } - mac_addr[0]=0x01; - mac_addr[1]=0x02; - mac_addr[2]=0x03; - mac_addr[3]=0x04; - mac_addr[4]=0x05; - mac_addr[5]=0x06; - // Packet reception flag OFF packet_enable = FALSE; #endif // RASCSI && !BAREMETAL @@ -99,7 +92,7 @@ SCSINuvolink::~SCSINuvolink() // //--------------------------------------------------------------------------- int FASTCALL SCSINuvolink::Inquiry( - const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor) + const DWORD *cdb, BYTE *buffer, DWORD major, DWORD minor) { DWORD response_size; DWORD temp_data_dword; @@ -107,7 +100,7 @@ int FASTCALL SCSINuvolink::Inquiry( ASSERT(this); ASSERT(cdb); - ASSERT(buf); + ASSERT(buffer); ASSERT(cdb[0] == 0x12); LOGTRACE("%s Inquiry with major %ld, minor %ld",__PRETTY_FUNCTION__, major, minor); @@ -115,7 +108,7 @@ int FASTCALL SCSINuvolink::Inquiry( // The LSB of cdb[3] is used as an extension to the size // field in cdb[4] response_size = (((DWORD)cdb[3] & 0x1) << 8) + cdb[4]; - LOGWARN("size is %d (%08X)",response_size, response_size); + LOGWARN("size is %d (%08X)",(int)response_size, (WORD)response_size); for(int i=0; i< 5; i++) { @@ -130,95 +123,95 @@ int FASTCALL SCSINuvolink::Inquiry( } // Clear the buffer - memset(buf, 0, response_size); + memset(buffer, 0, response_size); // Basic data - // buf[0] ... Communication Device - // buf[2] ... SCSI-2 compliant command system - // buf[3] ... SCSI-2 compliant Inquiry response - // buf[4] ... Inquiry additional data - buf[0] = 0x09; /* Communication device */ + // buffer[0] ... Communication Device + // buffer[2] ... SCSI-2 compliant command system + // buffer[3] ... SCSI-2 compliant Inquiry response + // buffer[4] ... Inquiry additional data + buffer[0] = 0x09; /* Communication device */ // SCSI-2 p.104 4.4.3 Incorrect logical unit handling if (((cdb[1] >> 5) & 0x07) != disk.lun) { - buf[0] = 0x7f; + buffer[0] = 0x7f; } /* SCSI 2 device */ - buf[2] = 0x02; + buffer[2] = 0x02; /* SCSI 2 response type */ - buf[3] = (response_size >> 8) | 0x02; + buffer[3] = (response_size >> 8) | 0x02; /* No additional length */ - buf[4] = response_size; + buffer[4] = response_size; // Vendor name - memcpy(&buf[8], m_vendor_name, strlen( m_vendor_name)); + memcpy(&buffer[8], m_vendor_name, strlen( m_vendor_name)); // Product name - memcpy(&buf[16], m_device_name, strlen(m_device_name)); + memcpy(&buffer[16], m_device_name, strlen(m_device_name)); // Revision - memcpy(&buf[32], m_revision, strlen(m_revision)); + memcpy(&buffer[32], m_revision, strlen(m_revision)); // MAC Address currently configured - memcpy(&buf[36], mac_addr, sizeof(mac_addr)); + memcpy(&buffer[36], mac_addr, sizeof(mac_addr)); // Build-in Hardware MAC address - memcpy(&buf[56], mac_addr, sizeof(mac_addr)); + memcpy(&buffer[56], mac_addr, sizeof(mac_addr)); // For now, all of the statistics are just garbage data to // make sure that the inquiry response is formatted correctly if(response_size > 96){ // Header for SCSI statistics - buf[96] = 0x04; // Decimal 1234 - buf[97] = 0xD2; + buffer[96] = 0x04; // Decimal 1234 + buffer[97] = 0xD2; // Header for SCSI errors section - buf[184]=0x09; // Decimal 2345 - buf[185]=0x29; + buffer[184]=0x09; // Decimal 2345 + buffer[185]=0x29; // Header for network statistics - buf[244]=0x0D; - buf[245]=0x80; + buffer[244]=0x0D; + buffer[245]=0x80; // Received Packet Count temp_data_dword=100; - memcpy(&buf[246], &temp_data_dword, sizeof(temp_data_dword)); + memcpy(&buffer[246], &temp_data_dword, sizeof(temp_data_dword)); // Transmitted Packet Count temp_data_dword=200; - memcpy(&buf[250], &temp_data_dword, sizeof(temp_data_dword)); + memcpy(&buffer[250], &temp_data_dword, sizeof(temp_data_dword)); // Transmitted Request Count temp_data_dword=300; - memcpy(&buf[254], &temp_data_dword, sizeof(temp_data_dword)); + memcpy(&buffer[254], &temp_data_dword, sizeof(temp_data_dword)); // Reset Count temp_data_word=50; - memcpy(&buf[258], &temp_data_word, sizeof(temp_data_word)); + memcpy(&buffer[258], &temp_data_word, sizeof(temp_data_word)); // Header for network errors - buf[260]=0x11; // Decimal 4567 - buf[261]=0xD7; + buffer[260]=0x11; // Decimal 4567 + buffer[261]=0xD7; // unexp_rst - buf[262]=0x01; - buf[263]=0x02; + buffer[262]=0x01; + buffer[263]=0x02; //transmit_errors - buf[264]=0x03; - buf[265]=0x04; + buffer[264]=0x03; + buffer[265]=0x04; // re_int - buf[266]=0x05; - buf[267]=0x06; + buffer[266]=0x05; + buffer[267]=0x06; // te_int - buf[268]=0x07; - buf[269]=0x08; + buffer[268]=0x07; + buffer[269]=0x08; // ow_int - buf[270]=0x09; - buf[271]=0x0A; - buf[272]=0x0B; - buf[273]=0x0C; - buf[274]=0x0D; - buf[275]=0x0E; + buffer[270]=0x09; + buffer[271]=0x0A; + buffer[272]=0x0B; + buffer[273]=0x0C; + buffer[274]=0x0D; + buffer[275]=0x0E; } // Success @@ -246,7 +239,7 @@ BOOL FASTCALL SCSINuvolink::TestUnitReady(const DWORD* /*cdb*/) // GET MESSAGE(10) // //--------------------------------------------------------------------------- -int FASTCALL SCSINuvolink::GetMessage10(const DWORD *cdb, BYTE *buf) +int FASTCALL SCSINuvolink::GetMessage6(const DWORD *cdb, BYTE *buffer) { int type; int phase; @@ -257,7 +250,7 @@ int FASTCALL SCSINuvolink::GetMessage10(const DWORD *cdb, BYTE *buf) #endif // RASCSI && !BAREMETAL ASSERT(this); - LOGTRACE("SCSINuvolink::GetMessage10"); + LOGTRACE("SCSINuvolink::GetMessage"); // Type type = cdb[2]; @@ -280,26 +273,26 @@ int FASTCALL SCSINuvolink::GetMessage10(const DWORD *cdb, BYTE *buf) switch (func) { case 0: // Get MAC address - return GetMacAddr(buf); + return GetMacAddr(buffer); case 1: // Received packet acquisition (size/buffer) if (phase == 0) { // Get packet size ReceivePacket(); - buf[0] = (BYTE)(packet_len >> 8); - buf[1] = (BYTE)packet_len; + buffer[0] = (BYTE)(packet_len >> 8); + buffer[1] = (BYTE)packet_len; return 2; } else { // Get package data - GetPacketBuf(buf); + GetPacketBuf(buffer); return packet_len; } case 2: // Received packet acquisition (size + buffer simultaneously) ReceivePacket(); - buf[0] = (BYTE)(packet_len >> 8); - buf[1] = (BYTE)packet_len; - GetPacketBuf(&buf[2]); + buffer[0] = (BYTE)(packet_len >> 8); + buffer[1] = (BYTE)packet_len; + GetPacketBuf(&buffer[2]); return packet_len + 2; case 3: // Simultaneous acquisition of multiple packets (size + buffer simultaneously) @@ -308,13 +301,13 @@ int FASTCALL SCSINuvolink::GetMessage10(const DWORD *cdb, BYTE *buf) total_len = 0; for (i = 0; i < 10; i++) { ReceivePacket(); - *buf++ = (BYTE)(packet_len >> 8); - *buf++ = (BYTE)packet_len; + *buffer++ = (BYTE)(packet_len >> 8); + *buffer++ = (BYTE)packet_len; total_len += 2; if (packet_len == 0) break; - GetPacketBuf(buf); - buf += packet_len; + GetPacketBuf(buffer); + buffer += packet_len; total_len += packet_len; } return total_len; @@ -325,13 +318,13 @@ int FASTCALL SCSINuvolink::GetMessage10(const DWORD *cdb, BYTE *buf) case 2: // Host Drive // switch (phase) { // case 0: // Get result code - // return ReadFsResult(buf); + // return ReadFsResult(buffer); // case 1: // Return data acquisition - // return ReadFsOut(buf); + // return ReadFsOut(buffer); // case 2: // Return additional data acquisition - // return ReadFsOpt(buf); + // return ReadFsOpt(buffer); // } break; } @@ -346,63 +339,62 @@ int FASTCALL SCSINuvolink::GetMessage10(const DWORD *cdb, BYTE *buf) // SEND MESSAGE(10) // //--------------------------------------------------------------------------- -BOOL FASTCALL SCSINuvolink::SendMessage10(const DWORD *cdb, BYTE *buf) +BOOL FASTCALL SCSINuvolink::SendMessage6(const DWORD *cdb, BYTE *buffer) { - int type; + // int type; int func; int len; ASSERT(this); ASSERT(cdb); - ASSERT(buf); - LOGTRACE("SCSINuvolink::SendMessage10"); + ASSERT(buffer); + LOGTRACE("%s Entering....", __PRETTY_FUNCTION__); + + // SendMessage6 is 6 bytes + for(int i=0; i< 6; i++) + { + LOGDEBUG("%s Byte %d: %02X",__PRETTY_FUNCTION__, i, (int)cdb[i]); + } // Type - type = cdb[2]; + // type = cdb[2]; // Function number - func = cdb[3]; + func = cdb[0]; // Phase // phase = cdb[9]; - // Get the number of lights - len = cdb[6]; - len <<= 8; - len |= cdb[7]; - len <<= 8; - len |= cdb[8]; + // Get the number of bytes + len = cdb[4]; - switch (type) { -#if defined(RASCSI) && !defined(BAREMETAL) - case 1: // Ethernet - // Do not process if TAP is invalid - if (!m_bTapEnable) { - return FALSE; - } + // // Do not process if TAP is invalid + // if (!m_bTapEnable) { + // LOGWARN("%s TAP is invalid and not working...", __PRETTY_FUNCTION__); + // return FALSE; + // } - switch (func) { - case 0: // MAC address setting - SetMacAddr(buf); - return TRUE; + switch (func) { + case 0x06: // MAC address setting + LOGWARN("%s Unhandled Set MAC Address happening here...", __PRETTY_FUNCTION__); + SetMacAddr(buffer); + return TRUE; + case 0x09: // Set Multicast Registers + LOGWARN("%s Set Multicast registers happening here...", __PRETTY_FUNCTION__); + SetMulticastRegisters(buffer, len); + return TRUE; - case 1: // Send packet - SendPacket(buf, len); - return TRUE; - } - break; -#endif // RASCSI && !BAREMETAL + case 0x05: // Send message + LOGWARN("%s Send message happening here...(%d)", __PRETTY_FUNCTION__, len); + // SendPacket(buffer,len); + return TRUE; - case 2: // Host drive - // switch (phase) { - // case 0: // issue command - // WriteFs(func, buf); - // return TRUE; - // case 1: // additional data writing - // WriteFsOpt(buf, len); - // return TRUE; - // } + // case 1: // Send packet + // SendPacket(buffer, len); + // return TRUE; + default: + LOGWARN("%s Unexpected command type found %02X",__PRETTY_FUNCTION__, func); break; } @@ -411,6 +403,23 @@ BOOL FASTCALL SCSINuvolink::SendMessage10(const DWORD *cdb, BYTE *buf) return FALSE; } +//--------------------------------------------------------------------------- +// +// Set the Multicast Configuration +// +//--------------------------------------------------------------------------- +void FASTCALL SCSINuvolink::SetMulticastRegisters(BYTE *buffer, int len){ + LOGINFO("%s I should be setting the multicast registers here, but I'll just print instead...", __PRETTY_FUNCTION__); + LOGINFO("%s Got %d bytes", __PRETTY_FUNCTION__, len) + for(int i=0; iTx(buf, len); + LOGERROR("%s buffer addr %016lX len:%d", __PRETTY_FUNCTION__, (DWORD)buffer, len); + + LOGDEBUG("%s Total Len: %d", __PRETTY_FUNCTION__, len); + LOGDEBUG("%s Destination Addr: %02X:%02X:%02X:%02X:%02X:%02X",\ + __PRETTY_FUNCTION__, (WORD)buffer[0], (WORD)buffer[1], (WORD)buffer[2], (WORD)buffer[3], (WORD)buffer[4], (WORD)buffer[5]); + LOGDEBUG("%s Source Addr: %02X:%02X:%02X:%02X:%02X:%02X",\ + __PRETTY_FUNCTION__, (WORD)buffer[6], (WORD)buffer[7], (WORD)buffer[8], (WORD)buffer[9], (WORD)buffer[10], (WORD)buffer[11]); + LOGDEBUG("%s EtherType: %02X:%02X", __PRETTY_FUNCTION__, (WORD)buffer[12], (WORD)buffer[13]); + + + for(int i=0; iTx(buffer, len); + return TRUE; } #endif // RASCSI && !BAREMETAL diff --git a/src/raspberrypi/devices/scsi_nuvolink.h b/src/raspberrypi/devices/scsi_nuvolink.h index 591a7e3..c67167d 100644 --- a/src/raspberrypi/devices/scsi_nuvolink.h +++ b/src/raspberrypi/devices/scsi_nuvolink.h @@ -48,10 +48,13 @@ public: // INQUIRY command BOOL FASTCALL TestUnitReady(const DWORD *cdb); // TEST UNIT READY command - int FASTCALL GetMessage10(const DWORD *cdb, BYTE *buf); + int FASTCALL GetMessage6(const DWORD *cdb, BYTE *buf); // GET MESSAGE10 command - BOOL FASTCALL SendMessage10(const DWORD *cdb, BYTE *buf); + BOOL FASTCALL SendMessage6(const DWORD *cdb, BYTE *buf); // SEND MESSAGE10 command + BOOL SendPacket(BYTE *buf, int len); + // Send a packet + private: enum nuvolink_command_enum : BYTE { @@ -82,8 +85,8 @@ private: // Receive a packet void FASTCALL GetPacketBuf(BYTE *buf); // Get a packet - void FASTCALL SendPacket(BYTE *buf, int len); - // Send a packet + void FASTCALL SetMulticastRegisters(BYTE *buf, int len); + // Change the multicast registers CTapDriver *tap; // TAP driver diff --git a/src/raspberrypi/rascsi.cpp b/src/raspberrypi/rascsi.cpp index 6b51dd4..af296b9 100644 --- a/src/raspberrypi/rascsi.cpp +++ b/src/raspberrypi/rascsi.cpp @@ -458,7 +458,7 @@ BOOL ProcessCmd(FILE *fp, int id, int un, int cmd, int type, char *file) // Check the Controller Number if (id < 0 || id >= CtrlMax) { - FPRT(fp, "Error : Invalid ID\n"); + FPRT(fp, "%s Error : Invalid ID %d\n", __PRETTY_FUNCTION__, id); return FALSE; } diff --git a/src/raspberrypi/rasctl.cpp b/src/raspberrypi/rasctl.cpp index d85fb69..6ad00c9 100644 --- a/src/raspberrypi/rasctl.cpp +++ b/src/raspberrypi/rasctl.cpp @@ -179,13 +179,13 @@ int main(int argc, char* argv[]) // Check the ID number if (id < 0 || id > 7) { - fprintf(stderr, "Error : Invalid ID\n"); + fprintf(stderr, "%s Error : Invalid ID %d \n", __PRETTY_FUNCTION__, id); exit(EINVAL); } // Check the unit number if (un < 0 || un > 1) { - fprintf(stderr, "Error : Invalid UNIT\n"); + fprintf(stderr, "%s Error : Invalid UNIT %d \n", __PRETTY_FUNCTION__, un); exit(EINVAL); }