Contribute
Register

OSX El Capitan - USB Issues

Status
Not open for further replies.
Joined
Mar 18, 2014
Messages
977
Motherboard
Dell XPS 15 7590 - Clover
CPU
i7-9980HK
Graphics
HD 630 + GTX 1650
Mac
  1. iMac
  2. MacBook Pro
Classic Mac
  1. Apple
Mobile Phone
  1. iOS
​----SOLUTION POSTED IN POST #123----

Hi all,

As you might all know, Apple's changed their USB3 drivers / kexts around in OS X El Capitan (see here: USB Driver Changed Again - PB6 / USB3.0 has become USB2.0 after upgrading to PB5)

Now my chipset (Z97) is natively supported on OS X (for now hehe) , but I get some USB errors on boot, and I'm not able to use my keyboard and mouse, which are plugged into a USB2 hub, which is plugged into a USB3 port. Speaking of USB3 ports, half of them aren't working (only the 2 on the front panel are working AFAIK). Here are the relevant errors:

Code:
[FONT=Menlo]Sep 19 15:51:28 localhost watchdogd[56]:  [watchdog_daemon] @(      wd_daemon_init) - could not open connection with the kernel watchdog[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.713790 XHC@14000000: AppleUSBXHCIPCI::createPorts: ports limit reached.  Not creating the remaining 6 ports[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.777339 PXSX@00000000: AppleUSBXHCI::createPorts: created port 1[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.777383 PXSX@00000000: AppleUSBXHCI::createPorts: created port 2[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.777450 PXSX@00000000: AppleUSBXHCI::createPorts: created port 3[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.777496 PXSX@00000000: AppleUSBXHCI::createPorts: created port 4

[/FONT][FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014812 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::handleStart: unable to open interface[/FONT]
[FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014828 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::handleStart: unable to open interface[/FONT]
[FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014841 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::start: unable to start IOHIDDevice[/FONT]
[FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014864 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::handleStart: unable to open interface[/FONT]
[FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014868 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::start: unable to start IOHIDDevice[/FONT]

I'm almost certain that only the top part of that dump is related to my problem, but there's other USB entries so I just put them there too...

Now I've done some reading on the posts that I linked at the top of this thread, about how RehabMan and someone else were using a USB injector to try to get the ports working, but if you look at the first line of the first part of the code, it says "port limit reached: not creating the rest of the 6 ports". I've done some reading and apparently the port limit is 15, and the USB chipset is natively supported, so it's not going to create the rest of the ports.

Is there any way to bypass the 15 port limit, or in general, to fix the problem? Looking at RehabMan, AGAIN. :p:think:

Cheers!

-Duncan
 
Hi all,

As you might all know, Apple's changed their USB3 drivers / kexts around in OS X El Capitan (see here: USB Driver Changed Again - PB6 / USB3.0 has become USB2.0 after upgrading to PB5)

Now my chipset (Z97) is natively supported on OS X (for now hehe) , but I get some USB errors on boot, and I'm not able to use my keyboard and mouse, which are plugged into a USB2 hub, which is plugged into a USB3 port. Speaking of USB3 ports, half of them aren't working (only the 2 on the front panel are working AFAIK). Here are the relevant errors:

Code:
[FONT=Menlo]Sep 19 15:51:28 localhost watchdogd[56]:  [watchdog_daemon] @(      wd_daemon_init) - could not open connection with the kernel watchdog[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.713790 XHC@14000000: AppleUSBXHCIPCI::createPorts: ports limit reached.  Not creating the remaining 6 ports[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.777339 PXSX@00000000: AppleUSBXHCI::createPorts: created port 1[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.777383 PXSX@00000000: AppleUSBXHCI::createPorts: created port 2[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.777450 PXSX@00000000: AppleUSBXHCI::createPorts: created port 3[/FONT]
[FONT=Menlo]Sep 19 15:51:29 localhost kernel[0]: 000000.777496 PXSX@00000000: AppleUSBXHCI::createPorts: created port 4

[/FONT][FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014812 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::handleStart: unable to open interface[/FONT]
[FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014828 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::handleStart: unable to open interface[/FONT]
[FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014841 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::start: unable to start IOHIDDevice[/FONT]
[FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014864 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::handleStart: unable to open interface[/FONT]
[FONT=Menlo]Sep 19 15:51:31 localhost kernel[0]: 000021.014868 IOUSBHostHIDDevice@: IOUSBHostHIDDevice::start: unable to start IOHIDDevice[/FONT]

I'm almost certain that only the top part of that dump is related to my problem, but there's other USB entries so I just put them there too...

Now I've done some reading on the posts that I linked at the top of this thread, about how RehabMan and someone else were using a USB injector to try to get the ports working, but if you look at the first line of the first part of the code, it says "port limit reached: not creating the rest of the 6 ports". I've done some reading and apparently the port limit is 15, and the USB chipset is natively supported, so it's not going to create the rest of the ports.

Is there any way to bypass the 15 port limit, or in general, to fix the problem? Looking at RehabMan, AGAIN. :p:think:

Cheers!

-Duncan

No way to bypass. Determine which ports are actually connected and create an injector for them.

USB3 ports include both an HS and SS port. You can move the USB2 component part of the USB3 ports to the EHC controller using FakePCIID and FakePCIID_XHCIMux.
 
No way to bypass. Determine which ports are actually connected and create an injector for them.

USB3 ports include both an HS and SS port. You can move the USB2 component part of the USB3 ports to the EHC controller using FakePCIID and FakePCIID_XHCIMux.

So when OS X registers USB3 ports it creates 2 entries per port? AKA HS (USB2) and SS (USB3)? Could you link guide to using those kexts you mentioned? :think:
 
So when OS X registers USB3 ports it creates 2 entries per port? AKA HS (USB2) and SS (USB3)? Could you link guide to using those kexts you mentioned? :think:

It will... because USB3 ports are actually two ports in one. HS ports (USB2) on XHC are typically named HSxx, and SS ports (USB3) on XHC are typically named SSPx.

FakePCIID: https://github.com/RehabMan/OS-X-Fake-PCI-ID
 
It will... because USB3 ports are actually two ports in one. HS ports (USB2) on XHC are typically named HSxx, and SS ports (USB3) on XHC are typically named SSPx.

FakePCIID: https://github.com/RehabMan/OS-X-Fake-PCI-ID

Installed FakePCIID and FakePCIID_XHCIMux and this is what came up in kernel log:

Code:
[FONT=Menlo]Sep 19 17:52:56 localhost kernel[0]: FakePCIID: [8086:8cb1] XHCIMux::startup: newData for PR2: 0x00000000[/FONT]
[FONT=Menlo]Sep 19 17:52:55 localhost watchdogd[57]:  [watchdog_daemon] @(      wd_daemon_init) - could not open connection with the kernel watchdog[/FONT]
[FONT=Menlo]Sep 19 17:52:56 localhost kernel[0]: 000000.713166 XHC@14000000: AppleUSBXHCIPCI::createPorts: ports limit reached.  Not creating the remaining 6 ports[/FONT]

Quick question here, how do I figure out which Device ID to use (e.g. in the example above: 8086:8cb1) as in DPCIManager it doesn't list any of them (they're listed but blank). And I'm wondering how do you configure XHCIMux to get all of the HS ports rerouted to EHC1?
 
Installed FakePCIID and FakePCIID_XHCIMux and this is what came up in kernel log:

Code:
[FONT=Menlo]Sep 19 17:52:56 localhost kernel[0]: FakePCIID: [8086:8cb1] XHCIMux::startup: newData for PR2: 0x00000000[/FONT]
[FONT=Menlo]Sep 19 17:52:55 localhost watchdogd[57]:  [watchdog_daemon] @(      wd_daemon_init) - could not open connection with the kernel watchdog[/FONT]
[FONT=Menlo]Sep 19 17:52:56 localhost kernel[0]: 000000.713166 XHC@14000000: AppleUSBXHCIPCI::createPorts: ports limit reached.  Not creating the remaining 6 ports[/FONT]

Quick question here, how do I figure out which Device ID to use (e.g. in the example above: 8086:8cb1) as in DPCIManager it doesn't list any of them (they're listed but blank). And I'm wondering how do you configure XHCIMux to get all of the HS ports rerouted to EHC1?

FakePCIID will not solve your port limit problems by itself. It only sets the hardware to forward the USB2 port component on XHC to EHC.

The actual fixing of the detected ports ... you have to do with a port injector kext.

The device-ids are already in the FakePCIID_XHCIMux. Including your 8086:8cb1.
 
FakePCIID will not solve your port limit problems by itself. It only sets the hardware to forward the USB2 port component on XHC to EHC.

The actual fixing of the detected ports ... you have to do with a port injector kext.

The device-ids are already in the FakePCIID_XHCIMux. Including your 8086:8cb1.

So if I understand this right, all the USB2 data from USB3 ports should be rerouted to EHC, so it would look like this (for my motherboard):

Before FakePCIID:

AppleUSBXHCIPCI:

HS01/SS01
HS02/SS02
HS03/SS03
HS04/SS04
HS05/SS05
HS06/SS06
HS07/SS07
HS08/SS08

There are 8 USB3 ports (6 on board, 2 front header), and thus there are 16 total "ports", so 1 of them is omitted from final USB tree b/c of port limit.

AppleUSBEHCIPCI:

HS09
HS10

There are 2 USB2 ports (2 on board), and port limit not reached.


After FakePCIID XHCIMux:

AppleUSBXHCIPCI:

SS01
SS02
SS03
SS04
SS05
SS06
SS07
SS08

There are 8 USB3 ports (2 front header, 6 on board), and 8 ports b/c HS is rerouted to EHC. Port limit not reached, so all are created.

AppleUSBEHCIPCI:

HS01
HS02
HS03
HS04
HS05
HS06
HS07
HS08

HS09
HS10

10 USB2 ports (8 from USB3, 2 from USB2 physical port), port limit not reached.


If that's the case, wouldn't my problem be solved already? As all the data's being routed properly and there's nothing exceeding the limit, then why does it still say "port limit reached not creating the rest of the 6 ports"?

Also, is it that I have a USB2 hub plugged into a USB3 port make any difference in this? :think:

Sorry if I'm making it look complicating, just want to understand it right, as right now I don't see the use of an injector kext if there's no need for one (based on my current understanding on this)... :think:
 
FakePCIID will not solve your port limit problems by itself. It only sets the hardware to forward the USB2 port component on XHC to EHC.

The actual fixing of the detected ports ... you have to do with a port injector kext.

The device-ids are already in the FakePCIID_XHCIMux. Including your 8086:8cb1.

Sorry for spam here or bump, but how to make port injector kext / guide? :think:
 
So if I understand this right, all the USB2 data from USB3 ports should be rerouted to EHC, so it would look like this (for my motherboard):

Before FakePCIID:

AppleUSBXHCIPCI:

HS01/SS01
HS02/SS02
HS03/SS03
HS04/SS04
HS05/SS05
HS06/SS06
HS07/SS07
HS08/SS08

There are 8 USB3 ports (6 on board, 2 front header), and thus there are 16 total "ports", so 1 of them is omitted from final USB tree b/c of port limit.

AppleUSBEHCIPCI:

HS09
HS10

There are 2 USB2 ports (2 on board), and port limit not reached.

I'm assuming all those ports are on XHC, for a total of 18.

After FakePCIID XHCIMux:

AppleUSBXHCIPCI:

SS01
SS02
SS03
SS04
SS05
SS06
SS07
SS08

Yes. USB3 stays on XHC.

There are 8 USB3 ports (2 front header, 6 on board), and 8 ports b/c HS is rerouted to EHC. Port limit not reached, so all are created.

AppleUSBEHCIPCI:

HS01
HS02
HS03
HS04
HS05
HS06
HS07
HS08

HS09
HS10

10 USB2 ports (8 from USB3, 2 from USB2 physical port), port limit not reached.

Some of the USB2 ports may be on the EHC2 controller, assuming you have two EHC controllers active (EHC1/EHC2).

Also, my experience is that XHC USB2 ports relocate themselves to a single port on EHC1 via a hub.

If that's the case, wouldn't my problem be solved already? As all the data's being routed properly and there's nothing exceeding the limit, then why does it still say "port limit reached not creating the rest of the 6 ports"?

You have to build a port injector to tell the system how the ports are arranged.

Also, is it that I have a USB2 hub plugged into a USB3 port make any difference in this? :think:

No difference. A hub is a just a USB device (with a driver). A USB2 hub will appear on EHC1 with XHCIMux when plugged into an XHC USB port.

Sorry if I'm making it look complicating, just want to understand it right, as right now I don't see the use of an injector kext if there's no need for one (based on my current understanding on this)... :think:

Injector kext purpose is to override DSDT port definition.

Think of it this way:
- FakePCIID_XHCIMux can affect the USB port/controller topology (routing USB2 from XCH to EHC)
- DSDT is used to by the USB drivers to discover port/controller topology
- DSDT does not always reflect the topology accurately
- port injector kexts are used to override topology information DSDT would otherwise provide
- Apple has included built-in port injectors for certain Mac models
- the port injectors that Apple includes are probably not accurate for your hack
- disabling the port injectors provided by Apple can be accomplished by using different names in DSDT for the controllers (Apple uses EHC1/EHC2/XHC1).
- one first step is to rename EHC1->EH01, EHC2->EH02, and either keep XHC or rename XHC1->XHC as it disables any port injectors that may be wrong for your USB port/controller topology
 
Think of it this way:
- FakePCIID_XHCIMux can affect the USB port/controller topology (routing USB2 from XCH to EHC)
- DSDT is used to by the USB drivers to discover port/controller topology
- DSDT does not always reflect the topology accurately
- port injector kexts are used to override topology information DSDT would otherwise provide
- Apple has included built-in port injectors for certain Mac models
- the port injectors that Apple includes are probably not accurate for your hack
- disabling the port injectors provided by Apple can be accomplished by using different names in DSDT for the controllers (Apple uses EHC1/EHC2/XHC1).
- one first step is to rename EHC1->EH01, EHC2->EH02, and either keep XHC or rename XHC1->XHC as it disables any port injectors that may be wrong for your USB port/controller topology

I've done some digging into the Apple "port injectors" and this is what I found for my SMBIOS (iMac14,2):

Code:
iMac14,2-XHC1
			<string>AppleUSBXHCIPCI</string>
			<key>IOProviderMergeProperties</key>
			<dict>
				<key>port-count</key>
				<data>
				FQAAAA==
				</data>
				<key>ports</key>
				<dict>
					<key>HS01</key>
					<dict>
						<key>UsbConnector</key>
						<integer>3</integer>
						<key>port</key>
						<data>
						AQAAAA==
						</data>
					</dict>
					<key>HS02</key>
					<dict>
						<key>UsbConnector</key>
						<integer>3</integer>
						<key>port</key>
						<data>
						AgAAAA==
						</data>
					</dict>
					<key>HS05</key>
					<dict>
						<key>UsbConnector</key>
						<integer>3</integer>
						<key>port</key>
						<data>
						BQAAAA==
						</data>
					</dict>
					<key>HS06</key>
					<dict>
						<key>UsbConnector</key>
						<integer>3</integer>
						<key>port</key>
						<data>
						BgAAAA==
						</data>
					</dict>
					<key>HS07</key>
					<dict>
						<key>UsbConnector</key>
						<integer>255</integer>
						<key>port</key>
						<data>
						BwAAAA==
						</data>
					</dict>
					<key>HS08</key>
					<dict>
						<key>UsbConnector</key>
						<integer>255</integer>
						<key>port</key>
						<data>
						CAAAAA==
						</data>
					</dict>
					<key>SSP1</key>
					<dict>
						<key>UsbConnector</key>
						<integer>3</integer>
						<key>port</key>
						<data>
						EAAAAA==
						</data>
					</dict>
					<key>SSP2</key>
					<dict>
						<key>UsbConnector</key>
						<integer>3</integer>
						<key>port</key>
						<data>
						EQAAAA==
						</data>
					</dict>
					<key>SSP5</key>
					<dict>
						<key>UsbConnector</key>
						<integer>3</integer>
						<key>port</key>
						<data>
						FAAAAA==
						</data>
					</dict>
					<key>SSP6</key>
					<dict>
						<key>UsbConnector</key>
						<integer>3</integer>
						<key>port</key>
						<data>
						FQAAAA==
						</data>
					</dict>
				</dict>
			</dict>

Code:
iMac14,2-EHC

		<key>iMac14,2-EHC1</key>
		<dict>
			<key>CFBundleIdentifier</key>
			<string>com.apple.driver.AppleUSBMergeNub</string>
			<key>IOClass</key>
			<string>AppleUSBMergeNub</string>
			<key>IONameMatch</key>
			<string>EHC1</string>
			<key>IOProviderClass</key>
			<string>AppleUSBEHCIPCI</string>
			<key>IOProviderMergeProperties</key>
			<dict>
				<key>kUSBMuxEnabled</key>
				<true/>
			</dict>
			<key>model</key>
			<string>iMac14,2</string>
		</dict>
		<key>iMac14,2-EHC2</key>
		<dict>
			<key>CFBundleIdentifier</key>
			<string>com.apple.driver.AppleUSBMergeNub</string>
			<key>IOClass</key>
			<string>AppleUSBMergeNub</string>
			<key>IONameMatch</key>
			<string>EHC2</string>
			<key>IOProviderClass</key>
			<string>AppleUSBEHCIPCI</string>
			<key>IOProviderMergeProperties</key>
			<dict>
				<key>kUSBMuxEnabled</key>
				<true/>
			</dict>
			<key>model</key>
			<string>iMac14,2</string>
		</dict>

I'm going to now proceed to disabling the built-in port injectors and see if that makes a difference...
 
Status
Not open for further replies.
Back
Top