Contribute
Register

[GUIDE] Replace non-working Intel I225 with 82574L PCIe NIC (Monterey + OpenCore)

@leborgne,

In most cases only the PID (the first two bytes, IE 0x10F6) are significant when dealing with device-id matching, the Vendor ID (the last two bytes, IE 0x8086) tend not to be used. The method should work fine if you use 8086 as the VID, the only reason i used 0000 is out of habbit from the days when i did a lot of IGPU patching.

Cheers
Jay
Ok got it . Thanks for taking the time Jay !
 
Hello @jaymonkey, Intel firmware flashing utility? do you mean "eeupdate64e /gui"?

I have the I225-V V3 model on Asus B560-G motherboard, I tried the device-id method with three different IDs, all of them showing connected to the Internet cable, and get the IP, but cannot visit any website.

I also read some information on Intel 1.68 firmware, but cannot find more info right now.

Any suggestions?
 
Intel firmware flashing utility? do you mean "eeupdate64e /gui"?

@Sn0wMan,

Yes

I have the I225-V V3 model on Asus B560-G motherboard, I tried the device-id method with three different IDs, all of them showing connected to the Internet cable, and get the IP, but cannot visit any website.

I also read some information on Intel 1.68 firmware, but cannot find more info right now.

I tried the fix documented on the link I posted and it worked for me ...

Did you try flashing the fixed firmware or did you just flash the PID/VID of your existing firmware ?

Cheers
Jay
 
Note: As of April 2022 there is now a community fix for the non-working Intel I225 V Ethernet controller on Gigabyte motherboards when running macOS Monterey. The fix is very easy to apply and simply involves flashing the I225 V ethernet controller with updated/modified firmware using the Intel firmware flashing utility. I've applied the fix myself to my Gigabyte Z490 Vision G system and can confirm that it works.

More details on the fix along with a link to the necessary files can be found here :-




Background

With the release of MacOS Monterey, many of us with motherboards that have an on-board Intel I225 NIC have found that it is no longer functional, despite the fact it was working well in MacOS BigSur.

There have been many attempts to resolve the issue using different approaches but so far there is no clear answer. It is speculated that the problem could be something to do with the hardware revision and/or firmware version of the I225 chip, however this is still un-proven and the recommended solution in 95% of cases is to disable the on-board I225 NIC and replace it with an alternative.

Many users have had success using a cheap USB->Ethernet adapter, however almost all USB->Ethernet adapters use software running on the CPU to process the LAN packets rather than processing them on the bare metal NIC. As a result these adapters only provide basic connectivity and are not capable of running in promiscuous mode and most lack support for more advanced features such as Wake on LAN.

There are number of PCIe NiC's that can be made to work on MacOS Monterey using 3rd party kexts that have been developed by the Hackintosh community such as Intel cards supported by the IntelMausi kext which is now maintained by Acidanthera and RealTek based cards using the kext's maintained by Mieze.

Another approach is to inject older kext's to support Ethernet NIC's that Apple long dropped support for, however this approach is not something I would personally recommend as SIP needs to be disabled and Apple could depreciate the old API's that these kexts rely on at any time

I was not really interested in any of the above approaches and wanted to see if it was possible to use a current and natively supported PCIe NIC in Monterey, one that uses Apple supplied and maintained kexts rather than one relying on a 3rd party or depreciated kext.

It should be noted that Apple have removed official support for many 3rd party NIC's in MacOS Monterey that where once supported in BigSur and earlier versions of MacOS so the options are now somewhat limited and official documentation on what PCIe NIC's are supported is hard to find.

So the first thing I did was to take a peek in IONetworkingFamily.kext/Contents/Plugins which is located in the /System/Library/Extensions folder, here we can see the following natively supported kext drivers for Ethernet NIC's.

View attachment 542457
From the above list I was able to research the capabilities of each supported NIC's, my home network is 1 Gigabit Ethernet so I decided to go with an Intel 82574L based solution as these cards are cheep and wildly available and only require a PCIe x1 expansion slot. After a quick search on my preferred hardware suppliers web store I found the following PCIe card :-

Intel Gigabit Pro 1000CT PCI Express Gigabit Network Card OEM
View attachment 542462
1 Port Intel Gigabit PRO EXPI9301CTBLK 1000CT Gigabit PCI-e Network Adapter - OEM

