diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2963b8735..8aafacc88 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@
- Drops Rosetta requirement on Apple Silicon Macs
- Note building from source will require Python 3.11 or newer and up-to-date Python modules
- Resolve dGPU support for MacBookPro14,3 in macOS Sonoma
+- Resolve USB ethernet support in macOS Sonoma
+ - For Ethernet dongles based on ECM protocol (ex. Realtek)
- Increment Binaries:
- OpenCorePkg 0.9.3 - release
- Lilu 1.6.6 - release
diff --git a/payloads/Config/config.plist b/payloads/Config/config.plist
index 8492f2931..da5833c78 100644
--- a/payloads/Config/config.plist
+++ b/payloads/Config/config.plist
@@ -1761,6 +1761,24 @@
PlistPath
Contents/Info.plist
+
+ Arch
+ x86_64
+ Comment
+ USB Ethernet - ECM
+ Enabled
+
+ MaxKernel
+
+ MinKernel
+ 23.0.0
+ BundlePath
+ ECM-Override.kext
+ ExecutablePath
+
+ PlistPath
+ Contents/Info.plist
+
Block
diff --git a/payloads/Kexts/Misc/ECM-Override-v1.0.0.zip b/payloads/Kexts/Misc/ECM-Override-v1.0.0.zip
new file mode 100644
index 000000000..6a4496dc2
Binary files /dev/null and b/payloads/Kexts/Misc/ECM-Override-v1.0.0.zip differ
diff --git a/resources/build/networking/wired.py b/resources/build/networking/wired.py
index 342d022fc..c2de8cc05 100644
--- a/resources/build/networking/wired.py
+++ b/resources/build/networking/wired.py
@@ -33,6 +33,20 @@ class BuildWiredNetworking:
else:
self._prebuilt_assumption()
+ # Always enable due to chance of hot-plugging
+ self._usb_ecm_dongles()
+
+
+ def _usb_ecm_dongles(self) -> None:
+ """
+ USB ECM Dongle Handling
+ """
+ # With Sonoma, our WiFi patches require downgrading IOSkywalk
+ # Unfortunately Apple's DriverKit stack uses IOSkywalk for ECM dongles, so we'll need force load
+ # the kernel driver to prevent a kernel panic
+ # - DriverKit: com.apple.DriverKit.AppleUserECM.dext
+ # - Kext: AppleUSBECM.kext
+ support.BuildSupport(self.model, self.constants, self.config).enable_kext("ECM-Override.kext", self.constants.ecm_override_version, self.constants.ecm_override_path)
def _on_model(self) -> None:
"""
@@ -63,7 +77,7 @@ class BuildWiredNetworking:
support.BuildSupport(self.model, self.constants, self.config).enable_kext("nForceEthernet.kext", self.constants.nforce_version, self.constants.nforce_path)
elif isinstance(controller, device_probe.Marvell) or isinstance(controller, device_probe.SysKonnect):
support.BuildSupport(self.model, self.constants, self.config).enable_kext("MarvelYukonEthernet.kext", self.constants.marvel_version, self.constants.marvel_path)
-
+
# Pre-Ivy Bridge Aquantia Ethernet Patch
if isinstance(controller, device_probe.Aquantia) and controller.chipset == device_probe.Aquantia.Chipsets.AppleEthernetAquantiaAqtion:
if not self.model in smbios_data.smbios_dictionary:
diff --git a/resources/constants.py b/resources/constants.py
index e6fda315e..b35172f7a 100644
--- a/resources/constants.py
+++ b/resources/constants.py
@@ -92,6 +92,7 @@ class Constants:
self.mce_version: str = "1.0.0" # AppleMCEReporterDisabler
self.btspoof_version: str = "1.0.0" # Bluetooth-Spoof
self.aspp_override_version: str = "1.0.1" # ACPI_SMC_PlatformPlugin Override
+ self.ecm_override_version: str = "1.0.0" # AppleUSBECM Override
self.rsrhelper_version: str = "1.0.0" # RSRHelper
self.amfipass_version: str = "1.3.1" # AMFIPass
self.amfipass_compatibility_version: str = "1.2.1" # Minimum AMFIPass version required
@@ -502,6 +503,10 @@ class Constants:
def aspp_override_path(self):
return self.payload_kexts_path / Path(f"Misc/ASPP-Override-v{self.aspp_override_version}.zip")
+ @property
+ def ecm_override_path(self):
+ return self.payload_kexts_path / Path(f"Misc/ECM-Override-v{self.ecm_override_version}.zip")
+
@property
def nvmefix_path(self):
return self.payload_kexts_path / Path(f"Acidanthera/NVMeFix-v{self.nvmefix_version}-{self.kext_variant}.zip")