audk/QuarkSocPkg/QuarkSouthCluster/Usb/Ohci/Dxe/OhciSched.h

226 lines
5.4 KiB
C

/** @file
This file contains the definination for host controller schedule routines.
Copyright (c) 2013-2015 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _OHCI_SCHED_H
#define _OHCI_SCHED_H
#include "Descriptor.h"
#define HCCA_MEM_SIZE 256
#define GRID_SIZE 16
#define GRID_SHIFT 4
typedef struct _INTERRUPT_CONTEXT_ENTRY INTERRUPT_CONTEXT_ENTRY;
struct _INTERRUPT_CONTEXT_ENTRY{
UINT8 DeviceAddress;
UINT8 EndPointAddress;
ED_DESCRIPTOR *Ed;
TD_DESCRIPTOR *DataTd;
BOOLEAN IsSlowDevice;
UINT8 MaxPacketLength;
UINTN PollingInterval;
EFI_ASYNC_USB_TRANSFER_CALLBACK CallBackFunction;
VOID *Context;
BOOLEAN IsPeriodic;
VOID *Buffer;
UINTN DataLength;
VOID *UCBuffer;
VOID *UCBufferMapping;
UINT8 *Toggle;
INTERRUPT_CONTEXT_ENTRY *NextEntry;
};
typedef struct {
UINT32 ErrorCode;
UINT8 NextToggle;
} OHCI_ED_RESULT;
/**
Add an item of interrupt context
@param Ohc UHC private data
@param NewEntry New entry to add
@retval EFI_SUCCESS Item successfully added
**/
EFI_STATUS
OhciAddInterruptContextEntry (
IN USB_OHCI_HC_DEV *Ohc,
IN INTERRUPT_CONTEXT_ENTRY *NewEntry
);
/**
Free a interrupt context entry
@param Ohc UHC private data
@param Entry Pointer to an interrupt context entry
@retval EFI_SUCCESS Entry freed
@retval EFI_INVALID_PARAMETER Entry is NULL
**/
EFI_STATUS
OhciFreeInterruptContextEntry (
IN USB_OHCI_HC_DEV *Ohc,
IN INTERRUPT_CONTEXT_ENTRY *Entry
);
/**
Free entries match the device address and endpoint address
@Param Ohc UHC private date
@Param DeviceAddress Item to free must match this device address
@Param EndPointAddress Item to free must match this end point address
@Param DataToggle DataToggle for output
@retval EFI_SUCCESS Items match the requirement removed
**/
EFI_STATUS
OhciFreeInterruptContext(
IN USB_OHCI_HC_DEV *Ohc,
IN UINT8 DeviceAddress,
IN UINT8 EndPointAddress,
OUT UINT8 *DataToggle
);
/**
Convert Error code from OHCI format to EFI format
@Param ErrorCode ErrorCode in OHCI format
@retval ErrorCode in EFI format
**/
UINT32
ConvertErrorCode (
IN UINT32 ErrorCode
);
/**
Check TDs Results
@Param Ohc UHC private data
@Param Td TD_DESCRIPTOR
@Param Result Result to return
@retval TRUE means OK
@retval FLASE means Error or Short packet
**/
BOOLEAN
OhciCheckTDsResults (
IN USB_OHCI_HC_DEV *Ohc,
IN TD_DESCRIPTOR *Td,
OUT UINT32 *Result
);
/**
Check the task status on an ED
@Param Ed Pointer to the ED task that TD hooked on
@Param HeadTd TD header for current transaction
@retval Task Status Code
**/
UINT32
CheckEDStatus (
IN ED_DESCRIPTOR *Ed,
IN TD_DESCRIPTOR *HeadTd,
OUT OHCI_ED_RESULT *EdResult
);
/**
Check the task status
@Param Ohc UHC private data
@Param ListType Pipe type
@Param Ed Pointer to the ED task hooked on
@Param HeadTd Head of TD corresponding to the task
@Param ErrorCode return the ErrorCode
@retval EFI_SUCCESS Task done
@retval EFI_NOT_READY Task on processing
@retval EFI_DEVICE_ERROR Some error occured
**/
EFI_STATUS
CheckIfDone (
IN USB_OHCI_HC_DEV *Ohc,
IN DESCRIPTOR_LIST_TYPE ListType,
IN ED_DESCRIPTOR *Ed,
IN TD_DESCRIPTOR *HeadTd,
OUT OHCI_ED_RESULT *EdResult
);
/**
Convert TD condition code to Efi Status
@Param ConditionCode Condition code to convert
@retval EFI_SUCCESS No error occured
@retval EFI_NOT_READY TD still on processing
@retval EFI_DEVICE_ERROR Error occured in processing TD
**/
EFI_STATUS
OhciTDConditionCodeToStatus (
IN UINT32 ConditionCode
);
/**
Invoke callbacks hooked on done TDs
@Param Entry Interrupt transfer transaction information data structure
@Param Context Ohc private data
**/
VOID
OhciInvokeInterruptCallBack(
IN INTERRUPT_CONTEXT_ENTRY *Entry,
IN UINT32 Result
);
/**
Timer to submit periodic interrupt transfer, and invoke callbacks hooked on done TDs
@param Event Event handle
@param Context Device private data
**/
VOID
EFIAPI
OhciHouseKeeper (
IN EFI_EVENT Event,
IN VOID *Context
);
#endif