Fixed unexpected timeout in Uhci/Ehci driver. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4038 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			262 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| Copyright (c) 2004 - 2007, Intel Corporation
 | |
| All rights reserved. This program and the accompanying materials
 | |
| are licensed and made available under the terms and conditions of the BSD License
 | |
| which accompanies this distribution.  The full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
|   Module Name:
 | |
| 
 | |
|     UsbBus.h
 | |
| 
 | |
|   Abstract:
 | |
| 
 | |
|     Usb Bus Driver Binding and Bus IO Protocol
 | |
| 
 | |
|   Revision History
 | |
| 
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef _EFI_USB_BUS_H_
 | |
| #define _EFI_USB_BUS_H_
 | |
| 
 | |
| 
 | |
| #include <PiDxe.h>
 | |
| 
 | |
| #include <Protocol/Usb2HostController.h>
 | |
| #include <Protocol/UsbHostController.h>
 | |
| #include <Protocol/UsbIo.h>
 | |
| #include <Protocol/DevicePath.h>
 | |
| 
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/UefiDriverEntryPoint.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/UefiLib.h>
 | |
| #include <Library/DevicePathLib.h>
 | |
| #include <Library/MemoryAllocationLib.h>
 | |
| 
 | |
| 
 | |
| #include <IndustryStandard/Usb.h>
 | |
| 
 | |
| typedef struct _USB_DEVICE     USB_DEVICE;
 | |
| typedef struct _USB_INTERFACE  USB_INTERFACE;
 | |
| typedef struct _USB_BUS        USB_BUS;
 | |
| typedef struct _USB_HUB_API    USB_HUB_API;
 | |
| 
 | |
| 
 | |
| #include "UsbUtility.h"
 | |
| #include "UsbDesc.h"
 | |
| #include "UsbHub.h"
 | |
| #include "UsbEnumer.h"
 | |
| 
 | |
