VSCSIDevice.cpp revision d1baabd8ceb7d1f3ec166741e87d22378df76352
/* $Id$ */
/** @file
* Virtual SCSI driver: Device handling
*/
/*
* Copyright (C) 2006-2010 Sun Microsystems, Inc.
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 USA or visit http://www.sun.com if you need
* additional information or have any questions.
*/
#define LOG_GROUP LOG_GROUP_VSCSI
#include "VSCSIInternal.h"
/**
* Checks if a specific LUN exists fir the SCSI device
*
* @returns true if the LUN is present
* false otherwise
* @param pVScsiDevice The SCSI device instance.
* @param iLun The LUN to check for.
*/
{
}
/**
* Process a request common for all device types.
*
* @returns Flag whether we could handle the request.
* @param pVScsiDevice The virtual SCSI device instance.
* @param pVScsiReq The SCSi request.
* @param prcReq The final return value if the request was handled.
*/
int *prcReq)
{
bool fProcessed = true;
{
case SCSI_INQUIRY:
{
{
ScsiInquiryReply.u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_NOT_CONNECTED_NOT_SUPPORTED;
cbData = vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, (uint8_t *)&ScsiInquiryReply, sizeof(SCSIINQUIRYDATA));
}
else
fProcessed = false; /* Let the LUN process the request because it will provide LUN specific data */
break;
}
case SCSI_REPORT_LUNS:
{
/*
* If allocation length is less than 16 bytes SPC compliant devices have
* to return an error.
*/
*prcReq = vscsiReqSenseErrorSet(pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);
else
{
if (cbData < 16)
*prcReq = vscsiReqSenseErrorSet(pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);
else
}
break;
}
case SCSI_TEST_UNIT_READY:
{
break;
}
default:
fProcessed = false;
}
return fProcessed;
}
/**
* Completesa SCSI request and calls the completion handler.
*
* @returns nothing.
* @param pVScsiDevice The virtual SCSI device.
* @param pVScsiReq The request which completed.
* @param rcReq The status code
* One of the SCSI_STATUS_* #defines.
*/
int rcReq)
{
}
void *pvVScsiDeviceUser)
{
int rc = VINF_SUCCESS;
if (!pVScsiDevice)
return VERR_NO_MEMORY;
pVScsiDevice->cLunsAttached = 0;
pVScsiDevice->cLunsMax = 0;
if (RT_SUCCESS(rc))
{
return VINF_SUCCESS;
}
return rc;
}
{
if (pVScsiDevice->cLunsAttached > 0)
if (pVScsiDevice->papVScsiLun)
return VINF_SUCCESS;;
}
{
int rc = VINF_SUCCESS;
/* Parameter checks */
{
if (pVScsiDevice->papVScsiLun)
{
if (papLunOld)
}
else
rc = VERR_NO_MEMORY;
}
if (RT_SUCCESS(rc))
{
}
return rc;
}
{
/* Parameter checks */
return VINF_SUCCESS;
}
{
/* Parameter checks */
return VINF_SUCCESS;
}
{
int rc = VINF_SUCCESS;
/* Parameter checks */
/* Check if this request can be handled by us */
int rcReq;
if (!fProcessed)
{
/* Pass to the LUN driver */
{
}
else
{
/* LUN not present, report error. */
}
}
else
rcReq);
return rc;
}
{
/* Parameter checks */
if (!pVScsiReq)
return VERR_NO_MEMORY;
*phVScsiReq = pVScsiReq;
return VINF_SUCCESS;
}