Changeset 80589 in vbox
- Timestamp:
- Sep 4, 2019 6:20:28 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 16 edited
-
include/VBox/vmm/pdmstorageifs.h (modified) (2 diffs)
-
include/VBox/vscsi.h (modified) (2 diffs)
-
src/VBox/Devices/Samples/DrvStorageFilter.cpp (modified) (1 diff)
-
src/VBox/Devices/Storage/DevAHCI.cpp (modified) (1 diff)
-
src/VBox/Devices/Storage/DevBusLogic.cpp (modified) (2 diffs)
-
src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp (modified) (2 diffs)
-
src/VBox/Devices/Storage/DevVirtioSCSI.cpp (modified) (1 diff)
-
src/VBox/Devices/Storage/DrvHostDVD.cpp (modified) (2 diffs)
-
src/VBox/Devices/Storage/DrvSCSI.cpp (modified) (6 diffs)
-
src/VBox/Devices/Storage/DrvVD.cpp (modified) (1 diff)
-
src/VBox/Devices/Storage/UsbMsd.cpp (modified) (1 diff)
-
src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp (modified) (6 diffs)
-
src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h (modified) (2 diffs)
-
src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp (modified) (19 diffs)
-
src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp (modified) (13 diffs)
-
src/VBox/Devices/Storage/VSCSI/VSCSISense.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/pdmstorageifs.h
r76585 r80589 950 950 * @param cbCdb Size of the CDB in bytes. 951 951 * @param enmTxDir Direction of transfer. 952 * @param penmTxDir Where to store the transfer direction as parsed from the CDB, optional. 952 953 * @param cbBuf Size of the transfer buffer. 953 954 * @param pabSense Where to store the optional sense key. 954 955 * @param cbSense Size of the sense key buffer. 956 * @param pcbSense Where to store the amount of sense data written, optional. 955 957 * @param pu8ScsiSts Where to store the SCSI status on success. 956 958 * @param cTimeoutMillies Command timeout in milliseconds. 957 959 * @thread Any thread. 958 960 */ 959 DECLR3CALLBACKMEMBER(int, pfnIoReqSendScsiCmd,(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun, 960 const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir, 961 size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts, 962 uint32_t cTimeoutMillies)); 961 DECLR3CALLBACKMEMBER(int, pfnIoReqSendScsiCmd,(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, 962 uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb, 963 PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet, 964 size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet, 965 uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies)); 963 966 964 967 /** … … 1036 1039 } PDMIMEDIAEX; 1037 1040 /** PDMIMEDIAEX interface ID. */ 1038 #define PDMIMEDIAEX_IID " 1f82b709-a9f7-4928-ad50-e879c9bbeba1"1041 #define PDMIMEDIAEX_IID "29c9e82b-934e-45c5-bb84-0d871c3cc9dd" 1039 1042 1040 1043 /** @} */ -
trunk/include/VBox/vscsi.h
r76585 r80589 87 87 88 88 /** 89 * Virtual SCSI transfer direction as seen from the initiator. 90 */ 91 typedef enum VSCSIXFERDIR 92 { 93 /** Invalid data direction. */ 94 PVSCSIXFERDIR_INVALID = 0, 95 /** Direction is unknown. */ 96 VSCSIXFERDIR_UNKNOWN, 97 /** Direction is from target to initiator (aka a read). */ 98 VSCSIXFERDIR_T2I, 99 /** Direction is from initiator to device (aka a write). */ 100 VSCSIXFERDIR_I2T, 101 /** No data transfer associated with this request. */ 102 VSCSIXFERDIR_NONE, 103 /** 32bit hack. */ 104 VSCSIXFERDIR_32BIT_HACK = 0x7fffffff 105 } VSCSIXFERDIR; 106 107 /** 89 108 * LUN types we support 90 109 */ … … 277 296 bool fRedoPossible, 278 297 int rcReq, 279 size_t cbXfer); 298 size_t cbXfer, 299 VSCSIXFERDIR enmXferDir, 300 size_t cbSense); 280 301 /** Pointer to a virtual SCSI request completed callback. */ 281 302 typedef FNVSCSIREQCOMPLETED *PFNVSCSIREQCOMPLETED; -
trunk/src/VBox/Devices/Samples/DrvStorageFilter.cpp
r76553 r80589 337 337 338 338 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqSendScsiCmd} */ 339 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun, 340 const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir, 341 size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts, 342 uint32_t cTimeoutMillies) 339 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, 340 uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb, 341 PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet, 342 size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet, 343 uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies) 343 344 { 344 345 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 345 346 return pThis->pIMediaExBelow->pfnIoReqSendScsiCmd(pThis->pIMediaExBelow, hIoReq, uLun, pbCdb, cbCdb, 346 enmTxDir, cbBuf, pabSense, cbSense, pu8ScsiSts,347 cTimeoutMillies);347 enmTxDir, penmTxDirRet, cbBuf, pabSense, cbSense, pcbSenseRet, 348 pu8ScsiSts, cTimeoutMillies); 348 349 } 349 350 -
trunk/src/VBox/Devices/Storage/DevAHCI.cpp
r80531 r80589 4501 4501 rc = pAhciPort->pDrvMediaEx->pfnIoReqSendScsiCmd(pAhciPort->pDrvMediaEx, pAhciReq->hIoReq, 4502 4502 0, &pAhciReq->aATAPICmd[0], ATAPI_PACKET_SIZE, 4503 PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, cbBuf,4504 &pAhciPort->abATAPISense[0], sizeof(pAhciPort->abATAPISense), 4503 PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, NULL, cbBuf, 4504 &pAhciPort->abATAPISense[0], sizeof(pAhciPort->abATAPISense), NULL, 4505 4505 &pAhciReq->u8ScsiSts, 30 * RT_MS_1SEC); 4506 4506 } -
trunk/src/VBox/Devices/Storage/DevBusLogic.cpp
r80531 r80589 2754 2754 2755 2755 rc = pTgtDev->pDrvMediaEx->pfnIoReqSendScsiCmd(pTgtDev->pDrvMediaEx, pReq->hIoReq, uLun, 2756 pbCdb, cbCdb, PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, 2757 cbBuf, NULL, 0, &pReq->u8ScsiSts, 30 * RT_MS_1SEC);2756 pbCdb, cbCdb, PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, NULL, 2757 cbBuf, NULL, 0, NULL, &pReq->u8ScsiSts, 30 * RT_MS_1SEC); 2758 2758 if (rc == VINF_SUCCESS || rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS) 2759 2759 { … … 3282 3282 rc = pTgtDev->pDrvMediaEx->pfnIoReqSendScsiCmd(pTgtDev->pDrvMediaEx, pReq->hIoReq, uLun, 3283 3283 &pReq->CCBGuest.c.abCDB[0], pReq->CCBGuest.c.cbCDB, 3284 enmXferDir, cbBuf, pReq->pbSenseBuffer, cbSense,3284 enmXferDir, NULL, cbBuf, pReq->pbSenseBuffer, cbSense, NULL, 3285 3285 &pReq->u8ScsiSts, 30 * RT_MS_1SEC); 3286 3286 if (rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS) -
trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
r80531 r80589 2275 2275 rc = pTgtDev->pDrvMediaEx->pfnIoReqSendScsiCmd(pTgtDev->pDrvMediaEx, pLsiReq->hIoReq, pLsiReq->GuestRequest.SCSIIO.au8LUN[1], 2276 2276 &pLsiReq->GuestRequest.SCSIIO.au8CDB[0], pLsiReq->GuestRequest.SCSIIO.u8CDBLength, 2277 enmXferDir, pLsiReq->GuestRequest.SCSIIO.u32DataLength,2278 &pLsiReq->abSenseBuffer[0], sizeof(pLsiReq->abSenseBuffer), &pLsiReq->u8ScsiSts,2279 30 * RT_MS_1SEC);2277 enmXferDir, NULL, pLsiReq->GuestRequest.SCSIIO.u32DataLength, 2278 &pLsiReq->abSenseBuffer[0], sizeof(pLsiReq->abSenseBuffer), NULL, 2279 &pLsiReq->u8ScsiSts, 30 * RT_MS_1SEC); 2280 2280 if (rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS) 2281 2281 lsilogicR3ReqComplete(pThis, pLsiReq, rc); … … 3905 3905 3906 3906 rc = pTgtDev->pDrvMediaEx->pfnIoReqSendScsiCmd(pTgtDev->pDrvMediaEx, pReq->hIoReq, uLun, 3907 pbCdb, cbCdb, PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, 3908 cbBuf, NULL, 0, &pReq->u8ScsiSts, 30 * RT_MS_1SEC);3907 pbCdb, cbCdb, PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, NULL, 3908 cbBuf, NULL, 0, NULL, &pReq->u8ScsiSts, 30 * RT_MS_1SEC); 3909 3909 if (rc == VINF_SUCCESS || rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS) 3910 3910 { -
trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
r80577 r80589 1092 1092 rc = pIMediaEx->pfnIoReqSendScsiCmd(pIMediaEx, pReq->hIoReq, uLUN, 1093 1093 pVirtqReq->uCdb, pThis->virtioScsiConfig.uCdbSize, 1094 PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, cbDataIn,1095 pReq->pbSense, pReq->cbSense, 1094 PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, NULL, cbDataIn, 1095 pReq->pbSense, pReq->cbSense, NULL, 1096 1096 &pReq->uStatus, 30 * RT_MS_1SEC); 1097 1097 -
trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp
r76553 r80589 190 190 191 191 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqSendScsiCmd} */ 192 static DECLCALLBACK(int) drvHostDvdIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun, 193 const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir, 194 size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts, 195 uint32_t cTimeoutMillies) 192 static DECLCALLBACK(int) drvHostDvdIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, 193 uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb, 194 PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet, 195 size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet, 196 uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies) 196 197 { 197 198 RT_NOREF3(uLun, cTimeoutMillies, enmTxDir); … … 409 410 && VALID_PTR(pabSense) 410 411 && cbSense > 0) 411 memcpy(pabSense, &pThis->abATAPISense[0], RT_MIN(cbSense, sizeof(pThis->abATAPISense))); 412 { 413 size_t cbSenseCpy = RT_MIN(cbSense, sizeof(pThis->abATAPISense)); 414 415 memcpy(pabSense, &pThis->abATAPISense[0], cbSenseCpy); 416 if (pcbSenseRet) 417 *pcbSenseRet = cbSenseCpy; 418 } 419 420 if (penmTxDirRet) 421 { 422 switch (enmXferDir) 423 { 424 case PDMMEDIATXDIR_NONE: 425 *penmTxDirRet = PDMMEDIAEXIOREQSCSITXDIR_NONE; 426 break; 427 case PDMMEDIATXDIR_FROM_DEVICE: 428 *penmTxDirRet = PDMMEDIAEXIOREQSCSITXDIR_FROM_DEVICE; 429 break; 430 case PDMMEDIATXDIR_TO_DEVICE: 431 *penmTxDirRet = PDMMEDIAEXIOREQSCSITXDIR_TO_DEVICE; 432 break; 433 default: 434 *penmTxDirRet = PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN; 435 } 436 } 412 437 413 438 RTCritSectLeave(&pThis->Core.CritSect); -
trunk/src/VBox/Devices/Storage/DrvSCSI.cpp
r78796 r80589 73 73 /** Where to store the SCSI status code. */ 74 74 uint8_t *pu8ScsiSts; 75 /** Where to store the amount of sense data written, optional. */ 76 size_t *pcbSense; 77 /** Where to store the transfer direction determined by the VSCSI layer, optional. */ 78 PDMMEDIAEXIOREQSCSITXDIR *penmXferDir; 75 79 /** Transfer size determined by the VSCSI layer. */ 76 80 size_t cbXfer; … … 170 174 } 171 175 176 177 /** 178 * Converts the given VSCSI transfer direction enum to the appropriate PDM extended media interface one. 179 * 180 * @returns The PDM extended media interface transfer direction. 181 * @param enmVScsiXferDir The VSCSI transfer direction. 182 */ 183 static PDMMEDIAEXIOREQSCSITXDIR drvscsiVScsiXferDir2PdmMediaExDir(VSCSIXFERDIR enmVScsiXferDir) 184 { 185 switch (enmVScsiXferDir) 186 { 187 case VSCSIXFERDIR_UNKNOWN: return PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN; 188 case VSCSIXFERDIR_T2I: return PDMMEDIAEXIOREQSCSITXDIR_FROM_DEVICE; 189 case VSCSIXFERDIR_I2T: return PDMMEDIAEXIOREQSCSITXDIR_TO_DEVICE; 190 case VSCSIXFERDIR_NONE: return PDMMEDIAEXIOREQSCSITXDIR_NONE; 191 default: return PDMMEDIAEXIOREQSCSITXDIR_INVALID; 192 } 193 194 return PDMMEDIAEXIOREQSCSITXDIR_INVALID; 195 } 196 197 172 198 /* -=-=-=-=- VScsiIoCallbacks -=-=-=-=- */ 173 199 … … 881 907 882 908 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqSendScsiCmd} */ 883 static DECLCALLBACK(int) drvscsiIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun, 884 const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir, 885 size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts, 886 uint32_t cTimeoutMillies) 909 static DECLCALLBACK(int) drvscsiIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, 910 uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb, 911 PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet, 912 size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet, 913 uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies) 887 914 { 888 915 RT_NOREF1(cTimeoutMillies); … … 898 925 Log(("cbBuf=%zu\n", cbBuf)); 899 926 900 pReq->enmXferDir = enmTxDir; 901 pReq->cbBuf = cbBuf; 902 pReq->pu8ScsiSts = pu8ScsiSts; 927 pReq->enmXferDir = enmTxDir; 928 pReq->cbBuf = cbBuf; 929 pReq->pu8ScsiSts = pu8ScsiSts; 930 pReq->pcbSense = pcbSenseRet; 931 pReq->penmXferDir = penmTxDirRet; 903 932 904 933 /* Allocate and sync buffers if a data transfer is indicated. */ … … 989 1018 static DECLCALLBACK(void) drvscsiIoReqVScsiReqCompleted(VSCSIDEVICE hVScsiDevice, void *pVScsiDeviceUser, 990 1019 void *pVScsiReqUser, int rcScsiCode, bool fRedoPossible, 991 int rcReq, size_t cbXfer )1020 int rcReq, size_t cbXfer, VSCSIXFERDIR enmXferDir, size_t cbSense) 992 1021 { 993 1022 RT_NOREF2(hVScsiDevice, fRedoPossible); … … 1019 1048 *pReq->pu8ScsiSts = (uint8_t)rcScsiCode; 1020 1049 pReq->cbXfer = cbXfer; 1050 if (pReq->pcbSense) 1051 *pReq->pcbSense = cbSense; 1052 if (pReq->penmXferDir) 1053 *pReq->penmXferDir = drvscsiVScsiXferDir2PdmMediaExDir(enmXferDir); 1021 1054 int rc = pThis->pDevMediaExPort->pfnIoReqCompleteNotify(pThis->pDevMediaExPort, (PDMMEDIAEXIOREQ)pReq, 1022 1055 &pReq->abAlloc[0], rcReq); -
trunk/src/VBox/Devices/Storage/DrvVD.cpp
r80074 r80589 3631 3631 * @interface_method_impl{PDMIMEDIAEX,pfnIoReqSendScsiCmd} 3632 3632 */ 3633 static DECLCALLBACK(int) drvvdIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun, 3634 const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir, 3635 size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts, 3636 uint32_t cTimeoutMillies) 3633 static DECLCALLBACK(int) drvvdIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, 3634 uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb, 3635 PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet, 3636 size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet, 3637 uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies) 3637 3638 { 3638 3639 RT_NOREF10(pInterface, uLun, pbCdb, cbCdb, enmTxDir, cbBuf, pabSense, cbSense, pu8ScsiSts, cTimeoutMillies); -
trunk/src/VBox/Devices/Storage/UsbMsd.cpp
r76553 r80589 1561 1561 1562 1562 return pThis->Lun0.pIMediaEx->pfnIoReqSendScsiCmd(pThis->Lun0.pIMediaEx, pReq->hIoReq, pReq->Cbw.bCBWLun, 1563 &pReq->Cbw.CBWCB[0], pReq->Cbw.bCBWCBLength, enmTxDir, 1564 pReq->Cbw.dCBWDataTransferLength, NULL, 0, 1563 &pReq->Cbw.CBWCB[0], pReq->Cbw.bCBWCBLength, enmTxDir, NULL, 1564 pReq->Cbw.dCBWDataTransferLength, NULL, 0, NULL, 1565 1565 &pReq->iScsiReqStatus, 20 * RT_MS_1SEC); 1566 1566 } -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp
r80541 r80589 67 67 SCSIINQUIRYDATA ScsiInquiryReply; 68 68 69 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 69 70 vscsiReqSetXferSize(pVScsiReq, RT_MIN(sizeof(SCSIINQUIRYDATA), scsiBE2H_U16(&pVScsiReq->pbCDB[3]))); 70 71 memset(&ScsiInquiryReply, 0, sizeof(ScsiInquiryReply)); … … 86 87 * to return an error. 87 88 */ 89 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 88 90 vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U32(&pVScsiReq->pbCDB[6])); 89 91 if (pVScsiReq->cbXfer < 16) … … 106 108 case SCSI_TEST_UNIT_READY: 107 109 { 110 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE); 108 111 if ( vscsiDeviceLunIsPresent(pVScsiDevice, pVScsiReq->iLun) 109 112 && pVScsiDevice->papVScsiLun[pVScsiReq->iLun]->fReady) … … 115 118 case SCSI_REQUEST_SENSE: 116 119 { 120 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 117 121 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 118 122 … … 183 187 pVScsiDevice->pfnVScsiReqCompleted(pVScsiDevice, pVScsiDevice->pvVScsiDeviceUser, 184 188 pVScsiReq->pvVScsiReqUser, rcScsiCode, fRedoPossible, 185 rcReq, pVScsiReq->cbXfer );189 rcReq, pVScsiReq->cbXfer, pVScsiReq->enmXferDir, pVScsiReq->cbSenseWritten); 186 190 187 191 if (pVScsiReq->pvLun) … … 411 415 pVScsiReq->cbXfer = 0; 412 416 pVScsiReq->pvLun = NULL; 417 pVScsiReq->enmXferDir = VSCSIXFERDIR_UNKNOWN; 418 pVScsiReq->cbSenseWritten = 0; 413 419 RTSgBufInit(&pVScsiReq->SgBuf, paSGList, cSGListEntries); 414 420 -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h
r76565 r80589 126 126 /** Transfer size determined from the CDB. */ 127 127 size_t cbXfer; 128 /** Number of bytes of sense data written. */ 129 size_t cbSenseWritten; 130 /** Transfer direction as indicated by the CDB. */ 131 VSCSIXFERDIR enmXferDir; 128 132 /** Pointer to the opaque data which may be allocated by the LUN 129 133 * the request is for. */ … … 491 495 492 496 /** 497 * Sets the transfer direction for the given request. 498 * 499 * @returns nothing. 500 * @param pVScsiReq The SCSI request. 501 * @param cbXfer The transfer size for the request. 502 */ 503 DECLINLINE(void) vscsiReqSetXferDir(PVSCSIREQINT pVScsiReq, VSCSIXFERDIR enmXferDir) 504 { 505 pVScsiReq->enmXferDir = enmXferDir; 506 } 507 508 /** 493 509 * Wrapper for the set I/O request allocation size I/O callback. 494 510 * -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp
r80541 r80589 1086 1086 case SCSI_TEST_UNIT_READY: 1087 1087 Assert(!pVScsiLunMmc->Core.fReady); /* Only should get here if LUN isn't ready. */ 1088 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE); 1088 1089 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT, 0x00); 1089 1090 break; … … 1093 1094 SCSIINQUIRYDATA ScsiInquiryReply; 1094 1095 1096 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1095 1097 vscsiReqSetXferSize(pVScsiReq, RT_MIN(sizeof(SCSIINQUIRYDATA), scsiBE2H_U16(&pVScsiReq->pbCDB[3]))); 1096 1098 memset(&ScsiInquiryReply, 0, sizeof(ScsiInquiryReply)); … … 1122 1124 uint8_t aReply[8]; 1123 1125 memset(aReply, 0, sizeof(aReply)); 1126 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1124 1127 vscsiReqSetXferSize(pVScsiReq, sizeof(aReply)); 1125 1128 … … 1144 1147 bool fValid = false; 1145 1148 1149 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1146 1150 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 1147 1151 memset(aReply, 0, sizeof(aReply)); … … 1176 1180 { 1177 1181 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]); 1182 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1178 1183 vscsiReqSetXferSize(pVScsiReq, cbMax); 1179 1184 rcReq = vscsiLunMmcModeSense10(pVScsiLunMmc, pVScsiReq, cbMax); … … 1183 1188 { 1184 1189 uint32_t uLba = scsiBE2H_U32(&pVScsiReq->pbCDB[2]); 1190 1191 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE); 1185 1192 if (uLba > pVScsiLunMmc->cSectors) 1186 1193 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, … … 1193 1200 { 1194 1201 /** @todo implement!! */ 1202 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_I2T); 1195 1203 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 1196 1204 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); … … 1394 1402 uint8_t uDataMode = pVScsiReq->pbCDB[1] & 0x1f; 1395 1403 1404 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1396 1405 vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[6])); 1397 1406 … … 1425 1434 { 1426 1435 int rc2 = VINF_SUCCESS; 1436 1437 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE); 1427 1438 switch (pVScsiReq->pbCDB[4] & 3) 1428 1439 { … … 1448 1459 uint8_t uSubPageCode = pVScsiReq->pbCDB[3]; 1449 1460 1461 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1450 1462 vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[7])); 1451 1463 … … 1487 1499 /* Leave the rest 0 */ 1488 1500 1501 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1489 1502 vscsiReqSetXferSize(pVScsiReq, sizeof(aReply)); 1490 1503 RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply)); … … 1515 1528 fMSF = (pVScsiReq->pbCDB[1] >> 1) & 1; 1516 1529 1530 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1517 1531 vscsiReqSetXferSize(pVScsiReq, cbMax); 1518 1532 switch (format) … … 1537 1551 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]); 1538 1552 1553 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1539 1554 vscsiReqSetXferSize(pVScsiReq, cbMax); 1540 1555 if (pVScsiReq->pbCDB[1] & 0x1) … … 1549 1564 uint8_t aReply[8]; 1550 1565 1566 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1551 1567 vscsiReqSetXferSize(pVScsiReq, cbMax); 1552 1568 scsiH2BE_U16(&aReply[0], 0); … … 1566 1582 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]); 1567 1583 1584 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1568 1585 vscsiReqSetXferSize(pVScsiReq, cbMax); 1569 1586 memset(aReply, '\0', sizeof(aReply)); … … 1588 1605 { 1589 1606 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]); 1607 1608 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1590 1609 vscsiReqSetXferSize(pVScsiReq, cbMax); 1591 1610 rcReq = vscsiLunMmcReadTrackInformation(pVScsiLunMmc, pVScsiReq, cbMax); … … 1595 1614 { 1596 1615 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]); 1616 1617 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1597 1618 vscsiReqSetXferSize(pVScsiReq, cbMax); 1598 1619 rcReq = vscsiLunMmcGetConfiguration(pVScsiLunMmc, pVScsiReq, cbMax); … … 1602 1623 { 1603 1624 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[8]); 1625 1626 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 1604 1627 vscsiReqSetXferSize(pVScsiReq, cbMax); 1605 1628 rcReq = vscsiLunMmcReadDvdStructure(pVScsiLunMmc, pVScsiReq, cbMax); … … 1617 1640 __FUNCTION__, uLbaStart, cSectorTransfer)); 1618 1641 1642 vscsiReqSetXferDir(pVScsiReq, enmTxDir == VSCSIIOREQTXDIR_WRITE ? VSCSIXFERDIR_I2T : VSCSIXFERDIR_T2I); 1619 1643 vscsiReqSetXferSize(pVScsiReq, cSectorTransfer * cbSector); 1620 1644 if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunMmc->cSectors)) -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp
r80541 r80589 201 201 case SCSI_INQUIRY: 202 202 { 203 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 203 204 vscsiReqSetXferSize(pVScsiReq, RT_MIN(sizeof(SCSIINQUIRYDATA), scsiBE2H_U16(&pVScsiReq->pbCDB[3]))); 204 205 … … 252 253 memset(aReply, 0, sizeof(aReply)); 253 254 255 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 254 256 vscsiReqSetXferSize(pVScsiReq, sizeof(aReply)); 255 257 … … 274 276 bool fValid = false; 275 277 278 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 276 279 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 277 280 memset(aReply, 0, sizeof(aReply)); … … 312 315 size_t cbList = pVScsiReq->pbCDB[4]; 313 316 317 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_I2T); 314 318 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]); 315 319 … … 405 409 uint8_t uDataMode = pVScsiReq->pbCDB[1] & 0x1f; 406 410 411 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 407 412 vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[6])); 408 413 … … 437 442 case SCSI_START_STOP_UNIT: 438 443 { 444 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE); 439 445 vscsiReqSetXferSize(pVScsiReq, 0); 440 446 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); … … 446 452 uint8_t uSubPageCode = pVScsiReq->pbCDB[3]; 447 453 454 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 448 455 vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[7])); 449 456 … … 486 493 /* Leave the rest 0 */ 487 494 495 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I); 488 496 vscsiReqSetXferSize(pVScsiReq, sizeof(aReply)); 489 497 RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply)); … … 505 513 506 514 /* Copy the header. */ 515 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_I2T); 507 516 vscsiReqSetXferSize(pVScsiReq, cbList); 508 517 cbCopied = RTSgBufCopyToBuf(&pVScsiReq->SgBuf, &abHdr[0], sizeof(abHdr)); … … 570 579 if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunSbc->cSectors)) 571 580 { 581 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE); 572 582 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR, 0x00); 573 583 vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS); … … 576 586 { 577 587 /* A 0 transfer length is not an error. */ 588 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE); 578 589 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 579 590 vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS); … … 587 598 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_DATA_PROTECT, SCSI_ASC_WRITE_PROTECTED, 0x00); 588 599 else 600 { 601 vscsiReqSetXferDir(pVScsiReq, enmTxDir == VSCSIIOREQTXDIR_WRITE ? VSCSIXFERDIR_I2T : VSCSIXFERDIR_T2I); 589 602 rc = vscsiIoReqTransferEnqueue(pVScsiLun, pVScsiReq, enmTxDir, 590 603 uLbaStart * 512, cSectorTransfer * 512); 604 } 591 605 } 592 606 } … … 594 608 { 595 609 /* Enqueue flush */ 610 vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE); 596 611 vscsiReqSetXferSize(pVScsiReq, 0); 597 612 rc = vscsiIoReqFlushEnqueue(pVScsiLun, pVScsiReq); -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSISense.cpp
r76553 r80589 44 44 45 45 if (pVScsiReq->pbSense && pVScsiReq->cbSense) 46 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense)); 46 { 47 pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense); 48 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten); 49 } 47 50 48 51 return SCSI_STATUS_OK; … … 59 62 60 63 if (pVScsiReq->pbSense && pVScsiReq->cbSense) 61 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense)); 64 { 65 pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense); 66 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten); 67 } 62 68 63 69 return SCSI_STATUS_CHECK_CONDITION; … … 75 81 76 82 if (pVScsiReq->pbSense && pVScsiReq->cbSense) 77 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense)); 83 { 84 pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense); 85 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten); 86 } 78 87 79 88 return SCSI_STATUS_CHECK_CONDITION;
Note:
See TracChangeset
for help on using the changeset viewer.

