/** @file\r
Header file for SCSI Bus Driver.\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php\r
#include <Library/UefiLib.h>\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
-#include <Library/ScsiLib.h>\r
+#include <Library/UefiScsiLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/DevicePathLib.h>\r
+#include <Library/ReportStatusCodeLib.h>\r
\r
#include <IndustryStandard/Scsi.h>\r
-//\r
-// 1000 * 1000 * 10\r
-//\r
-#define ONE_SECOND_TIMER 10000000 \r
\r
-#define SCSI_IO_DEV_SIGNATURE EFI_SIGNATURE_32 ('s', 'c', 'i', 'o')\r
+#define SCSI_IO_DEV_SIGNATURE SIGNATURE_32 ('s', 'c', 'i', 'o')\r
+\r
+typedef union {\r
+ UINT32 Scsi;\r
+ UINT8 ExtScsi[4];\r
+} SCSI_ID;\r
\r
typedef struct _SCSI_TARGET_ID {\r
- union {\r
- UINT32 Scsi;\r
- UINT8 ExtScsi[4]; \r
- } ScsiId;\r
+ SCSI_ID ScsiId;\r
UINT8 ExtScsiId[12];\r
}SCSI_TARGET_ID;\r
\r
VOID *Data2;\r
} SCSI_EVENT_DATA;\r
\r
-\r
-typedef struct {\r
- UINT32 Signature;\r
- EFI_HANDLE Handle;\r
- EFI_SCSI_IO_PROTOCOL ScsiIo;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- BOOLEAN ExtScsiSupport; \r
- EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru;\r
- EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiPassThru;\r
- SCSI_TARGET_ID Pun;\r
- UINT64 Lun;\r
- UINT8 ScsiDeviceType;\r
- UINT8 ScsiVersion;\r
- BOOLEAN RemovableDevice;\r
-} SCSI_IO_DEV;\r
-\r
-#define SCSI_IO_DEV_FROM_THIS(a) CR (a, SCSI_IO_DEV, ScsiIo, SCSI_IO_DEV_SIGNATURE)\r
-\r
//\r
// SCSI Bus Controller device strcuture\r
//\r
-#define EFI_SCSI_BUS_PROTOCOL_GUID \\r
- { \\r
- 0x5261213D, 0x3A3D, 0x441E, {0xB3, 0xAF, 0x21, 0xD3, 0xF7, 0xA4, 0xCA, 0x17} \\r
- }\r
+#define SCSI_BUS_DEVICE_SIGNATURE SIGNATURE_32 ('s', 'c', 's', 'i')\r
+\r
+//\r
+// SCSI Bus Timeout Experience Value\r
+//\r
+#define SCSI_BUS_TIMEOUT EFI_TIMER_PERIOD_SECONDS (3)\r
\r
+//\r
+// The ScsiBusProtocol is just used to locate ScsiBusDev\r
+// structure in the SCSIBusDriverBindingStop(). Then we can\r
+// Close all opened protocols and release this structure.\r
+// ScsiBusProtocol is the private protocol.\r
+// gEfiCallerIdGuid will be used as its protocol guid.\r
+//\r
typedef struct _EFI_SCSI_BUS_PROTOCOL {\r
UINT64 Reserved;\r
} EFI_SCSI_BUS_PROTOCOL;\r
\r
-#define SCSI_BUS_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('s', 'c', 's', 'i')\r
-\r
-\r
typedef struct _SCSI_BUS_DEVICE {\r
UINTN Signature;\r
EFI_SCSI_BUS_PROTOCOL BusIdentify;\r
- BOOLEAN ExtScsiSupport; \r
+ BOOLEAN ExtScsiSupport;\r
EFI_SCSI_PASS_THRU_PROTOCOL *ScsiInterface;\r
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiInterface;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
\r
#define SCSI_BUS_CONTROLLER_DEVICE_FROM_THIS(a) CR (a, SCSI_BUS_DEVICE, BusIdentify, SCSI_BUS_DEVICE_SIGNATURE)\r
\r
+typedef struct {\r
+ UINT32 Signature;\r
+ EFI_HANDLE Handle;\r
+ EFI_SCSI_IO_PROTOCOL ScsiIo;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ BOOLEAN ExtScsiSupport;\r
+ EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru;\r
+ EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiPassThru;\r
+ SCSI_BUS_DEVICE *ScsiBusDeviceData;\r
+ SCSI_TARGET_ID Pun;\r
+ UINT64 Lun;\r
+ UINT8 ScsiDeviceType;\r
+ UINT8 ScsiVersion;\r
+ BOOLEAN RemovableDevice;\r
+} SCSI_IO_DEV;\r
+\r
+#define SCSI_IO_DEV_FROM_THIS(a) CR (a, SCSI_IO_DEV, ScsiIo, SCSI_IO_DEV_SIGNATURE)\r
+\r
//\r
// Global Variables\r
//\r
restrictions for this service. DisconnectController() must follow these\r
calling restrictions. If any other agent wishes to call Stop() it must also\r
follow these calling restrictions.\r
- \r
+\r
@param This Protocol instance pointer.\r
@param ControllerHandle Handle of device to stop driver on\r
@param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
languages specified in SupportedLanguages. The\r
number of languages supported by a driver is up\r
to the driver writer. Language is specified\r
- in RFC 3066 or ISO 639-2 language code format.\r
+ in RFC 4646 or ISO 639-2 language code format.\r
\r
@param DriverName A pointer to the Unicode string to return.\r
This Unicode string is the name of the\r
languages specified in SupportedLanguages. The\r
number of languages supported by a driver is up\r
to the driver writer. Language is specified in\r
- RFC 3066 or ISO 639-2 language code format.\r
+ RFC 4646 or ISO 639-2 language code format.\r
\r
@param ControllerName A pointer to the Unicode string to return.\r
This Unicode string is the name of the\r
driver specified by This was returned in\r
DriverName.\r
\r
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
+ @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.\r
\r
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
EFI_HANDLE.\r
\r
@param This Protocol instance pointer.\r
@param DeviceType A pointer to the device type information retrieved from\r
- the SCSI Controller. \r
+ the SCSI Controller.\r
\r
@retval EFI_SUCCESS Retrieves the device type information successfully.\r
@retval EFI_INVALID_PARAMETER The DeviceType is NULL.\r
- \r
+\r
**/\r
EFI_STATUS\r
EFIAPI\r
@retval EFI_DEVICE_ERROR Errors encountered when resetting the SCSI bus.\r
@retval EFI_UNSUPPORTED The bus reset operation is not supported by the\r
SCSI Host Controller.\r
- @retval EFI_TIMEOUT A timeout occurred while attempting to reset \r
+ @retval EFI_TIMEOUT A timeout occurred while attempting to reset\r
the SCSI bus.\r
**/\r
EFI_STATUS\r
Sends a SCSI Request Packet to the SCSI Controller for execution.\r
\r
@param This Protocol instance pointer.\r
- @param CommandPacket The SCSI request packet to send to the SCSI \r
+ @param CommandPacket The SCSI request packet to send to the SCSI\r
Controller specified by the device handle.\r
@param Event If the SCSI bus where the SCSI device is attached\r
- does not support non-blocking I/O, then Event is \r
- ignored, and blocking I/O is performed. \r
+ does not support non-blocking I/O, then Event is\r
+ ignored, and blocking I/O is performed.\r
If Event is NULL, then blocking I/O is performed.\r
- If Event is not NULL and non-blocking I/O is \r
+ If Event is not NULL and non-blocking I/O is\r
supported, then non-blocking I/O is performed,\r
and Event will be signaled when the SCSI Request\r
Packet completes.\r
\r
- @retval EFI_SUCCESS The SCSI Request Packet was sent by the host \r
- successfully, and TransferLength bytes were \r
- transferred to/from DataBuffer.See \r
- HostAdapterStatus, TargetStatus, \r
+ @retval EFI_SUCCESS The SCSI Request Packet was sent by the host\r
+ successfully, and TransferLength bytes were\r
+ transferred to/from DataBuffer.See\r
+ HostAdapterStatus, TargetStatus,\r
SenseDataLength, and SenseData in that order\r
for additional status information.\r
- @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was executed, \r
+ @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was executed,\r
but the entire DataBuffer could not be transferred.\r
The actual number of bytes transferred is returned\r
- in TransferLength. See HostAdapterStatus, \r
- TargetStatus, SenseDataLength, and SenseData in \r
+ in TransferLength. See HostAdapterStatus,\r
+ TargetStatus, SenseDataLength, and SenseData in\r
that order for additional status information.\r
- @retval EFI_NOT_READY The SCSI Request Packet could not be sent because \r
- there are too many SCSI Command Packets already \r
+ @retval EFI_NOT_READY The SCSI Request Packet could not be sent because\r
+ there are too many SCSI Command Packets already\r
queued.The caller may retry again later.\r
- @retval EFI_DEVICE_ERROR A device error occurred while attempting to send \r
- the SCSI Request Packet. See HostAdapterStatus, \r
- TargetStatus, SenseDataLength, and SenseData in \r
+ @retval EFI_DEVICE_ERROR A device error occurred while attempting to send\r
+ the SCSI Request Packet. See HostAdapterStatus,\r
+ TargetStatus, SenseDataLength, and SenseData in\r
that order for additional status information.\r
- @retval EFI_INVALID_PARAMETER The contents of CommandPacket are invalid. \r
- The SCSI Request Packet was not sent, so no \r
+ @retval EFI_INVALID_PARAMETER The contents of CommandPacket are invalid.\r
+ The SCSI Request Packet was not sent, so no\r
additional status information is available.\r
@retval EFI_UNSUPPORTED The command described by the SCSI Request Packet\r
- is not supported by the SCSI initiator(i.e., SCSI \r
+ is not supported by the SCSI initiator(i.e., SCSI\r
Host Controller). The SCSI Request Packet was not\r
- sent, so no additional status information is \r
+ sent, so no additional status information is\r
available.\r
- @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI \r
+ @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI\r
Request Packet to execute. See HostAdapterStatus,\r
- TargetStatus, SenseDataLength, and SenseData in \r
+ TargetStatus, SenseDataLength, and SenseData in\r
that order for additional status information.\r
**/\r
EFI_STATUS\r