Changeset 64654 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Nov 13, 2016 6:00:51 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 111898
- Location:
- trunk/src/VBox/Devices/Storage
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DrvSCSI.cpp
r64441 r64654 73 73 /** Where to store the SCSI status code. */ 74 74 uint8_t *pu8ScsiSts; 75 /** Transfer size determined by the VSCSI layer. */ 76 size_t cbXfer; 75 77 /** Start of the request data for the device above us. */ 76 78 uint8_t abAlloc[1]; … … 786 788 PDRVSCSIREQ pReq = (PDRVSCSIREQ)hIoReq; 787 789 788 *pcbResidual = *pReq->pu8ScsiSts == SCSI_STATUS_OK ? 0 : pReq->cbBuf; /** @todo: Implement properly. */ 790 if (pReq->cbXfer <= pReq->cbBuf) 791 *pcbResidual = pReq->cbBuf - pReq->cbXfer; 792 else 793 *pcbResidual = 0; /* Overflow/Underrun error. */ 789 794 return VINF_SUCCESS; 790 795 } … … 796 801 PDRVSCSIREQ pReq = (PDRVSCSIREQ)hIoReq; 797 802 798 *pcbXfer = pReq->cb Buf; /** @todo: Implement properly. */803 *pcbXfer = pReq->cbXfer; 799 804 return VINF_SUCCESS; 800 805 } … … 950 955 951 956 static DECLCALLBACK(void) drvscsiIoReqVScsiReqCompleted(VSCSIDEVICE hVScsiDevice, void *pVScsiDeviceUser, 952 void *pVScsiReqUser, int rcScsiCode, bool fRedoPossible, int rcReq) 957 void *pVScsiReqUser, int rcScsiCode, bool fRedoPossible, 958 int rcReq, size_t cbXfer) 953 959 { 954 960 RT_NOREF2(hVScsiDevice, fRedoPossible); … … 979 985 980 986 *pReq->pu8ScsiSts = (uint8_t)rcScsiCode; 987 pReq->cbXfer = cbXfer; 981 988 int rc = pThis->pDevMediaExPort->pfnIoReqCompleteNotify(pThis->pDevMediaExPort, (PDMMEDIAEXIOREQ)pReq, 982 989 &pReq->abAlloc[0], rcReq); -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp
r64412 r64654 67 67 SCSIINQUIRYDATA ScsiInquiryReply; 68 68 69 vscsiReqSetXferSize(pVScsiReq, vscsiBE2HU16(&pVScsiReq->pbCDB[3])); 69 70 memset(&ScsiInquiryReply, 0, sizeof(ScsiInquiryReply)); 70 71 ScsiInquiryReply.cbAdditional = 31; … … 85 86 * to return an error. 86 87 */ 87 if (vscsiBE2HU32(&pVScsiReq->pbCDB[6]) < 16) 88 vscsiReqSetXferSize(pVScsiReq, vscsiBE2HU32(&pVScsiReq->pbCDB[6])); 89 if (pVScsiReq->cbXfer < 16) 88 90 *prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00); 89 91 else … … 113 115 case SCSI_REQUEST_SENSE: 114 116 { 117 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 118 115 119 /* Descriptor format sense data is not supported and results in an error. */ 116 120 if ((pVScsiReq->pbCDB[1] & 0x1) != 0) … … 179 183 pVScsiDevice->pfnVScsiReqCompleted(pVScsiDevice, pVScsiDevice->pvVScsiDeviceUser, 180 184 pVScsiReq->pvVScsiReqUser, rcScsiCode, fRedoPossible, 181 rcReq );185 rcReq, pVScsiReq->cbXfer); 182 186 183 187 RTMemCacheFree(pVScsiDevice->hCacheReq, pVScsiReq); … … 391 395 pVScsiReq->cbSense = cbSense; 392 396 pVScsiReq->pvVScsiReqUser = pvVScsiReqUser; 397 pVScsiReq->cbXfer = 0; 393 398 RTSgBufInit(&pVScsiReq->SgBuf, paSGList, cSGListEntries); 394 399 -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h
r64412 r64654 119 119 /** Opaque user data associated with this request */ 120 120 void *pvVScsiReqUser; 121 /** Transfer size determined from the CDB. */ 122 size_t cbXfer; 121 123 } VSCSIREQINT; 122 124 … … 149 151 PCRTSGSEG paSeg; 150 152 } Io; 151 /** Unmap erequest. */153 /** Unmap request. */ 152 154 struct 153 155 { … … 442 444 443 445 /** 446 * Sets the transfer size for the given request. 447 * 448 * @returns nothing. 449 * @param pVScsiReq The SCSI request. 450 * @param cbXfer The transfer size for the request. 451 */ 452 DECLINLINE(void) vscsiReqSetXferSize(PVSCSIREQINT pVScsiReq, size_t cbXfer) 453 { 454 pVScsiReq->cbXfer = cbXfer; 455 } 456 457 /** 444 458 * Wrapper for the set I/O request allocation size I/O callback. 445 459 * -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp
r64412 r64654 887 887 SCSIINQUIRYDATA ScsiInquiryReply; 888 888 889 vscsiReqSetXferSize(pVScsiReq, vscsiBE2HU16(&pVScsiReq->pbCDB[3])); 889 890 memset(&ScsiInquiryReply, 0, sizeof(ScsiInquiryReply)); 890 891 … … 908 909 uint8_t aReply[8]; 909 910 memset(aReply, 0, sizeof(aReply)); 911 vscsiReqSetXferSize(pVScsiReq, sizeof(aReply)); 910 912 911 913 /* … … 929 931 bool fValid = false; 930 932 933 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 931 934 memset(aReply, 0, sizeof(aReply)); 932 935 aReply[0] = 4; /* Reply length 4. */ … … 959 962 case SCSI_MODE_SENSE_10: 960 963 { 961 size_t cbMax = vscsiBE2HU32(&pVScsiReq->pbCDB[7]); 964 size_t cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[7]); 965 vscsiReqSetXferSize(pVScsiReq, cbMax); 962 966 rcReq = vscsiLunMmcModeSense10(pVScsiLunMmc, pVScsiReq, cbMax); 963 967 break; … … 976 980 { 977 981 /** @todo implement!! */ 982 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 978 983 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 979 984 break; … … 1012 1017 { 1013 1018 uint8_t uDataMode = pVScsiReq->pbCDB[1] & 0x1f; 1019 1020 vscsiReqSetXferSize(pVScsiReq, vscsiBE2HU16(&pVScsiReq->pbCDB[6])); 1014 1021 1015 1022 switch (uDataMode) … … 1064 1071 uint8_t uPageCode = pVScsiReq->pbCDB[2] & 0x3f; 1065 1072 uint8_t uSubPageCode = pVScsiReq->pbCDB[3]; 1073 1074 vscsiReqSetXferSize(pVScsiReq, vscsiBE2HU16(&pVScsiReq->pbCDB[7])); 1066 1075 1067 1076 switch (uPageCode) … … 1100 1109 vscsiH2BEU32(&aReply[8], pVScsiLunMmc->cbSector); 1101 1110 /* Leave the rest 0 */ 1111 1112 vscsiReqSetXferSize(pVScsiReq, sizeof(aReply)); 1102 1113 RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply)); 1103 1114 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); … … 1126 1137 cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[7]); 1127 1138 fMSF = (pVScsiReq->pbCDB[1] >> 1) & 1; 1139 1140 vscsiReqSetXferSize(pVScsiReq, cbMax); 1128 1141 switch (format) 1129 1142 { … … 1145 1158 { 1146 1159 /* Only supporting polled mode at the moment. */ 1160 size_t cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[7]); 1161 1162 vscsiReqSetXferSize(pVScsiReq, cbMax); 1147 1163 if (pVScsiReq->pbCDB[1] & 0x1) 1148 {1149 size_t cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[7]);1150 1164 rcReq = vscsiLunMmcGetEventStatusNotification(pVScsiLunMmc, pVScsiReq, cbMax); 1151 }1152 1165 else 1153 1166 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00); … … 1159 1172 uint8_t aReply[8]; 1160 1173 1174 vscsiReqSetXferSize(pVScsiReq, cbMax); 1161 1175 vscsiH2BEU16(&aReply[0], 0); 1162 1176 /* no current LBA */ … … 1175 1189 size_t cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[7]); 1176 1190 1191 vscsiReqSetXferSize(pVScsiReq, cbMax); 1177 1192 memset(aReply, '\0', sizeof(aReply)); 1178 1193 vscsiH2BEU16(&aReply[0], 32); … … 1195 1210 case SCSI_READ_TRACK_INFORMATION: 1196 1211 { 1212 size_t cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[7]); 1213 1214 vscsiReqSetXferSize(pVScsiReq, cbMax); 1197 1215 /* Accept address/number type of 1 only, and only track 1 exists. */ 1198 1216 if ((pVScsiReq->pbCDB[1] & 0x03) != 1 || vscsiBE2HU32(&pVScsiReq->pbCDB[2]) != 1) … … 1201 1219 else 1202 1220 { 1203 size_t cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[7]);1204 1221 uint8_t aReply[36]; 1205 1222 RT_ZERO(aReply); … … 1224 1241 { 1225 1242 size_t cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[7]); 1243 vscsiReqSetXferSize(pVScsiReq, cbMax); 1226 1244 rcReq = vscsiLunMmcGetConfiguration(pVScsiLunMmc, pVScsiReq, cbMax); 1227 1245 break; … … 1230 1248 { 1231 1249 size_t cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[8]); 1250 vscsiReqSetXferSize(pVScsiReq, cbMax); 1232 1251 rcReq = vscsiLunMmcReadDvdStructure(pVScsiLunMmc, pVScsiReq, cbMax); 1233 1252 break; … … 1244 1263 __FUNCTION__, uLbaStart, cSectorTransfer)); 1245 1264 1265 vscsiReqSetXferSize(pVScsiReq, cSectorTransfer * pVScsiLunMmc->cbSector); 1246 1266 if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunMmc->cSectors)) 1247 1267 { -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp
r64412 r64654 203 203 case SCSI_INQUIRY: 204 204 { 205 vscsiReqSetXferSize(pVScsiReq, vscsiBE2HU16(&pVScsiReq->pbCDB[3])); 206 205 207 /* Check for EVPD bit. */ 206 208 if (pVScsiReq->pbCDB[1] & 0x1) … … 244 246 uint8_t aReply[8]; 245 247 memset(aReply, 0, sizeof(aReply)); 248 249 vscsiReqSetXferSize(pVScsiReq, sizeof(aReply)); 246 250 247 251 /* … … 265 269 bool fValid = false; 266 270 271 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 267 272 memset(aReply, 0, sizeof(aReply)); 268 273 aReply[0] = 4; /* Reply length 4. */ … … 302 307 size_t cbList = pVScsiReq->pbCDB[4]; 303 308 309 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 310 304 311 /* Copy the parameters. */ 305 312 cbCopied = RTSgBufCopyToBuf(&pVScsiReq->SgBuf, &abParms[0], sizeof(abParms)); … … 392 399 { 393 400 uint8_t uDataMode = pVScsiReq->pbCDB[1] & 0x1f; 401 402 vscsiReqSetXferSize(pVScsiReq, vscsiBE2HU16(&pVScsiReq->pbCDB[6])); 394 403 395 404 switch (uDataMode) … … 423 432 case SCSI_START_STOP_UNIT: 424 433 { 434 vscsiReqSetXferSize(pVScsiReq, 0); 425 435 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 426 436 break; … … 430 440 uint8_t uPageCode = pVScsiReq->pbCDB[2] & 0x3f; 431 441 uint8_t uSubPageCode = pVScsiReq->pbCDB[3]; 442 443 vscsiReqSetXferSize(pVScsiReq, vscsiBE2HU16(&pVScsiReq->pbCDB[7])); 432 444 433 445 switch (uPageCode) … … 468 480 /* Leave the rest 0 */ 469 481 482 vscsiReqSetXferSize(pVScsiReq, sizeof(aReply)); 470 483 RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply)); 471 484 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); … … 486 499 487 500 /* Copy the header. */ 501 vscsiReqSetXferSize(pVScsiReq, cbList); 488 502 cbCopied = RTSgBufCopyToBuf(&pVScsiReq->SgBuf, &abHdr[0], sizeof(abHdr)); 489 503 … … 546 560 __FUNCTION__, uLbaStart, cSectorTransfer)); 547 561 562 vscsiReqSetXferSize(pVScsiReq, cSectorTransfer * 512); 563 548 564 if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunSbc->cSectors)) 549 565 { … … 569 585 } 570 586 } 571 else if (pVScsiReq->pbCDB[0] == 587 else if (pVScsiReq->pbCDB[0] == SCSI_SYNCHRONIZE_CACHE) 572 588 { 573 589 /* Enqueue flush */ 590 vscsiReqSetXferSize(pVScsiReq, 0); 574 591 rc = vscsiIoReqFlushEnqueue(pVScsiLun, pVScsiReq); 575 592 }
Note:
See TracChangeset
for help on using the changeset viewer.