/** @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
-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
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#ifndef _SCSI_BUS_H_\r
#define _SCSI_BUS_H_\r
\r
-\r
#include <Uefi.h>\r
\r
#include <Protocol/ScsiPassThru.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
-#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 struct _SCSI_TARGET_ID {\r
- union {\r
- UINT32 Scsi;\r
- UINT8 ExtScsi[4]; \r
- } ScsiId;\r
- UINT8 ExtScsiId[12];\r
-}SCSI_TARGET_ID;\r
+typedef union {\r
+ UINT32 Scsi;\r
+ UINT8 ExtScsi[4];\r
+} SCSI_ID;\r
\r
+typedef struct _SCSI_TARGET_ID {\r
+ SCSI_ID ScsiId;\r
+ UINT8 ExtScsiId[12];\r
+} SCSI_TARGET_ID;\r
\r
typedef struct {\r
- VOID *Data1;\r
- VOID *Data2;\r
+ VOID *Data1;\r
+ VOID *Data2;\r
} SCSI_EVENT_DATA;\r
\r
+//\r
+// SCSI Bus Controller device structure\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
+typedef struct _SCSI_BUS_DEVICE {\r
+ UINTN Signature;\r
+ EFI_SCSI_BUS_PROTOCOL BusIdentify;\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
+} SCSI_BUS_DEVICE;\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
+ 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
\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
-\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
- EFI_SCSI_PASS_THRU_PROTOCOL *ScsiInterface;\r
- EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiInterface;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-} SCSI_BUS_DEVICE;\r
-\r
-#define SCSI_BUS_CONTROLLER_DEVICE_FROM_THIS(a) CR (a, SCSI_BUS_DEVICE, BusIdentify, SCSI_BUS_DEVICE_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
EFI_STATUS\r
EFIAPI\r
SCSIBusDriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
);\r
\r
//\r
// EFI Component Name Functions\r
//\r
+\r
/**\r
Retrieves a Unicode string that is the user readable name of the driver.\r
\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
EFI_STATUS\r
EFIAPI\r
ScsiBusComponentNameGetControllerName (\r
- IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE ChildHandle OPTIONAL,\r
- IN CHAR8 *Language,\r
- OUT CHAR16 **ControllerName\r
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_HANDLE ChildHandle OPTIONAL,\r
+ IN CHAR8 *Language,\r
+ OUT CHAR16 **ControllerName\r
);\r
\r
/**\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
ScsiGetDeviceType (\r
- IN EFI_SCSI_IO_PROTOCOL *This,\r
- OUT UINT8 *DeviceType\r
+ IN EFI_SCSI_IO_PROTOCOL *This,\r
+ OUT UINT8 *DeviceType\r
);\r
\r
/**\r
EFI_STATUS\r
EFIAPI\r
ScsiGetDeviceLocation (\r
- IN EFI_SCSI_IO_PROTOCOL *This,\r
- IN OUT UINT8 **Target,\r
- OUT UINT64 *Lun\r
+ IN EFI_SCSI_IO_PROTOCOL *This,\r
+ IN OUT UINT8 **Target,\r
+ OUT UINT64 *Lun\r
);\r
\r
/**\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
EFIAPI\r
ScsiResetBus (\r
- IN EFI_SCSI_IO_PROTOCOL *This\r
+ IN EFI_SCSI_IO_PROTOCOL *This\r
);\r
\r
/**\r
EFI_STATUS\r
EFIAPI\r
ScsiResetDevice (\r
- IN EFI_SCSI_IO_PROTOCOL *This\r
+ IN EFI_SCSI_IO_PROTOCOL *This\r
);\r
\r
/**\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
\r
@param This Protocol instance pointer\r
@param Controller Controller handle\r
- @param TargetId Tartget to be scanned\r
+ @param TargetId Target to be scanned\r
@param Lun The Lun of the SCSI device on the SCSI channel.\r
@param ScsiBusDev The pointer of SCSI_BUS_DEVICE\r
\r
EFI_STATUS\r
EFIAPI\r
ScsiScanCreateDevice (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN SCSI_TARGET_ID *TargetId,\r
- IN UINT64 Lun,\r
- IN OUT SCSI_BUS_DEVICE *ScsiBusDev\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN SCSI_TARGET_ID *TargetId,\r
+ IN UINT64 Lun,\r
+ IN OUT SCSI_BUS_DEVICE *ScsiBusDev\r
);\r
\r
/**\r
**/\r
BOOLEAN\r
DiscoverScsiDevice (\r
- IN OUT SCSI_IO_DEV *ScsiIoDevice\r
+ IN OUT SCSI_IO_DEV *ScsiIoDevice\r
);\r
\r
#endif\r