/*++\r
\r
-Copyright (c) 2006, Intel Corporation \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, Intel Corporation\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
\r
Module Name:\r
\r
scsibus.c\r
- \r
-Abstract: \r
- \r
+\r
+Abstract:\r
+\r
\r
Revision History\r
--*/\r
\r
-//\r
-// The package level header files this module uses\r
-//\r
+\r
#include <PiDxe.h>\r
\r
-//\r
-// The protocols, PPI and GUID defintions for this module\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
-// The Library classes this module consumes\r
-//\r
+\r
#include <Library/DebugLib.h>\r
#include <Library/UefiDriverEntryPoint.h>\r
#include <Library/UefiLib.h>\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] ImageHandle The firmware allocated handle for the EFI image.\r
@param[in] SystemTable A pointer to the EFI System Table.\r
- \r
+\r
@retval EFI_SUCCESS The entry point is executed successfully.\r
@retval other Some error occurs when executing this entry point.\r
\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
- \r
+\r
if (Status == EFI_ALREADY_STARTED) {\r
return EFI_SUCCESS;\r
}\r
- \r
+\r
if (EFI_ERROR (Status)) {\r
Status = gBS->OpenProtocol (\r
Controller,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
- \r
+\r
if (Status == EFI_ALREADY_STARTED) {\r
return EFI_SUCCESS;\r
}\r
- \r
+\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
);\r
return EFI_SUCCESS;\r
}\r
- \r
+\r
gBS->CloseProtocol (\r
Controller,\r
&gEfiExtScsiPassThruProtocolGuid,\r
}\r
\r
TargetId = &ScsiTargetId->ScsiId.ExtScsi[0];\r
- \r
+\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiDevicePathProtocolGuid,\r
);\r
gBS->FreePool (ScsiBusDev);\r
return Status;\r
- } \r
+ }\r
DEBUG ((EFI_D_INFO, "Open Scsi Pass Thrugh Protocol\n"));\r
ScsiBusDev->ExtScsiSupport = FALSE;\r
} else {\r
FromFirstTarget = TRUE;\r
} else {\r
if (ScsiBusDev->ExtScsiSupport) {\r
- ScsiBusDev->ExtScsiInterface->GetTargetLun (ScsiBusDev->ExtScsiInterface, RemainingDevicePath, &TargetId, &Lun); \r
+ ScsiBusDev->ExtScsiInterface->GetTargetLun (ScsiBusDev->ExtScsiInterface, RemainingDevicePath, &TargetId, &Lun);\r
} else {\r
ScsiBusDev->ScsiInterface->GetTargetLun (ScsiBusDev->ScsiInterface, RemainingDevicePath, &ScsiTargetId->ScsiId.Scsi, &Lun);\r
}\r
IN EFI_HANDLE *ChildHandleBuffer\r
)\r
/*++\r
- \r
+\r
Routine Description:\r
- \r
+\r
Arguments:\r
- \r
+\r
Returns:\r
- \r
+\r
--*/\r
// TODO: This - add argument and description to function comment\r
// TODO: Controller - add argument and description to function comment\r
Controller,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
- \r
+\r
if (EFI_ERROR (Status)) {\r
return EFI_DEVICE_ERROR;\r
}\r
&mScsiBusProtocolGuid,\r
&ScsiBusDev->BusIdentify\r
);\r
- \r
+\r
//\r
// Close the bus driver\r
//\r
gBS->OpenProtocol (\r
Controller,\r
&gEfiExtScsiPassThruProtocolGuid,\r
- &(EFI_EXT_SCSI_PASS_THRU_PROTOCOL*)ScsiPassThru,\r
+ (VOID **) &(EFI_EXT_SCSI_PASS_THRU_PROTOCOL*)ScsiPassThru,\r
This->DriverBindingHandle,\r
ChildHandleBuffer[Index],\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
gBS->OpenProtocol (\r
Controller,\r
&gEfiScsiPassThruProtocolGuid,\r
- &(EFI_SCSI_PASS_THRU_PROTOCOL*)ScsiPassThru,\r
+ (VOID **) &(EFI_SCSI_PASS_THRU_PROTOCOL*)ScsiPassThru,\r
This->DriverBindingHandle,\r
ChildHandleBuffer[Index],\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
\r
Routine Description:\r
Retrieves the device type information of the SCSI Controller.\r
- \r
+\r
Arguments:\r
This - Protocol instance pointer.\r
DeviceType - A pointer to the device type information\r
- retrieved from the SCSI Controller. \r
+ retrieved from the SCSI Controller.\r
\r
Returns:\r
EFI_SUCCESS - Retrieves the device type information successfully.\r
/*++\r
Routine Description:\r
Retrieves the device location in the SCSI channel.\r
- \r
+\r
Arguments:\r
This - Protocol instance pointer.\r
- Target - A pointer to the Target ID of a SCSI device \r
- on the SCSI channel. \r
- Lun - A pointer to the LUN of the SCSI device on \r
+ Target - A pointer to the Target 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
Routine Description:\r
Resets the SCSI Bus that the SCSI Controller is attached to.\r
- \r
+\r
Arguments:\r
This - Protocol instance pointer.\r
\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
+ EFI_TIMEOUT - A timeout occurred while attempting to reset\r
the SCSI bus.\r
--*/\r
{\r
\r
Routine Description:\r
Resets the SCSI Controller that the device handle specifies.\r
- \r
+\r
Arguments:\r
This - Protocol instance pointer.\r
- \r
+\r
\r
Returns:\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
+ EFI_UNSUPPORTED - The SCSI bus does not support a device\r
reset operation.\r
- EFI_TIMEOUT - A timeout occurred while attempting to \r
+ EFI_TIMEOUT - A timeout occurred while attempting to\r
reset the SCSI Controller.\r
--*/\r
{\r
\r
Routine Description:\r
Sends a SCSI Request Packet to the SCSI Controller for execution.\r
- \r
+\r
Arguments:\r
This - Protocol instance pointer.\r
- Packet - The SCSI request packet to send to the SCSI \r
+ Packet - 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
- 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
Returns:\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
+ 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_WARN_BUFFER_TOO_SMALL - The SCSI Request Packet was executed, \r
+ EFI_WARN_BUFFER_TOO_SMALL - 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
- EFI_NOT_READY - The SCSI Request Packet could not be sent because \r
- there are too many SCSI Command Packets already \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
+ 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
+ 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
+ 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
- EFI_TIMEOUT - A timeout occurred while waiting for the SCSI \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
+ TargetStatus, SenseDataLength, and SenseData in\r
that order for additional status information.\r
--*/\r
{\r
UINT8 Target[TARGET_MAX_BYTES];\r
EFI_EVENT PacketEvent;\r
EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *ExtRequestPacket;\r
- SCSI_EVENT_DATA EventData; \r
+ SCSI_EVENT_DATA EventData;\r
\r
PacketEvent = NULL;\r
- \r
+\r
if (Packet == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
ScsiIoDevice = SCSI_IO_DEV_FROM_THIS (This);\r
CopyMem (Target,&ScsiIoDevice->Pun, TARGET_MAX_BYTES);\r
- \r
+\r
if (ScsiIoDevice->ExtScsiSupport) {\r
ExtRequestPacket = (EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *) Packet;\r
Status = ScsiIoDevice->ExtScsiPassThru->PassThru (\r
}\r
\r
//\r
- // Convert package into EFI1.0, EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET. \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
if (EFI_ERROR(Status)) {\r
- gBS->FreePool(WorkingBuffer); \r
+ gBS->FreePool(WorkingBuffer);\r
return Status;\r
}\r
\r
gBS->FreePool(WorkingBuffer);\r
return Status;\r
}\r
- \r
+\r
Status = ScsiIoDevice->ScsiPassThru->PassThru (\r
ScsiIoDevice->ScsiPassThru,\r
ScsiIoDevice->Pun.ScsiId.Scsi,\r
gBS->CloseEvent(PacketEvent);\r
return Status;\r
}\r
- \r
+\r
} else {\r
//\r
// If there's no event or SCSI Device doesn't support NON-BLOCKING, just convert\r
}\r
\r
EFI_STATUS\r
-EFIAPI \r
+EFIAPI\r
ScsiScanCreateDevice (\r
EFI_DRIVER_BINDING_PROTOCOL *This,\r
EFI_HANDLE Controller,\r
return Status;\r
}\r
}\r
- \r
+\r
ScsiIoDevice->DevicePath = AppendDevicePathNode (\r
ScsiBusDev->DevicePath,\r
ScsiDevicePath\r
gBS->FreePool (ScsiIoDevice);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- \r
+\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&ScsiIoDevice->Handle,\r
&gEfiDevicePathProtocolGuid,\r
}\r
\r
BOOLEAN\r
-EFIAPI \r
+EFIAPI\r
DiscoverScsiDevice (\r
SCSI_IO_DEV *ScsiIoDevice\r
)\r
Returns:\r
\r
TRUE - Find SCSI Device and verify it.\r
- FALSE - Unable to find SCSI Device. \r
+ FALSE - Unable to find SCSI Device.\r
\r
--*/\r
{\r
if (0x1e >= InquiryData.Peripheral_Type >= 0xa) {\r
return FALSE;\r
}\r
- \r
+\r
//\r
// valid device type and peripheral qualifier combination.\r
//\r
\r
Routine Description:\r
\r
- Convert EFI_SCSI_IO_SCSI_REQUEST_PACKET packet to \r
+ Convert EFI_SCSI_IO_SCSI_REQUEST_PACKET packet to\r
EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet\r
- \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
+\r
Returns:\r
\r
NONE\r
if (Packet->DataDirection == EFI_SCSI_IO_DATA_DIRECTION_BIDIRECTIONAL) {\r
return EFI_UNSUPPORTED;\r
}\r
- \r
+\r
ZeroMem (CommandPacket, sizeof (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET));\r
\r
CommandPacket->Timeout = Packet->Timeout;\r
\r
Routine Description:\r
\r
- Convert EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet to \r
+ Convert EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet to\r
EFI_SCSI_IO_SCSI_REQUEST_PACKET packet\r
- \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
+\r
Returns:\r
\r
NONE\r
Packet->OutDataBuffer = ScsiPacket->DataBuffer;\r
Packet->OutTransferLength = ScsiPacket->TransferLength;\r
}\r
- \r
+\r
return EFI_SUCCESS;\r
}\r
\r
\r
Routine Description:\r
\r
- Notify Function in which convert EFI1.0 PassThru Packet back to UEF2.0 \r
+ Notify Function in which convert EFI1.0 PassThru Packet back to UEF2.0\r
SCSI IO Packet.\r
- \r
+\r
Arguments:\r
\r
Event - The instance of EFI_EVENT.\r
Context - The parameter passed in.\r
- \r
+\r
Returns:\r
\r
NONE\r
\r
---*/ \r
+--*/\r
{\r
EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet;\r
EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *ScsiPacket;\r
EFI_EVENT CallerEvent;\r
- SCSI_EVENT_DATA *PassData; \r
+ SCSI_EVENT_DATA *PassData;\r
\r
PassData = (SCSI_EVENT_DATA*)Context;\r
Packet = (EFI_SCSI_IO_SCSI_REQUEST_PACKET *)PassData->Data1;\r
// Convert EFI1.0 PassThru packet to UEFI2.0 SCSI IO Packet.\r
//\r
PassThruToScsiioPacket(ScsiPacket, Packet);\r
- \r
+\r
//\r
// After converting EFI1.0 PassThru Packet back to UEFI2.0 SCSI IO Packet,\r
// free WorkingBuffer.\r