| enum {
 | |
|   USB_MAX_LANG_ID           = 16,
 | |
|   USB_MAX_INTERFACE         = 16,
 | |
|   USB_MAX_DEVICES           = 128,
 | |
| 
 | |
|   USB_BUS_1_MILLISECOND     = 1000,
 | |
| 
 | |
|   //
 | |
|   // Roothub and hub's polling interval, set by experience,
 | |
|   // The unit of roothub is 100us, means 1s as interval, and
 | |
|   // the unit of hub is 1ms, means 64ms as interval.
 | |
|   //
 | |
|   USB_ROOTHUB_POLL_INTERVAL = 1000 * 10000U,
 | |
|   USB_HUB_POLL_INTERVAL     = 64,
 | |
| 
 | |
|   //
 | |
|   // Wait for port stable to work, refers to specification
 | |
|   // [USB20-9.1.2]
 | |
|   //
 | |
|   USB_WAIT_PORT_STABLE_STALL     = 100 * USB_BUS_1_MILLISECOND,
 | |
| 
 | |
|   // 
 | |
|   // Wait for port statue reg change, set by experience
 | |
|   //
 | |
|   USB_WAIT_PORT_STS_CHANGE_STALL = 5 * USB_BUS_1_MILLISECOND,
 | |
| 
 | |
|   //
 | |
|   // Wait for set device address, refers to specification
 | |
|   // [USB20-9.2.6.3, it says 2ms]
 | |
|   //
 | |
|   USB_SET_DEVICE_ADDRESS_STALL   = 20 * USB_BUS_1_MILLISECOND,
 | |
| 
 | |
|   //
 | |
|   // Wait for retry max packet size, set by experience
 | |
|   //
 | |
|   USB_RETRY_MAX_PACK_SIZE_STALL  = 100 * USB_BUS_1_MILLISECOND,
 | |
| 
 | |
|   //
 | |
|   // Wait for hub port power-on, refers to specification
 | |
|   // [USB20-11.23.2]
 | |
|   //
 | |
|   USB_SET_PORT_POWER_STALL       = 2 * USB_BUS_1_MILLISECOND,
 | |
| 
 | |
|   //
 | |
|   // Wait for port reset, refers to specification 
 | |
|   // [USB20-7.1.7.5, it says 10ms for hub and 50ms for 
 | |
|   // root hub]
 | |
|   //
 | |
|   USB_SET_PORT_RESET_STALL       = 20 * USB_BUS_1_MILLISECOND,
 | |
|   USB_SET_ROOT_PORT_RESET_STALL  = 50 * USB_BUS_1_MILLISECOND,
 | |
| 
 | |
|   //
 | |
|   // Wait for clear roothub port reset, set by experience
 | |
|   //
 | |
|   USB_CLR_ROOT_PORT_RESET_STALL  = 1 * USB_BUS_1_MILLISECOND,
 | |
| 
 | |
|   //
 | |
|   // Wait for set roothub port enable, set by experience
 | |
|   // 
 | |
|   USB_SET_ROOT_PORT_ENABLE_STALL = 20 * USB_BUS_1_MILLISECOND,
 | |
| 
 | |
|   //
 | |
|   // Send general device request timeout, refers to 
 | |
|   // specification[USB20-11.24.1]
 | |
|   //
 | |
|   USB_GENERAL_DEVICE_REQUEST_TIMEOUT = 50 * USB_BUS_1_MILLISECOND,
 | |
| 
 | |
|   //
 | |
|   // Send clear feature request timeout, set by experience
 | |
|   //
 | |
|   USB_CLEAR_FEATURE_REQUEST_TIMEOUT  = 10 * USB_BUS_1_MILLISECOND,
 | |
|   
 | |
|   //
 | |
|   // Bus raises TPL to TPL_NOTIFY to serialize all its operations
 | |
|   // to protect shared data structures.
 | |
|   //
 | |
|   USB_BUS_TPL               = TPL_NOTIFY,
 | |
| 
 | |
|   USB_INTERFACE_SIGNATURE   = EFI_SIGNATURE_32 ('U', 'S', 'B', 'I'),
 | |
|   USB_BUS_SIGNATURE         = EFI_SIGNATURE_32 ('U', 'S', 'B', 'B')
 | |
| };
 | |
| 
 | |
| #define USB_BIT(a)                  ((UINTN)(1 << (a)))
 | |
| #define USB_BIT_IS_SET(Data, Bit)   ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
 | |
| 
 | |
| #define EFI_USB_BUS_PROTOCOL_GUID \
 | |
|           {0x2B2F68CC, 0x0CD2, 0x44cf, {0x8E, 0x8B, 0xBB, 0xA2, 0x0B, 0x1B, 0x5B, 0x75}}
 | |
| 
 | |
| #define USB_INTERFACE_FROM_USBIO(a) \
 | |
|           CR(a, USB_INTERFACE, UsbIo, USB_INTERFACE_SIGNATURE)
 | |
| 
 | |
| #define USB_BUS_FROM_THIS(a) \
 | |
|           CR(a, USB_BUS, BusId, USB_BUS_SIGNATURE)
 | |
| 
 | |
| //
 | |
| // Used to locate USB_BUS
 | |
| //
 | |
| typedef struct _EFI_USB_BUS_PROTOCOL {
 | |
|   UINT64                    Reserved;
 | |
| } EFI_USB_BUS_PROTOCOL;
 | |
| 
 | |
| 
 | |
| //
 | |
| // Stands for the real USB device. Each device may
 | |
| // has several seperately working interfaces.
 | |
| //
 | |
