UINT16 Rsvd:4;\r
} UFS_EXPOSED_LUNS;\r
\r
+//\r
+// Iterate through the doule linked list. This is delete-safe.\r
+// Do not touch NextEntry\r
+//\r
+#define EFI_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \\r
+ for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink;\\r
+ Entry != (ListHead); Entry = NextEntry, NextEntry = Entry->ForwardLink)\r
+\r
typedef struct _UFS_PASS_THRU_PRIVATE_DATA { \r
UINT32 Signature;\r
EFI_HANDLE Handle;\r
VOID *TmrlMapping;\r
\r
UFS_EXPOSED_LUNS Luns;\r
+\r
+ //\r
+ // For Non-blocking operation.\r
+ //\r
+ EFI_EVENT TimerEvent;\r
+ LIST_ENTRY Queue;\r
} UFS_PASS_THRU_PRIVATE_DATA;\r
\r
+#define UFS_PASS_THRU_TRANS_REQ_SIG SIGNATURE_32 ('U', 'F', 'S', 'T')\r
+\r
+typedef struct {\r
+ UINT32 Signature;\r
+ LIST_ENTRY TransferList;\r
+\r
+ UINT8 Slot;\r
+ UTP_TRD *Trd;\r
+ UINT32 CmdDescSize;\r
+ VOID *CmdDescHost;\r
+ VOID *CmdDescMapping;\r
+ VOID *DataBufMapping;\r
+\r
+ EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet;\r
+ UINT64 TimeoutRemain;\r
+ EFI_EVENT CallerEvent;\r
+} UFS_PASS_THRU_TRANS_REQ;\r
+\r
+#define UFS_PASS_THRU_TRANS_REQ_FROM_THIS(a) \\r
+ CR(a, UFS_PASS_THRU_TRANS_REQ, TransferList, UFS_PASS_THRU_TRANS_REQ_SIG)\r
+\r
#define UFS_TIMEOUT EFI_TIMER_PERIOD_SECONDS(3)\r
+#define UFS_HC_ASYNC_TIMER EFI_TIMER_PERIOD_MILLISECONDS(1)\r
\r
#define ROUNDUP8(x) (((x) % 8 == 0) ? (x) : ((x) / 8 + 1) * 8)\r
\r
@param[in] Lun The LUN of the UFS device to send the SCSI Request Packet.\r
@param[in, out] Packet A pointer to the SCSI Request Packet to send to a specified Lun of the\r
UFS device.\r
+ @param[in] Event If nonblocking I/O is not supported then Event is ignored, and blocking\r
+ I/O is performed. If Event is NULL, then blocking I/O is performed. If\r
+ Event is not NULL and non blocking I/O is supported, then\r
+ nonblocking I/O is performed, and Event will be signaled when the\r
+ SCSI Request Packet completes.\r
\r
@retval EFI_SUCCESS The SCSI Request Packet was sent by the host. For bi-directional\r
commands, InTransferLength bytes were transferred from\r
UfsExecScsiCmds (\r
IN UFS_PASS_THRU_PRIVATE_DATA *Private,\r
IN UINT8 Lun,\r
- IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet\r
+ IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,\r
+ IN EFI_EVENT Event OPTIONAL\r
);\r
\r
/**\r
IN UFS_PASS_THRU_PRIVATE_DATA *Private\r
);\r
\r
+/**\r
+ Call back function when the timer event is signaled.\r
+\r
+ @param[in] Event The Event this notify function registered to.\r
+ @param[in] Context Pointer to the context data registered to the Event.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+ProcessAsyncTaskList (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ Internal helper function which will signal the caller event and clean up\r
+ resources.\r
+\r
+ @param[in] Private The pointer to the UFS_PASS_THRU_PRIVATE_DATA data\r
+ structure.\r
+ @param[in] TransReq The pointer to the UFS_PASS_THRU_TRANS_REQ data\r
+ structure.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SignalCallerEvent (\r
+ IN UFS_PASS_THRU_PRIVATE_DATA *Private,\r
+ IN UFS_PASS_THRU_TRANS_REQ *TransReq\r
+ );\r
+\r
extern EFI_COMPONENT_NAME_PROTOCOL gUfsPassThruComponentName;\r
extern EFI_COMPONENT_NAME2_PROTOCOL gUfsPassThruComponentName2;\r
extern EFI_DRIVER_BINDING_PROTOCOL gUfsPassThruDriverBinding;\r