Fixing USB on X79 Hackintosh with OS X El Capitan: SSDT Patch Guide
Step-by-step guide to create and apply an SSDT patch for USB ports on X79-based Hackintosh systems running OS X El Capitan, covering diagnostics, port mapping, Clover configuration, and troubleshooting.
On X79-based Hackintosh builds running OS X El Capitan (10.11), USB ports often fail to enumerate devices correctly unless you apply a custom SSDT patch. The Intel C600-series chipset that comes with the X79 platform uses both an EHCI (USB 2.0) and XHCI (USB 3.0) controller, but macOS 10.11 doesn't recognize them properly out of the box. Without an SSDT that explicitly defines the USB port layout, the system might show only a single USB 2.0 hub, drop all USB 3.0 ports, or even kernel panic when you hot-plug a device.
Why X79 USB Needs an SSDT Patch
Apple’s USB stack in OS X El Capitan relies on ACPI tables to map physical USB ports to the internal controller topology. The stock DSDT provided by most X79 motherboard manufacturers omits these port definitions or defines them in a way that conflicts with macOS expectations. Specifically, the XHCI controller (usually at PCI 0x00, function 0x14) requires a set of UsbConnector and PortConnector objects in the ACPI namespace to enable proper port detection. Without them, the system defaults to a generic EHCI-only configuration, disabling USB 3.0 entirely and often misidentifying USB 2.0 ports as internal (0xFF) instead of external (0x00).
The SSDT patch works by adding a new table (or overriding an existing one) that declares each physical USB port with the correct connector type and speed capability. For X79 boards, the C600 chipset typically provides up to 14 USB 2.0 ports (through the EHCI controller) and 6 USB 3.0 ports (through the XHCI controller). However, the actual number of available ports depends on the motherboard layout—many mid-range X79 boards expose only 4–6 USB 2.0 and 2–4 USB 3.0 ports. Creating a port map that matches your specific board is essential to avoid instability.
Creating the USB SSDT Patch
Before writing the SSDT, you must identify which ports are physically present on your motherboard. Boot into a known-good macOS installation (or a Linux live USB) and run a tool like IORegistryExplorer or use the command ioreg -l -w0 | grep -i "USB" to list the USB controller entries. Look for the XHCI root hub and note the port numbers that appear when devices are plugged in. On X79, the XHCI controller often appears as XHC1 or XHC in IORegistry. The EHCI controller appears as EHC1 and EHC2 (two controllers for USB 2.0).
Once you have the port numbers, create a new SSDT file using MaciASL or a text editor. The following is a minimal example for a typical X79 board with 4 USB 2.0 ports on the back panel and 2 USB 3.0 ports:
DefinitionBlock ("", "SSDT", 1, "Hack", "USB", 0x00000001)
{
External (_SB.PCI0.XHC1, DeviceObj)
Scope (_SB.PCI0.XHC1)
{
Device (PR01)
{
Name (_ADR, 0x00000001)
Method (_DSM, 4, NotSerialized)
{
Store (Package ()
{
"port-type", Buffer (0x01) { 0x00 },
"port-number", Buffer (0x01) { 0x01 },
"UsbConnector", 0x00
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}
// Repeat for each port with appropriate _ADR and port-number
}
}
Each port must have a unique _ADR value that matches the physical address on the XHCI controller. For USB 2.0 ports connected through the EHCI controller, you need a separate scope under _SB.PCI0.EHC1 and _SB.PCI0.EHC2. The UsbConnector value determines the port type: 0x00 for USB 2.0, 0x03 for USB 3.0, 0x02 for internal (like Bluetooth), and 0xFF for disabled. Incorrect connector types can cause devices to fail or charge incorrectly.
A more reliable approach is to use the USBInjectAll.kext in combination with a custom SSDT that overrides only the port definitions. This kext provides a generic port map for most Intel chipsets, but on X79 it often conflicts because the C600 XHCI controller is not fully covered. If you experience kernel panics with USBInjectAll, remove it and rely solely on the SSDT.
Applying the Patch in Clover
Place the compiled SSDT-USB.aml file in the EFI/CLOVER/ACPI/patched folder on your EFI partition. In Clover’s config.plist, under the ACPI section, set DropTables to drop any existing USB-related SSDTs that may conflict. Add the following:
<key>DropTables</key>
<array>
<dict>
<key>Signature</key>
<string>SSDT</string>
<key>TableId</key>
<string>Cpu0Ist</string>
</dict>
</array>
Also ensure FixUSB is enabled in ACPI > Fixes. This fix renames the EHCI and XHCI devices to match Apple’s naming convention (e.g., EHC1→EHC1, XHC1→XHC). Without this rename, macOS will not load the AppleUSBXHCI driver. After rebooting, check System Information under USB to confirm all ports appear with their correct speed.
Troubleshooting Common Issues
- No USB 3.0 ports appear: Verify the XHCI controller is properly renamed. In IORegistry, look for
XHCorXHC1. If it still shows asXHC1@14, the rename is not applying. Check thatFixUSBis enabled and no other ACPI table is overriding the device. - Kernel panic on USB hot-plug: This often indicates a port address mismatch or incorrect
UsbConnectorvalue. Double-check the port number from IORegistry and ensure the SSDT’s_ADRmatches the physical address (e.g., 0x00000001 for port 1). - USB 2.0 devices not working on USB 3.0 ports: Set the
UsbConnectorfor those ports to 0x03 (USB 3.0) rather than 0x00. macOS can route USB 2.0 devices through USB 3.0 ports, but only if the connector type is correct. - Sleep/wake issues: Some X79 boards lose USB enumeration after wake. Add the
_PTSand_WAKmethods to your SSDT to reinitialize the XHCI controller. Alternatively, use theDarkWakefix in Clover’sKernelAndKextPatches > AppleRTC.
For users migrating from older macOS versions, note that the SSDT patch for El Capitan is also compatible with macOS 10.12 Sierra and 10.13 High Sierra, provided you update the USBInjectAll kext or remove it entirely. However, the port mapping may need adjustment if you upgrade to a newer macOS that changes the USB stack (e.g., macOS 10.15 Catalina dropped support for many legacy controllers).
If your X79 motherboard includes a wireless card that relies on internal USB (like Bluetooth modules), ensure those ports are defined with UsbConnector 0x02 (internal). A misconfigured internal port can cause Bluetooth to disappear after sleep. For detailed guidance on compatible wireless cards for this era, see the Wireless Card Guide for Hackintosh macOS 10.7–10.11: Broadcom & Atheros Chips That Work Natively.
After applying the patch, verify each USB port by plugging in a USB 2.0 and 3.0 device and checking System Information. A correctly patched X79 system will list all ports under the XHCI controller with the appropriate speed (up to 5 Gb/s for USB 3.0). If any port remains missing, re-run IORegistryExplorer with the device attached to confirm the port number and adjust the SSDT accordingly.
