diff options
Diffstat (limited to 'src/VBox/Devices/Storage/DevBusLogic.cpp')
-rw-r--r-- | src/VBox/Devices/Storage/DevBusLogic.cpp | 41 |
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")); |