diff options
Diffstat (limited to 'src/VBox/Devices/Storage/VBoxSCSI.h')
| -rw-r--r-- | src/VBox/Devices/Storage/VBoxSCSI.h | 71 |
1 files changed, 42 insertions, 29 deletions
diff --git a/src/VBox/Devices/Storage/VBoxSCSI.h b/src/VBox/Devices/Storage/VBoxSCSI.h index c30749a5..5d055698 100644 --- a/src/VBox/Devices/Storage/VBoxSCSI.h +++ b/src/VBox/Devices/Storage/VBoxSCSI.h @@ -1,12 +1,10 @@ /* $Id: VBoxSCSI.h $ */ /** @file - * - * VBox storage devices: - * Simple SCSI interface for BIOS access + * VBox storage devices - Simple SCSI interface for BIOS access. */ /* - * Copyright (C) 2006-2009 Oracle Corporation + * Copyright (C) 2006-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -17,14 +15,14 @@ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. */ -/** - * This is a simple interface to access SCSI devices from the BIOS - * which is shared between the BusLogic and the LsiLogic - * SCSI host adapters to simplify the BIOS part. +/** @page pg_drv_scsi Simple SCSI interface for BIOS access. + * + * This is a simple interface to access SCSI devices from the BIOS which is + * shared between the BusLogic and the LsiLogic SCSI host adapters to simplify + * the BIOS part. * - * The BusLogic interface if available will be starting at port 0x330 - * and the LsiLogic starts at 0x340 and each will have a size of 3 ports. - * The ports are used as described below: + * The first interface (if available) will be starting at port 0x430 and + * each will occupy 4 ports. The ports are used as described below: * * +--------+--------+----------+ * | Offset | Access | Purpose | @@ -39,22 +37,29 @@ * +--------+--------+----------+ * | 2 | R/W | Detect | * +--------+--------+----------+ + * | 3 | Read | SCSI rc | + * +--------+--------+----------+ * | 3 | Write | Reset | * +--------+--------+----------+ * - * The register at port 0 receives the SCSI CDB issued from the driver when writing to it but - * before writing the actual CDB the first write gives the size of the CDB in bytes. + * The register at port 0 receives the SCSI CDB issued from the driver when + * writing to it but before writing the actual CDB the first write gives the + * size of the CDB in bytes. * - * Reading the port at offset 0 gives status information about the adapter. - * If the busy bit is set the adapter is processing a previous issued request if it is + * Reading the port at offset 0 gives status information about the adapter. If + * the busy bit is set the adapter is processing a previous issued request if it is * cleared the command finished and the adapter can process another request. - * The driver has to poll this bit because the adapter will not assert an IRQ for simplicity reasons. + * The driver has to poll this bit because the adapter will not assert an IRQ + * for simplicity reasons. * - * The register at offset 2 is to detect if a host adapter is available - * If the driver writes a value to this port and gets the same value after reading it + * The register at offset 2 is to detect if a host adapter is available. If the + * driver writes a value to this port and gets the same value after reading it * again the adapter is available. * - * This part has no R0 or GC components. + * Any write to the register at offset 3 causes the interface to be reset. A + * read returns the SCSI status code of the last operation. + * + * This part has no R0 or RC components. */ #ifndef ___Storage_VBoxSCSI_h @@ -65,14 +70,15 @@ *******************************************************************************/ //#define DEBUG #include <VBox/vmm/pdmdev.h> +#include <VBox/scsi.h> typedef enum VBOXSCSISTATE { VBOXSCSISTATE_NO_COMMAND = 0x00, VBOXSCSISTATE_READ_TXDIR = 0x01, - VBOXSCSISTATE_READ_CDB_SIZE = 0x02, - VBOXSCSISTATE_READ_BUFFER_SIZE_LOW = 0x03, - VBOXSCSISTATE_READ_BUFFER_SIZE_HIGH = 0x04, + VBOXSCSISTATE_READ_CDB_SIZE_BUFHI = 0x02, + VBOXSCSISTATE_READ_BUFFER_SIZE_LSB = 0x03, + VBOXSCSISTATE_READ_BUFFER_SIZE_MID = 0x04, VBOXSCSISTATE_READ_COMMAND = 0x05, VBOXSCSISTATE_COMMAND_READY = 0x06 } VBOXSCSISTATE; @@ -94,7 +100,7 @@ typedef struct VBOXSCSI /** The size of the CDB we are issuing. */ uint8_t cbCDB; /** The command to issue. */ - uint8_t aCDB[12]; + uint8_t abCDB[12]; /** Current position in the array. */ uint8_t iCDB; @@ -103,18 +109,24 @@ typedef struct VBOXSCSI #endif /** Pointer to the buffer holding the data. */ - R3PTRTYPE(uint8_t *) pBuf; + R3PTRTYPE(uint8_t *) pbBuf; /** Size of the buffer in bytes. */ uint32_t cbBuf; - /** Current position in the buffer. */ + /** Current position in the buffer (offBuf if you like). */ uint32_t iBuf; + /** The result code of last operation. */ + int32_t rcCompletion; +#if HC_ARCH_BITS == 64 + uint32_t Alignment1; +#endif /** Flag whether a request is pending. */ volatile bool fBusy; /** The state we are in when fetching a command from the BIOS. */ VBOXSCSISTATE enmState; } VBOXSCSI, *PVBOXSCSI; -#define VBOX_SCSI_BUSY RT_BIT(0) +#define VBOX_SCSI_BUSY RT_BIT(0) +#define VBOX_SCSI_ERROR RT_BIT(1) #ifdef IN_RING3 RT_C_DECLS_BEGIN @@ -122,13 +134,14 @@ int vboxscsiInitialize(PVBOXSCSI pVBoxSCSI); int vboxscsiReadRegister(PVBOXSCSI pVBoxSCSI, uint8_t iRegister, uint32_t *pu32Value); int vboxscsiWriteRegister(PVBOXSCSI pVBoxSCSI, uint8_t iRegister, uint8_t uVal); int vboxscsiSetupRequest(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest, uint32_t *puTargetDevice); -int vboxscsiRequestFinished(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest); +int vboxscsiRequestFinished(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest, int rcCompletion); void vboxscsiSetRequestRedo(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest); int vboxscsiWriteString(PPDMDEVINS pDevIns, PVBOXSCSI pVBoxSCSI, uint8_t iRegister, RTGCPTR *pGCPtrSrc, PRTGCUINTREG pcTransfer, unsigned cb); int vboxscsiReadString(PPDMDEVINS pDevIns, PVBOXSCSI pVBoxSCSI, uint8_t iRegister, RTGCPTR *pGCPtrDst, PRTGCUINTREG pcTransfer, unsigned cb); RT_C_DECLS_END -#endif +#endif /* IN_RING3 */ + +#endif /* !___Storage_VBoxSCSI_h */ -#endif /* ___Storage_VBoxSCSI_h */ |
