**/\r
\r
\r
-#include <Uefi.h>\r
-\r
-\r
-#include <Protocol/ScsiPassThru.h>\r
-#include <Protocol/ScsiPassThruExt.h>\r
-#include <Protocol/ScsiIo.h>\r
-#include <Protocol/ComponentName.h>\r
-#include <Protocol/DriverBinding.h>\r
-#include <Protocol/DevicePath.h>\r
-\r
-#include <Library/DebugLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/UefiLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/ScsiLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/DevicePathLib.h>\r
-\r
#include "ScsiBus.h"\r
\r
+\r
EFI_DRIVER_BINDING_PROTOCOL gSCSIBusDriverBinding = {\r
SCSIBusDriverBindingSupported,\r
SCSIBusDriverBindingStart,\r
//\r
EFI_GUID mScsiBusProtocolGuid = EFI_SCSI_BUS_PROTOCOL_GUID;\r
\r
-VOID *WorkingBuffer;\r
+VOID *mWorkingBuffer;\r
+\r
+/**\r
+ Convert EFI_SCSI_IO_SCSI_REQUEST_PACKET packet to EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet.\r
\r
+ @param Packet The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET\r
+ @param CommandPacket The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
ScsiioToPassThruPacket (\r
IN EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet,\r
- IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *CommandPacket\r
+ OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *CommandPacket\r
);\r
\r
+/**\r
+ Convert EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet to EFI_SCSI_IO_SCSI_REQUEST_PACKET packet.\r
+\r
+ @param ScsiPacket The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET\r
+ @param Packet The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET\r
\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PassThruToScsiioPacket (\r
IN EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *ScsiPacket,\r
- IN OUT EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet\r
+ OUT EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet\r
);\r
+\r
+/**\r
+ Notify Function in which convert EFI1.0 PassThru Packet back to UEF2.0\r
+ SCSI IO Packet.\r
+\r
+ @param Event The instance of EFI_EVENT.\r
+ @param Context The parameter passed in.\r
+\r
+**/\r
VOID\r
EFIAPI\r
NotifyFunction (\r
- EFI_EVENT Event,\r
- VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
);\r
\r
/**\r
The user Entry Point for module ScsiBus. The user code starts with this function.\r
\r
- @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
- @param[in] SystemTable A pointer to the EFI System Table.\r
+ @param ImageHandle The firmware allocated handle for the EFI image.\r
+ @param SystemTable A pointer to the EFI System Table.\r
\r
- @retval EFI_SUCCESS The entry point is executed successfully.\r
- @retval other Some error occurs when executing this entry point.\r
+ @retval EFI_SUCCESS The entry point is executed successfully.\r
+ @retval other Some error occurs when executing this entry point.\r
\r
**/\r
EFI_STATUS\r
return Status;\r
}\r
\r
+\r
+/**\r
+ Test to see if this driver supports ControllerHandle.\r
+\r
+ This service is called by the EFI boot service ConnectController(). In order\r
+ to make drivers as small as possible, there are a few calling restrictions for\r
+ this service. ConnectController() must follow these calling restrictions. If\r
+ any other agent wishes to call Supported() it must also follow these calling\r
+ restrictions.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param ControllerHandle Handle of device to test\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
+\r
+ @retval EFI_SUCCESS This driver supports this device\r
+ @retval EFI_ALREADY_STARTED This driver is already running on this device\r
+ @retval other This driver does not support this device\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
SCSIBusDriverBindingSupported (\r
IN EFI_HANDLE Controller,\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Test to see if this driver supports ControllerHandle. Any ControllerHandle\r
- that has ExtScsiPassThruProtocol/ScsiPassThruProtocol installed will be supported.\r
-\r
-Arguments:\r
-\r
- This - Protocol instance pointer.\r
- Controller - Handle of device to test\r
- RemainingDevicePath - Not used\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - This driver supports this device.\r
- EFI_UNSUPPORTED - This driver does not support this device.\r
-\r
---*/\r
-\r
{\r
EFI_STATUS Status;\r
EFI_SCSI_PASS_THRU_PROTOCOL *PassThru;\r
return EFI_SUCCESS;\r
}\r
\r
+\r
+/**\r
+ Start this driver on ControllerHandle.\r
+\r
+ This service is called by the EFI boot service ConnectController(). In order\r
+ to make drivers as small as possible, there are a few calling restrictions for\r
+ this service. ConnectController() must follow these calling restrictions. If\r
+ any other agent wishes to call Start() it must also follow these calling\r
+ restrictions.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param ControllerHandle Handle of device to bind driver to\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
+\r
+ @retval EFI_SUCCESS This driver is added to ControllerHandle\r
+ @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
+ @retval other This driver does not support this device\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
SCSIBusDriverBindingStart (\r
IN EFI_HANDLE Controller,\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
-/*++\r
-\r
-Routine Description:\r
- Starting the SCSI Bus Driver\r
-\r
-Arguments:\r
- This - Protocol instance pointer.\r
- Controller - Handle of device to test\r
- RemainingDevicePath - Not used\r
-\r
-Returns:\r
- EFI_SUCCESS - This driver supports this device.\r
- EFI_UNSUPPORTED - This driver does not support this device.\r
- EFI_DEVICE_ERROR - This driver cannot be started due to device Error\r
-\r
---*/\r
{\r
UINT64 Lun;\r
UINT8 *TargetId;\r
FromFirstTarget = FALSE;\r
ExtScsiSupport = FALSE;\r
PassThruStatus = EFI_SUCCESS;\r
- \r
+ \r
ScsiTargetId = AllocateZeroPool(sizeof(SCSI_TARGET_ID));\r
if (ScsiTargetId == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
//\r
Status = ScsiScanCreateDevice (This, Controller, ScsiTargetId, Lun, ScsiBusDev);\r
}\r
- gBS->FreePool (ScsiTargetId);\r
+ FreePool (ScsiTargetId);\r
return EFI_SUCCESS;\r
\r
ErrorExit:\r
return Status;\r
}\r
\r
+/**\r
+ Stop this driver on ControllerHandle.\r
+\r
+ This service is called by the EFI boot service DisconnectController().\r
+ In order to make drivers as small as possible, there are a few calling\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
+ @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
+ children is zero stop the entire bus driver.\r
+ @param ChildHandleBuffer List of Child Handles to Stop.\r
+\r
+ @retval EFI_SUCCESS This driver is removed ControllerHandle\r
+ @retval other This driver was not removed from this device\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
SCSIBusDriverBindingStop (\r
IN UINTN NumberOfChildren,\r
IN EFI_HANDLE *ChildHandleBuffer\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Stop this driver on ControllerHandle. Support stoping any child handles\r
- created by this driver.\r
-\r
-Arguments:\r
-\r
- This - Protocol instance pointer.\r
- Controller - Handle of device to stop driver on\r
- NumberOfChildren - Number of Children in the ChildHandleBuffer\r
- ChildHandleBuffer - List of handles for the children we need to stop.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS\r
- Others\r
---*/\r
{\r
EFI_STATUS Status;\r
BOOLEAN AllChildrenStopped;\r
return EFI_SUCCESS;\r
}\r
\r
+\r
+/**\r
+ Retrieves the device type information of the SCSI Controller.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param DeviceType A pointer to the device type information retrieved from\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
EFI_STATUS\r
EFIAPI\r
ScsiGetDeviceType (\r
IN EFI_SCSI_IO_PROTOCOL *This,\r
OUT UINT8 *DeviceType\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Retrieves the device type information of the SCSI Controller.\r
- \r
-Arguments:\r
-\r
- This - Protocol instance pointer.\r
- DeviceType - A pointer to the device type information\r
- retrieved from the SCSI Controller. \r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Retrieves the device type information successfully.\r
- EFI_INVALID_PARAMETER - The DeviceType is NULL.\r
- \r
---*/\r
{\r
SCSI_IO_DEV *ScsiIoDevice;\r
\r
return EFI_SUCCESS;\r
}\r
\r
+\r
+/**\r
+ Retrieves the device location in the SCSI channel.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Target A pointer to the Target ID of a SCSI device\r
+ on the SCSI channel.\r
+ @param Lun A pointer to the LUN of the SCSI device on\r
+ the SCSI channel.\r
+\r
+ @retval EFI_SUCCESS Retrieves the device location successfully.\r
+ @retval EFI_INVALID_PARAMETER The Target or Lun is NULL.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
ScsiGetDeviceLocation (\r
IN OUT UINT8 **Target,\r
OUT UINT64 *Lun\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Retrieves the device location in the SCSI channel.\r
- \r
-Arguments:\r
-\r
- This - Protocol instance pointer.\r
- Target - A pointer to the Target Array which represents ID of a SCSI device \r
- on the SCSI channel. \r
- Lun - A pointer to the LUN of the SCSI device on \r
- the SCSI channel.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Retrieves the device location successfully.\r
- EFI_INVALID_PARAMETER - The Target or Lun is NULL.\r
-\r
---*/\r
{\r
SCSI_IO_DEV *ScsiIoDevice;\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Resets the SCSI Bus that the SCSI Controller is attached to.\r
+\r
+ @param This Protocol instance pointer.\r
+\r
+ @retval EFI_SUCCESS The SCSI bus is reset successfully.\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
+ the SCSI bus.\r
+**/\r
EFI_STATUS\r
EFIAPI\r
ScsiResetBus (\r
IN EFI_SCSI_IO_PROTOCOL *This\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Resets the SCSI Bus that the SCSI Controller is attached to.\r
- \r
-Arguments:\r
-\r
- This - Protocol instance pointer.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The SCSI bus is reset successfully.\r
- EFI_DEVICE_ERROR - Errors encountered when resetting the SCSI bus.\r
- EFI_UNSUPPORTED - The bus reset operation is not supported by the\r
- SCSI Host Controller.\r
- EFI_TIMEOUT - A timeout occurred while attempting to reset \r
- the SCSI bus.\r
---*/\r
{\r
SCSI_IO_DEV *ScsiIoDevice;\r
\r
}\r
}\r
\r
+\r
+/**\r
+ Resets the SCSI Controller that the device handle specifies.\r
+\r
+ @param This Protocol instance pointer.\r
+\r
+ @retval EFI_SUCCESS Reset the SCSI controller successfully.\r
+ @retval EFI_DEVICE_ERROR Errors are encountered when resetting the SCSI Controller.\r
+ @retval EFI_UNSUPPORTED The SCSI bus does not support a device reset operation.\r
+ @retval EFI_TIMEOUT A timeout occurred while attempting to reset the\r
+ SCSI Controller.\r
+**/\r
EFI_STATUS\r
EFIAPI\r
ScsiResetDevice (\r
IN EFI_SCSI_IO_PROTOCOL *This\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Resets the SCSI Controller that the device handle specifies.\r
- \r
-Arguments:\r
-\r
- This - Protocol instance pointer.\r
- \r
-Returns:\r
-\r
- EFI_SUCCESS - Reset the SCSI controller successfully.\r
- EFI_DEVICE_ERROR - Errors are encountered when resetting the\r
- SCSI Controller.\r
- EFI_UNSUPPORTED - The SCSI bus does not support a device \r
- reset operation.\r
- EFI_TIMEOUT - A timeout occurred while attempting to \r
- reset the SCSI Controller.\r
---*/\r
{\r
SCSI_IO_DEV *ScsiIoDevice;\r
UINT8 Target[TARGET_MAX_BYTES];\r
}\r
}\r
\r
-EFI_STATUS\r
-EFIAPI\r
-ScsiExecuteSCSICommand (\r
- IN EFI_SCSI_IO_PROTOCOL *This,\r
- IN OUT EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet,\r
- IN EFI_EVENT Event OPTIONAL\r
- )\r
-/*++\r
-\r
-Routine Description:\r
\r
+/**\r
Sends a SCSI Request Packet to the SCSI Controller for execution.\r
- \r
-Arguments:\r
\r
- This - Protocol instance pointer.\r
- Packet - The SCSI request packet to send to the SCSI \r
+ @param This Protocol instance pointer.\r
+ @param CommandPacket The SCSI request packet to send to the SCSI \r
Controller specified by the device handle.\r
- Event - If the SCSI bus where the SCSI device is attached\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
If Event is NULL, then blocking I/O is performed.\r
supported, then non-blocking I/O is performed,\r
and Event will be signaled when the SCSI Request\r
Packet completes.\r
-Returns:\r
-\r
- 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
- 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
- that order for additional status information.\r
- 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
- 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
- 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
- EFI_UNSUPPORTED - The command described by the SCSI Request Packet\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
- available.\r
- EFI_TIMEOUT - A timeout occurred while waiting for the SCSI \r
- Request Packet to execute. See HostAdapterStatus,\r
- TargetStatus, SenseDataLength, and SenseData in \r
- that order for additional status information.\r
---*/\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
+ SenseDataLength, and SenseData in that order\r
+ for additional status information.\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
+ 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
+ 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
+ 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
+ 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
+ Host Controller). The SCSI Request Packet was not\r
+ sent, so no additional status information is \r
+ available.\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
+ that order for additional status information.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ScsiExecuteSCSICommand (\r
+ IN EFI_SCSI_IO_PROTOCOL *This,\r
+ IN OUT EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet,\r
+ IN EFI_EVENT Event OPTIONAL\r
+ )\r
{\r
SCSI_IO_DEV *ScsiIoDevice;\r
EFI_STATUS Status;\r
Status = gBS->AllocatePool (\r
EfiBootServicesData,\r
sizeof(EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET),\r
- (VOID**)&WorkingBuffer\r
+ (VOID**)&mWorkingBuffer\r
);\r
\r
if (EFI_ERROR (Status)) {\r
//\r
// Convert package into EFI1.0, EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET.\r
//\r
- Status = ScsiioToPassThruPacket(Packet, (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET*)WorkingBuffer);\r
+ Status = ScsiioToPassThruPacket(Packet, (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET*)mWorkingBuffer);\r
if (EFI_ERROR(Status)) {\r
- gBS->FreePool(WorkingBuffer);\r
+ FreePool(mWorkingBuffer);\r
return Status;\r
}\r
\r
&PacketEvent\r
);\r
if (EFI_ERROR(Status)) {\r
- gBS->FreePool(WorkingBuffer);\r
+ FreePool(mWorkingBuffer);\r
return Status;\r
}\r
\r
ScsiIoDevice->ScsiPassThru,\r
ScsiIoDevice->Pun.ScsiId.Scsi,\r
ScsiIoDevice->Lun,\r
- WorkingBuffer,\r
+ mWorkingBuffer,\r
PacketEvent\r
);\r
\r
if (EFI_ERROR(Status)) {\r
- gBS->FreePool(WorkingBuffer);\r
+ gBS->FreePool(mWorkingBuffer);\r
gBS->CloseEvent(PacketEvent);\r
return Status;\r
}\r
ScsiIoDevice->ScsiPassThru,\r
ScsiIoDevice->Pun.ScsiId.Scsi,\r
ScsiIoDevice->Lun,\r
- WorkingBuffer,\r
+ mWorkingBuffer,\r
Event\r
);\r
if (EFI_ERROR(Status)) {\r
- gBS->FreePool(WorkingBuffer);\r
+ FreePool(mWorkingBuffer);\r
return Status;\r
}\r
\r
- PassThruToScsiioPacket((EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET*)WorkingBuffer,Packet);\r
+ PassThruToScsiioPacket((EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET*)mWorkingBuffer,Packet);\r
//\r
// After converting EFI1.0 PassThru Packet back to UEFI2.0 SCSI IO Packet,\r
- // free WorkingBuffer.\r
+ // free mWorkingBuffer.\r
//\r
- gBS->FreePool(WorkingBuffer);\r
+ FreePool(mWorkingBuffer);\r
}\r
}\r
return Status;\r
}\r
\r
-EFI_STATUS\r
-EFIAPI\r
-ScsiScanCreateDevice (\r
- EFI_DRIVER_BINDING_PROTOCOL *This,\r
- EFI_HANDLE Controller,\r
- SCSI_TARGET_ID *TargetId,\r
- UINT64 Lun,\r
- SCSI_BUS_DEVICE *ScsiBusDev\r
- )\r
-/*++\r
-\r
-Routine Description:\r
\r
+/**\r
Scan SCSI Bus to discover the device, and attach ScsiIoProtocol to it.\r
\r
-Arguments:\r
+ @param This Protocol instance pointer\r
+ @param Controller Controller handle\r
+ @param TargetId Tartget 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
- This - Protocol instance pointer\r
- Controller - Controller handle\r
- Pun - The Pun of the SCSI device on the SCSI channel.\r
- Lun - The Lun of the SCSI device on the SCSI channel.\r
- ScsiBusDev - The pointer of SCSI_BUS_DEVICE\r
+ @retval EFI_SUCCESS Successfully to discover the device and attach\r
+ ScsiIoProtocol to it.\r
+ @retval EFI_OUT_OF_RESOURCES Fail to discover the device.\r
\r
-Returns:\r
-\r
- EFI_SUCCESS - Successfully to discover the device and attach ScsiIoProtocol to it.\r
- EFI_OUT_OF_RESOURCES - Fail to discover the device.\r
-\r
---*/\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
+ )\r
{\r
EFI_STATUS Status;\r
SCSI_IO_DEV *ScsiIoDevice;\r
EFI_DEVICE_PATH_PROTOCOL *ScsiDevicePath;\r
\r
- Status = gBS->AllocatePool (\r
- EfiBootServicesData,\r
- sizeof (SCSI_IO_DEV),\r
- (VOID **) &ScsiIoDevice\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ ScsiIoDevice = AllocateZeroPool (sizeof (SCSI_IO_DEV));\r
+ if (ScsiIoDevice == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- ZeroMem (ScsiIoDevice, sizeof (SCSI_IO_DEV));\r
-\r
ScsiIoDevice->Signature = SCSI_IO_DEV_SIGNATURE;\r
CopyMem(&ScsiIoDevice->Pun, TargetId, TARGET_MAX_BYTES);\r
ScsiIoDevice->Lun = Lun;\r
\r
\r
if (!DiscoverScsiDevice (ScsiIoDevice)) {\r
- gBS->FreePool (ScsiIoDevice);\r
+ FreePool (ScsiIoDevice);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
&ScsiDevicePath\r
);\r
if (Status == EFI_OUT_OF_RESOURCES) {\r
- gBS->FreePool (ScsiIoDevice);\r
+ FreePool (ScsiIoDevice);\r
return Status;\r
}\r
} else {\r
&ScsiDevicePath\r
);\r
if (Status == EFI_OUT_OF_RESOURCES) {\r
- gBS->FreePool (ScsiIoDevice);\r
+ FreePool (ScsiIoDevice);\r
return Status;\r
}\r
}\r
return EFI_SUCCESS;\r
}\r
\r
-BOOLEAN\r
-EFIAPI\r
-DiscoverScsiDevice (\r
- SCSI_IO_DEV *ScsiIoDevice\r
- )\r
-/*++\r
-\r
-Routine Description:\r
\r
+/**\r
Discovery SCSI Device\r
\r
-Arguments:\r
-\r
- ScsiIoDevice - The pointer of SCSI_IO_DEV\r
-\r
-Returns:\r
+ @param ScsiIoDevice The pointer of SCSI_IO_DEV\r
\r
- TRUE - Find SCSI Device and verify it.\r
- FALSE - Unable to find SCSI Device.\r
+ @retval TRUE Find SCSI Device and verify it.\r
+ @retval FALSE Unable to find SCSI Device.\r
\r
---*/\r
+**/\r
+BOOLEAN\r
+DiscoverScsiDevice (\r
+ IN OUT SCSI_IO_DEV *ScsiIoDevice\r
+ )\r
{\r
EFI_STATUS Status;\r
UINT32 InquiryDataLength;\r
FALSE\r
);\r
if (EFI_ERROR (Status)) {\r
- //\r
- // ParseSenseData (&SenseData,SenseDataLength);\r
- //\r
return FALSE;\r
}\r
//\r
}\r
\r
\r
+/**\r
+ Convert EFI_SCSI_IO_SCSI_REQUEST_PACKET packet to EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet.\r
+\r
+ @param Packet The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET\r
+ @param CommandPacket The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
ScsiioToPassThruPacket (\r
IN EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet,\r
- IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *CommandPacket\r
+ OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *CommandPacket\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Convert EFI_SCSI_IO_SCSI_REQUEST_PACKET packet to\r
- EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet\r
-\r
-Arguments:\r
-\r
- Packet - The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET\r
- CommandPacket - The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET\r
-\r
-Returns:\r
-\r
- NONE\r
-\r
---*/\r
{\r
//\r
//EFI 1.10 doesn't support Bi-Direction Command.\r
}\r
\r
\r
+/**\r
+ Convert EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet to EFI_SCSI_IO_SCSI_REQUEST_PACKET packet.\r
+\r
+ @param ScsiPacket The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET\r
+ @param Packet The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PassThruToScsiioPacket (\r
IN EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *ScsiPacket,\r
- IN OUT EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet\r
+ OUT EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Convert EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet to\r
- EFI_SCSI_IO_SCSI_REQUEST_PACKET packet\r
-\r
-Arguments:\r
-\r
- ScsiPacket - The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET\r
- Packet - The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET\r
-\r
-Returns:\r
-\r
- NONE\r
-\r
---*/\r
{\r
Packet->Timeout = ScsiPacket->Timeout;\r
Packet->Cdb = ScsiPacket->Cdb;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Notify Function in which convert EFI1.0 PassThru Packet back to UEF2.0\r
+ SCSI IO Packet.\r
\r
+ @param Event The instance of EFI_EVENT.\r
+ @param Context The parameter passed in.\r
\r
+**/\r
VOID\r
EFIAPI\r
NotifyFunction (\r
- EFI_EVENT Event,\r
- VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Notify Function in which convert EFI1.0 PassThru Packet back to UEF2.0\r
- SCSI IO Packet.\r
-\r
-Arguments:\r
-\r
- Event - The instance of EFI_EVENT.\r
- Context - The parameter passed in.\r
-\r
-Returns:\r
-\r
- NONE\r
-\r
---*/\r
{\r
EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet;\r
EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *ScsiPacket;\r
\r
PassData = (SCSI_EVENT_DATA*)Context;\r
Packet = (EFI_SCSI_IO_SCSI_REQUEST_PACKET *)PassData->Data1;\r
- ScsiPacket = (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET*)WorkingBuffer;\r
+ ScsiPacket = (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET*)mWorkingBuffer;\r
\r
//\r
// Convert EFI1.0 PassThru packet to UEFI2.0 SCSI IO Packet.\r
\r
//\r
// After converting EFI1.0 PassThru Packet back to UEFI2.0 SCSI IO Packet,\r
- // free WorkingBuffer.\r
+ // free mWorkingBuffer.\r
//\r
- gBS->FreePool(WorkingBuffer);\r
+ gBS->FreePool(mWorkingBuffer);\r
\r
//\r
// Signal Event to tell caller to pick up UEFI2.0 SCSI IO Packet.\r
gBS->CloseEvent(Event);\r
gBS->SignalEvent(CallerEvent);\r
}\r
+\r