As MacOS Monterey has a kext driver specifically for the Intel 82574L NIC I was somewhat hopefully that VID & PID would match the ones defined in Apples kext and it would esentially be plug and play, however this proved not to be the case.

After some experimentation I found the solution was to modify the device properties of the NIC, make a small patch for the kext and then force MacOS to load the kext during boot-up.

Rather than just give you the code to cut and paste i'll try to explain what each part of the fix does and why it is needed, that said if your not familiar with OpenCore I highly recommend reading the official documentation and referencing the sample config.plist, both can be found in the Docs folder that is included with each release of OpenCore.

The following method should work for any motherboard and will most likely work for any of the Ethernet kext drivers in IONetworkingFamily.kext/Contents/Plugins with modification to the file paths, identifiers and PID's/VID's.

For reference I'm booting MacOS Monterey 12.3.1 via OpenCore 0.8.0 on a Gigabyte Z490 Vision G.

Prerequisites

First, backup your existing EFI folder, so that you have working EFI that you can fall back to if things go wrong.

Next you should remove any existing kexts, device properties and boot args from your OpenCore EFI and config.plist that you may have been using for the Intel I225, once you have made and saved the changes, shutdown the system and install the new PCIe card in a empty PCIe slot. As the Intel 82574L PCIe card only has a PCIe x1 interface I recommend installing it in one of the PCIe x1 slots that is routed through the PCH, since the built in Intel I225 NIC was also routed through the PCH it should not put any extra load on the PCH data bus.

Note that installing a Ethernet PCIe card in one of the expansion slots that is directly connected the CPU will reduce the number of PCIe lanes available for a dGPU (if you have one installed).

Once you have installed the new PCIe Ethernet card, boot up the PC and enter the BIOS to disable the on-board Intel I225 Ethernet NIC.

View attachment 542601

Save the changes, and boot into MacOS Monterey normally.

Step-1 - Identify the Intel 82574L NIC's Device Path.

Run HackinTool and click on the PCI icon and find the new Intel 82574L NIC in the device list, right click on the entry for the Intel 82574L NIC and select "Copy Device Path"

View attachment 542463

In my case the Device Path for the Intel 82574L NIC is PciRoot(0x0)/Pci(0x1B,0x2)/Pci(0x0,0x0) but this will be different depending on the make/type of motherboard you have and PCIe slot you put the card in.

Step-2 - Create Custom Device Properties for the Intel 82574L NIC

Mount your EFI partition and open your OpenCore config.plist in the editor of your choice, I always work with the raw code using BBEdit, but you can use whatever code or plist editor you want.

Using the Device Path you copied from Hackintool, create a new <key> in the DeviceProperties->Add section of your config.plist.

Code:
    <key>DeviceProperties</key>
    <dict>
        <key>Add</key>
        <dict>
            <key>PciRoot(0x0)/Pci(0x1B,0x2)/Pci(0x0,0x0)</key>

Now copy and paste the following device properties after the <key> you just created.

Code:
            <dict>
                <key>AAPL,slot-name</key>
                <string>PCIEX4</string>
                <key>built-in</key>
                <data>AA==</data>
                <key>device-id</key>
                <data>9hAAAA==</data>
                <key>device_type</key>
                <string>Ethernet Controller</string>
                <key>subsystem-id</key>
                <data>AAAAAA==</data>
                <key>subsystem-vendor-id</key>
                <data>AAAAAA==</data>
                <key>vendor-id</key>
                <data>hoAAAA==</data>
            </dict>

Change the string value for AAPL,slot-name to match the slot you have installed the Intel 82574L NIC in, in most cases you will likely have other existing entires but for this example I will keep it simple so the Device Properties section it should now look something like this :-

Code:
    <key>DeviceProperties</key>
    <dict>
        <key>Add</key>
        <dict>
            <key>PciRoot(0x0)/Pci(0x1B,0x2)/Pci(0x0,0x0)</key>
            <dict>
                <key>AAPL,slot-name</key>
                <string>PCIEX4</string>
                <key>built-in</key>
                <data>AQ==</data>
                <key>device-id</key>
                <data>9hAAAA==</data>
                <key>device_type</key>
                <string>Ethernet Controller</string>
                <key>subsystem-id</key>
                <data>AAAAAA==</data>
                <key>subsystem-vendor-id</key>
                <data>AAAAAA==</data>
                <key>vendor-id</key>
                <data>hoAAAA==</data>
            </dict>
        </dict>
        <key>Delete</key>
        <dict/>
    </dict>

