4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The implementation of EFI_EXT_SCSI_PASS_THRU_PROTOCOL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "IScsiImpl.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiExtScsiPassThruFunction,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiExtScsiPassThruGetNextTargetLun,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiExtScsiPassThruBuildDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiExtScsiPassThruGetTargetLun,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiExtScsiPassThruResetChannel,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiExtScsiPassThruResetTargetLun,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiExtScsiPassThruGetNextTarget
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function supports both blocking I/O and nonblocking I/O. The blocking I/O
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync functionality is required, and the nonblocking I/O functionality is optional.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Target The Target is an array of size TARGET_MAX_BYTES and it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync represents the id of the SCSI device to send the SCSI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Request Packet. Each transport driver may choose to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync utilize a subset of this size to suit the needs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of transport target representation. For example, a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Fibre Channel driver may use only 8 bytes (WWN)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to represent an FC target.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Lun The LUN of the SCSI device to send the SCSI Request Packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Packet A pointer to the SCSI Request Packet to send to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCSI device specified by Target and Lun.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Event If nonblocking I/O is not supported then Event is ignored,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and blocking I/O is performed. If Event is NULL, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync blocking I/O is performed. If Event is not NULL and non
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync blocking I/O is supported, then nonblocking I/O is performed,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Event will be signaled when the SCSI Request Packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync completes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The SCSI Request Packet was sent by the host. For
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bi-directional commands, InTransferLength bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync were transferred from InDataBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync For write and bi-directional commands, OutTransferLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bytes were transferred by OutDataBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not executed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The number of bytes that could be transferred is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned in InTransferLength. For write and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bi-directional commands, OutTransferLength bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync were transferred by OutDataBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_READY The SCSI Request Packet could not be sent because
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync there are too many SCSI Request Packets already
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync queued. The caller may retry later.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR A device error occurred while attempting to send
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the SCSI Request Packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The command described by the SCSI Request Packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is not supported by the host adapter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This includes the case of Bi-directional SCSI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync commands not supported by the implementation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The SCSI Request Packet was not sent,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync so no additional status information is available.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Request Packet to execute.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiExtScsiPassThruFunction (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Lun,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Target[0] != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Packet == NULL) || (Packet->Cdb == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IScsiExecuteScsiCommand (This, Target, Lun, Packet);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a SCSI channel. These can either be the list SCSI devices that are actually
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync present on the SCSI channel, or the list of legal Target Ids and LUNs for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCSI channel. Regardless, the caller of this function must probe the Target ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and LUN returned to see if a SCSI device is actually present at that location
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync on the SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Target On input, a pointer to the Target ID of a SCSI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device present on the SCSI channel. On output, a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pointer to the Target ID of the next SCSI device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync present on a SCSI channel. An input value of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFFFF retrieves the Target ID of the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCSI device present on a SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Lun On input, a pointer to the LUN of a SCSI device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync present on the SCSI channel. On output, a pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to the LUN of the next SCSI device present on a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Target ID and Lun of the next SCSI device on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the SCSI channel was returned in Target and Lun.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Target is not 0xFFFFFFFF,and Target and Lun were
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not returned on a previous call to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetNextDevice().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiExtScsiPassThruGetNextTargetLun (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT8 **Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT64 *Lun
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_DRIVER_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 TargetId[TARGET_MAX_BYTES];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigNvData = &Private->Session->ConfigData->SessionConfigData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only one <Target, Lun> pair per iSCSI Driver instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Target)[0] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocate and build a device path node for a SCSI device on a SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Target The Target ID of the SCSI device for which a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device path node is to be allocated and built.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Lun The LUN of the SCSI device for which a device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path node is to be allocated and built.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] DevicePath A pointer to a single device path node that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync describes the SCSI device specified by Target and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Lun. This function is responsible for allocating
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the buffer DevicePath with the boot service
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AllocatePool(). It is the caller's
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync responsibility to free DevicePath when the caller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is finished with DevicePath.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The device path node that describes the SCSI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device specified by Target and Lun was allocated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and returned in DevicePath.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The SCSI devices specified by Target and Lun does
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not exist on the SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER DevicePath is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiExtScsiPassThruBuildDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Lun,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_DRIVER_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_SESSION *Session;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEV_PATH *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DevPathNodeLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DevicePath == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Target[0] != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Session = Private->Session;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigNvData = &Session->ConfigData->SessionConfigData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AuthConfig = Session->AuthData.CHAP.AuthConfig;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen (ConfigNvData->TargetName) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = AllocateZeroPool (DevPathNodeLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Node == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->DevPath.Type = MESSAGING_DEVICE_PATH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->DevPath.SubType = MSG_ISCSI_DP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathNodeLength (&Node->DevPath, DevPathNodeLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 0 for TCP, others are reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Iscsi.NetworkProtocol = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Iscsi.LoginOption = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Session->AuthType) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ISCSI_AUTH_TYPE_NONE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Iscsi.LoginOption |= 0x0800;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ISCSI_AUTH_TYPE_CHAP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Bit12: 0=CHAP_BI, 1=CHAP_UNI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Iscsi.LoginOption |= 0x1000;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiStrCpy ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), ConfigNvData->TargetName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Translate a device path node to a Target ID and LUN.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DevicePath A pointer to the device path node that describes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a SCSI device on the SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Target A pointer to the Target ID of a SCSI device on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Lun A pointer to the LUN of a SCSI device on the SCSI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS DevicePath was successfully translated to a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Target ID and LUN, and they were returned in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Target and Lun.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER DevicePath/Target/Lun is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED This driver does not support the device path node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync type in DevicePath.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND A valid translation does not exist from DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to a TargetID and LUN.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiExtScsiPassThruGetTargetLun (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 **Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *Lun
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_DRIVER_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DevicePath->Type != MESSAGING_DEVICE_PATH) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (DevicePath->SubType != MSG_ISCSI_DP) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigNvData = &Private->Session->ConfigData->SessionConfigData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (*Target, TARGET_MAX_BYTES, 0xFF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Target)[0] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + sizeof (ISCSI_DEVICE_PATH)) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Resets a SCSI channel. This operation resets all the SCSI devices connected to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED It is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiExtScsiPassThruResetChannel (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Resets a SCSI device that is connected to a SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Target The Target ID of the SCSI device to reset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Lun The LUN of the SCSI device to reset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED It is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiExtScsiPassThruResetTargetLun (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Lun
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve the list of legal Target IDs for SCSI devices on a SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Target (TARGET_MAX_BYTES) of a SCSI device present on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the SCSI channel. On output, a pointer to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Target ID (an array of TARGET_MAX_BYTES) of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync next SCSI device present on a SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync An input value of 0xF(all bytes in the array are 0xF)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in the Target array retrieves the Target ID of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync first SCSI device present on a SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Target ID of the next SCSI device on the SCSI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync channel was returned in Target.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_TIMEOUT Target array is not all 0xF, and Target was not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned on a previous call to GetNextTarget().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiExtScsiPassThruGetNextTarget (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT8 **Target
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 TargetId[TARGET_MAX_BYTES];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Target)[0] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((*Target)[0] == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync