summaryrefslogtreecommitdiff
path: root/src/VBox/Devices/Storage/DevBusLogic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Devices/Storage/DevBusLogic.cpp')
-rw-r--r--src/VBox/Devices/Storage/DevBusLogic.cpp41
1 files changed, 24 insertions, 17 deletions
diff --git a/src/VBox/Devices/Storage/DevBusLogic.cpp b/src/VBox/Devices/Storage/DevBusLogic.cpp
index 5193030da..439384882 100644
--- a/src/VBox/Devices/Storage/DevBusLogic.cpp
+++ b/src/VBox/Devices/Storage/DevBusLogic.cpp
@@ -1,4 +1,4 @@
-/* $Id: DevBusLogic.cpp $ */
+/* $Id: DevBusLogic.cpp 37636 2011-06-24 14:59:59Z vboxsync $ */
/** @file
* VBox storage devices: BusLogic SCSI host adapter BT-958.
*/
@@ -15,7 +15,9 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-/* Implemented looking at the driver source in the linux kernel (drivers/scsi/BusLogic.[ch]). */
+/* Implemented looking at the driver source in the linux kernel (drivers/scsi/BusLogic.[ch]).
+ * See also: http://www.drdobbs.com/184410111
+ */
/*******************************************************************************
* Header Files *
@@ -139,6 +141,8 @@ enum BUSLOGICCOMMAND
BUSLOGICCOMMAND_INQUIRE_INSTALLED_DEVICES_ID_8_TO_15 = 0x23,
BUSLOGICCOMMAND_INQUIRE_TARGET_DEVICES = 0x24,
BUSLOGICCOMMAND_DISABLE_HOST_ADAPTER_INTERRUPT = 0x25,
+ BUSLOGICCOMMAND_EXT_BIOS_INFO = 0x28,
+ BUSLOGICCOMMAND_UNLOCK_MAILBOX = 0x29,
BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX = 0x81,
BUSLOGICCOMMAND_EXECUTE_SCSI_COMMAND = 0x83,
BUSLOGICCOMMAND_INQUIRE_FIRMWARE_VERSION_3RD_LETTER = 0x84,
@@ -774,17 +778,6 @@ typedef struct BUSLOGICTASKSTATE
#ifndef VBOX_DEVICE_STRUCT_TESTCASE
-RT_C_DECLS_BEGIN
-PDMBOTHCBDECL(int) buslogicIOPortWrite (PPDMDEVINS pDevIns, void *pvUser,
- RTIOPORT Port, uint32_t u32, unsigned cb);
-PDMBOTHCBDECL(int) buslogicIOPortRead (PPDMDEVINS pDevIns, void *pvUser,
- RTIOPORT Port, uint32_t *pu32, unsigned cb);
-PDMBOTHCBDECL(int) buslogicMMIOWrite(PPDMDEVINS pDevIns, void *pvUser,
- RTGCPHYS GCPhysAddr, void *pv, unsigned cb);
-PDMBOTHCBDECL(int) buslogicMMIORead(PPDMDEVINS pDevIns, void *pvUser,
- RTGCPHYS GCPhysAddr, void *pv, unsigned cb);
-RT_C_DECLS_END
-
#define PDMIBASE_2_PBUSLOGICDEVICE(pInterface) ( (PBUSLOGICDEVICE)((uintptr_t)(pInterface) - RT_OFFSETOF(BUSLOGICDEVICE, IBase)) )
#define PDMISCSIPORT_2_PBUSLOGICDEVICE(pInterface) ( (PBUSLOGICDEVICE)((uintptr_t)(pInterface) - RT_OFFSETOF(BUSLOGICDEVICE, ISCSIPort)) )
#define PDMILEDPORTS_2_PBUSLOGICDEVICE(pInterface) ( (PBUSLOGICDEVICE)((uintptr_t)(pInterface) - RT_OFFSETOF(BUSLOGICDEVICE, ILed)) )
@@ -1530,6 +1523,15 @@ static int buslogicProcessCommand(PBUSLOGIC pBusLogic)
Log(("Bus-off time: %d\n", pBusLogic->aCommandBuffer[0]));
break;
}
+ case BUSLOGICCOMMAND_EXT_BIOS_INFO:
+ case BUSLOGICCOMMAND_UNLOCK_MAILBOX:
+ /* Commands valid for Adaptec 154xC which we don't handle since
+ * we pretend being 154xB compatible. Just mark the command as invalid.
+ */
+ Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode));
+ pBusLogic->cbReplyParametersLeft = 0;
+ pBusLogic->regStatus |= BUSLOGIC_REGISTER_STATUS_COMMAND_INVALID;
+ break;
case BUSLOGICCOMMAND_EXECUTE_MAILBOX_COMMAND: /* Should be handled already. */
default:
AssertMsgFailed(("Invalid command %#x\n", pBusLogic->uOperationCode));
@@ -1682,8 +1684,8 @@ static int buslogicRegisterWrite(PBUSLOGIC pBusLogic, unsigned iRegister, uint8_
pBusLogic->uOperationCode = uVal;
pBusLogic->iParameter = 0;
- /* Mark host adapter as busy. */
- pBusLogic->regStatus &= ~BUSLOGIC_REGISTER_STATUS_HOST_ADAPTER_READY;
+ /* Mark host adapter as busy and clear the invalid status bit. */
+ pBusLogic->regStatus &= ~(BUSLOGIC_REGISTER_STATUS_HOST_ADAPTER_READY | BUSLOGIC_REGISTER_STATUS_COMMAND_INVALID);
/* Get the number of bytes for parameters from the command code. */
switch (pBusLogic->uOperationCode)
@@ -1715,6 +1717,11 @@ static int buslogicRegisterWrite(PBUSLOGIC pBusLogic, unsigned iRegister, uint8_
case BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX:
pBusLogic->cbCommandParametersLeft = sizeof(RequestInitializeExtendedMailbox);
break;
+ case BUSLOGICCOMMAND_EXT_BIOS_INFO:
+ case BUSLOGICCOMMAND_UNLOCK_MAILBOX:
+ /* Invalid commands. */
+ pBusLogic->cbCommandParametersLeft = 0;
+ break;
case BUSLOGICCOMMAND_EXECUTE_MAILBOX_COMMAND: /* Should not come here anymore. */
default:
AssertMsgFailed(("Invalid operation code %#x\n", uVal));
@@ -1780,7 +1787,7 @@ PDMBOTHCBDECL(int) buslogicMMIORead(PPDMDEVINS pDevIns, void *pvUser,
* @param cb Number of bytes to write.
*/
PDMBOTHCBDECL(int) buslogicMMIOWrite(PPDMDEVINS pDevIns, void *pvUser,
- RTGCPHYS GCPhysAddr, void *pv, unsigned cb)
+ RTGCPHYS GCPhysAddr, void const *pv, unsigned cb)
{
/* the linux driver does not make use of the MMIO area. */
AssertMsgFailed(("MMIO Write\n"));
@@ -3117,7 +3124,7 @@ static DECLCALLBACK(int) buslogicConstruct(PPDMDEVINS pDevIns, int iInstance, PC
pThis->pNotifierQueueR0 = PDMQueueR0Ptr(pThis->pNotifierQueueR3);
pThis->pNotifierQueueRC = PDMQueueRCPtr(pThis->pNotifierQueueR3);
- rc = PDMDevHlpCritSectInit(pDevIns, &pThis->CritSectIntr, RT_SRC_POS, "BusLogic-Intr");
+ rc = PDMDevHlpCritSectInit(pDevIns, &pThis->CritSectIntr, RT_SRC_POS, "BusLogic-Intr#%u", pDevIns->iInstance);
if (RT_FAILURE(rc))
return PDMDEV_SET_ERROR(pDevIns, rc,
N_("BusLogic: cannot create critical section"));