mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-26 16:47:40 +01:00
266 lines
7.0 KiB
C
266 lines
7.0 KiB
C
|
/** @file
|
||
|
|
||
|
The definition for EHCI register operation routines.
|
||
|
|
||
|
Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#ifndef _EFI_UHCI_SCHED_H_
|
||
|
#define _EFI_UHCI_SCHED_H_
|
||
|
|
||
|
|
||
|
#define UHCI_ASYNC_INT_SIGNATURE SIGNATURE_32 ('u', 'h', 'c', 'a')
|
||
|
//
|
||
|
// The failure mask for USB transfer return status. If any of
|
||
|
// these bit is set, the transfer failed. EFI_USB_ERR_NOEXECUTE
|
||
|
// and EFI_USB_ERR_NAK are not considered as error condition:
|
||
|
// the transfer is still going on.
|
||
|
//
|
||
|
#define USB_ERR_FAIL_MASK (EFI_USB_ERR_STALL | EFI_USB_ERR_BUFFER | \
|
||
|
EFI_USB_ERR_BABBLE | EFI_USB_ERR_CRC | \
|
||
|
EFI_USB_ERR_TIMEOUT | EFI_USB_ERR_BITSTUFF | \
|
||
|
EFI_USB_ERR_SYSTEM)
|
||
|
|
||
|
|
||
|
//
|
||
|
// Structure to return the result of UHCI QH execution.
|
||
|
// Result is the final result of the QH's QTD. NextToggle
|
||
|
// is the next data toggle to use. Complete is the actual
|
||
|
// length of data transferred.
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Result;
|
||
|
UINT8 NextToggle;
|
||
|
UINTN Complete;
|
||
|
} UHCI_QH_RESULT;
|
||
|
|
||
|
typedef struct _UHCI_ASYNC_REQUEST UHCI_ASYNC_REQUEST;
|
||
|
|
||
|
//
|
||
|
// Structure used to manager the asynchronous interrupt transfers.
|
||
|
//
|
||
|
struct _UHCI_ASYNC_REQUEST{
|
||
|
UINTN Signature;
|
||
|
LIST_ENTRY Link;
|
||
|
UHCI_ASYNC_REQUEST *Recycle;
|
||
|
|
||
|
//
|
||
|
// Endpoint attributes
|
||
|
//
|
||
|
UINT8 DevAddr;
|
||
|
UINT8 EndPoint;
|
||
|
BOOLEAN IsLow;
|
||
|
UINTN Interval;
|
||
|
|
||
|
//
|
||
|
// Data and UHC structures
|
||
|
//
|
||
|
UHCI_QH_SW *QhSw;
|
||
|
UHCI_TD_SW *FirstTd;
|
||
|
UINT8 *Data; // Allocated host memory, not mapped memory
|
||
|
UINTN DataLen;
|
||
|
VOID *Mapping;
|
||
|
|
||
|
//
|
||
|
// User callback and its context
|
||
|
//
|
||
|
EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
|
||
|
VOID *Context;
|
||
|
};
|
||
|
|
||
|
#define UHCI_ASYNC_INT_FROM_LINK(a) \
|
||
|
CR (a, UHCI_ASYNC_REQUEST, Link, UHCI_ASYNC_INT_SIGNATURE)
|
||
|
|
||
|
|
||
|
/**
|
||
|
Create Frame List Structure.
|
||
|
|
||
|
@param Uhc The UHCI device.
|
||
|
|
||
|
@return EFI_OUT_OF_RESOURCES Can't allocate memory resources.
|
||
|
@return EFI_UNSUPPORTED Map memory fail.
|
||
|
@return EFI_SUCCESS Success.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
UhciInitFrameList (
|
||
|
IN USB_HC_DEV *Uhc
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Destory FrameList buffer.
|
||
|
|
||
|
@param Uhc The UHCI device.
|
||
|
|
||
|
@return None.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
UhciDestoryFrameList (
|
||
|
IN USB_HC_DEV *Uhc
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Convert the poll rate to the maxium 2^n that is smaller
|
||
|
than Interval.
|
||
|
|
||
|
@param Interval The poll rate to convert.
|
||
|
|
||
|
@return The converted poll rate.
|
||
|
|
||
|
**/
|
||
|
UINTN
|
||
|
UhciConvertPollRate (
|
||
|
IN UINTN Interval
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Link a queue head (for asynchronous interrupt transfer) to
|
||
|
the frame list.
|
||
|
|
||
|
@param Uhc The UHCI device.
|
||
|
@param Qh The queue head to link into.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
UhciLinkQhToFrameList (
|
||
|
USB_HC_DEV *Uhc,
|
||
|
UHCI_QH_SW *Qh
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Unlink QH from the frame list is easier: find all
|
||
|
the precedence node, and pointer there next to QhSw's
|
||
|
next.
|
||
|
|
||
|
@param Uhc The UHCI device.
|
||
|
@param Qh The queue head to unlink.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
UhciUnlinkQhFromFrameList (
|
||
|
USB_HC_DEV *Uhc,
|
||
|
UHCI_QH_SW *Qh
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Check the result of the transfer.
|
||
|
|
||
|
@param Uhc The UHCI device.
|
||
|
@param Qh The queue head of the transfer.
|
||
|
@param Td The first TDs of the transfer.
|
||
|
@param TimeOut TimeOut value in milliseconds.
|
||
|
@param IsLow Is Low Speed Device.
|
||
|
@param QhResult The variable to return result.
|
||
|
|
||
|
@retval EFI_SUCCESS The transfer finished with success.
|
||
|
@retval EFI_DEVICE_ERROR Transfer failed.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
UhciExecuteTransfer (
|
||
|
IN USB_HC_DEV *Uhc,
|
||
|
IN UHCI_QH_SW *Qh,
|
||
|
IN UHCI_TD_SW *Td,
|
||
|
IN UINTN TimeOut,
|
||
|
IN BOOLEAN IsLow,
|
||
|
OUT UHCI_QH_RESULT *QhResult
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Create Async Request node, and Link to List.
|
||
|
|
||
|
@param Uhc The UHCI device.
|
||
|
@param Qh The queue head of the transfer.
|
||
|
@param FirstTd First TD of the transfer.
|
||
|
@param DevAddr Device Address.
|
||
|
@param EndPoint EndPoint Address.
|
||
|
@param DataLen Data length.
|
||
|
@param Interval Polling Interval when inserted to frame list.
|
||
|
@param Data Data buffer, unmapped.
|
||
|
@param Callback Callback after interrupt transfeer.
|
||
|
@param Context Callback Context passed as function parameter.
|
||
|
@param IsLow Is Low Speed.
|
||
|
|
||
|
@retval EFI_SUCCESS An asynchronous transfer is created.
|
||
|
@retval EFI_INVALID_PARAMETER Paremeter is error.
|
||
|
@retval EFI_OUT_OF_RESOURCES Failed because of resource shortage.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
UhciCreateAsyncReq (
|
||
|
IN USB_HC_DEV *Uhc,
|
||
|
IN UHCI_QH_SW *Qh,
|
||
|
IN UHCI_TD_SW *FirstTd,
|
||
|
IN UINT8 DevAddr,
|
||
|
IN UINT8 EndPoint,
|
||
|
IN UINTN DataLen,
|
||
|
IN UINTN Interval,
|
||
|
IN UINT8 *Data,
|
||
|
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||
|
IN VOID *Context,
|
||
|
IN BOOLEAN IsLow
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Delete Async Interrupt QH and TDs.
|
||
|
|
||
|
@param Uhc The UHCI device.
|
||
|
@param DevAddr Device Address.
|
||
|
@param EndPoint EndPoint Address.
|
||
|
@param Toggle The next data toggle to use.
|
||
|
|
||
|
@retval EFI_SUCCESS The request is deleted.
|
||
|
@retval EFI_INVALID_PARAMETER Paremeter is error.
|
||
|
@retval EFI_NOT_FOUND The asynchronous isn't found.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
UhciRemoveAsyncReq (
|
||
|
IN USB_HC_DEV *Uhc,
|
||
|
IN UINT8 DevAddr,
|
||
|
IN UINT8 EndPoint,
|
||
|
OUT UINT8 *Toggle
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Release all the asynchronous transfers on the lsit.
|
||
|
|
||
|
@param Uhc The UHCI device.
|
||
|
|
||
|
@return None.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
UhciFreeAllAsyncReq (
|
||
|
IN USB_HC_DEV *Uhc
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Interrupt transfer periodic check handler.
|
||
|
|
||
|
@param Event The event of the time.
|
||
|
@param Context Context of the event, pointer to USB_HC_DEV.
|
||
|
|
||
|
@return None.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
UhciMonitorAsyncReqList (
|
||
|
IN EFI_EVENT Event,
|
||
|
IN VOID *Context
|
||
|
);
|
||
|
|
||
|
#endif
|