Use exception for unsupported LUN handling in order to reduce duplicate code

This commit is contained in:
Uwe Seimet 2021-06-21 08:51:44 +02:00
parent 88f59a6f1e
commit 118a22d6d0
4 changed files with 69 additions and 265 deletions

View File

@ -19,6 +19,7 @@
#include "devices/scsi_host_bridge.h"
#include "controllers/scsidev_ctrl.h"
#include "devices/scsi_daynaport.h"
#include "exceptions.h"
//===========================================================================
//
@ -498,7 +499,12 @@ void FASTCALL SASIDEV::Command()
ctrl.blocks = 0;
// Execution Phase
Execute();
try {
Execute();
}
catch (const lunexception& e) {
Error();
}
#else
// Request the command
ctrl.bus->SetREQ(TRUE);
@ -912,19 +918,13 @@ void FASTCALL SASIDEV::Error()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdTestUnitReady()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE("%s TEST UNIT READY Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->TestUnitReady(ctrl.cmd);
@ -945,19 +945,13 @@ void FASTCALL SASIDEV::CmdTestUnitReady()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdRezero()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE( "%s REZERO UNIT Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->Rezero(ctrl.cmd);
@ -978,18 +972,11 @@ void FASTCALL SASIDEV::CmdRezero()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdRequestSense()
{
DWORD lun;
ASSERT(this);
LOGTRACE( "%s REQUEST SENSE Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
ctrl.length = ctrl.unit[lun]->RequestSense(ctrl.cmd, ctrl.buffer);
ASSERT(ctrl.length > 0);
@ -1008,19 +995,13 @@ void FASTCALL SASIDEV::CmdRequestSense()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdFormat()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE( "%s FORMAT UNIT Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->Format(ctrl.cmd);
@ -1041,19 +1022,13 @@ void FASTCALL SASIDEV::CmdFormat()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdReassign()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE("%s REASSIGN BLOCKS Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->Reassign(ctrl.cmd);
@ -1112,17 +1087,11 @@ void FASTCALL SASIDEV::CmdReleaseUnit()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdRead6()
{
DWORD lun;
DWORD record;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Get record number and block number
record = ctrl.cmd[1] & 0x1f;
@ -1168,17 +1137,11 @@ void FASTCALL SASIDEV::CmdRead6()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::DaynaPortWrite()
{
DWORD lun;
DWORD data_format;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Error if not a host bridge
if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')) {
@ -1232,17 +1195,11 @@ void FASTCALL SASIDEV::DaynaPortWrite()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdWrite6()
{
DWORD lun;
DWORD record;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Special receive function for the DaynaPort
if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'D', 'P')){
@ -1286,19 +1243,13 @@ void FASTCALL SASIDEV::CmdWrite6()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdSeek6()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE("%s SEEK(6) Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->Seek(ctrl.cmd);
@ -1319,19 +1270,13 @@ void FASTCALL SASIDEV::CmdSeek6()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdAssign()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE("%s ASSIGN Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->Assign(ctrl.cmd);
@ -1355,19 +1300,13 @@ void FASTCALL SASIDEV::CmdAssign()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdSpecify()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE("%s SPECIFY Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->Assign(ctrl.cmd);
@ -1391,18 +1330,9 @@ void FASTCALL SASIDEV::CmdSpecify()
//---------------------------------------------------------------------------
void FASTCALL SASIDEV::CmdInvalid()
{
DWORD lun;
ASSERT(this);
LOGWARN("%s Command not supported", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (ctrl.unit[lun]) {
// Command processing on drive
ctrl.unit[lun]->InvalidCmd();
}
// Failure (Error)
Error();
}
@ -1979,3 +1909,18 @@ void SASIDEV::GetPhaseStr(char *str)
}
}
#endif
//---------------------------------------------------------------------------
//
// Validate LUN
//
//---------------------------------------------------------------------------
DWORD FASTCALL SASIDEV::ValidateLun()
{
DWORD lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
throw lunexception();
}
return lun;
}

View File

@ -163,6 +163,8 @@ protected:
// Special operations
void FASTCALL FlushUnit(); // Flush the logical unit
DWORD FASTCALL ValidateLun(); // LUN validation
protected:
#ifndef RASCSI
Device *host; // Host device

View File

@ -18,6 +18,7 @@
#include "gpiobus.h"
#include "devices/scsi_host_bridge.h"
#include "devices/scsi_daynaport.h"
#include "exceptions.h"
//===========================================================================
//
@ -611,18 +612,11 @@ void FASTCALL SCSIDEV::CmdInquiry()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdModeSelect()
{
DWORD lun;
ASSERT(this);
LOGTRACE( "%s MODE SELECT Command", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
ctrl.length = ctrl.unit[lun]->SelectCheck(ctrl.cmd);
@ -720,18 +714,11 @@ void FASTCALL SCSIDEV::CmdRelease10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdModeSense()
{
DWORD lun;
ASSERT(this);
LOGTRACE( "%s MODE SENSE Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
ctrl.length = ctrl.unit[lun]->ModeSense(ctrl.cmd, ctrl.buffer);
@ -755,19 +742,13 @@ void FASTCALL SCSIDEV::CmdModeSense()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdStartStop()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE( "%s START STOP UNIT Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->StartStop(ctrl.cmd);
@ -788,19 +769,13 @@ void FASTCALL SCSIDEV::CmdStartStop()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdSendDiag()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE( "%s SEND DIAGNOSTIC Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->SendDiag(ctrl.cmd);
@ -821,19 +796,13 @@ void FASTCALL SCSIDEV::CmdSendDiag()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdRemoval()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE( "%s PREVENT/ALLOW MEDIUM REMOVAL Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->Removal(ctrl.cmd);
@ -854,19 +823,13 @@ void FASTCALL SCSIDEV::CmdRemoval()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdReadCapacity()
{
DWORD lun;
int length;
ASSERT(this);
LOGTRACE( "%s READ CAPACITY Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
length = ctrl.unit[lun]->ReadCapacity(ctrl.cmd, ctrl.buffer);
@ -890,17 +853,11 @@ void FASTCALL SCSIDEV::CmdReadCapacity()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdRead10()
{
DWORD lun;
DWORD record;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Receive message if host bridge
if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'B', 'R')) {
@ -950,17 +907,11 @@ void FASTCALL SCSIDEV::CmdRead10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdWrite10()
{
DWORD lun;
DWORD record;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Receive message with host bridge
if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'B', 'R')) {
@ -1010,19 +961,13 @@ void FASTCALL SCSIDEV::CmdWrite10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdSeek10()
{
DWORD lun;
BOOL status;
ASSERT(this);
LOGTRACE( "%s SEEK(10) Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->Seek(ctrl.cmd);
@ -1043,18 +988,12 @@ void FASTCALL SCSIDEV::CmdSeek10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdVerify()
{
DWORD lun;
BOOL status;
DWORD record;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Get record number and block number
record = ctrl.cmd[2];
@ -1113,16 +1052,9 @@ void FASTCALL SCSIDEV::CmdVerify()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdSynchronizeCache()
{
DWORD lun;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
ValidateLun();
// Make it do something (not implemented)...
@ -1137,17 +1069,11 @@ void FASTCALL SCSIDEV::CmdSynchronizeCache()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdReadDefectData10()
{
DWORD lun;
ASSERT(this);
LOGTRACE( "%s READ DEFECT DATA(10) Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
ctrl.length = ctrl.unit[lun]->ReadDefectData10(ctrl.cmd, ctrl.buffer);
@ -1169,15 +1095,9 @@ void FASTCALL SCSIDEV::CmdReadDefectData10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdReadToc()
{
DWORD lun;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
ctrl.length = ctrl.unit[lun]->ReadToc(ctrl.cmd, ctrl.buffer);
@ -1198,17 +1118,11 @@ void FASTCALL SCSIDEV::CmdReadToc()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdPlayAudio10()
{
DWORD lun;
BOOL status;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->PlayAudio(ctrl.cmd);
@ -1229,17 +1143,11 @@ void FASTCALL SCSIDEV::CmdPlayAudio10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdPlayAudioMSF()
{
DWORD lun;
BOOL status;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->PlayAudioMSF(ctrl.cmd);
@ -1260,17 +1168,11 @@ void FASTCALL SCSIDEV::CmdPlayAudioMSF()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdPlayAudioTrack()
{
DWORD lun;
BOOL status;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
status = ctrl.unit[lun]->PlayAudioTrack(ctrl.cmd);
@ -1291,18 +1193,11 @@ void FASTCALL SCSIDEV::CmdPlayAudioTrack()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdModeSelect10()
{
DWORD lun;
ASSERT(this);
LOGTRACE( "%s MODE SELECT10 Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
ctrl.length = ctrl.unit[lun]->SelectCheck10(ctrl.cmd);
@ -1323,18 +1218,11 @@ void FASTCALL SCSIDEV::CmdModeSelect10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdModeSense10()
{
DWORD lun;
ASSERT(this);
LOGTRACE( "%s MODE SENSE(10) Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Command processing on drive
ctrl.length = ctrl.unit[lun]->ModeSense10(ctrl.cmd, ctrl.buffer);
@ -1358,17 +1246,11 @@ void FASTCALL SCSIDEV::CmdModeSense10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdGetMessage10()
{
DWORD lun;
SCSIBR *bridge;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Error if not a host bridge
if ((ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'B', 'R')) &&
@ -1412,16 +1294,9 @@ void FASTCALL SCSIDEV::CmdGetMessage10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdSendMessage10()
{
DWORD lun;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Error if not a host bridge
if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'B', 'R')) {
@ -1465,17 +1340,11 @@ void FASTCALL SCSIDEV::CmdSendMessage10()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdRetrieveStats()
{
DWORD lun;
SCSIDaynaPort *dayna_port;
ASSERT(this);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Error if not a DaynaPort SCSI Link
if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')){
@ -1509,20 +1378,13 @@ void FASTCALL SCSIDEV::CmdRetrieveStats()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdSetIfaceMode()
{
DWORD lun;
// BOOL status;
SCSIDaynaPort *dayna_port;
ASSERT(this);
LOGTRACE("%s",__PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Error if not a DaynaPort SCSI Link
if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')){
@ -1560,18 +1422,11 @@ void FASTCALL SCSIDEV::CmdSetIfaceMode()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdSetMcastAddr()
{
DWORD lun;
ASSERT(this);
LOGTRACE("%s Set Multicast Address Command ", __PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')){
LOGWARN("Received a SetMcastAddress command for a non-daynaport unit");
@ -1601,7 +1456,6 @@ void FASTCALL SCSIDEV::CmdSetMcastAddr()
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::CmdEnableInterface()
{
DWORD lun=0;
BOOL status;
SCSIDaynaPort *dayna_port;
@ -1609,12 +1463,7 @@ void FASTCALL SCSIDEV::CmdEnableInterface()
LOGTRACE("%s",__PRETTY_FUNCTION__);
// Logical Unit
lun = (ctrl.cmd[1] >> 5) & 0x07;
if (!ctrl.unit[lun]) {
Error();
return;
}
DWORD lun = ValidateLun();
// Error if not a DaynaPort SCSI Link
if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')){
@ -1907,7 +1756,12 @@ void FASTCALL SCSIDEV::Receive()
}
// Execution Phase
Execute();
try {
Execute();
}
catch (const lunexception& e) {
Error();
}
break;
// Message out phase

View File

@ -0,0 +1,3 @@
using namespace std;
class lunexception : public exception { };