A port-injection kext for macOS 10.11+ that temporarily enables all USB ports on Intel controllers, so you can identify which ports are physically present on your machine before creating a final, minimal port injector.
Starting with 10.11, Apple's USB drivers rely on ACPI to determine active ports — and that information is often incorrect. Before you can build a proper port injector (or SSDT), you need to know which ports actually exist. This kext injects every possible port so you can test and map them.
Note: This kext is only for 10.11 and later. It has no use with earlier versions. Currently, only Intel controllers are supported.
| Controller | Chipset ID | USB2 Ports | USB3 Ports | Notes |
|---|---|---|---|---|
| EH01 | — | 8 (PR11–PR18) | — | |
| EH02 | — | 8 (PR21–PR28) | — | |
| EH01 Hub | — | 8 (HP11–HP18) | — | Hub on EH01.PRT1 only |
| EH02 Hub | — | 8 (HP21–HP28) | — | Hub on EH02.PRT1 only |
| XHC 7-series | 8086:1e31 | 4 (HS01–HS04) | 4 (SS01–SS04) | |
| XHC 8/9-series | 8086:9xxx | 9 (HS01–HS09) | 6 (SS01–SS06) | |
| XHC 8/9-series | 8086:8xxx | 14 (HS01–HS14) | 6 (SS01–SS06) | |
| XHC 8/9-series | 8086:9cb1 | 11 (HS01–HS11) | 4 (SS01–SS04) | |
| XHC 100-series | 8086:a12f | 14 (HS01–HS14) | 10 (SS01–SS10) | + USR1/USR2 |
| XHC 100-series | 8086:9dxx | 10 (HS01–HS10) | 6 (SS01–SS06) | + USR1/USR2 |
| XHC 200-series | 8086:a2af | 14 (HS01–HS14) | 10 (SS01–SS10) | + USR1/USR2 |
| XHC 300-series | 8086:a36d | 14 (HS01–HS14) | 10 (SS01–SS10) | + USR1/USR2 |
| XHC 400-series | 8086:a3af, 8086:06ed | 14 (HS01–HS14) | 10 (SS01–SS10) | + USR1/USR2 |
| XHC 500-series | 8086:43ed, 8086:a0ed | 14 (HS01–HS14) | 10 (SS01–SS10) | + USR1/USR2 |
| XHC 600-series | 8086:7ae0, 8086:51ed | 14 (HS01–HS14) | 10 (SS01–SS10) | + USR1/USR2 |
| XHC 700-series | 8086:7a60 | 14 (HS01–HS14) | 10 (SS01–SS10) | + USR1/USR2 |
| XHC 800-series | 8086:7ec0, 8086:7e7d, 8086:7f6e | 14 (HS01–HS14) | 10 (SS01–SS10) | + USR1/USR2 |
| Comet Lake PCH-LP | 8086:02ed | 10 (HS01–HS10) | 4 (SS01–SS04) | + USR1/USR2 |
| Ice Lake-LP | 8086:34ed | 12 (HS01–HS12) | 4 (SS01–SS04) | + USR1/USR2 |
Place the kext in:
EFI/Clover/kexts/Other/
Place the kext in:
EFI/OC/Kexts/
Then add a USBInjectAll.kext entry under config.plist → Kernel → Add, just like any other kext.
After installation, reboot.
-
EHC1/EHC2 Renaming — This kext assumes you have already renamed
EHC1→EH01andEHC2→EH02in your DSDT. It also assumes your XHCI controller is namedXHCorXHCI(notXHC1). Seeconfig_patches.plistfor the required DSDT patches. -
Not for Long-term Use — Without customization, this kext is intended only as a diagnostic tool. Create a custom injector with only your active ports, or use an SSDT to override the injections (see below).
-
Installation Scenarios — This kext may help during macOS installation when broken USB prevents booting from an installer stick. Install it to
EFI/Clover/kexts. -
XHCI-unsupported.kext — Certain Intel xHCI controllers lack native support and require
XHCI-unsupported.kextfrom this project. Typical controllers needing it:- X99-series: 8086:8d31
- 200-series: 8086:a2af
- 300-series: 8086:a36d, 8086:9ded
- 400-series: 8086:a3af
- 500-series: 8086:43ed, 8086:a0ed
- 600-series: 8086:7ae0, 8086:51ed
- 700-series: 8086:7a60
- 800-series: 8086:7ec0, 8086:7e7d, 8086:7f6e
Check native support in:
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/Plugins/AppleUSBXHCIPCI.kext/Contents/Info.plistXHCI-unsupported.kextuses a lowerIOProbeScorethan the native Info.plist, so there is no harm in installing it even if native support exists. -
XHCI-9-series.kext — For 9-series chipset XHC controllers (8086:8cb1), this injector was previously required. As of 10.11.1, direct support was added and it is no longer needed. Historical version: RehabMan fork.
Some chipsets exceed the 10.11 default of 15 ports on XHC. Controllers with device-IDs starting with 8 will need a patch to bypass this limit. The patch was created by arix98 and published on insanelymac.com (post #179).
Do not plan to use these patches long-term. Consider routing USB2 ports off XHC via
FakePCIID_XHCIMuxinstead.
Comment: change 15 port limit to 20 in AppleUSBXHCIPCI
Name: AppleUSBXHCIPCI
Find: <83bd8cfe ffff10>
Replace: <83bd8cfe ffff15>
Comment: change 15 port limit to 26 in AppleUSBXHCIPCI
Name: AppleUSBXHCIPCI
Find: <83bd8cfe ffff10>
Replace: <83bd8cfe ffff1b>
You can also copy patches directly from the config_patches.plist file included in this repository, which contains patches for all supported macOS versions plus the DSDT rename patches.
Use kernel flags to exclude specific ports without creating a custom SSDT:
| Flag | Description |
|---|---|
uia_exclude=<ports> |
Exclude specific ports (comma-delimited), e.g. uia_exclude=HS01,HS06 |
-uia_exclude_hs |
Exclude all HSxx (USB2) ports |
-uia_exclude_ss |
Exclude all SSxx (USB3) ports |
-uia_exclude_xhc |
Disable injection on XHC entirely |
uia_include=<ports> |
Include ports that would otherwise be excluded, e.g. -uia_exclude_hs uia_include=HS01 |
Each port identifier injected by the kext is unique, so you can easily identify which device is connected to which port.
For full control, override the injected configuration via ACPI. Example — enable only SS01 on XHC for 8086_8xxx chipsets:
DefinitionBlock ("", "SSDT", 1, "hack", "UIAC", 0)
{
Device(UIAC)
{
Name(_HID, "UIA00000")
Name(RMCF, Package()
{
"8086_8xxx", Package()
{
"port-count", Buffer() { 0xa, 0, 0, 0 },
"ports", Package()
{
"SS01", Package()
{
"UsbConnector", 3,
"port", Buffer() { 0xa, 0, 0, 0 },
}
}
}
})
}
}A complete example is provided in SSDT-UIAC.dsl. The file SSDT-UIAC-ALL.dsl contains all data from the Info.plist (net zero change when used as-is) — use it as a starting template. Delete ports you don't need, or adjust UsbConnector/portType to match your hardware.
To find your XHC device-id, check the vendor-id and device-id under the XHC node in IORegistryExplorer.
| Item | Link |
|---|---|
| Kext releases | Releases |
| Full repository (ZIP) | Download |
For details and feedback, please visit: tonymacx86.com — Guide: 10.11 USB Changes & Solutions