DrvSCSIHost.cpp revision ad27e1d5e48ca41245120c331cc88b50464813ce
2N/A * available from http://www.virtualbox.org. This file is free software;
2N/A#if defined(RT_OS_LINUX)
2N/A#include "../Builtins.h"
2N/Atypedef struct DRVSCSIHOST
2N/A char *pszDevicePath;
2N/A#define PDMISCSICONNECTOR_2_DRVSCSIHOST(pInterface) ( (PDRVSCSIHOST)((uintptr_t)pInterface - RT_OFFSETOF(DRVSCSIHOST, ISCSIConnector)) )
2N/Astatic int drvscsihostScatterGatherListCopyFromBuffer(PPDMSCSIREQUEST pRequest, void *pvBuf, size_t cbBuf)
2N/A return VINF_SUCCESS;
2N/ADECLINLINE(void) drvscsiCmdError(PPDMSCSIREQUEST pRequest, uint8_t uSCSISenseKey, uint8_t uSCSIASC)
2N/A case SCSI_INQUIRY:
2N/A case SCSI_REPORT_LUNS:
2N/A case SCSI_MODE_SENSE_6:
2N/A case SCSI_READ_TOC_PMA_ATIP:
2N/A case SCSI_READ_CAPACITY:
2N/A case SCSI_MODE_SENSE_10:
2N/A case SCSI_GET_CONFIGURATION:
2N/A case SCSI_READ_10:
2N/A case SCSI_READ_12:
2N/A case SCSI_READ_BUFFER:
2N/A case SCSI_READ_DVD_STRUCTURE:
2N/A case SCSI_READ_SUBCHANNEL:
2N/A case SCSI_READ_CD:
2N/A case SCSI_READ_CD_MSF:
2N/A return PDMSCSIREQUESTTXDIR_FROM_DEVICE;
2N/A case SCSI_TEST_UNIT_READY:
2N/A case SCSI_START_STOP_UNIT:
2N/A return PDMSCSIREQUESTTXDIR_NONE;
2N/A case SCSI_WRITE_10:
2N/A case SCSI_WRITE_12:
2N/A case SCSI_WRITE_BUFFER:
2N/A return PDMSCSIREQUESTTXDIR_TO_DEVICE;
2N/A case SCSI_INQUIRY:
2N/A ScsiInquiryReply.u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_NOT_CONNECTED_NOT_SUPPORTED;
2N/A drvscsihostScatterGatherListCopyFromBuffer(pRequest, &ScsiInquiryReply, sizeof(SCSIINQUIRYDATA));
2N/A#if defined(RT_OS_LINUX)
2N/A rc = pThis->pDevScsiPort->pfnSCSIRequestCompleted(pThis->pDevScsiPort, pRequest, SCSI_STATUS_OK, false, VINF_SUCCESS);
2N/Astatic int drvscsihostAsyncIOLoopWakeupFunc(void)
2N/A return VWRN_STATE_CHANGED;
2N/A return VINF_SUCCESS;
2N/A AssertMsg(rc == VWRN_STATE_CHANGED, ("Left RTReqProcess and error code is not VWRN_STATE_CHANGED rc=%Rrc\n", rc));
2N/A return VINF_SUCCESS;
2N/A rc = RTReqCall(pThis->pQueueRequests, &pReq, 10000 /* 10 sec. */, (PFNRT)drvscsihostAsyncIOLoopWakeupFunc, 0);
2N/Astatic DECLCALLBACK(int) drvscsihostRequestSend(PPDMISCSICONNECTOR pInterface, PPDMSCSIREQUEST pSCSIRequest)
2N/A rc = RTReqCallEx(pThis->pQueueRequests, &pReq, 0, RTREQFLAGS_NO_WAIT, (PFNRT)drvscsihostProcessRequestOne, 2, pThis, pSCSIRequest);
2N/A return VINF_SUCCESS;
2N/Astatic DECLCALLBACK(int) drvscsihostConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
2N/A AssertMsgReturn(pThis->pDevScsiPort, ("Missing SCSI port interface above\n"), VERR_PDM_MISSING_INTERFACE);
2N/A rc = RTFileOpen(&pThis->DeviceFile, pThis->pszDevicePath, RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
2N/A return VINF_SUCCESS;
2N/A sizeof(DRVSCSIHOST),