EFI_TPL OldTpl;\r
\r
FreeUnicodeStringTable (AtaDevice->ControllerNameTable);\r
- FreeAlignedBuffer (AtaDevice->Asb, sizeof (*AtaDevice->Asb));\r
- FreeAlignedBuffer (AtaDevice->IdentifyData, sizeof (*AtaDevice->IdentifyData));\r
+ FreeAlignedBuffer (AtaDevice->Asb, sizeof (EFI_ATA_STATUS_BLOCK));\r
+ FreeAlignedBuffer (AtaDevice->IdentifyData, sizeof (ATA_IDENTIFY_DATA));\r
if (AtaDevice->DevicePath != NULL) {\r
FreePool (AtaDevice->DevicePath);\r
}\r
//\r
// Free the Subtask list.\r
//\r
- for(Entry = (&AtaDevice->AtaTaskList)->ForwardLink; \r
+ for(Entry = AtaDevice->AtaTaskList.ForwardLink; \r
Entry != (&AtaDevice->AtaTaskList);\r
) {\r
DelEntry = Entry;\r
//\r
// Allocate ATA device from the template.\r
//\r
- AtaDevice = AllocateCopyPool (sizeof (gAtaDeviceTemplate), &gAtaDeviceTemplate);\r
+ AtaDevice = AllocateCopyPool (sizeof (ATA_DEVICE), &gAtaDeviceTemplate);\r
if (AtaDevice == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
AtaDevice->DevicePath = DevicePath;\r
AtaDevice->Port = Port;\r
AtaDevice->PortMultiplierPort = PortMultiplierPort;\r
- AtaDevice->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (*AtaDevice->Asb));\r
+ AtaDevice->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (EFI_ATA_STATUS_BLOCK));\r
if (AtaDevice->Asb == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
}\r
- AtaDevice->IdentifyData = AllocateAlignedBuffer (AtaDevice, sizeof (*AtaDevice->IdentifyData));\r
+ AtaDevice->IdentifyData = AllocateAlignedBuffer (AtaDevice, sizeof (ATA_IDENTIFY_DATA));\r
if (AtaDevice->IdentifyData == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
Handle,\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
);\r
- return Status;\r
+ return Status;\r
}\r
}\r
\r
)\r
{\r
//\r
- // Signla event and return directly.\r
+ // Signal event and return directly.\r
//\r
if (Token != NULL && Token->Event != NULL) {\r
Token->TransactionStatus = EFI_SUCCESS;\r
AtaDevice = ATA_DEVICE_FROM_DISK_INFO (This);\r
\r
Status = EFI_BUFFER_TOO_SMALL;\r
- if (*IdentifyDataSize >= sizeof (*AtaDevice->IdentifyData)) {\r
+ if (*IdentifyDataSize >= sizeof (ATA_IDENTIFY_DATA)) {\r
Status = EFI_SUCCESS;\r
- CopyMem (IdentifyData, AtaDevice->IdentifyData, sizeof (*AtaDevice->IdentifyData));\r
+ CopyMem (IdentifyData, AtaDevice->IdentifyData, sizeof (ATA_IDENTIFY_DATA));\r
}\r
- *IdentifyDataSize = sizeof (*AtaDevice->IdentifyData);\r
+ *IdentifyDataSize = sizeof (ATA_IDENTIFY_DATA);\r
\r
return Status;\r
}\r
{\r
EFI_STATUS Status;\r
ATA_DEVICE *Private;\r
+ EFI_TPL OldTpl;\r
\r
DEBUG ((EFI_D_INFO, "EFI Storage Security Protocol - Read"));\r
if ((PayloadBuffer == NULL || PayloadTransferSize == NULL) && PayloadBufferSize != 0) {\r
return EFI_NO_MEDIA;\r
}\r
\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+\r
Status = TrustTransferAtaDevice (\r
Private,\r
PayloadBuffer,\r
PayloadTransferSize\r
);\r
\r
+ gBS->RestoreTPL (OldTpl);\r
return Status;\r
}\r
\r
{\r
EFI_STATUS Status;\r
ATA_DEVICE *Private;\r
+ EFI_TPL OldTpl;\r
\r
DEBUG ((EFI_D_INFO, "EFI Storage Security Protocol - Send"));\r
if ((PayloadBuffer == NULL) && (PayloadBufferSize != 0)) {\r
return EFI_MEDIA_CHANGED;\r
}\r
\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
Status = TrustTransferAtaDevice (\r
Private,\r
PayloadBuffer,\r
NULL\r
);\r
\r
+ gBS->RestoreTPL (OldTpl);\r
return Status;\r
}\r
\r
It transforms the high level identity, read/write, reset command to ATA pass\r
through command and protocol.\r
\r
- NOTE: This file aslo implements the StorageSecurityCommandProtocol(SSP). For input\r
+ NOTE: This file also implements the StorageSecurityCommandProtocol(SSP). For input\r
parameter SecurityProtocolSpecificData, ATA spec has no explicitly definition \r
- for Security Protocol Specific layout. This implementation uses big edian for \r
+ for Security Protocol Specific layout. This implementation uses big endian for \r
Cylinder register.\r
\r
Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
//\r
if (TaskPacket != NULL) {\r
Packet = TaskPacket;\r
- Packet->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (*AtaDevice->Asb));\r
- CopyMem (Packet->Asb, AtaDevice->Asb, sizeof (*AtaDevice->Asb));\r
- Packet->Acb = AllocateCopyPool(sizeof (EFI_ATA_COMMAND_BLOCK), &AtaDevice->Acb);\r
+ Packet->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (EFI_ATA_STATUS_BLOCK));\r
+ CopyMem (Packet->Asb, AtaDevice->Asb, sizeof (EFI_ATA_STATUS_BLOCK));\r
+ Packet->Acb = AllocateCopyPool (sizeof (EFI_ATA_COMMAND_BLOCK), &AtaDevice->Acb);\r
} else {\r
Packet = &AtaDevice->Packet;\r
Packet->Asb = AtaDevice->Asb;\r
//\r
// Prepare for ATA command block.\r
//\r
- Acb = ZeroMem (&AtaDevice->Acb, sizeof (*Acb));\r
+ Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));\r
Acb->AtaCommand = ATA_CMD_IDENTIFY_DRIVE;\r
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort << 4));\r
\r
//\r
// Prepare for ATA pass through packet.\r
//\r
- Packet = ZeroMem (&AtaDevice->Packet, sizeof (*Packet));\r
+ Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));\r
Packet->InDataBuffer = AtaDevice->IdentifyData;\r
- Packet->InTransferLength = sizeof (*AtaDevice->IdentifyData);\r
+ Packet->InTransferLength = sizeof (ATA_IDENTIFY_DATA);\r
Packet->Protocol = EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN;\r
Packet->Length = EFI_ATA_PASS_THRU_LENGTH_BYTES | EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT;\r
Packet->Timeout = ATA_TIMEOUT;\r
//\r
// Prepare for ATA command block.\r
//\r
- Acb = ZeroMem (&AtaDevice->Acb, sizeof (*Acb));\r
+ Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));\r
Acb->AtaCommand = mAtaCommands[AtaDevice->UdmaValid][AtaDevice->Lba48Bit][IsWrite];\r
Acb->AtaSectorNumber = (UINT8) StartLba;\r
Acb->AtaCylinderLow = (UINT8) RShiftU64 (StartLba, 8);\r
// Prepare for ATA pass through packet.\r
//\r
if (TaskPacket != NULL) {\r
- Packet = ZeroMem (TaskPacket, sizeof (*Packet));\r
+ Packet = ZeroMem (TaskPacket, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));\r
} else {\r
- Packet = ZeroMem (&AtaDevice->Packet, sizeof (*Packet));\r
+ Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));\r
}\r
\r
if (IsWrite) {\r
)\r
{\r
if (Task->Packet.Asb != NULL) {\r
- FreeAlignedBuffer (Task->Packet.Asb, sizeof (Task->Packet.Asb));\r
+ FreeAlignedBuffer (Task->Packet.Asb, sizeof (EFI_ATA_STATUS_BLOCK));\r
}\r
if (Task->Packet.Acb != NULL) {\r
FreePool (Task->Packet.Acb);\r
Call back funtion when the event is signaled.\r
\r
@param[in] Event The Event this notify function registered to.\r
- @param[in] Context Pointer to the context data registerd to the\r
+ @param[in] Context Pointer to the context data registered to the\r
Event.\r
\r
**/\r
// should be returned to the caller directly, so here the Task->Token may already\r
// be deleted by the caller and no need to update the status.\r
//\r
- if ((!(*Task->IsError)) && (Task->Packet.Asb->AtaStatus & 0x01) == 0x01) {\r
+ if ((!(*Task->IsError)) && ((Task->Packet.Asb->AtaStatus & 0x01) == 0x01)) {\r
Task->Token->TransactionStatus = EFI_DEVICE_ERROR;\r
}\r
DEBUG ((\r
// Reduce the SubEventCount, till it comes to zero.\r
//\r
(*Task->UnsignalledEventCount) --;\r
- DEBUG ((DEBUG_INFO, "UnsignalledEventCount = %x\n", *Task->UnsignalledEventCount));\r
+ DEBUG ((DEBUG_INFO, "UnsignalledEventCount = %d\n", *Task->UnsignalledEventCount));\r
\r
//\r
// Remove the SubTask from the Task list.\r
RemoveEntryList (&Task->TaskEntry);\r
if ((*Task->UnsignalledEventCount) == 0) {\r
//\r
- // All Sub tasks are done, then signal the upper layyer event.\r
+ // All Sub tasks are done, then signal the upper layer event.\r
// Except there is error during the sub task source allocation.\r
//\r
if (!(*Task->IsError)) {\r
BOOLEAN *IsError;\r
EFI_TPL OldTpl;\r
\r
- SubEvent = NULL;\r
- TempCount = 0;\r
- Status = EFI_SUCCESS;\r
+ TempCount = 0;\r
+ Status = EFI_SUCCESS;\r
+ EventCount = NULL;\r
+ IsError = NULL;\r
+ Index = 0;\r
+ Task = NULL;\r
+ SubEvent = NULL;\r
\r
- EventCount = AllocateZeroPool (sizeof (UINTN));\r
- if (EventCount == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- \r
- IsError = AllocateZeroPool (sizeof (BOOLEAN));\r
- if (IsError == NULL) {\r
- goto EXIT;\r
- }\r
- *IsError = FALSE;\r
-\r
- //\r
- // Initial the return status for Non Blocking.\r
- //\r
- if (Token != NULL && Token->Event != NULL) {\r
- Token->TransactionStatus = EFI_SUCCESS;\r
- }\r
//\r
// Ensure AtaDevice->Lba48Bit is a valid boolean value \r
//\r
MaxTransferBlockNumber = mMaxTransferBlockNumber[AtaDevice->Lba48Bit];\r
BlockSize = AtaDevice->BlockMedia.BlockSize;\r
\r
- TempCount = (NumberOfBlocks + MaxTransferBlockNumber - 1) / MaxTransferBlockNumber;\r
- *EventCount = TempCount;\r
- Index = 0;\r
+ //\r
+ // Initial the return status and shared account for Non Blocking.\r
+ //\r
+ if ((Token != NULL) && (Token->Event != NULL)) {\r
+ Token->TransactionStatus = EFI_SUCCESS;\r
+\r
+ EventCount = AllocateZeroPool (sizeof (UINTN));\r
+ if (EventCount == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ \r
+ IsError = AllocateZeroPool (sizeof (BOOLEAN));\r
+ if (IsError == NULL) {\r
+ FreePool (EventCount);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ *IsError = FALSE;\r
+ \r
+ TempCount = (NumberOfBlocks + MaxTransferBlockNumber - 1) / MaxTransferBlockNumber;\r
+ *EventCount = TempCount;\r
+ }\r
\r
do {\r
if (NumberOfBlocks > MaxTransferBlockNumber) {\r
NumberOfBlocks -= MaxTransferBlockNumber;\r
} else {\r
TransferBlockNumber = NumberOfBlocks;\r
- NumberOfBlocks = 0;\r
+ NumberOfBlocks = 0;\r
}\r
\r
//\r
- // Create sub event for the sub Ata task. Non-Blocking Mode.\r
+ // Create sub event for the sub ata task. Non-blocking mode.\r
//\r
- if (Token != NULL && Token->Event != NULL) {\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
- Task = AllocateZeroPool (sizeof (ATA_BUS_ASYN_TASK));\r
+ if ((Token != NULL) && (Token->Event != NULL)) {\r
+ Task = NULL;\r
+ SubEvent = NULL;\r
+\r
+ Task = AllocateZeroPool (sizeof (ATA_BUS_ASYN_TASK));\r
if (Task == NULL) {\r
- //\r
- // If resource allocation fail, reduce the total sub event counts.\r
- //\r
- *EventCount = (*EventCount) - (TempCount - Index);\r
- *IsError = TRUE;\r
- Token->TransactionStatus = EFI_OUT_OF_RESOURCES;\r
- Status = EFI_OUT_OF_RESOURCES;\r
-\r
- gBS->RestoreTPL (OldTpl);\r
+ Status = EFI_OUT_OF_RESOURCES;\r
goto EXIT;\r
}\r
\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
Task->UnsignalledEventCount = EventCount;\r
Task->Token = Token;\r
Task->IsError = IsError;\r
-\r
InsertTailList (&AtaDevice->AtaTaskList, &Task->TaskEntry);\r
+ gBS->RestoreTPL (OldTpl); \r
\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_SIGNAL,\r
// the original one minus the unassigned subtasks number.\r
//\r
if (EFI_ERROR (Status)) {\r
- *EventCount = (*EventCount) - (TempCount - Index);\r
- *IsError = TRUE;\r
- gBS->RestoreTPL (OldTpl);\r
+ Status = EFI_OUT_OF_RESOURCES;\r
goto EXIT;\r
}\r
- Index++;\r
- gBS->RestoreTPL (OldTpl); \r
\r
DEBUG ((EFI_D_INFO, "NON-BLOCKING SET EVENT START: WRITE = %d\n", IsWrite));\r
Status = TransferAtaDevice (AtaDevice, &Task->Packet, Buffer, StartLba, (UINT32) TransferBlockNumber, IsWrite, SubEvent);\r
TransferBlockNumber,\r
Status\r
));\r
- }else {\r
+ } else {\r
//\r
// Blocking Mode.\r
//\r
goto EXIT;\r
}\r
\r
+ Index++;\r
StartLba += TransferBlockNumber;\r
Buffer += TransferBlockNumber * BlockSize;\r
} while (NumberOfBlocks > 0);\r
\r
EXIT:\r
+ if ((Token != NULL) && (Token->Event != NULL)) {\r
+ //\r
+ // Release resource at non-blocking mode.\r
+ //\r
+ if (EFI_ERROR (Status)) {\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+ Token->TransactionStatus = Status;\r
+ *EventCount = (*EventCount) - (TempCount - Index);\r
+ *IsError = TRUE;\r
+ \r
+ if (*EventCount == 0) {\r
+ FreePool (EventCount);\r
+ FreePool (IsError);\r
+ }\r
+ \r
+ if (Task != NULL) {\r
+ RemoveEntryList (&Task->TaskEntry);\r
+ FreeAtaSubTask (Task); \r
+ }\r
\r
- if (*EventCount == 0) {\r
- FreePool (EventCount);\r
- FreePool (IsError);\r
- }\r
+ if (SubEvent != NULL) {\r
+ gBS->CloseEvent (SubEvent); \r
+ }\r
+ \r
+ gBS->RestoreTPL (OldTpl);\r
+ }\r
+ } \r
\r
return Status;\r
}\r
//\r
// Prepare for ATA command block.\r
//\r
- Acb = ZeroMem (&AtaDevice->Acb, sizeof (*Acb));\r
+ Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));\r
if (TransferLength == 0) {\r
Acb->AtaCommand = ATA_CMD_TRUST_NON_DATA;\r
} else {\r
Acb->AtaSectorNumber = (UINT8) ((TransferLength / 512) >> 8);\r
//\r
// NOTE: ATA Spec has no explicitly definition for Security Protocol Specific layout. \r
- // Here use big edian for Cylinder register. \r
+ // Here use big endian for Cylinder register. \r
//\r
Acb->AtaCylinderHigh = (UINT8) SecurityProtocolSpecificData;\r
Acb->AtaCylinderLow = (UINT8) (SecurityProtocolSpecificData >> 8);\r
//\r
// Prepare for ATA pass through packet.\r
//\r
- Packet = ZeroMem (&AtaDevice->Packet, sizeof (*Packet));\r
+ Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));\r
if (TransferLength == 0) {\r
Packet->InTransferLength = 0;\r
Packet->OutTransferLength = 0;\r