/** Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel. This function supports both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the nonblocking I/O functionality is optional. @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. @param[in] Target The Target is an array of size TARGET_MAX_BYTES and it represents the id of the SCSI device to send the SCSI Request Packet. Each transport driver may chose to utilize a subset of this size to suit the needs of transport target representation. For example, a Fibre Channel driver may use only 8 bytes (WWN) to represent an FC target. @param[in] Lun The LUN of the SCSI device to send the SCSI Request Packet. @param[in, out] Packet A pointer to the SCSI Request Packet to send to the SCSI device specified by Target and Lun. @param[in] Event If nonblocking I/O is not supported then Event is ignored, and blocking I/O is performed. If Event is NULL, then blocking I/O is performed. If Event is not NULL and non blocking I/O is supported, then nonblocking I/O is performed, and Event will be signaled when the SCSI Request Packet completes. @retval EFI_SUCCESS The SCSI Request Packet was sent by the host. For bi-directional commands, InTransferLength bytes were transferred from InDataBuffer. For write and bi-directional commands, OutTransferLength bytes were transferred by OutDataBuffer. @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not executed. The number of bytes that could be transferred is returned in InTransferLength. For write and bi-directional commands, OutTransferLength bytes were transferred by OutDataBuffer. Currently not implemeted. @retval EFI_NOT_READY The SCSI Request Packet could not be sent because there are too many SCSI Request Packets already queued. The caller may retry again later. @retval EFI_DEVICE_ERROR A device error occurred while attempting to send the SCSI Request Packet. @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket are invalid. @retval EFI_UNSUPPORTED The command described by the SCSI Request Packet is not supported by the host adapter. This includes the case of Bi-directional SCSI commands not supported by the implementation. The SCSI Request Packet was not sent, so no additional status information is available. Currently not implemeted. @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI Request Packet to execute. **/ EFI_STATUS EFIAPI IScsiExtScsiPassThruFunction ( IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, IN UINT8 *Target, IN UINT64 Lun, IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, IN EFI_EVENT Event OPTIONAL ) { ISCSI_DRIVER_DATA *Private; ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; EFI_STATUS Status; Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); ConfigNvData = &Private->Session.ConfigData.NvData; if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0)) { return EFI_INVALID_PARAMETER; } if ((Packet == NULL) || (Packet->Cdb == NULL)) { return EFI_INVALID_PARAMETER; } Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) { // // Try to reinstate the session and re-execute the Scsi command. // if (EFI_ERROR (IScsiSessionReinstatement (Private))) { return EFI_DEVICE_ERROR; } Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); } return Status; }
/** Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel. This function supports both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the nonblocking I/O functionality is optional. @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. @param[in] Target The Target is an array of size TARGET_MAX_BYTES and it represents the id of the SCSI device to send the SCSI Request Packet. Each transport driver may choose to utilize a subset of this size to suit the needs of transport target representation. For example, a Fibre Channel driver may use only 8 bytes (WWN) to represent an FC target. @param[in] Lun The LUN of the SCSI device to send the SCSI Request Packet. @param[in, out] Packet A pointer to the SCSI Request Packet to send to the SCSI device specified by Target and Lun. @param[in] Event If nonblocking I/O is not supported then Event is ignored, and blocking I/O is performed. If Event is NULL, then blocking I/O is performed. If Event is not NULL and non blocking I/O is supported, then nonblocking I/O is performed, and Event will be signaled when the SCSI Request Packet completes. @retval EFI_SUCCESS The SCSI Request Packet was sent by the host. For bi-directional commands, InTransferLength bytes were transferred from InDataBuffer. For write and bi-directional commands, OutTransferLength bytes were transferred by OutDataBuffer. @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not executed. The number of bytes that could be transferred is returned in InTransferLength. For write and bi-directional commands, OutTransferLength bytes were transferred by OutDataBuffer. @retval EFI_NOT_READY The SCSI Request Packet could not be sent because there are too many SCSI Request Packets already queued. The caller may retry later. @retval EFI_DEVICE_ERROR A device error occurred while attempting to send the SCSI Request Packet. @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket, are invalid. @retval EFI_UNSUPPORTED The command described by the SCSI Request Packet is not supported by the host adapter. This includes the case of Bi-directional SCSI commands not supported by the implementation. The SCSI Request Packet was not sent, so no additional status information is available. @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI Request Packet to execute. **/ EFI_STATUS EFIAPI IScsiExtScsiPassThruFunction ( IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, IN UINT8 *Target, IN UINT64 Lun, IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, IN EFI_EVENT Event OPTIONAL ) { EFI_STATUS Status; ISCSI_DRIVER_DATA *Private; if (Target[0] != 0) { return EFI_INVALID_PARAMETER; } if ((Packet == NULL) || (Packet->Cdb == NULL)) { return EFI_INVALID_PARAMETER; } Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) { // // Try to reinstate the session and re-execute the Scsi command. // Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); if (EFI_ERROR (IScsiSessionReinstatement (Private->Session))) { return EFI_DEVICE_ERROR; } Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); } return Status; }