summaryrefslogtreecommitdiff
path: root/Board/EM/usb
diff options
context:
space:
mode:
Diffstat (limited to 'Board/EM/usb')
-rw-r--r--Board/EM/usb/amiusb.cif19
-rw-r--r--Board/EM/usb/usb.chmbin0 -> 758524 bytes
-rw-r--r--Board/EM/usb/usb.sdl481
-rw-r--r--Board/EM/usb/usbport.c1444
4 files changed, 1944 insertions, 0 deletions
diff --git a/Board/EM/usb/amiusb.cif b/Board/EM/usb/amiusb.cif
new file mode 100644
index 0000000..bd02ab2
--- /dev/null
+++ b/Board/EM/usb/amiusb.cif
@@ -0,0 +1,19 @@
+<component>
+ name = "USB"
+ category = eModule
+ LocalRoot = "board\em\usb\"
+ RefName = "USB"
+[files]
+"usb.sdl"
+"usbport.c"
+"usb.chm"
+[parts]
+"USBRT"
+"UHCD"
+"FRAMEWORK"
+"AmiUSBProtocols"
+"USB_SETUP"
+"USB_LEGACY"
+"USB_SB"
+"AmiUsbLib"
+<endComponent>
diff --git a/Board/EM/usb/usb.chm b/Board/EM/usb/usb.chm
new file mode 100644
index 0000000..46593a3
--- /dev/null
+++ b/Board/EM/usb/usb.chm
Binary files differ
diff --git a/Board/EM/usb/usb.sdl b/Board/EM/usb/usb.sdl
new file mode 100644
index 0000000..bedc7e5
--- /dev/null
+++ b/Board/EM/usb/usb.sdl
@@ -0,0 +1,481 @@
+TOKEN
+ Name = "AMIUSB_SUPPORT"
+ Value = "1"
+ Help = "Main switch to enable AMI USB support in Project"
+ TokenType = Boolean
+ TargetEQU = Yes
+ TargetMAK = Yes
+ TargetH = Yes
+ Master = Yes
+End
+
+TOKEN
+ Name = "USB_DRIVER_MAJOR_VER"
+ Value = "8"
+ Help = "USB driver major version"
+ TokenType = Integer
+ TargetH = Yes
+ Lock = Yes
+End
+
+TOKEN
+ Name = "USB_DRIVER_MINOR_VER"
+ Value = "10"
+ Help = "USB driver minor version"
+ TokenType = Integer
+ TargetH = Yes
+ Lock = Yes
+End
+
+TOKEN
+ Name = "USB_DRIVER_BUILD_VER"
+ Value = "36"
+ Help = "USB driver build version"
+ TokenType = Integer
+ TargetH = Yes
+ Lock = Yes
+End
+
+TOKEN
+ Name = "UHCI_SUPPORT"
+ Value = "1"
+ Help = "Enable/Disable UHCI controller(s)."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "OHCI_SUPPORT"
+ Value = "1"
+ Help = "Enable/Disable OHCI controller(s)"
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "EHCI_SUPPORT"
+ Value = "1"
+ Help = "Enable/Disable EHCI controller(s)"
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "XHCI_SUPPORT"
+ Value = "1"
+ Help = "Enable/Disable xHCI controller(s)"
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_HOTPLUG_FDD"
+ Value = "0"
+ Help = "Includes the support for USB hot plug floppy drive."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_HOTPLUG_HDD"
+ Value = "0"
+ Help = "Includes the support for USB hot plug hard drive."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_HOTPLUG_CDROM"
+ Value = "0"
+ Help = "Includes the support for USB hot plug CD-ROM drive."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "HIDE_USB_SUPPORT_SETUP_QUESTION"
+ Value = "1"
+ Help = "This setup item is for debug only. Switch to Hide/Un-hide USB Support setup question."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_LEGACY_PLATFORM_SUPPORT"
+ Value = "1"
+ Help = "Includes the USB Legacy options and keypress monitor implementation."
+ TokenType = Boolean
+ TargetH = Yes
+ Token = "KEYMONFILTER_SUPPORT" "!=" "0"
+End
+
+TOKEN
+ Name = "KBC_EMULATION_8MSTD_OVERRIDE"
+ Value = "25"
+ Help = "This token is designed to work around the problems for the projects that have the actual KBC hardware enabled and at the same time enable KBC emulation.\For these projects there is a high probability of racing conditions between IRQ1 handler and USB keyboard SMI handler. It was found the problem could be solved by 'slowing down' the 8ms TD schedule.\By default 8ms is changed to 25ms. This change may depend on the execution time of SMI dispatcher (number of SMI handlers, size of SMI code, cachability of SMM area, etc.)."
+ TokenType = Integer
+ TargetH = Yes
+ Range = "8..64"
+End
+
+TOKEN
+ Name = "KEY_REPEAT_DELAY"
+ Value = "2"
+ Help = "This value is for the offset of the aTypematicRateDelayTable. aTypematicRateDelayTable is based on 8ms periodic interrupt. If the periodic interrupt is more than 8ms , modify this token for the proper delay between KeyRepeat action. To calculate the delay between Key repeat action PeriodicTime Interrupt Interval * aTypematicRateDelayTable[KEY_REPEAT_DELAY]"
+ TokenType = Integer
+ TargetH = Yes
+ Range = "0..3"
+End
+
+TOKEN
+ Name = "KEY_REPEAT_INITIAL_DELAY"
+ Value = "6"
+ Help = "This value is for the offset of the aTypematicRateDelayTable. aTypematicRateDelayTable is based on 8ms periodic interrupt. If the periodic interrupt is more than 8ms , modify this token for the proper initial delay for KeyRepeat action.To calculate the initial delay for the Key repeat action PeriodicTime Interrupt Interval * aTypematicRateDelayTable[KEY_REPEAT_INITIAL_DELAY]"
+ TokenType = Integer
+ TargetH = Yes
+ Range = "4..7"
+End
+
+TOKEN
+ Name = "USB_KEYREPEAT_INTERVAL"
+ Value = "0"
+ Help = "0-Use default key repeat interval 8ms. 1-Use key repeat interval 16ms."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_EHCI_HANDOFF_SUPPORT"
+ Value = "1"
+ Help = "Switch to enable EHCI hand-off"
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "XHCI_EVENT_SERVICE_MODE"
+ Value = "0"
+ Help = "This token controlls xHCI event service mode.\0 - Use periodic timer SMI.\1 - Use xHCI hardware SMI.\2 - Both periodic timer SMI and se xHCI hardware SMI."
+ TokenType = Integer
+ TargetH = Yes
+ Range = "0..2"
+End
+
+TOKEN
+ Name = "USB_XHCI_EXT_HW_SMI_PINS"
+ Value = "255"
+ Help = "List of xHCI GPI bit offset in the following format: GPI0, GPI1,...,GPIN.\Use 0xFF (255) to ignore the settings."
+ TokenType = Expression
+ TargetH = Yes
+ Range = "0..31"
+ Token = "XHCI_EVENT_SERVICE_MODE" "!=" "0"
+End
+
+TOKEN
+ Name = "USB_S5_WAKEUP_SUPPORT"
+ Value = "0"
+ Help = "Support USB S5 wakeup function."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_DIFFERENTIATE_IDENTICAL_DEVICE_NAME"
+ Value = "0"
+ Help = "If enabled the USB Device name string is prefixed with U1-,U2-... for each USB device to differentiate the Devices with same Device name Strings."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_BAD_DEVICES"
+ Help = "List the non-compliant USB devices, please refer to the gUsbBadDeviceTable in usbport.c."
+ TokenType = Expression
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "HIDE_USB_HISPEED_SUPPORT_SETUP_QUESTION"
+ Value = "1"
+ Help = "Switch to Hide/Un-hide USB HiSpeed Support setup question."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "DEFAULT_USB_EMUL6064_OPTION"
+ Value = "1"
+ Help = "Default value of the I/O port 60h/64h emulation support option"
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_RUNTIME_DRIVER_IN_SMM"
+ Value = "1"
+ TokenType = Boolean
+ TargetMAK = Yes
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "EXTERNAL_USB_CONTROLLER_SUPPORT"
+ Value = "1"
+ Help = "Support external USB controllers."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_OHCI_HANDOFF_SUPPORT"
+ Value = "0"
+ Help = "Switch to enable OHCI hand-off workaround"
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_CONTROLLERS_WITH_RMH"
+ Help = "List of USB controllers that have integrated USB 2.0 Rate Matching Hubs (RMH) in the following format: {vid1, did1}, {vid2, did2}"
+ TokenType = Expression
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "HIDE_USB_XHCI_LEGACY_SUPPORT_SETUP_QUESTION"
+ Value = "1"
+ Help = "This setup item is for debug only. Switch to Hide/Un-hide USB XHCI Legacy Support setup question."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_SETUP_VARIABLE_RUNTIME_ACCESS"
+ Value = "0"
+ Help = "Set Runtime attribute for the setup variables used by USB driver."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_CONTROLLERS_INITIAL_DELAY_LIST"
+ Help = "List of USB controllers which need to delay for stabilization in the following format: {vid1, did1, delay time1(ms)}, {vid2, did2, delay time2(ms)}"
+ TokenType = Expression
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "DEFAULT_XHCI_HANDOFF_OPTION"
+ Value = "1"
+ Help = "Default value of the XHCI Hand-off option."
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+TOKEN
+ Name = "USB_STORAGE_DEVICE_RMB_CHECK"
+ Value = "1"
+ Help = "RMB bit returned by inquiry command indicate whether device media is removable.\Off: Always set mass storage devices RemovableMedia.\On: Check RMB status from inquiry data. \"
+ TokenType = Boolean
+ TargetH = Yes
+End
+
+PATH
+ Name = "USBPORTING_DIR"
+End
+
+PATH
+ Name = "UHCD_DIR"
+ Path = "core\em\usb"
+End
+
+PATH
+ Name = "USBRT_DIR"
+ Path = "core\em\usb\rt"
+ Help = "AMI USB runtime files source directory"
+End
+
+PATH
+ Name = "USB_SETUP_DIR"
+ Path = "core\em\usb\setup"
+End
+
+PATH
+ Name = "USB_SB_DIR"
+ Path = "chipset\sb\usb"
+End
+
+MODULE
+ Help = "Includes uhcd.mak into project"
+ Path = "$(UHCD_DIR)"
+ File = "uhcd.mak"
+End
+
+MODULE
+ Help = "Includes usbrt.mak into project"
+ Path = "$(USBRT_DIR)"
+ File = "usbrt.mak"
+End
+
+ELINK
+ Name = "$(BUILD_DIR)\usb.sdb"
+ Parent = "SETUP_SDBS"
+ Priority = 30
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "$(USB_SETUP_DIR)\usb.sd"
+ Parent = "SETUP_DEFINITIONS"
+ Priority = 30
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "$(BUILD_DIR)\uhcd.ffs"
+ Parent = "FV_MAIN"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "$(BUILD_DIR)\usbrt.ffs"
+ Parent = "FV_MAIN"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "InitUSBStrings,"
+ Parent = "SetupStringInit"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "UsbAcpiEnableCallBack,"
+ Parent = "AcpiEnableCallbackList"
+ Token = "USB_RUNTIME_DRIVER_IN_SMM" "=" "1"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "USB_DEV_DELAYED_DRIVER_LIST"
+ InvokeOrder = ReplaceParent
+End
+
+ELINK
+ Name = "USB_DEV_DRIVER_LIST"
+ InvokeOrder = ReplaceParent
+End
+
+ELINK
+ Name = "USB_DEV_EFI_DRIVER_LIST"
+ InvokeOrder = ReplaceParent
+End
+
+ELINK
+ Name = "USBHIDFillDriverEntries,"
+ Parent = "USB_DEV_DELAYED_DRIVER_LIST"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "USBMassFillDriverEntries,"
+ Parent = "USB_DEV_DELAYED_DRIVER_LIST"
+ Token = "USB_DEV_MASS" "=" "1"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "USBCCIDFillDriverEntries,"
+ Parent = "USB_DEV_DELAYED_DRIVER_LIST"
+ Token = "USB_DEV_CCID" "=" "1"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "USBHubFillDriverEntries,"
+ Parent = "USB_DEV_DRIVER_LIST"
+ Token = "USB_DEV_HUB" "=" "1"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "BusFillDriverEntries,"
+ Parent = "USB_DEV_DRIVER_LIST"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "USBHIDFillDriverEntries,"
+ Parent = "USB_DEV_DRIVER_LIST"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "USBMassFillDriverEntries,"
+ Parent = "USB_DEV_DRIVER_LIST"
+ Token = "USB_DEV_MASS" "=" "1"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "USBCCIDFillDriverEntries,"
+ Parent = "USB_DEV_DRIVER_LIST"
+ Token = "USB_DEV_CCID" "=" "1"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "UsbBusInit,"
+ Parent = "USB_DEV_EFI_DRIVER_LIST"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "UsbHidInit,"
+ Parent = "USB_DEV_EFI_DRIVER_LIST"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "UsbMassInit,"
+ Parent = "USB_DEV_EFI_DRIVER_LIST"
+ Token = "USB_DEV_MASS" "=" "1"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "UsbCCIDInit,"
+ Parent = "USB_DEV_EFI_DRIVER_LIST"
+ Token = "USB_DEV_CCID" "=" "1"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "CheckKeyBoardBufferForSpecialChars"
+ Help = "This is a list of OEM KBD routines that consumes KBD buffer to handle some input chanracters differently. \The child eLink can be in following format:Functionname(DEV_INFO fpDevInfo, UINT8 *fpBuffer)"
+ InvokeOrder = ReplaceParent
+End
+
+ELINK
+ Name = "ITEM_CALLBACK(ADVANCED_FORM_SET_CLASS, 0, USB_DEVICES_ENABLED_REFRESH_KEY, UpdateUSBStrings),"
+ Parent = "SetupItemCallbacks"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "{{ 0xEC87D643, 0xEBA4, 0x4BB5, 0xA1, 0xE5, 0x3F, 0x3E, 0x36, 0xB2, 0x0D, 0xA9 }, {'U','s','b','M','a','s','s','D','e','v','N','u','m'}},"
+ Parent = "AMITSE_DYNAMICPARSING_HANDLE_SUPPRESS_LIST"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "{{ 0xEC87D643, 0xEBA4, 0x4BB5, 0xA1, 0xE5, 0x3F, 0x3E, 0x36, 0xB2, 0x0D, 0xA9 }, {'U','s','b','M','a','s','s','D','e','v','V','a','l','i','d'}},"
+ Parent = "AMITSE_DYNAMICPARSING_HANDLE_SUPPRESS_LIST"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "{{ 0xEC87D643, 0xEBA4, 0x4BB5, 0xA1, 0xE5, 0x3F, 0x3E, 0x36, 0xB2, 0x0D, 0xA9 }, {'U','s','b','S','u','p','p','o','r','t'}},"
+ Parent = "AMITSE_DYNAMICPARSING_HANDLE_SUPPRESS_LIST"
+ InvokeOrder = AfterParent
+End \ No newline at end of file
diff --git a/Board/EM/usb/usbport.c b/Board/EM/usb/usbport.c
new file mode 100644
index 0000000..027332f
--- /dev/null
+++ b/Board/EM/usb/usbport.c
@@ -0,0 +1,1444 @@
+//****************************************************************************
+//****************************************************************************
+//** **
+//** (C)Copyright 1985-2016, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Pkwy, Norcross, GA 30093 **
+//** **
+//** Phone (770)-246-8600 **
+//** **
+//****************************************************************************
+//****************************************************************************
+
+//****************************************************************************
+// $Header: /Alaska/SOURCE/Modules/USB/ALASKA/usbport.c 80 10/28/16 3:57a Wilsonlee $
+//
+// $Revision: 80 $
+//
+// $Date: 10/28/16 3:57a $
+//
+//****************************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/USB/ALASKA/usbport.c $
+//
+// 80 10/28/16 3:57a Wilsonlee
+// [TAG] EIP300142
+// [Category] Improvement
+// [Description] Remove USB Int1C module part because we use the other
+// method to service xhci.
+// [Files] usbport.c, amidef.h, amiusbhc.c, UsbLegacy.cif
+//
+// 79 10/28/16 1:28a Wilsonlee
+// [TAG] EIP300142
+// [Category] Improvement
+// [Description] Get vector value from memory 0x1c directly and check
+// it's not zero.
+// [Files] usbport.c, amidef.h
+//
+// 78 2/18/16 10:05p Wilsonlee
+// [TAG] EIP256089
+// [Category] Improvement
+// [Description] Add {0, 0, 0, 0, 0, 0} for the end of USB_SKIP_LIST
+// structure in UsbGetSkipList function.
+// [Files] usbport.c
+//
+// 77 2/16/15 2:43a Wilsonlee
+// [TAG] EIP205373
+// [Category] Improvement
+// [Description] Cppcheck errors in Usb module.
+// [Files] usb.c, usbport.c, uhcd.c, usbCCID.c
+//
+// 76 12/24/14 10:41p Wilsonlee
+// [TAG] EIP196287
+// [Category] Improvement
+// [Description] Display info of connected usb controllers and remove or
+// grayed-out some item according the connected usb controller number.
+// [Files] uhcd.c, usbport.c, usb.uni, usb.sd, usbsetup.c,
+// AmiUsbController.h, UsbPolicy.h
+//
+// 75 11/24/14 12:13a Wilsonlee
+// [TAG] EIP188680
+// [Category] Improvement
+// [Description] Add Genovation USB Mini-Terminal Model #904-RJ to
+// UsbBadDeviceTable.
+// [Files] usbport.c
+//
+// 74 9/23/14 11:52p Wilsonlee
+// [TAG] EIP185391
+// [Category] Improvement
+// [Description] Use 0xF to mask the port number for
+// SKIP_FLAG_SKIP_MULTI_LEVEL function.
+// [Files] usbport.c
+//
+// 73 8/06/14 10:06p Wilsonlee
+// [TAG] EIP180650
+// [Category] Improvement
+// [Description] Hide mass storage devices if "Usb Support" is disable.
+// [Files] usbport.c, uhcd.c
+//
+// 72 6/26/14 1:12a Wilsonlee
+// [TAG] EIP173387
+// [Category] Improvement
+// [Description] Remove TODO comments.
+// [Files] usbsetup.c, xhci.c, usbmass.c, usbCCID.c, usb.c, uhci.c,
+// syskbc.c, usbport.c, usbbus.c, uhcd.c, UsbBotPeim.c, PeiXhci.c,
+// PeiEhci.c
+//
+// 71 6/11/14 8:22p Wilsonlee
+// [TAG] EIP172625
+// [Category] Improvement
+// [Description] Usb skip table function adds the flag
+// "SKIP_FLAG_SKIP_MULTI_LEVEL" that skips usb ports include down stream
+// ports.
+// [Files] usbport.c, AmiUsbController.h
+//
+// 70 5/07/14 10:38a Wilsonlee
+// [TAG] EIP166594
+// [Category] Improvement
+// [Description] Add the token "USB_SETUP_VARIABLE_RUNTIME_ACCESS" to
+// control if we set runtime attribute for the setup variables used by USB
+// module.
+// [Files] usb.sdl, usbport.c, usbsetup.c
+//
+// 69 7/03/13 4:06a Roberthsu
+// [TAG] EIP127455
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] Skip table can not skip device
+// [RootCause] Because xhci root port over than 0xf.
+// [Solution] Check root port use another variable.
+// [Files] usbport.c
+//
+// 68 6/26/13 3:37a Roberthsu
+// [TAG] EIP125792
+// [Category] Bug Fix
+// [Severity:] Normal
+// [Symptom:] Keep function not work
+// [Root Cause] When check port change. We can not get baseclass.
+// [Solution] Add Vaild base class flag.
+// [Files] UsbPort.c,Usb.c
+//
+// 67 3/19/13 3:54a Ryanchou
+// [TAG] EIP118177
+// [Category] Improvement
+// [Description] Dynamically allocate HCStrucTable at runtime.
+// [Files] usb.sdl, usbport.c, usbsb.c, amiusb.c, ehci.c, ohci.c,
+// syskbc.c, sysnokbc.c, uhci.c, usb.c, usbCCID.c, usbdef.h, usbhid.c,
+// usbhub.c, usbmass.c, usbrt.mak, usb.sd, amiusbhc.c, efiusbccid.c,
+// efiusbhid.c, efiusbmass.c, efiusbms.c, uhcd.c, uhcd.h, uhcd.mak,
+// usbmisc.c, usbsrc.sdl
+//
+// 66 3/18/13 4:46a Ryanchou
+// [TAG] EIP98377
+// [Category] Improvement
+// [Description] Optimize USB controller timing.
+// [Files] usb.sdl, usbport.c, ehci.c, elib.c, ohci.c, uhci.c,
+// usbdef.h, usbhub.c, xhci.c, uhcd.c
+//
+// 65 1/22/13 2:40a Wilsonlee
+// [TAG] EIP110305
+// [Category] Improvement
+// [Description] Set the device address after we send the first
+// get-device-descriptor command.
+// [Files] usbmass.c, usb.c, usbdef.h, usbbus.c, efiusbmass.c, uhcd.c,
+// usbport.c
+//
+// 64 1/11/13 4:13a Ryanchou
+// [TAG] EIP102491
+// [Category] Improvement
+// [Description] Synchronized with Aptio V USB module
+// [Files] usbport.c, usbsb.c, ehci.c, ehci.h, ohci.c, ohci.h, uhci.h,
+// usb.c, usbdef.h, usbhid.c, usbhub.c, usbkbd.c, usbkbd.h, usbmass.c.
+// usbms.c, usbpoint.c, xhci.h, usb.sd, amiusbhc.c, componentname.c,
+// efiusbkc.c, efiusbmass.c, uhcd.c, uhcd.h, usbbus.c, usbbus.h, usbmisc.c
+//
+// 63 12/21/12 5:01a Ryanchou
+// [TAG] EIP71730
+// [Category] New Feature
+// [Description] Added OHCI handoff support.
+// [Files] usb.sdl, usbport.c, amiusb.c, usbdef.h, UsbPolicy.h, usb.sd,
+// usb.uni
+//
+// 62 12/19/12 2:51a Roberthsu
+// Correct comment.
+//
+// 61 12/19/12 2:35a Roberthsu
+// [TAG] EIP107664
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] Usb skip table no function
+// [RootCause] HubDeviceNumber and PortNumber fail.
+// [Solution] Restore bHubDeviceNumber and bHubPortNumber.
+// [Files] usbport.c
+//
+// 60 9/13/12 1:41a Ryanchou
+// Fix compile error with x64_BUILD = 0.
+//
+// 59 9/04/12 8:06a Wilsonlee
+// [TAG] EIP99882
+// [Category] New Feature
+// [Description] Add the usb setup item and usbpolicyprotocol to enable
+// or disable the usb mass storage driver.
+// [Files] UsbPolicy.h, usb.uni, usb.sd, usbmass.c, usbdef.h,
+// efiusbmass.c, usbport.c, uhcd.c
+//
+// 58 9/03/12 5:25a Roberthsu
+// [TAG] EIP88776
+// [Category] Improvement
+// [Description] Implement keep port function.
+// [Files] usbport.c,AmiUsbController.h
+//
+// 57 8/29/12 8:06a Ryanchou
+// [TAG] EIP77262
+// [Category] New Feature
+// [Description] Remove SMM dependency of USB.
+// [Files] usb.sdl, usbport.c, amiusb.c, amiusb.dxs, amiusb.h, ehci.c,
+// elib.c, ohci.c, uhci.c, usb.c, usbdef.h, usbrt.mak, xhci.c, amiusbhc.c,
+// efiusbccid.c, efiusbhid.c, efiusbkb.c, efiusbmass.c, uhcd.c, uhcd.dxs,
+// uhcd.h, usbmisc.c, AmiUsbController.h
+//
+// 56 5/04/12 6:36a Ryanchou
+// [TAG] EIP82875
+// [Category] Improvement
+// [Description] Support start/stop individual USB host to avoid
+// reconnect issues.
+// [Files] usbport.c, usbsb.c, amiusb.c, amiusb.h, ehci.c, ohci.c,
+// uhci.c, uhci.h, usb.c, usbdef.h, xhci.c, amiusbhc.c, uhcd.c, uhcd.h,
+// usbbus.c, usbmisc.c
+//
+// 55 5/03/12 5:06a Ryanchou
+// [TAG] EIP83361
+// [Category] New Feature
+// [Description] Added "USB 2.0 Controller Mode" setup item.
+// [Files] ehci.c, usb.sd, usb.sdl, usb.uni, usbdef.h, UsbPolicy.h,
+// usbport.c
+//
+// 54 5/02/12 8:11a Wilsonlee
+// [TAG] EIP86793
+// [Category] New Feature
+// [Description] Add the SDL token "USB_MASS_EMULATION_FOR_NO_MEDIA" for
+// determine the USB mass storage device emulation type without media.
+// [Files] usbmass.c, usbport.c, uhcd.c, usbdef.h, usbsrc.sdl
+//
+// 53 4/05/12 10:54a Ryanchou
+// [TAG] EIP74685
+// [Category] New Feature
+// [Description] Add a token "USB_BAD_DEVICES" that is used to list the
+// bad devices for OEM.
+// [Files] usb.sdl, usbport.c
+//
+// 52 1/14/12 6:40a Wilsonlee
+// [TAG] EIP80382
+// [Category] New Feature
+// [Description] Add the SDL token "USB_MASS_EMULATION_BY_SIZE" for
+// determine the USB mass storage device emulation type by size only.
+// [Files] usbmass.c, usbport.c, uhcd.c, usbdef.h, usbsrc.sdl
+//
+// 51 1/06/12 1:03a Rajeshms
+// [TAG] EIP62737
+// [Category] Improvement
+// [Description] Added USB Device number into USB mass device name
+// string based on SDL Token.
+// [Files] Usb.sdl, usbport.c, usbmass.c, UsbInt13.h, UsbInt13.c,
+// usbbus.c, Bfiusb.equ
+//
+// 50 12/26/11 2:32a Roberthsu
+// Correct checkin comment.
+//
+// 49 12/26/11 2:21a Roberthsu
+// [TAG] EIP74609
+// [Category] Improvement
+// [Description] Add check oemskiplist at check port change.
+// [Files] usbport.c,usb.c,AmiUsbController.h
+//
+// 48 12/08/11 1:44a Ryanchou
+// [TAG] EIP75441
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] System hangs at 0xB4 after restart from Win7
+// [RootCause] The device does not use standard BOT protocol under
+// Windows.
+// [Solution] Add the device into bad device table.
+// [Files] usb.c usbport.c
+//
+// 47 11/16/11 3:18a Ryanchou
+// [TAG] EIP70094
+// [Category] Improvement
+// [Description] Microsoft CSM Opt-Out feature implementation.
+// [Files] amiusb.c, uhcd.c, usbport.c
+//
+// 46 11/05/11 7:34a Wilsonlee
+// [TAG] EIP64781
+// [Category] New Feature
+// [Description] Added SDL token
+// SKIP_CARD_READER_CONNECT_BEEP_IF_NO_MEDIA that skip the connect beep if
+// no media present in USB card reader.
+// [Files] usbport.c, usbmass.c, usb.c, usbdef.h, uhcd.c usbsrc.sdl
+//
+// 45 10/17/11 2:23a Ryanchou
+// [TAG] EIP69136
+// [Category] Improvement
+// [Description] Remove the dependency of EBDA in USB module for CSM
+// disabling.
+// [Files] amiusb.c, uhcd.c, usbport.c, usbsb.c
+//
+// 44 9/28/11 10:46a Ryanchou
+// [TAG] EIP66064
+// [Category] Bug Fix
+// [Severity] Minor
+// [Symptom] System hangs when waiting for finger swipe
+// [RootCause] USB driver save the URP pointer to EBDA in function
+// UsbSmiCore and UsbSmiHc, the pointer will be destroyed if someone also
+// invoke the two functions.
+// [Solution] Save the URP pointer before generate SW SMI and restore it
+// after return from SMI.
+// [Files] amiusb.c, amiusbhc.c, usbport.c
+//
+// 43 8/08/11 5:14a Ryanchou
+// [TAG] EIP60561
+// [Category] New Feature
+// [Description] Add USB timing policy protocol for timing override.
+// [Files] ehci.c, guids.c, ohci.c, uhcd.c, uhci.c usb.c, usbdef.h,
+// usbhub.c, usbmass.c, UsbPolicy.h, usbport.c usbsrc.sdl
+//
+// 42 8/05/11 6:17a Ryanchou
+// [TAG] EIP60706
+// [Category] Improvement
+// [Description] Move gUsbBadDeviceTable into SMRAM.
+// [Files] usbport.c, amiusb.c, usb.c, uhcd.c, AmiUsbController.h
+//
+// 41 6/22/11 2:14a Ryanchou
+// [TAG] EIP62695
+// [Improvement] Add new oemskiplist function
+// [Description] Add skip function by controller or port.Skip by device
+// type or port number.
+//
+// 40 4/13/11 12:47a Ryanchou
+// [TAG] EIP58029
+// [Category] Bug Fix
+// [Severity] Important
+// [Symptom] System hangs when insert USB devices
+// [RootCause] The function OEMSkipList uses LocateProtocol to get USB
+// global data pointer, uses Boot Services in runtime may cause system
+// hang.
+// [Solution] Extern usb global data pointer.
+// [Files] usbport.c
+//
+// 39 4/06/11 12:52a Ryanchou
+// [TAG] EIP51653
+// [Category] New Feature
+// [Description] Added an interface that skips specific port
+// enumeration.
+// [Files] AmiUsbController.h, uhcd.c, uhcd.h, usb.c, usbdef.h,
+// usbport.c
+//
+// 38 3/29/11 10:05a Ryanchou
+// [TAG] EIP53518
+// [Category] Improvement
+// [Description] Added chipset xHCI chip support.
+// [Files] amiusb.c, amiusb.h, ehci.c, ohci.c, uhcd.c, uhci.c, usb.c,
+// usb.sdl, usbdef.h, usbport, usbsb.c, xhci.c
+//
+// 37 10/29/10 5:33a Ryanchou
+// EIP46992: USB module build failed with WDK after apply EIP44570.
+//
+// 36 10/22/10 8:56a Ryanchou
+// EIP46693: Clear xHCI BIOS owned semaphore bit and SMI enable bit in
+// PreInitXhci.
+//
+// 35 10/21/10 8:56a Ryanchou
+// EIP44570: Added multiple xHCI SMI pin support.
+//
+// 34 10/12/10 4:52a Rameshr
+// [TAG]- EIP 44585
+// [Category]-IMPROVEMENT
+// [Description]- Number of maximum supported USB Mass Storage device
+// increased from 8 to 16.
+// [Files]- Uin13.bin, UsbPort.c, UsbInt13.h, Usb.c, Usbdef.h, Uasbmass.c,
+// Usb.sd, usb.uni, UsbSetup.c, UsbSrc.sdl, UsbPolicy.h
+//
+// 33 10/12/10 2:05a Rameshr
+// [TAG]- EIP 44585
+// [Category]-IMPROVEMENT
+// [Description]- Number of maximum supported USB Mass Storage device
+// increased from 8 to 16.
+// [Files]- Uin13.bin, UsbPort.c, UsbInt13.h, Usb.c, Usbdef.h, Uasbmass.c,
+// Usb.sd, usb.uni, UsbSetup.c, UsbSrc.sdl, UsbPolicy.h
+//
+// 32 9/16/10 1:09p Olegi
+//
+// 31 8/31/10 8:52a Tonylo
+// EIP41544 - Add EntronTech XHCI support.
+//
+// 30 7/13/10 7:03a Ryanchou
+// EIP38356: Implement shutdown USB legacy support in ACPI enable call.
+//
+// 29 6/23/10 10:18a Olegi
+//
+// 28 6/22/10 9:15p Olegi
+// EIP39708: added incompatible mouse "SANWA Supply MA-LS11DS USB Mouse"
+//
+// 27 6/15/10 1:25a Ryanchou
+// Implement xHCI USB Legacy Capability.
+//
+// 26 6/10/10 10:45p Ryanchou
+// Remove SMSC USB Floppy in gUsbBadDeviceTable.
+//
+// 25 5/20/10 11:56a Olegi
+//
+// 24 5/19/10 4:01p Olegi
+//
+// 23 4/19/10 1:54p Olegi
+//
+// 22 4/12/10 12:20p Olegi
+// Moving structure definitions to the .H file. EIP36942
+//
+// 21 4/02/10 10:09a Olegi
+//
+// 20 4/02/10 8:57a Olegi
+//
+// 19 12/10/09 10:10a Olegi
+// Added UsbControlTimeout setup selection. EIP30079.
+//
+// 18 11/23/09 3:28p Olegi
+// Fix for EIP30023: access gSetupData only when GetVariable returns
+// EFI_SUCCESS.
+//
+// 17 11/13/09 9:11a Olegi
+// EIP31023: key repeat rates are defined by SDL tokens.
+//
+// 16 10/30/09 5:48p Olegi
+//
+// 15 10/09/09 5:56p Olegi
+//
+// 14 10/06/09 6:19p Olegi
+//
+// 13 5/21/09 5:10p Olegi
+// Added HDD hotplug support.
+//
+// 12 3/26/09 2:17p Olegi
+// All setup related code is moved to OEMPORT.C to maximize the porting
+// capabilities.
+//
+// 11 2/27/09 10:27a Olegi
+//
+// 10 2/18/09 3:45p Olegi
+// Added a feature that allows to skip mass storage device installation
+// depending on physical media presence. EIP#19260.
+//
+// 9 11/25/08 6:03p Olegi
+// Support for OEM USB Boot Override feature. EIP#17052.
+//
+// 8 7/04/08 1:06p Olegi
+// NATIVE emulation option EIP 14317
+//
+// 7 5/16/08 12:00p Olegi
+// Compliance with AMI coding standard.
+//
+// 6 2/06/08 11:44a Olegi
+// Added UpdateHCPCIInfo function.
+//
+// 5 12/17/07 4:03p Olegi
+// Removed kbc_support variable.
+//
+// 4 5/22/07 1:20p Yakovlevs
+// Added code to initialize kbc_support variable if KBC_SUPPORT token is
+// undefined
+//
+// 3 11/10/05 11:10a Olegi
+//
+// 2 8/04/05 5:57p Andriyn
+// Legacy over LegacyFree
+//
+// 1 3/29/05 10:16a Olegi
+//
+//****************************************************************************
+//
+//<AMI_FHDR_START>
+//-----------------------------------------------------------------------------
+//
+// Name: USBPORT.C
+//
+// Description: AMI USB Porting file
+//
+//-----------------------------------------------------------------------------
+//<AMI_FHDR_END>
+
+//****************************************************************************
+
+#include "Efi.h"
+#include "token.h"
+#include "Setup.h"
+#include "amidef.h"
+#include "usbdef.h"
+#include "uhcd.h"
+
+#if defined(CSM_SUPPORT) && CSM_SUPPORT //(EIP69136+)
+#include <Protocol\LegacyBiosExt.h>
+#endif //(EIP69136+)
+
+#if USB_DIFFERENTIATE_IDENTICAL_DEVICE_NAME
+static UINT8 DeviceNumber=1;
+#endif
+
+#if USB_RT_DRIVER
+//-----------------------------------------------------------------------------
+// This part is linked with USBRT and located in SMI
+
+//<AMI_THDR_START>
+//----------------------------------------------------------------------------
+// Name: USBBadDeviceTable
+//
+// Description: This table contains list of vendor & device IDs of USB
+// devices that are non-compliant. This is currently used
+// only for USB mass storage devices but can be extended to
+// other type of non-compliant devices also.
+//
+//----------------------------------------------------------------------------
+//<AMI_THDR_END>
+
+USB_BADDEV_STRUC gUsbBadDeviceTable[] = {
+// Intel, Lacie hard disk
+ {0x059f, 0xa601,
+ 0, 0, PROTOCOL_CBI_NO_INT,
+ 0},
+
+// In-systems ATA bridge
+ {0x05ab, 0x0060,
+ 0, 0, 0,
+ USB_INCMPT_START_UNIT_NOT_SUPPORTED},
+
+// Data Store Technologies, USB 2 ATA bridge
+ {0x04e6, 0x0001,
+ BASE_CLASS_MASS_STORAGE, 0, PROTOCOL_CBI_NO_INT,
+ USB_INCMPT_BOT_STATUS_FAILED},
+
+// NEC, Floppy drive
+ {0x0409, 0x0040,
+ 0, 0, PROTOCOL_CBI_NO_INT,
+ 0},
+
+// Hana flash drive
+ {0x090a, 0x1001,
+ 0, 0, 0, \
+ USB_INCMPT_SINGLE_LUN_DEVICE +
+ USB_INCMPT_MODE_SENSE_NOT_SUPPORTED},
+
+// Compact Flash reader
+ {0x04e6, 0x000a,
+ 0, 0, 0,
+ USB_INCMPT_MODE_SENSE_NOT_SUPPORTED},
+
+// ScanLogic SL11R-IDE and Ennyah RW4420U
+ {0x04ce, 0x0002,
+ 0, SUB_CLASS_SL11R, PROTOCOL_BOT,
+ 0},
+
+// BAFO Slim CDR-W BF-2100
+ {0x09cc, 0x0404,
+ 0, 0, PROTOCOL_CBI,
+ 0},
+
+//Panasonic USB CD/RW Model:KXL-RW21AN
+ {0x04da, 0x0d06,
+ BASE_CLASS_MASS_STORAGE, 0, PROTOCOL_CBI,
+ 0},
+
+ {0x04da, 0x0d07,
+ BASE_CLASS_MASS_STORAGE, 0, PROTOCOL_CBI,
+ 0},
+
+//TaiDen Technology:CoolFlash
+ {0x0ea0, 0x6803,
+ 0, 0, 0,
+ USB_INCMPT_MODE_SENSE_NOT_SUPPORTED},
+
+// A-Bit USB Mouse(Model:97M32U)
+ {0x0605, 0x0001,
+ 0, 0, 0,
+ USB_INCMPT_SET_BOOT_PROTOCOL_NOT_SUPPORTED},
+
+// The problem with this card reader is fixed elsewhere
+// HP 4-in-1 Card reader (does not support Read Format Capacity command)
+// {0x6050, 0x0034,
+// 0, 0, 0,
+// USB_INCMPT_FORMAT_CAPACITY_NOT_SUPPORTED},
+
+// Silicon Motion Inc., Taiwan: USB Flash Disk
+ {0x090c, 0x1000,
+ 0, 0, 0,
+ USB_INCMPT_GETMAXLUN_NOT_SUPPORTED},
+
+//Intel KVM HID
+ {0x8086, 0x2b,
+ 0, 0, 0,
+ USB_INCMPT_HID_DATA_OVERFLOW},
+
+// SANWA Supply MA-LS11DS USB Mouse
+ {0x04fc, 0x0801,
+ 0, 0, 0,
+ USB_INCMPT_BOOT_PROTOCOL_IGNORED},
+ //(EIP75441+)>
+// SanDisk 2GB Sansa Clip+ MP3 Player
+ {0x0781, 0x74D0,
+ 0xFF, 0xFF, 0xFF,
+ 0},
+
+// SanDisk Sansa Fuze 4GB Flash Portable Media Player
+ {0x0781, 0x74C2,
+ 0xFF, 0xFF, 0xFF,
+ 0},
+ //<(EIP75441+)
+// Genovation USB Mini-Terminal Model #904-RJ
+ {0x16C0, 0x0604,
+ 0, 0, 0,
+ USB_INCMPT_DISABLE_DEVICE},
+#ifdef USB_BAD_DEVICES
+ USB_BAD_DEVICES
+#endif
+// End of incompatible device list
+ {0, 0, 0, 0, 0, 0}
+};
+
+UINT16 gKbcSetTypeRate11CharsSec=KEY_REPEAT_DELAY;
+UINT16 gKbcSetTypeDelay500MSec=KEY_REPEAT_INITIAL_DELAY;
+extern USB_GLOBAL_DATA *gUsbData; //EIP58029
+
+DEV_INFO* USB_GetDeviceInfoStruc(UINT8, DEV_INFO*, UINT8, HC_STRUC*);
+
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: OEMSkipList
+//
+// Description: This function intends to skip port.
+//
+// Notes:
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+BOOLEAN
+OEMSkipList (
+ UINT8 HubAddr,
+ UINT8 PortNum,
+ UINT16 Bdf,
+ UINT8 BaseClass,
+ UINT8 VaildBaseClass
+)
+{
+ //(EIP88776+)>
+ USB_SKIP_LIST *UsbSkipListTable;
+ DEV_INFO *TmpDevInfo;
+ UINT8 TablePortNumber;
+ UINT8 ConnectDeviceNumber;
+ UINT8 ConnectPortNumber;
+ UINT16 i;
+ UINT16 TableLevel;
+ UINT16 ConnectLevel;
+ UINT32 TablePath;
+ UINT32 ConnectPath;
+ UINT32 ConnectPathMask;
+
+ UsbSkipListTable = (USB_SKIP_LIST*) gUsbData->gUsbSkipListTable;
+
+ if (UsbSkipListTable == NULL) {
+ return FALSE;
+ }
+
+ for ( ; (UsbSkipListTable->wBDF != 0); UsbSkipListTable++) {
+ TablePortNumber = UsbSkipListTable->bRootPort;
+ TablePath = UsbSkipListTable->dRoutePath;
+ for (i = 1; i < 5; i++, TablePath >>= 4) {
+ if (TablePath == 0) {
+ break;
+ }
+ }
+
+ TablePath = UsbSkipListTable->dRoutePath;
+ TableLevel = i;
+ USB_DEBUG(4, "TableLevel = %x TablePath = %x TablePortNumber = %x BDF = %x\n",
+ TableLevel,TablePath,TablePortNumber, UsbSkipListTable->wBDF);
+
+ //get connect path and level
+ ConnectDeviceNumber = HubAddr;
+ ConnectPortNumber = PortNum;
+ for (i = 1, ConnectPath = 0; i < 5; i++) {
+ if (ConnectDeviceNumber & BIT7) {
+ break;
+ }
+ ConnectPath = ConnectPath << 4;
+ ConnectPath |= ConnectPortNumber;
+
+ // Get the device info structure for the matching device address
+ TmpDevInfo = USB_GetDeviceInfoStruc(
+ USB_SRCH_DEV_ADDR,
+ 0,
+ ConnectDeviceNumber,
+ 0);
+ if (TmpDevInfo == NULL) {
+ break;
+ }
+ ConnectDeviceNumber = TmpDevInfo->bHubDeviceNumber;
+ ConnectPortNumber = TmpDevInfo->bHubPortNumber;
+ }
+ ConnectLevel = i;
+ USB_DEBUG(4, "ConnectLevel = %x ConnectPath = %x ConnectPortNumber = %x BDF = %x\n",
+ ConnectLevel, ConnectPath, ConnectPortNumber, Bdf);
+
+ //Skip by all
+ if (UsbSkipListTable->bSkipType == SKIP_FOR_ALLCONTROLLER) {
+ if (UsbSkipListTable->bFlag == SKIP_FLAG_SKIP_LEVEL) {
+ if (TableLevel != ConnectLevel) {
+ continue;
+ }
+ }
+
+ if (UsbSkipListTable->bBaseClass == 0) {
+ return TRUE;
+ }
+
+ if (UsbSkipListTable->bBaseClass == BaseClass) {
+ return TRUE;
+ }
+
+ continue;
+ }
+
+ if (UsbSkipListTable->wBDF != Bdf) {
+ continue;
+ }
+
+ //Skip by controller
+ if (UsbSkipListTable->bRootPort == 0) {
+ if (UsbSkipListTable->bBaseClass != 0) {
+ if (UsbSkipListTable->bBaseClass != BaseClass) {
+ continue;
+ } else {
+ return TRUE;
+ }
+ }
+ return TRUE;
+ }
+ //Skip usb ports which include down stream ports.
+ if (UsbSkipListTable->bFlag == SKIP_FLAG_SKIP_MULTI_LEVEL) {
+ ConnectPathMask = 0xFFFFFFFF >> (4 * (8 - (TableLevel)));
+ ConnectPathMask = ConnectPathMask >> 4;
+ if (((ConnectPath & ConnectPathMask) == TablePath) && (ConnectPortNumber == TablePortNumber)){
+ if (UsbSkipListTable->bBaseClass != 0) {
+ if (UsbSkipListTable->bBaseClass == BaseClass) {
+ return TRUE;
+ }
+ continue;
+ }
+ return TRUE;
+ }
+ continue;
+ }
+
+ if (TableLevel != ConnectLevel) {
+ continue;
+ }
+ //Skip usb ports on the same level.
+ if (UsbSkipListTable->bFlag == SKIP_FLAG_SKIP_LEVEL) {
+ if (UsbSkipListTable->bBaseClass == 0) {
+ return TRUE;
+ }
+
+ if (UsbSkipListTable->bBaseClass == BaseClass) {
+ return TRUE;
+ }
+ }
+ for (i = 0; i < TableLevel; i++, ConnectPath >>= 4, TablePath >>= 4) {
+ if (i == (TableLevel - 1)) {
+ switch (UsbSkipListTable->bFlag) {
+ case SKIP_FLAG_SKIP_PORT:
+ if ((ConnectPath == TablePath) && (ConnectPortNumber == TablePortNumber)){
+ if (UsbSkipListTable->bBaseClass != 0) {
+ if (UsbSkipListTable->bBaseClass == BaseClass) {
+ return TRUE;
+ }
+ break;
+ }
+ return TRUE;
+ }
+ break;
+ case SKIP_FLAG_KEEP_PORT:
+ if (ConnectPortNumber == TablePortNumber) {
+ if (ConnectPath == TablePath) {
+ if (UsbSkipListTable->bBaseClass != 0) {
+ if (VaildBaseClass == 1) {
+ if (UsbSkipListTable->bBaseClass != BaseClass) {
+ return TRUE;
+ }
+ }
+ }
+ break;
+ }
+ return TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+ } else {
+ if ((ConnectPath & 0xf) != (TablePath & 0xf)) {
+ break;
+ }
+ }
+ }
+ }
+
+ return FALSE;
+ //<(EIP88776+)
+}
+
+// End of SMI part of USBPORT.C
+//-----------------------------------------------------------------------------
+#else
+//-----------------------------------------------------------------------------
+// This part is linked with UHCD and located outside SMI
+extern USB_GLOBAL_DATA *gUsbData; //EIP58029
+extern EFI_GUID gEfiSetupGuid;
+
+UINT8 gFddHotplugSupport = USB_HOTPLUG_FDD;
+UINT8 gHddHotplugSupport = USB_HOTPLUG_HDD;
+UINT8 gCdromHotplugSupport = USB_HOTPLUG_CDROM;
+UINT8 gUsbMassNativeEmulation = USB_MASS_EMULATION_NATIVE;
+UINT8 UsbMassEmulationForNoMedia = USB_MASS_EMULATION_FOR_NO_MEDIA; //(EIP86793+)
+ //(EIP80382+)>
+#ifndef USB_MASS_EMULATION_BY_SIZE
+#define USB_MASS_EMULATION_BY_SIZE 0
+#endif
+UINT8 UsbMassSizeEmulation = USB_MASS_EMULATION_BY_SIZE;
+ //<(EIP80382+)
+#ifndef REMOVE_CHECK_FOR_USB_FLOPPY_DRIVE
+#define REMOVE_CHECK_FOR_USB_FLOPPY_DRIVE 0
+#endif
+UINT8 gUsbMassMediaCheck = REMOVE_USB_STORAGE_FROM_BBS_IF_NO_MEDIA;
+UINT8 gUsbMassSkipFddMediaCheck = REMOVE_CHECK_FOR_USB_FLOPPY_DRIVE;
+UINT8 gUsbEfiMsDirectAccess = USB_EFIMS_DIRECT_ACCESS;
+UINT8 SkipCardReaderConnectBeep = SKIP_CARD_READER_CONNECT_BEEP_IF_NO_MEDIA; //(EIP64781+)
+
+//USB_SUPPORT_SETUP gSetupData; //(EIP99882-)
+
+//(EIP51653+)>
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: UsbGetSkipList
+//
+// Description: This function returns a name string of connected mass storage
+// device.
+//
+// Input: SkipStruc - Pointer to a skip list to be filled
+// TotalStruc - Size of the data to copy to a buffer
+// Output: None
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+VOID
+UsbGetSkipList(
+ USB_SKIP_LIST *SkipStruc,
+ UINT8 TotalStruc
+)
+{
+ EFI_STATUS Status;
+
+ Status = pBS->AllocatePool(
+ EfiRuntimeServicesData,
+ (TotalStruc + 1) * sizeof(USB_SKIP_LIST),
+ &(gUsbData->gUsbSkipListTable));
+
+ if (EFI_ERROR(Status)) {
+ return;
+ }
+
+ pBS->SetMem(gUsbData->gUsbSkipListTable, (TotalStruc + 1) * sizeof(USB_SKIP_LIST), 0);
+ pBS->CopyMem(gUsbData->gUsbSkipListTable,SkipStruc, TotalStruc*sizeof(USB_SKIP_LIST));
+
+ return;
+}
+//<(EIP51653+)
+
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: UpdateHcPciInfo
+//
+// Description: This function is called from the UHCD entry point, HcPciInfo
+// can be updated here depending on the platform and/or chipset
+// requirements.
+//
+// Input: None
+//
+// Output: EFI_STATUS - Updating succeeded / failed
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS
+UpdateHcPciInfo()
+{
+ return EFI_UNSUPPORTED;
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: OemGetAssignedUsbBootPort
+//
+// Description: This procedure return specific USB host controller index and
+// port number for BIOS to give specific mass storage device
+// have highest boot priority.
+//
+// Input: None
+//
+// Output:
+// EFI_SUCCESS USB boot device assigned
+// UsbHcIndx USB host index (1-based)
+// UsbHubPortIndx USB hub port index (1-based)
+// EFI_UNSUPPORTED No USB boot device assigned
+// EFI_INVALID_PARAMETER UsbHcIndx or UsbHubPortIndx are NULL
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS
+OemGetAssignUsbBootPort (
+ UINT8 *UsbHcIndx,
+ UINT8 *UsbHubPortIndx
+)
+{
+ if (UsbHcIndx == NULL || UsbHubPortIndx == NULL)
+ {
+ return EFI_INVALID_PARAMETER;
+ }
+/*
+ // The code below is the sample implementation that reports Port#3 of HC#7
+ // to be a port of boot priority device
+ *UsbHcIndx = 7;
+ *UsbHubPortIndx = 3;
+
+ return EFI_SUCCESS;
+*/
+ return EFI_UNSUPPORTED;
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: InitUsbSetupVars
+//
+// Description: This is porting function that fills in USB related fields in
+// gSetupData variable according to the setup settings and OEM
+// policy.
+//
+// Input: Pointers to USB data, Boot Services and Runtime Services
+//
+// Output: The status of gSetupData initialization
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS
+InitUsbSetupVars (
+ USB_GLOBAL_DATA *UsbData,
+ EFI_BOOT_SERVICES *pBS,
+ EFI_RUNTIME_SERVICES *pRS
+)
+{
+
+ UINTN VariableSize;
+ USB_MASS_DEV_NUM MassDevNum;
+ EFI_STATUS Status;
+ UINT8 Index;
+ USB_MASS_DEV_VALID MassDevValid= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ UINT32 VariableAttributes = EFI_VARIABLE_BOOTSERVICE_ACCESS;
+ USB_CONTROLLER_NUM UsbControllerNum;
+
+#if USB_SETUP_VARIABLE_RUNTIME_ACCESS
+ VariableAttributes |= EFI_VARIABLE_RUNTIME_ACCESS;
+#endif
+
+ UsbControllerNum.UhciNum = 0;
+ UsbControllerNum.OhciNum = 0;
+ UsbControllerNum.EhciNum = 0;
+ UsbControllerNum.XhciNum = 0;
+ VariableSize = sizeof(UsbControllerNum);
+
+ Status = pRS->SetVariable(L"UsbControllerNum",
+ &gEfiSetupGuid,
+ VariableAttributes,
+ VariableSize,
+ &UsbControllerNum);
+
+ MassDevNum.UsbMassDevNum = 0;
+ MassDevNum.IsInteractionAllowed = 1;
+ VariableSize = sizeof(MassDevNum);
+
+ Status = pRS->SetVariable(L"UsbMassDevNum",
+ &gEfiSetupGuid,
+ VariableAttributes,
+ VariableSize,
+ &MassDevNum);
+
+ //
+ // Initilize the Variable to 0
+ //
+ VariableSize = sizeof(MassDevValid);
+ Status = pRS->SetVariable( L"UsbMassDevValid",
+ &gEfiSetupGuid,
+ VariableAttributes,
+ VariableSize,
+ &MassDevValid );
+
+ if (UsbData == NULL) {
+ return EFI_SUCCESS;
+ }
+
+ VariableSize = sizeof(USB_SUPPORT_SETUP);
+ Status = pRS->GetVariable( L"UsbSupport", &gEfiSetupGuid, NULL,
+ &VariableSize, &UsbData->UsbSetupData);
+ if (EFI_ERROR(Status)) {
+ // Set default values and save "UsbSupport" variable.
+ pBS->SetMem(&UsbData->UsbSetupData, sizeof(UsbData->UsbSetupData), 0);
+
+ UsbData->UsbSetupData.UsbMainSupport = 1;
+
+ if (gFddHotplugSupport) {
+ UsbData->UsbSetupData.UsbHotplugFddSupport = SETUP_DATA_HOTPLUG_AUTO;
+ }
+ if (gHddHotplugSupport) {
+ UsbData->UsbSetupData.UsbHotplugHddSupport = SETUP_DATA_HOTPLUG_AUTO;
+ }
+ if (gCdromHotplugSupport) {
+ UsbData->UsbSetupData.UsbHotplugCdromSupport = SETUP_DATA_HOTPLUG_AUTO;
+ }
+
+ UsbData->UsbSetupData.UsbMassResetDelay = SETUP_DATA_RESETDELAY_20S;
+ UsbData->UsbSetupData.UsbControlTimeOut = 20; //(EIP30079+)
+ UsbData->UsbSetupData.UsbXhciSupport = 1;
+ UsbData->UsbSetupData.UsbHiSpeedSupport = 1;
+ UsbData->UsbSetupData.UsbMassDriverSupport = 1;
+
+ VariableAttributes |= EFI_VARIABLE_NON_VOLATILE;
+
+ Status = pRS->SetVariable(
+ L"UsbSupport",
+ &gEfiSetupGuid,
+ VariableAttributes,
+ sizeof(UsbData->UsbSetupData),
+ &UsbData->UsbSetupData );
+ }
+
+ if (gFddHotplugSupport) {
+ UsbData->fdd_hotplug_support = UsbData->UsbSetupData.UsbHotplugFddSupport;
+ }
+ if (gHddHotplugSupport) {
+ UsbData->hdd_hotplug_support = UsbData->UsbSetupData.UsbHotplugHddSupport;
+ }
+ if (gCdromHotplugSupport) {
+ UsbData->cdrom_hotplug_support = UsbData->UsbSetupData.UsbHotplugCdromSupport;
+ }
+ UsbData->UsbXhciHandoff = UsbData->UsbSetupData.UsbXhciHandoff;
+ UsbData->UsbEhciHandoff = UsbData->UsbSetupData.UsbEhciHandoff;
+ UsbData->UsbOhciHandoff = UsbData->UsbSetupData.UsbOhciHandoff;
+ UsbData->UsbEmul6064 = UsbData->UsbSetupData.UsbEmul6064;
+ UsbData->UsbMassResetDelay = UsbData->UsbSetupData.UsbMassResetDelay;
+ for (Index=0; Index<16; Index++) {
+ UsbData->USBMassEmulationOptionTable[Index] =
+ *((UINT8*)&UsbData->UsbSetupData.UsbEmu1+Index);
+ }
+ if (UsbData->UsbSetupData.UsbLegacySupport == 1) {
+ UsbData->dUSBStateFlag |= USB_FLAG_DISABLE_LEGACY_SUPPORT;
+ }
+ UsbData->wTimeOutValue = UsbData->UsbSetupData.UsbControlTimeOut*1000 ; //(EIP30079+)
+ UsbData->UsbXhciSupport = UsbData->UsbSetupData.UsbXhciSupport;
+ UsbData->UsbHiSpeedSupport = UsbData->UsbSetupData.UsbHiSpeedSupport;
+
+ UsbData->PowerGoodDeviceDelay =
+ (UsbData->UsbSetupData.PowerGoodDeviceDelay == 0)? 0 : UsbData->UsbSetupData.PowerGoodDeviceNumDelay;
+
+ return EFI_SUCCESS;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+//
+// Procedure: UsbSetupGetLegacySupport
+//
+// Description: Returns the status of "USB legacy support" question from Setup.
+//
+// Input: None
+//
+// Output: 0 - Enable, 1 - Disable, 2 - Auto
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+UINT8 UsbSetupGetLegacySupport()
+{
+ return gUsbData->UsbSetupData.UsbLegacySupport; //(EIP99882)
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+//
+// Procedure: UpdateMassDevicesForSetup
+//
+// Description: Updates "UsbMassDevNum" setup variable according to the number
+// of installed mass storage devices.
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS
+UpdateMassDevicesForSetup()
+{
+ EFI_STATUS Status;
+ UINTN VariableSize;
+ CONNECTED_USB_DEVICES_NUM devs;
+ USB_MASS_DEV_NUM SetupData;
+ UINT8 MassDevValid[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ UINT8 i;
+ UINT32 VariableAttributes = EFI_VARIABLE_BOOTSERVICE_ACCESS;
+
+#if USB_SETUP_VARIABLE_RUNTIME_ACCESS
+ VariableAttributes |= EFI_VARIABLE_RUNTIME_ACCESS;
+#endif
+
+ VariableSize = sizeof(SetupData);
+ Status = pRS->GetVariable( L"UsbMassDevNum",
+ &gEfiSetupGuid,
+ NULL,
+ &VariableSize,
+ &SetupData );
+
+ if (Status == EFI_SUCCESS) {
+ if (!SetupData.IsInteractionAllowed) return EFI_SUCCESS;
+ }
+
+ ReportDevices(&devs);
+
+ SetupData.UsbMassDevNum = devs.NumUsbMass;
+
+ Status = pRS->SetVariable( L"UsbMassDevNum",
+ &gEfiSetupGuid,
+ VariableAttributes,
+ VariableSize,
+ &SetupData );
+
+ //
+ // Based on avilable USB mass storage device, set the device avilable flag
+ //
+ for(i=0;i<devs.NumUsbMass;i++) {
+ MassDevValid[i]=1;
+ }
+
+ VariableSize = sizeof(USB_MASS_DEV_VALID);
+
+ Status = pRS->SetVariable( L"UsbMassDevValid",
+ &gEfiSetupGuid,
+ VariableAttributes,
+ VariableSize,
+ &MassDevValid );
+
+ return Status;
+}
+
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: Usb3OemGetMaxDeviceSlots
+//
+// Description: Returns maximum device slots to be enabled and programmed
+// in MaxSlotsEn field of XHCI CONFIG register. Valid range
+// is 1...HCPARAMS1.MaxSlots (see xhci.h for details)
+//
+// Output: EFI_SUCCESS - Valid value is reported in MaxSlots
+// EFI_UNSUPPORTED - Function is not ported; MaxSlots will
+// be used from HCPARAMS1 field.
+// Notes: Porting is optional
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS
+Usb3OemGetMaxDeviceSlots(
+ OUT UINT8 *MaxSlots
+)
+{
+ return EFI_UNSUPPORTED;
+}
+
+
+/*
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: XHCI_InterruptHandler
+//
+// Description:
+// Hardware interrupt handler
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+VOID
+XHCI_InterruptHandler (
+ IN EFI_EXCEPTION_TYPE InterruptType,
+ IN EFI_SYSTEM_CONTEXT SystemContext
+ )
+{
+ EFI_TPL OriginalTPL;
+
+ OriginalTPL = pBS->RaiseTPL (TPL_HIGH_LEVEL);
+
+ gPic->EndOfInterrupt (gPic, gVector);
+
+ pBS->RestoreTPL (OriginalTPL);
+ USB_DEBUG(3, "xhci interrupt..\n");
+}
+*/
+
+VOID
+XhciTimerCallback(
+ EFI_EVENT Event,
+ VOID *Context
+)
+{
+ EFI_TPL OriginalTPL;
+
+ OriginalTPL = pBS->RaiseTPL (TPL_HIGH_LEVEL);
+
+ // Execute XHCI_ProcessInterrupt using SW SMI, Context points to HC_STRUC
+ UsbSmiHc(opHC_ProcessInterrupt, USB_HC_XHCI, Context);
+
+ pBS->RestoreTPL (OriginalTPL);
+}
+
+
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: USBPort_InstallEventHandler
+//
+// Description:
+// Purpose of this function is to install event handlers for different
+// USB host controllers.
+//
+// Input:
+// Pointer to a host controller data structure
+//
+// Output:
+// EFI_SUCCESS on a successful handler installation, otherwise EFI_NOT_READY
+//
+// Notes:
+// 1. Currently implemented for XHCI only. UHCI, OHCI and EHCI currently have the
+// HW SMI registration routines in their HC Start functions.
+//
+// 2. This function is a part of UHCD, not a part of USBRT (SMI). It may only have
+// a code that installs a non-SMI event handler, e.h. timer callback function for
+// HC event polling, or HW interrupt handler. SMI handlers are installed in the
+// USBRT entry point (amiusb.c).
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS
+USBPort_InstallEventHandler(
+ HC_STRUC *HcStruc
+)
+{
+#if XHCI_SUPPORT
+ EFI_STATUS Status = EFI_SUCCESS;
+
+ if (HcStruc->bHCType != USB_HC_XHCI) return EFI_UNSUPPORTED;
+/*
+#if XHCI_EVENT_SERVICE_MODE == 0
+{
+ EFI_EVENT XhciTimerEvent;
+
+ // Current HW does not support INTx method of interrupt, hold on to the handler
+ // installation until HW matures. In the meantime, use timer interrupt callback.
+ Status = pBS->CreateEvent(
+ EFI_EVENT_TIMER | EFI_EVENT_NOTIFY_SIGNAL,
+ EFI_TPL_CALLBACK,
+ XhciTimerCallback, HcStruc, &XhciTimerEvent
+ );
+ ASSERT_EFI_ERROR(Status);
+
+ pBS->SetTimer (XhciTimerEvent, TimerPeriodic, MILLISECOND*100 );
+}
+#endif
+*/
+/*
+#if USBInt1C_SUPPORT
+#if defined(CSM_SUPPORT) && CSM_SUPPORT //(EIP69136+)
+
+ // Update INT1C timer interrupt handler with the HcStruc data
+ {
+ UINT32 *ivt = (UINT32*)0;
+ UINT32 Int1cVector;
+ UINT32 Addr;
+ UINT32 HcStrucAddr;
+ UINT8 Count;
+ EFI_LEGACY_BIOS_EXT_PROTOCOL *BiosExtensions = NULL;
+
+ // Find the vector hooked up by "USB Int1C". At this time only AMI OEM interrupts
+ // might have trapped the original INT1C. So the trapped vector is located at EP-4
+ // (EP is the Entry Point).
+ //
+ // For the details refer the INT1C data area in usbint1c.asm
+ Status = pBS->LocateProtocol(
+ &gEfiLegacyBiosExtProtocolGuid, NULL, &BiosExtensions);
+
+ if (!EFI_ERROR(Status)) {
+ for (Count = 0, Int1cVector = ivt[0x1c];
+ ((Int1cVector >> 16) != 0xf000) && Count < 5;
+ Count++)
+ {
+ Addr = ((Int1cVector >> 12) & 0xffff0) + (Int1cVector & 0xffff);
+ // Check "$AMIUSB$" signature
+ if ((*(UINT32*)(UINTN)(Addr+2) == 0x494d4124) &&
+ (*(UINT32*)(UINTN)(Addr+6) == 0x24425355)) break;
+
+ Int1cVector = *(UINT32*)(UINTN)(Addr - 4); // Trapped address
+ }
+ ASSERT(Count < 5);
+ if ((Count < 5) && ((Int1cVector >> 16) != 0xf000)) {
+ // Update HcStruc information
+ HcStrucAddr = Addr + 12;
+ Addr = (UINT32)(*(UINT16*)(UINTN)(Addr + 10)); // offset of the Params in URP
+ Addr += ((Int1cVector >> 12) & 0xffff0); // added segment to create 32-bit address
+
+ BiosExtensions->UnlockShadow(0, 0, 0, 0);
+
+ *(UINTN*)(UINTN)HcStrucAddr = (UINTN)HcStruc;
+ *(UINTN*)(UINTN)Addr = (UINTN)HcStrucAddr;
+
+ BiosExtensions->LockShadow(0, 0);
+ }
+ }
+ }
+
+#endif //(EIP69136+)
+#endif
+*/
+/*
+ // Install HW interrupt handler on HcStruc->Irq IRQ level
+
+ // Find the Legacy8259 protocol. ASSERT if not found.
+ Status = pBS->LocateProtocol (&gEfiLegacy8259ProtocolGuid, NULL, (VOID **) &gPic);
+ if (!EFI_ERROR(Status)) {
+ EFI_CPU_ARCH_PROTOCOL *Cpu;
+
+ // Get the interrupt vector number corresponding to IRQ0 from the 8259 driver
+ Status = gPic->GetVector (gPic, HcStruc->Irq, (UINT8*)&gVector);
+ ASSERT_EFI_ERROR (Status);
+
+ // Find the CPU architectural protocol. ASSERT if not found.
+ Status = pBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **) &Cpu);
+ ASSERT_EFI_ERROR (Status);
+
+ // Install interrupt handler for XHCI controller
+ Status = Cpu->RegisterInterruptHandler (Cpu, gVector, XHCI_InterruptHandler);
+ ASSERT_EFI_ERROR (Status);
+ gPic->EnableIrq (gPic, HcStruc->Irq, TRUE);
+
+ }
+*/
+
+#endif
+ return EFI_SUCCESS;
+}
+
+#endif
+
+#if USB_DIFFERENTIATE_IDENTICAL_DEVICE_NAME
+//<AMI_PHDR_START>
+//---------------------------------------------------------------------------
+//
+// Name: AddPortNumbertoDeviceString
+//
+// Description:
+// This function will insert the USB device number into the devicename string.
+// Format----> "U(DeviceNumber)-DevNameString"
+//
+// Input:
+// Pointer to a device data structure
+//
+// Output:
+// VOID
+//
+// Notes:
+//
+//---------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+AddPortNumbertoDeviceString(
+ DEV_INFO *Device
+)
+{
+ UINT8 i;
+ UINT8 j;
+ UINT8 TempArray[50];
+ UINT8 Appendarray1[5] = {'U',NULL,'-',NULL};
+ UINT8 Appendarray2[6] = {'U',NULL,NULL,'-',NULL};
+
+ for (i = 0 ; Device->DevNameString[i]; i++) {
+ TempArray[i] = Device->DevNameString[i];
+ }
+ TempArray[i] = 0;
+
+ //
+ // Check for device number, if <= 9 then convert to ASCII and insert in array,
+ // else split the number and convert to ASCII and then insert in array.
+ //
+ if (DeviceNumber <= 9) {
+ Appendarray1[1] = DeviceNumber + 0x30;
+
+ for (i = 0; Appendarray1[i]; i++) {
+ Device->DevNameString[i] = Appendarray1[i];
+ }
+ } else {
+ i = (DeviceNumber / 10) + 0x30;
+ j = (DeviceNumber % 10) + 0x30;
+
+ Appendarray2[1] = i;
+ Appendarray2[2] = j;
+
+ for (i = 0; Appendarray2[i] ; i++) {
+ Device->DevNameString[i] = Appendarray2[i];
+ }
+ }
+
+ for (j=0; TempArray[j]; j++, i++) {
+ Device->DevNameString[i] = TempArray[j];
+ }
+
+ Device->DevNameString[i] = 0;
+
+ DeviceNumber++;
+}
+#endif
+
+//****************************************************************************
+//****************************************************************************
+//** **
+//** (C)Copyright 1985-2016, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Pkwy, Norcross, GA 30093 **
+//** **
+//** Phone (770)-246-8600 **
+//** **
+//****************************************************************************
+//****************************************************************************