| struct _USB_DEVICE {
 | |
|   USB_BUS                   *Bus;
 | |
| 
 | |
|   //
 | |
|   // Configuration information
 | |
|   //
 | |
|   UINT8                     Speed;
 | |
|   UINT8                     Address;
 | |
|   UINT8                     MaxPacket0;
 | |
| 
 | |
|   //
 | |
|   // The device's descriptors and its configuration
 | |
|   //
 | |
|   USB_DEVICE_DESC           *DevDesc;
 | |
|   USB_CONFIG_DESC           *ActiveConfig;
 | |
| 
 | |
|   UINT16                    LangId [USB_MAX_LANG_ID];
 | |
|   UINT16                    TotalLangId;
 | |
| 
 | |
|   UINT8                     NumOfInterface;
 | |
|   USB_INTERFACE             *Interfaces [USB_MAX_INTERFACE];
 | |
| 
 | |
|   //
 | |
|   // Parent child relationship
 | |
|   //
 | |
|   EFI_USB2_HC_TRANSACTION_TRANSLATOR Translator;
 | |
| 
 | |
|   UINT8                     ParentAddr;
 | |
|   USB_INTERFACE             *ParentIf;
 | |
|   UINT8                     ParentPort;       // Start at 0
 | |
| };
 | |
| 
 | |
| //
 | |
| // Stands for different functions of USB device
 | |
| //
 | |
| struct _USB_INTERFACE {
 | |
|   UINTN                     Signature;
 | |
|   USB_DEVICE                *Device;
 | |
|   USB_INTERFACE_DESC        *IfDesc;
 | |
|   USB_INTERFACE_SETTING     *IfSetting;
 | |
| 
 | |
|   //
 | |
|   // Handles and protocols
 | |
|   //
 | |
|   EFI_HANDLE                Handle;
 | |
|   EFI_USB_IO_PROTOCOL       UsbIo;
 | |
|   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
 | |
|   BOOLEAN                   IsManaged;
 | |
| 
 | |
|   //
 | |
|   // Hub device special data
 | |
|   //
 | |
|   BOOLEAN                   IsHub;
 | |
|   USB_HUB_API               *HubApi;
 | |
|   UINT8                     NumOfPort;
 | |
|   EFI_EVENT                 HubNotify;
 | |
| 
 | |
|   //
 | |
|   // Data used only by normal hub devices
 | |
|   //
 | |
|   USB_ENDPOINT_DESC         *HubEp;
 | |
|   UINT8                     *ChangeMap;
 | |
| 
 | |
|   //
 | |
|   // Data used only by root hub to hand over device to
 | |
|   // companion UHCI driver if low/full speed devices are
 | |
|   // connected to EHCI.
 | |
|   //
 | |
|   UINT8                     MaxSpeed;
 | |
| };
 | |
| 
 | |
| //
 | |
| // Stands for the current USB Bus
 | |
| //
 | |
| struct _USB_BUS {
 | |
|   UINTN                     Signature;
 | |
|   EFI_USB_BUS_PROTOCOL      BusId;
 | |
| 
 | |
|   //
 | |
|   // Managed USB host controller
 | |
|   //
 | |
|   EFI_HANDLE                HostHandle;
 | |
|   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
 | |
|   EFI_USB2_HC_PROTOCOL      *Usb2Hc;
 | |
|   EFI_USB_HC_PROTOCOL       *UsbHc;
 | |
| 
 | |
|   //
 | |
|   // An array of device that is on the bus. Devices[0] is
 | |
|   // for root hub. Device with address i is at Devices[i].
 | |
|   //
 | |
|   USB_DEVICE                *Devices[USB_MAX_DEVICES];
 | |
| };
 | |
| 
 | |
| extern EFI_USB_IO_PROTOCOL            mUsbIoProtocol;
 | |
| extern EFI_DRIVER_BINDING_PROTOCOL    mUsbBusDriverBinding;
 | |
| extern EFI_COMPONENT_NAME_PROTOCOL    mUsbBusComponentName;
 | |
| extern EFI_COMPONENT_NAME2_PROTOCOL   mUsbBusComponentName2;
 | |
| 
 | |
| #endif
 |