Explanation of the Device Properties

Code:
                <key>built-in</key>
                <data>AQ==</data>

Sets the "built-in" flag to 0x01 so that MacOS thinks it's a built-in device.

Code:
                <key>device-id</key>
                <data>9hAAAA==</data>

This changes the Intel 82574L device-id (Primary PID) to 0x10F60000 which is required for the primary PID match in Apples native 82574L kext driver, if you open the info.plist for the Intel82574L.kext you can see where we get this value from :-

View attachment 542465

Code:
                <key>device_type</key>
                <string>Ethernet Controller</string>

This is pretty self explanatory.

Code:
                <key>subsystem-id</key>
                <data>AAAAAA==</data>
                <key>subsystem-vendor-id</key>
                <data>AAAAAA==</data>
                <key>vendor-id</key>
                <data>hoAAAA==</data>

Sets the sub-system PID & VID to 0x00000000 and vendor-id (Primary VID) to 0x80860000 (Intel).

Step-3 - Patch the Intel82574L kext to ignore the Secondary PID & VID Match

Despite injecting the correct PID and VID values for both the primary and secondary PCI matches the native Apple kext still refused to bind it's self to the newly installed NIC. In order to fix this add the following to the Kernel->Patch section of your config.plist

Code:
            <dict>
                <key>Arch</key>
                <string>Any</string>
                <key>Base</key>
                <string></string>
                <key>Comment</key>
                <string>Intel 82574L Ethernet</string>
                <key>Count</key>
                <integer>0</integer>
                <key>Enabled</key>
                <true/>
                <key>Find</key>
                <data>SU9QQ0lTZWNvbmRhcnlNYXRjaA==</data>
                <key>Identifier</key>
                <string>com.apple.driver.Intel82574LEthernet</string>
                <key>Limit</key>
                <integer>0</integer>
                <key>Mask</key>
                <data></data>
                <key>MaxKernel</key>
                <string></string>
                <key>MinKernel</key>
                <string></string>
                <key>Replace</key>
                <data>RFVNTVlTZWNvbmRhcnlNYXRjaA==</data>
                <key>ReplaceMask</key>
                <data></data>
                <key>Skip</key>
                <integer>0</integer>
            </dict>
        </array>

This patch changes the <key> name IOPCISecondaryMatch in info.plist of the Intel82574L.kext to DUMMYSecondaryMatch thus effectually disabling secondary PID and VID matching.

Step-4 - Force MacOS to load the Intel82574L kext.

Create the following entry in the Kernel/Force section of your config.plist

Code:
        <key>Force</key>
        <array>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>BundlePath</key>
                <string>System\Library\Extensions\IONetworkingFamily.kext\Contents\PlugIns\Intel82574L.kext</string>
                <key>Comment</key>
                <string>For Intel 82574L NIC</string>
                <key>Enabled</key>
                <true/>
                <key>ExecutablePath</key>
                <string>Contents/MacOS/Intel82574L</string>
                <key>Identifier</key>
                <string>com.apple.driver.Intel82574LEthernet</string>
                <key>MaxKernel</key>
                <string></string>
                <key>MinKernel</key>
                <string></string>
                <key>PlistPath</key>
                <string>Contents/Info.plist</string>
            </dict>
        </array>

This entry forces MacOS to load the Intel82574L kext regardless of the Mac model / SMBIOS you are using.

Step-5 - Final checks and Testing

After you have made the above changes and saved the updated config.plist, i recommend using OCValidate to check that there are no syntax or formatting errors, if the file passes validation then you can reboot and load MacOS again.

Run Hackintool again and check the entry for the Intel 82574L NIC, if everything has worked you should see that the devices Primary PID is now 0x10F6 and if you click on the magnifying glass icon for that entry you should see that the device is now attached to the Intel82574L.kext.

At this point you should find that the 82574L NIC is working.

View attachment 542466

I've been running my system with the Intel 82574L NIC for about two weeks now and it's been 100% stable with no issues with sleep and wake, since we are using a native Apple kext driver it's highly likely that "Wake on LAN" should also work although this is something that I haven't tested myself.

Cheers
Jay
Hi Jay,
I'm not getting a 100% stable connexion after all.
3-4 times a day I lose my internet access (although the link is still up and IP address is still valid) and I have to delete and add the interface in sysprefs to get it working again.
Swapping with another identical NIC did not solve the issue.
Any ideas ? anyone ?
 
Back
Top