Additional powerview processing implemented

This commit is contained in:
Tony Kuker 2022-01-08 22:04:34 +00:00
parent 9f8fc1fb8a
commit f09fb6dd2f
5 changed files with 68 additions and 36 deletions

View File

@ -9,6 +9,8 @@
"ratio": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp"
"utility": "cpp",
"string_view": "cpp",
"regex": "cpp"
}
}

View File

@ -1033,6 +1033,7 @@ void SASIDEV::Receive()
// If result is false, move to the status phase
if (!result) {
LOGWARN("%s invalid result received", __PRETTY_FUNCTION__);
Error();
return;
}
@ -1119,9 +1120,16 @@ bool SASIDEV::XferOut(bool cont)
{
ASSERT(ctrl.phase == BUS::dataout);
// Logical Unit
DWORD lun = GetEffectiveLun();
if(ctrl.cmd[0] == SASIDEV::eCmdUnknownPowerViewCC)
{
lun = 0;
}
if (!ctrl.unit[lun]) {
LOGWARN("%s Invalid LUN %d - %02X", __PRETTY_FUNCTION__, (int)lun, ctrl.cmd[0]);
return false;
}
Disk *device = ctrl.unit[lun];
@ -1199,6 +1207,7 @@ bool SASIDEV::XferOut(bool cont)
case SASIDEV::eCmdUnknownPowerViewCB:
case SASIDEV::eCmdUnknownPowerViewCC:
LOGWARN("Finished receiving a Powerview Command ($%02X) in %s", (WORD)ctrl.cmd[0] , __PRETTY_FUNCTION__)
return true;
break;
case SASIDEV::eCmdSetMcastAddr:
LOGTRACE("%s Done with DaynaPort Set Multicast Address", __PRETTY_FUNCTION__);

View File

@ -229,7 +229,8 @@ void SCSIDEV::Execute()
int lun = GetEffectiveLun();
if (!ctrl.unit[lun]) {
if ((SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdInquiry && (SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdRequestSense) {
if ((SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdInquiry && (SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdRequestSense && (SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdUnknownPowerViewCC)
{
LOGDEBUG("Invalid LUN %d for ID %d", lun, GetSCSIID());
Error(ERROR_CODES::sense_key::ILLEGAL_REQUEST, ERROR_CODES::asc::INVALID_LUN);

View File

@ -54,17 +54,15 @@ const BYTE SCSIPowerView::m_inquiry_response[] = {
SCSIPowerView::SCSIPowerView() : Disk("SCPV")
{
AddCommand(SCSIDEV::eCmdUnknownPowerViewC8, "Unknown PowerViewC8", &SCSIPowerView::UnknownCommandC9);
AddCommand(SCSIDEV::eCmdUnknownPowerViewC8, "Unknown PowerViewC8", &SCSIPowerView::UnknownCommandC8);
AddCommand(SCSIDEV::eCmdUnknownPowerViewC9, "Unknown PowerViewC9", &SCSIPowerView::UnknownCommandC9);
AddCommand(SCSIDEV::eCmdUnknownPowerViewCA, "Unknown PowerViewCA", &SCSIPowerView::UnknownCommandC9);
AddCommand(SCSIDEV::eCmdUnknownPowerViewCB, "Unknown PowerViewCB", &SCSIPowerView::UnknownCommandC9);
AddCommand(SCSIDEV::eCmdUnknownPowerViewCC, "Unknown PowerViewCC", &SCSIPowerView::UnknownCommandC9);
AddCommand(SCSIDEV::eCmdUnknownPowerViewCA, "Unknown PowerViewCA", &SCSIPowerView::UnknownCommandCA);
AddCommand(SCSIDEV::eCmdUnknownPowerViewCB, "Unknown PowerViewCB", &SCSIPowerView::UnknownCommandCB);
AddCommand(SCSIDEV::eCmdUnknownPowerViewCC, "Unknown PowerViewCC", &SCSIPowerView::UnknownCommandCC);
struct fb_var_screeninfo fbinfo;
struct fb_var_screeninfo fbinfo;
struct fb_fix_screeninfo fbfixinfo;
// disk.id = MAKEID('S', 'C', 'V', 'D');
// create lookup table
for (int i = 0; i < 256; i++) {
unsigned char b = i;
@ -150,31 +148,35 @@ void SCSIPowerView::dump_command(SASIDEV *controller){
}
// //---------------------------------------------------------------------------
// //
// // Unknown Command C8
// //
// //---------------------------------------------------------------------------
// void SCSIPowerView::UnknownCommandC8(SASIDEV *controller)
// {
//---------------------------------------------------------------------------
//
// Unknown Command C8
//
//---------------------------------------------------------------------------
void SCSIPowerView::UnknownCommandC8(SASIDEV *controller)
{
// // Set transfer amount
// ctrl->length = ctrl->cmd[6];
// LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length);
// dump_command(controller);
// Set transfer amount
ctrl->length = ctrl->cmd[6];
LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length);
dump_command(controller);
// if (ctrl->length <= 0) {
// // Failure (Error)
// controller->Error();
// return;
// }
if (ctrl->length <= 0) {
// Failure (Error)
controller->Error();
return;
}
// // Set next block
// ctrl->blocks = 1;
// ctrl->next = 1;
ctrl->buffer[0] = 0x01;
ctrl->buffer[1] = 0x09;
ctrl->buffer[2] = 0x08;
// controller->DataOut();
// }
// Set next block
ctrl->blocks = 1;
ctrl->next = 1;
controller->DataIn();
}
//---------------------------------------------------------------------------
@ -189,7 +191,7 @@ void SCSIPowerView::UnknownCommandC9(SASIDEV *controller)
ctrl->length = ctrl->cmd[6];
LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length);
dump_command(controller);
LOGWARN("Controller: %08X ctrl: %08X", (DWORD)controller->GetCtrl(), (DWORD)ctrl);
// LOGWARN("Controller: %08X ctrl: %08X", (DWORD)controller->GetCtrl(), (DWORD)ctrl);
// if (ctrl->length <= 0) {
// // Failure (Error)
// controller->Error();
@ -222,7 +224,7 @@ void SCSIPowerView::UnknownCommandCA(SASIDEV *controller)
// Set transfer amount
ctrl->length = ctrl->cmd[6];
LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length);
dump_command(controller);
dump_command(controller);
if (ctrl->length <= 0) {
// Failure (Error)
controller->Error();
@ -247,8 +249,9 @@ void SCSIPowerView::UnknownCommandCB(SASIDEV *controller)
// Set transfer amount
ctrl->length = ctrl->cmd[6];
ctrl->length = ctrl->length * 4;
LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length);
dump_command(controller);
dump_command(controller);
if (ctrl->length <= 0) {
// Failure (Error)
controller->Error();
@ -272,9 +275,10 @@ void SCSIPowerView::UnknownCommandCC(SASIDEV *controller)
{
// Set transfer amount
ctrl->length = ctrl->cmd[6];
// ctrl->length = ctrl->cmd[6];
ctrl->length = 0x8bb;
LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length);
dump_command(controller);
dump_command(controller);
if (ctrl->length <= 0) {
// Failure (Error)
controller->Error();

View File

@ -1563,7 +1563,23 @@ int GPIOBUS::GetCommandByteCount(BYTE opcode) {
}
else if (opcode >= 0x20 && opcode <= 0x7D) {
return 10;
} else {
}
else if(opcode == 0xC8){
return 8;
}
else if(opcode == 0xC9){
return 8;
}
else if(opcode == 0xCA){
return 11;
}
else if(opcode == 0xCB){
return 6;
}
else if(opcode == 0xCC){
return 4;
}
else {
return 6;
}
}