Changeset 28684 in vbox
- Timestamp:
- Apr 24, 2010 2:22:22 PM (15 years ago)
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/BIOS/scsi.c
r28530 r28684 29 29 #define VBOXSCSI_REGISTER_DATA_IN 1 30 30 #define VBOXSCSI_REGISTER_IDENTIFY 2 31 #define VBOXSCSI_REGISTER_RESET 3 31 32 32 33 #define VBOXSCSI_MAX_DEVICES 16 /* Maximum number of devices a SCSI device can have. */ … … 456 457 /* Detected - Enumerate attached devices. */ 457 458 VBOXSCSI_DEBUG("scsi_init: BusLogic SCSI adapter detected\n"); 459 outb(BUSLOGIC_ISA_IO_PORT+VBOXSCSI_REGISTER_RESET, 0); 458 460 scsi_enumerate_attached_devices(BUSLOGIC_ISA_IO_PORT); 459 461 } … … 471 473 /* Detected - Enumerate attached devices. */ 472 474 VBOXSCSI_DEBUG("scsi_init: LsiLogic SCSI adapter detected\n"); 475 outb(LSILOGIC_ISA_IO_PORT+VBOXSCSI_REGISTER_RESET, 0); 473 476 scsi_enumerate_attached_devices(LSILOGIC_ISA_IO_PORT); 474 477 } -
trunk/src/VBox/Devices/Storage/VBoxSCSI.cpp
r28065 r28684 41 41 #include "VBoxSCSI.h" 42 42 43 /** 44 * Initializes the state for the SCSI interface. 45 * 46 * @returns VBox status code. 47 * @param pVBoxSCSI Pointer to the unitialized SCSI state. 48 */ 49 int vboxscsiInitialize(PVBOXSCSI pVBoxSCSI) 43 static void vboxscsiReset(PVBOXSCSI pVBoxSCSI) 50 44 { 51 45 pVBoxSCSI->regIdentify = 0; … … 56 50 pVBoxSCSI->cbBuf = 0; 57 51 pVBoxSCSI->iBuf = 0; 52 if (pVBoxSCSI->pBuf) 53 RTMemFree(pVBoxSCSI->pBuf); 54 58 55 pVBoxSCSI->pBuf = NULL; 59 56 pVBoxSCSI->enmState = VBOXSCSISTATE_NO_COMMAND; 57 58 } 59 60 /** 61 * Initializes the state for the SCSI interface. 62 * 63 * @returns VBox status code. 64 * @param pVBoxSCSI Pointer to the unitialized SCSI state. 65 */ 66 int vboxscsiInitialize(PVBOXSCSI pVBoxSCSI) 67 { 68 pVBoxSCSI->pBuf = NULL; 69 vboxscsiReset(pVBoxSCSI); 60 70 61 71 return VINF_SUCCESS; … … 153 163 else if (pVBoxSCSI->enmState == VBOXSCSISTATE_READ_TXDIR) 154 164 { 155 pVBoxSCSI->enmState = VBOXSCSISTATE_READ_CDB_SIZE; 156 pVBoxSCSI->uTxDir = uVal; 165 if (uVal != VBOXSCSI_TXDIR_FROM_DEVICE && uVal != VBOXSCSI_TXDIR_TO_DEVICE) 166 vboxscsiReset(pVBoxSCSI); 167 else 168 { 169 pVBoxSCSI->enmState = VBOXSCSISTATE_READ_CDB_SIZE; 170 pVBoxSCSI->uTxDir = uVal; 171 } 157 172 } 158 173 else if (pVBoxSCSI->enmState == VBOXSCSISTATE_READ_CDB_SIZE) 159 174 { 160 pVBoxSCSI->enmState = VBOXSCSISTATE_READ_BUFFER_SIZE_LOW; 161 pVBoxSCSI->cbCDB = uVal; 175 if (uVal > VBOXSCSI_CDB_SIZE_MAX) 176 vboxscsiReset(pVBoxSCSI); 177 else 178 { 179 pVBoxSCSI->enmState = VBOXSCSISTATE_READ_BUFFER_SIZE_LOW; 180 pVBoxSCSI->cbCDB = uVal; 181 } 162 182 } 163 183 else if (pVBoxSCSI->enmState == VBOXSCSISTATE_READ_BUFFER_SIZE_LOW) … … 202 222 case 1: 203 223 { 204 AssertMsg(pVBoxSCSI->enmState == VBOXSCSISTATE_COMMAND_READY, ("Invalid state\n")); 205 pVBoxSCSI->pBuf[pVBoxSCSI->iBuf++] = uVal; 206 if (pVBoxSCSI->iBuf == pVBoxSCSI->cbBuf) 207 { 208 rc = VERR_MORE_DATA; 209 ASMAtomicXchgBool(&pVBoxSCSI->fBusy, true); 224 if ( pVBoxSCSI->enmState != VBOXSCSISTATE_COMMAND_READY 225 || pVBoxSCSI->uTxDir != VBOXSCSI_TXDIR_TO_DEVICE) 226 { 227 /* Reset the state */ 228 vboxscsiReset(pVBoxSCSI); 229 } 230 else 231 { 232 pVBoxSCSI->pBuf[pVBoxSCSI->iBuf++] = uVal; 233 if (pVBoxSCSI->iBuf == pVBoxSCSI->cbBuf) 234 { 235 rc = VERR_MORE_DATA; 236 ASMAtomicXchgBool(&pVBoxSCSI->fBusy, true); 237 } 210 238 } 211 239 break; … … 214 242 { 215 243 pVBoxSCSI->regIdentify = uVal; 244 break; 245 } 246 case 3: 247 { 248 /* Reset */ 249 vboxscsiReset(pVBoxSCSI); 216 250 break; 217 251 } -
trunk/src/VBox/Devices/Storage/VBoxSCSI.h
r21321 r28684 44 44 * | 2 | R/W | Detect | 45 45 * +--------+--------+----------+ 46 * | 3 | Write | Reset | 47 * +--------+--------+----------+ 46 48 * 47 49 * The register at port 0 receives the SCSI CDB issued from the driver when writing to it but … … 82 84 #define VBOXSCSI_TXDIR_FROM_DEVICE 0 83 85 #define VBOXSCSI_TXDIR_TO_DEVICE 1 86 87 /** Maximum CDB size the BIOS driver sends. */ 88 #define VBOXSCSI_CDB_SIZE_MAX 10 84 89 85 90 typedef struct VBOXSCSI
Note:
See TracChangeset
for help on using the changeset viewer.