- Joined
- Dec 7, 2010
- Messages
- 25
- Motherboard
- Mac Mini
- CPU
- Core i7
- Graphics
- Integrated
- Mac
- Classic Mac
- Mobile Phone
I have a Dell XPS 15 9550 but this may be applicable to other laptops as well. Apologies if this has already been fixed or discussed, but I could find very little information on it.
The 9550's USB-C USB 3.1/TB3 port looks to be powered by a similar chip to the new Macbook Pros (the 15" has two of them). Unlike the MBP, on the 9550 this chip only appears to be powered on when a device is inserted into the USB-C port. Under Windows, the USB 3.1 controller appears or disappears in Device Manager depending on what's in the port, so this appears to be a hardware design choice.
On the 9550, when a USB 3.1 device is inserted, it appears in the ACPI chain as RP15-> PXSX (which lights up as a PCI-to-PCI bridge) -> the third of four PCI busses on the chip -> the USB 3.1 controller -> first of two USB 3.1 port devices. On the MBP, the PCI-to-PCI bridge is called UPSB, the four PCI buses are DSB0-3, and the USB 3.1 controller is XHC2. The Thunderbolt controller, called NHI0 on the MBP, is on the chip's first PCI bus.
I've gotten a USB 3.1 device to hotplug (briefly) by overriding the _RMV method on RP15.PXSX to return 1. This makes OS X think the PCI-to-PCI bridge is an ExpressCard (IOPCIHotplugCapable in ioreg), so it scans for, and loads kexts for the 9550's chip when a device is inserted and it is powered on. There's even a card icon that appears in the menu bar that gives you the option to power off the bus. I've also gotten the 9550 to sleep properly when a USB 3.1 device is present by creating an ACPI device tree all the way down to the USB 3.1 controller (calling it XHC2) and creating a _PRW method on it.
The problem is, when you unplug the device, or use the ExpressCard menu to power off the bus, the USB 3.1 controller being unplugged isn't handled properly. I get the following errors:
I *think* this could be handled by creating _PS0 and _PS3 methods on the XHC2 device, but I have no idea how to go about this. None of the info I've found on the Apple developer's site has been helpful. Looking at the ACPI code from the XHC2 device on the MBP, _PS3 fiddles with bits in the PCI_Config space, but I don't know if the chips are similar enough for this to work. Windows 10 handles this gracefully without any ACPI code somehow. I know it's also possible on OS X since there are USB 3 ExpressCards that work, but I'm assuming they have their own drivers.
I'm hoping someone more knowledgeable about how USB works in OS X (@RehabMan ?) might be able to help. I've attached the SSDT with the ACPI objects I'm using.
The 9550's USB-C USB 3.1/TB3 port looks to be powered by a similar chip to the new Macbook Pros (the 15" has two of them). Unlike the MBP, on the 9550 this chip only appears to be powered on when a device is inserted into the USB-C port. Under Windows, the USB 3.1 controller appears or disappears in Device Manager depending on what's in the port, so this appears to be a hardware design choice.
On the 9550, when a USB 3.1 device is inserted, it appears in the ACPI chain as RP15-> PXSX (which lights up as a PCI-to-PCI bridge) -> the third of four PCI busses on the chip -> the USB 3.1 controller -> first of two USB 3.1 port devices. On the MBP, the PCI-to-PCI bridge is called UPSB, the four PCI buses are DSB0-3, and the USB 3.1 controller is XHC2. The Thunderbolt controller, called NHI0 on the MBP, is on the chip's first PCI bus.
I've gotten a USB 3.1 device to hotplug (briefly) by overriding the _RMV method on RP15.PXSX to return 1. This makes OS X think the PCI-to-PCI bridge is an ExpressCard (IOPCIHotplugCapable in ioreg), so it scans for, and loads kexts for the 9550's chip when a device is inserted and it is powered on. There's even a card icon that appears in the menu bar that gives you the option to power off the bus. I've also gotten the 9550 to sleep properly when a USB 3.1 device is present by creating an ACPI device tree all the way down to the USB 3.1 controller (calling it XHC2) and creating a _PRW method on it.
The problem is, when you unplug the device, or use the ExpressCard menu to power off the bus, the USB 3.1 controller being unplugged isn't handled properly. I get the following errors:
Code:
XHC2@00000000: AppleUSBXHCIPCI::hardwareException: controller unplugged (regRead32)
XHC2@00000000: AppleUSBXHCI::hardwareException: Error saving state
XHC2@00000000: AppleUSBHostController::setPowerStateGated: going to state 1 returned 0xe00002e9
I *think* this could be handled by creating _PS0 and _PS3 methods on the XHC2 device, but I have no idea how to go about this. None of the info I've found on the Apple developer's site has been helpful. Looking at the ACPI code from the XHC2 device on the MBP, _PS3 fiddles with bits in the PCI_Config space, but I don't know if the chips are similar enough for this to work. Windows 10 handles this gracefully without any ACPI code somehow. I know it's also possible on OS X since there are USB 3 ExpressCards that work, but I'm assuming they have their own drivers.
I'm hoping someone more knowledgeable about how USB works in OS X (@RehabMan ?) might be able to help. I've attached the SSDT with the ACPI objects I'm using.