- A supported network adapter
- A bootloader with DSDT override
- A working DSDT dump
- an IOReg from your system
- The required stuff to compile/decompile and edit your DSDT
1 - Locate your network device in the IOReg and find its device path :
QUOTE
+-o P0P9@1C,5 <class IOPCIDevice, registered, matched, active, busy 0, retain 27>
| | | | {
| | | | "IOPCIResourced" = Yes
| | | | "#address-cells" = <03000000>
| | | | "IOName" = "pci-bridge"
| | | | "IOInterruptControllers" = ("io-apic-0","IOPCIMessagedInterruptController")
| | | | "IOPCIExpressLinkCapabilities" = 101788689
| | | | "class-code" = <00040600>
| | | | "IOPowerManagement" = {"ChildrenPowerState"=2,"CurrentPowerState"=2}
| | | | "revision-id" = <02000000>
| | | | "IOInterruptSpecifiers" = (<1100000007000000>,<0300000000000100>)
| | | | "built-in" = <00>
| | | | "acpi-device" = "IOACPIPlatformDevice is not serializable"
| | | | "device-id" = <49280000>
| | | | "vendor-id" = <86800000>
| | | | "acpi-path" = "IOACPIPlane:/_SB/PCI0@0/P0P9@1c0005"
| | | | "ranges" = <00000082000000000000d0fb00000082000000000000d0fb0000000000001000000000810000
00000c00000000000810000000000c000000000000000100000>
| | | | "name" = "pci-bridge"
| | | | "IOPCIExpressLinkStatus" = 12305
| | | | "reg" = <00e5000000000000000000000000000000000000>
| | | | "compatible" = <"pci8086,2849","pciclass,060400">
| | | | "IODTPersist" = <348adf2e7c8adf2e>
| | | | "#size-cells" = <02000000>
| | | | "IOPCIConfigured" = Yes
| | | | }
| | | |
| | | +-o IOPCI2PCIBridge <class IOPCI2PCIBridge, registered, matched, active, busy 0, retain 7>
| | | | {
| | | | "IOProviderClass" = "IOPCIDevice"
| | | | "IOProbeScore" = 18446744073709551516
| | | | "CFBundleIdentifier" = "com.apple.iokit.IOPCIFamily"
| | | | "IOMatchCategory" = "IODefaultMatchCategory"
| | | | "Bridge IO Ranges" = (49152,51199,51456,53247)
| | | | "IONameMatched" = "pci-bridge"
| | | | "IOClass" = "IOPCI2PCIBridge"
| | | | "IONameMatch" = "pci-bridge"
| | | | "IOPowerManagement" = {"ChildrenPowerState"=2,"CurrentPowerState"=2}
| | | | }
| | | |
| | | +-o Ethernet@0 <class IOPCIDevice, registered, matched, active, busy 0, retain 27>
| | | | {
| | | | "IOPCIResourced" = Yes
| | | | "IOInterruptControllers" = ("io-apic-0","IOPCIMessagedInterruptController")
| | | | "IOName" = "ethernet"
| | | | "subsystem-id" = <f8810000>
| | | | "IOPCIExpressLinkCapabilities" = 502801
| | | | "class-code" = <00000200>
| | | | "IOPowerManagement" = {"ChildrenPowerState"=2,"CurrentPowerState"=2}
| | | | "revision-id" = <12000000>
| | | | "IOInterruptSpecifiers" = (<1100000007000000>,<0600000000000100>)
| | | | "assigned-addresses" = <100002820000000000c0dffb0000000000400000180002810000000000c80000000000000001
00030000282000000000000dcfb0000000000000200>
| | | | "IOChildIndex" = 1
| | | | "built-in" = <00>
| | | | "acpi-device" = "IOACPIPlatformDevice is not serializable"
| | | | "device-id" = <64430000>
| | | | "vendor-id" = <ab110000>
| | | | "acpi-path" = "IOACPIPlane:/_SB/PCI0@0/P0P9@1c0005/Ethernet@0"
| | | | "subsystem-vendor-id" = <43100000>
| | | | "name" = "ethernet"
| | | | "IOPCIExpressLinkStatus" = 4113
| | | | "reg" = <0000020000000000000000000000000000000000100002020000000000000000000000000040
00018000201000000000000000000000000000100003000020200000000000000000000000000000
00>
| | | | "compatible" = <"pci1043,81f8","pci11ab,4364","pciclass,020000">
| | | | }
| | | |
| | | +-o yukonosx <class yukonosx, registered, matched, active, busy 0, retain 7>
| | | | {
| | | | "Model" = "Yukon Gigabit Adapter 88E8056"
| | | | "IOSelectedMedium" = "00000020"
| | | | "CFBundleIdentifier" = "com.apple.iokit.AppleYukon"
| | | | "IOVendor" = "Marvell"
| | | | "InitialWaitForLinkUp" = 60000
| | | | "IOMatchCategory" = "IODefaultMatchCategory"
| | | | "Vendor" = "Marvell"
| | | | "DescriptorPollTimer" = 250
| | | | "WaitToCheckDelay" = 5000
| | | | "IOFeatures" = 2
| | | | "EED_Tickle_On" = 2000
| | | | "LowPwrPeerMax" = 240
| | | | "LowPwrPeerMin" = 60
| | | | "IOMaxPacketSize" = 9018
| | | | "IOMinPacketSize" = 64
| | | | "IOUserClientClass" = "yukonosx_ioc_uc"
| | | | "RxRingSize" = 256
| | | | "IOActiveMedium" = "00500026"
| | | | "IOModel" = "Yukon Gigabit Adapter 88E8056"
| | | | "IOProbeScore" = 0
| | | | "EnableLowPwr" = 1
| | | | "TxRingSize" = 256
| | | | "IOLinkSpeed" = 100000000
| | | | "LowPwrClockDivide" = Yes
| | | | "IOPowerManagement" = {"CurrentPowerState"=1}
| | | | "IOPacketFilters" = {"IONetworkFilterGroup"=275,"IOEthernetWakeOnLANFilterGroup"=1}
| | | | "IOMACAddress" = <001a925ea08e>
| | | | "EED_Tickle_Off" = 60000
| | | | "IOProviderClass" = "IOPCIDevice"
| | | | "InputQueueMax" = 100
| | | | "WaitForLinkUp" = 6000
| | | | "IOLinkStatus" = 3
| | | | "IOPCIPrimaryMatch" = "0x436411AB"
| | | | "IOClass" = "yukonosx"
| | | | "LowPwrD1" = Yes
| | | | }
| | | | {
| | | | "IOPCIResourced" = Yes
| | | | "#address-cells" = <03000000>
| | | | "IOName" = "pci-bridge"
| | | | "IOInterruptControllers" = ("io-apic-0","IOPCIMessagedInterruptController")
| | | | "IOPCIExpressLinkCapabilities" = 101788689
| | | | "class-code" = <00040600>
| | | | "IOPowerManagement" = {"ChildrenPowerState"=2,"CurrentPowerState"=2}
| | | | "revision-id" = <02000000>
| | | | "IOInterruptSpecifiers" = (<1100000007000000>,<0300000000000100>)
| | | | "built-in" = <00>
| | | | "acpi-device" = "IOACPIPlatformDevice is not serializable"
| | | | "device-id" = <49280000>
| | | | "vendor-id" = <86800000>
| | | | "acpi-path" = "IOACPIPlane:/_SB/PCI0@0/P0P9@1c0005"
| | | | "ranges" = <00000082000000000000d0fb00000082000000000000d0fb0000000000001000000000810000
00000c00000000000810000000000c000000000000000100000>
| | | | "name" = "pci-bridge"
| | | | "IOPCIExpressLinkStatus" = 12305
| | | | "reg" = <00e5000000000000000000000000000000000000>
| | | | "compatible" = <"pci8086,2849","pciclass,060400">
| | | | "IODTPersist" = <348adf2e7c8adf2e>
| | | | "#size-cells" = <02000000>
| | | | "IOPCIConfigured" = Yes
| | | | }
| | | |
| | | +-o IOPCI2PCIBridge <class IOPCI2PCIBridge, registered, matched, active, busy 0, retain 7>
| | | | {
| | | | "IOProviderClass" = "IOPCIDevice"
| | | | "IOProbeScore" = 18446744073709551516
| | | | "CFBundleIdentifier" = "com.apple.iokit.IOPCIFamily"
| | | | "IOMatchCategory" = "IODefaultMatchCategory"
| | | | "Bridge IO Ranges" = (49152,51199,51456,53247)
| | | | "IONameMatched" = "pci-bridge"
| | | | "IOClass" = "IOPCI2PCIBridge"
| | | | "IONameMatch" = "pci-bridge"
| | | | "IOPowerManagement" = {"ChildrenPowerState"=2,"CurrentPowerState"=2}
| | | | }
| | | |
| | | +-o Ethernet@0 <class IOPCIDevice, registered, matched, active, busy 0, retain 27>
| | | | {
| | | | "IOPCIResourced" = Yes
| | | | "IOInterruptControllers" = ("io-apic-0","IOPCIMessagedInterruptController")
| | | | "IOName" = "ethernet"
| | | | "subsystem-id" = <f8810000>
| | | | "IOPCIExpressLinkCapabilities" = 502801
| | | | "class-code" = <00000200>
| | | | "IOPowerManagement" = {"ChildrenPowerState"=2,"CurrentPowerState"=2}
| | | | "revision-id" = <12000000>
| | | | "IOInterruptSpecifiers" = (<1100000007000000>,<0600000000000100>)
| | | | "assigned-addresses" = <100002820000000000c0dffb0000000000400000180002810000000000c80000000000000001
00030000282000000000000dcfb0000000000000200>
| | | | "IOChildIndex" = 1
| | | | "built-in" = <00>
| | | | "acpi-device" = "IOACPIPlatformDevice is not serializable"
| | | | "device-id" = <64430000>
| | | | "vendor-id" = <ab110000>
| | | | "acpi-path" = "IOACPIPlane:/_SB/PCI0@0/P0P9@1c0005/Ethernet@0"
| | | | "subsystem-vendor-id" = <43100000>
| | | | "name" = "ethernet"
| | | | "IOPCIExpressLinkStatus" = 4113
| | | | "reg" = <0000020000000000000000000000000000000000100002020000000000000000000000000040
00018000201000000000000000000000000000100003000020200000000000000000000000000000
00>
| | | | "compatible" = <"pci1043,81f8","pci11ab,4364","pciclass,020000">
| | | | }
| | | |
| | | +-o yukonosx <class yukonosx, registered, matched, active, busy 0, retain 7>
| | | | {
| | | | "Model" = "Yukon Gigabit Adapter 88E8056"
| | | | "IOSelectedMedium" = "00000020"
| | | | "CFBundleIdentifier" = "com.apple.iokit.AppleYukon"
| | | | "IOVendor" = "Marvell"
| | | | "InitialWaitForLinkUp" = 60000
| | | | "IOMatchCategory" = "IODefaultMatchCategory"
| | | | "Vendor" = "Marvell"
| | | | "DescriptorPollTimer" = 250
| | | | "WaitToCheckDelay" = 5000
| | | | "IOFeatures" = 2
| | | | "EED_Tickle_On" = 2000
| | | | "LowPwrPeerMax" = 240
| | | | "LowPwrPeerMin" = 60
| | | | "IOMaxPacketSize" = 9018
| | | | "IOMinPacketSize" = 64
| | | | "IOUserClientClass" = "yukonosx_ioc_uc"
| | | | "RxRingSize" = 256
| | | | "IOActiveMedium" = "00500026"
| | | | "IOModel" = "Yukon Gigabit Adapter 88E8056"
| | | | "IOProbeScore" = 0
| | | | "EnableLowPwr" = 1
| | | | "TxRingSize" = 256
| | | | "IOLinkSpeed" = 100000000
| | | | "LowPwrClockDivide" = Yes
| | | | "IOPowerManagement" = {"CurrentPowerState"=1}
| | | | "IOPacketFilters" = {"IONetworkFilterGroup"=275,"IOEthernetWakeOnLANFilterGroup"=1}
| | | | "IOMACAddress" = <001a925ea08e>
| | | | "EED_Tickle_Off" = 60000
| | | | "IOProviderClass" = "IOPCIDevice"
| | | | "InputQueueMax" = 100
| | | | "WaitForLinkUp" = 6000
| | | | "IOLinkStatus" = 3
| | | | "IOPCIPrimaryMatch" = "0x436411AB"
| | | | "IOClass" = "yukonosx"
| | | | "LowPwrD1" = Yes
| | | | }
In the example above, the path is /PCI0@0/P0P9@1c0005/Ethernet@0
After looking in an IOReg from a macbook pro with a Marvell Yukon 88E8056, I noticed that the device wasn't displayed as Ethernet@0 but GIGE@0. Further digging in the DSDT showed that this GIGE device had some infos coded there.
Now, the goal is to replace the Ethernet@0 thing with GIGE@0 and associate this node with some values that we'll include in the DSDT. The OS will use this data to determine whether the device is built-in or not, like on a real mac.
2 - Open your DSDT and find the corresponding PCI port :
In the example, the PCI port is P0P9, its adress is (_ADR, 0x001c0005) which leads to the following section :
QUOTE
Device (P0P9)
{
Name (_ADR, 0x001C0005)
Method (_PRW, 0, NotSerialized)
{
Return (GPRW (0x09, 0x04))
}
Method (_PRT, 0, NotSerialized)
{
If (PICM)
{
Return (AR09)
}
Return (PR09)
}
}
{
Name (_ADR, 0x001C0005)
Method (_PRW, 0, NotSerialized)
{
Return (GPRW (0x09, 0x04))
}
Method (_PRT, 0, NotSerialized)
{
If (PICM)
{
Return (AR09)
}
Return (PR09)
}
}
This is where the network adapter is physically located. Now we're gonna add the missing data that OSX is looking for.
3 - This is the official data about the network adapter extracted from a real mac :
QUOTE
Device (GIGE)
{
Name (_ADR, 0x00)
Name (_PRW, Package (0x02)
{
0x09,
0x03
})
Method (EWOL, 1, NotSerialized)
{
If (LEqual (Arg0, 0x01))
{
Or (GP9, 0x01, GP9)
}
Else
{
And (GP9, 0x00, GP9)
}
If (LEqual (Arg0, GP9))
{
Return (0x00)
}
Else
{
Return (0x01)
}
}
}
{
Name (_ADR, 0x00)
Name (_PRW, Package (0x02)
{
0x09,
0x03
})
Method (EWOL, 1, NotSerialized)
{
If (LEqual (Arg0, 0x01))
{
Or (GP9, 0x01, GP9)
}
Else
{
And (GP9, 0x00, GP9)
}
If (LEqual (Arg0, GP9))
{
Return (0x00)
}
Else
{
Return (0x01)
}
}
}
4 - We know that Ethernet@0 is a subdevice of P0P9, so it has to be inside its section, which means before the last } which closes it,
so, copy and past the GIGE data there :
QUOTE
Device (P0P9)
{
Name (_ADR, 0x001C0005)
Method (_PRW, 0, NotSerialized)
{
Return (GPRW (0x09, 0x04))
}
Method (_PRT, 0, NotSerialized)
{
If (PICM)
{
Return (AR09)
}
Return (PR09)
}
Device (GIGE)
{
Name (_ADR, 0x00)
Name (_PRW, Package (0x02)
{
0x09,
0x03
})
Method (EWOL, 1, NotSerialized)
{
If (LEqual (Arg0, 0x01))
{
Or (GP9, 0x01, GP9)
}
Else
{
And (GP9, 0x00, GP9)
}
If (LEqual (Arg0, GP9))
{
Return (0x00)
}
Else
{
Return (0x01)
}
}
}
}
{
Name (_ADR, 0x001C0005)
Method (_PRW, 0, NotSerialized)
{
Return (GPRW (0x09, 0x04))
}
Method (_PRT, 0, NotSerialized)
{
If (PICM)
{
Return (AR09)
}
Return (PR09)
}
Device (GIGE)
{
Name (_ADR, 0x00)
Name (_PRW, Package (0x02)
{
0x09,
0x03
})
Method (EWOL, 1, NotSerialized)
{
If (LEqual (Arg0, 0x01))
{
Or (GP9, 0x01, GP9)
}
Else
{
And (GP9, 0x00, GP9)
}
If (LEqual (Arg0, GP9))
{
Return (0x00)
}
Else
{
Return (0x01)
}
}
}
}
Save and recompile your new DSDT, put it on the root of your disk so that the loader uses it.
If you succeeded, the network device became GIGE@0 and is correctly located in the device tree.
If you failed, you probably created a fantom GIGE@0 device wandering alone somewhere with few data inside.
This guide is for experimented people only, I don't give details about how to achieve things step by step, and I won't, so don't ask me more details, if you have the skills, you'll understand it.
Please test and report, this was tested on a system with a built-in Marvell 8056, so it was very close from the mac model (8055) and may not work as good with different adapters.
The benefit is that you can use the stock IONetworkingfamily.kext and enjoy the en0 flavor (time machine working, some apps that use en0 MAC to identify the computer, etc...). However if your device needs a custom device ID edit, you'll still have to mod the kext, so the point of doing this might be compromised.
Note : If your network adapter is a PCI device, moving it to an other port will break this mod.
Note 2 : If your Network adapter was already configured as en1 or other before, you might have to delete it and re-add from the network preferences (quit the preferences and apply changes before you add it back).
Good luck.





Feb 24 2009, 11:55 AM





