Tools: Fix ASIX AX88179 Ethernet Crash Loop on Linux When Using a UGREEN USB-C Hub

Tools: Fix ASIX AX88179 Ethernet Crash Loop on Linux When Using a UGREEN USB-C Hub

🧠 The Root Cause: Why Your USB Ethernet Adapter is Dead on Linux

🛠️ The Fix: Compiling the Official ASIX Linux Driver via DKMS

Step 1: Automating the Fetch

Step 2: Arbitration and Blacklists

Step 3: Compiling via DKMS (Dynamic Kernel Module Support)

Step 4: Bypassing the Secure Boot Bouncer

📝 System Status You buy a new USB-C hub. You plug it into a Windows partition, and the Gigabit Ethernet adapter lights up instantly via plug-and-play magic. You reboot into Linux, and the interface is dead. Wired cable unplugged. If you are running the UGREEN UNO 7-in-1 Hub (Model 45155) featuring the ASIX AX88179 chipset on a modern kernel (6.1+ on Ubuntu 24.04 or Linux Mint 22), standard user-space debugging is a waste of time. Restarting Network Manager or disabling USB autosuspend won't save you. This isn't a configuration typo. It is a fundamental architectural conflict between a proprietary hardware gimmick and strict Linux kernel module dependencies. Here is the pointer arithmetic behind the USB-C hub crash loop, and how to rewrite the rules. USB network adapters are composite devices, and this specific UGREEN hub exposes exactly how fragile Linux's handling of these configurations can be. Bridging the gap between "broken" and "functional" requires looking at how the drivers interact with the metal. To actually fix this Gigabit Ethernet adapter issue, we have to abandon the broken in-tree modules. We force the hardware into its native configuration, compile the official ASIX driver from source, and cryptographically sign it to bypass Secure Boot. Install the compilation toolchain, bypass the web portal, and drop the source code into a staging directory. We need udev rules to block the generic driver, and blacklists to suppress the broken in-tree driver. The ASIX Makefile handles this device arbitration for us. Running a standard make install is how you break your internet connection the next time apt updates your Ubuntu kernel. We use DKMS so the custom driver recompiles itself automatically during system updates. If Secure Boot is enforcing signatures in your BIOS, the kernel will block your custom driver (Key was rejected by service). Because we used DKMS, the system generated a Machine Owner Key (MOK). We need to inject that cryptographic signature into the newly compiled binary. Unplug the UGREEN hub. Wait five seconds for the hardware capacitors to drain. Plug it back in. Run ethtool enx... using your specific predictable interface name. The interface powers up the PHY cleanly, bypassing the LCD interrupt storm. You will see Speed: 1000Mb/s alongside Link detected: yes. No magic code. Just a resilient networking stack engineered to survive the next Linux kernel update. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse

Command

Copy

# Install the required Linux headers and compilation toolchain -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">update -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install -y dkms build-essential linux-headers-$(uname -r) -weight: 500;">git -weight: 500;">curl -weight: 500;">wget # Pull the latest official ASIX AX88179 Linux driver and extract it -weight: 500;">curl -sL https://www.asix.com.tw/en/product/USBEthernet/Super-Speed_USB_Ethernet/AX88179A | grep -A 10 'Linux kernel' | grep -oP 'data-href="\K[^"]+' | head -n 1 | xargs -I {} -weight: 500;">wget -O /tmp/ax88179a_linux.tar.bz2 {} # Extract into a properly named staging directory -weight: 600;">sudo mkdir -p /usr/src/ax_usb_nic-4.0.0 -weight: 600;">sudo tar -xf /tmp/ax88179a_linux.tar.bz2 -C /usr/src/ax_usb_nic-4.0.0 --strip-components=1 # Install the required Linux headers and compilation toolchain -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">update -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install -y dkms build-essential linux-headers-$(uname -r) -weight: 500;">git -weight: 500;">curl -weight: 500;">wget # Pull the latest official ASIX AX88179 Linux driver and extract it -weight: 500;">curl -sL https://www.asix.com.tw/en/product/USBEthernet/Super-Speed_USB_Ethernet/AX88179A | grep -A 10 'Linux kernel' | grep -oP 'data-href="\K[^"]+' | head -n 1 | xargs -I {} -weight: 500;">wget -O /tmp/ax88179a_linux.tar.bz2 {} # Extract into a properly named staging directory -weight: 600;">sudo mkdir -p /usr/src/ax_usb_nic-4.0.0 -weight: 600;">sudo tar -xf /tmp/ax88179a_linux.tar.bz2 -C /usr/src/ax_usb_nic-4.0.0 --strip-components=1 # Install the required Linux headers and compilation toolchain -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">update -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install -y dkms build-essential linux-headers-$(uname -r) -weight: 500;">git -weight: 500;">curl -weight: 500;">wget # Pull the latest official ASIX AX88179 Linux driver and extract it -weight: 500;">curl -sL https://www.asix.com.tw/en/product/USBEthernet/Super-Speed_USB_Ethernet/AX88179A | grep -A 10 'Linux kernel' | grep -oP 'data-href="\K[^"]+' | head -n 1 | xargs -I {} -weight: 500;">wget -O /tmp/ax88179a_linux.tar.bz2 {} # Extract into a properly named staging directory -weight: 600;">sudo mkdir -p /usr/src/ax_usb_nic-4.0.0 -weight: 600;">sudo tar -xf /tmp/ax88179a_linux.tar.bz2 -C /usr/src/ax_usb_nic-4.0.0 --strip-components=1 cd /usr/src/ax_usb_nic-4.0.0 # Install ASIX udev rules and hardware blacklists -weight: 600;">sudo make udev_install -weight: 600;">sudo make blacklist_install # Purge the conflicting network modules from active memory -weight: 600;">sudo modprobe -r ax88179_178a cdc_ncm cdc_ether cdc_mbim # Rebuild the boot image so the kernel respects the blacklist on the next boot -weight: 600;">sudo -weight: 500;">update-initramfs -u cd /usr/src/ax_usb_nic-4.0.0 # Install ASIX udev rules and hardware blacklists -weight: 600;">sudo make udev_install -weight: 600;">sudo make blacklist_install # Purge the conflicting network modules from active memory -weight: 600;">sudo modprobe -r ax88179_178a cdc_ncm cdc_ether cdc_mbim # Rebuild the boot image so the kernel respects the blacklist on the next boot -weight: 600;">sudo -weight: 500;">update-initramfs -u cd /usr/src/ax_usb_nic-4.0.0 # Install ASIX udev rules and hardware blacklists -weight: 600;">sudo make udev_install -weight: 600;">sudo make blacklist_install # Purge the conflicting network modules from active memory -weight: 600;">sudo modprobe -r ax88179_178a cdc_ncm cdc_ether cdc_mbim # Rebuild the boot image so the kernel respects the blacklist on the next boot -weight: 600;">sudo -weight: 500;">update-initramfs -u # Patch the Makefile for DKMS compatibility -weight: 600;">sudo sed -i 's/TARGET = ax88179_178a/TARGET = ax_usb_nic/g' /usr/src/ax_usb_nic-4.0.0/Makefile # Generate the DKMS config file -weight: 600;">sudo bash -c 'cat > /usr/src/ax_usb_nic-4.0.0/dkms.conf <<EOF PACKAGE_NAME="ax_usb_nic" PACKAGE_VERSION="4.0.0" CLEAN="make clean" MAKE="make KERNELRELEASE=\$kernelver" BUILT_MODULE_NAME="ax_usb_nic" DEST_MODULE_LOCATION="/updates/dkms" AUTOINSTALL="yes" EOF' # Build and -weight: 500;">install the ASIX driver -weight: 600;">sudo dkms add -m ax_usb_nic -v 4.0.0 -weight: 600;">sudo dkms build -m ax_usb_nic -v 4.0.0 -weight: 600;">sudo dkms -weight: 500;">install -m ax_usb_nic -v 4.0.0 # Patch the Makefile for DKMS compatibility -weight: 600;">sudo sed -i 's/TARGET = ax88179_178a/TARGET = ax_usb_nic/g' /usr/src/ax_usb_nic-4.0.0/Makefile # Generate the DKMS config file -weight: 600;">sudo bash -c 'cat > /usr/src/ax_usb_nic-4.0.0/dkms.conf <<EOF PACKAGE_NAME="ax_usb_nic" PACKAGE_VERSION="4.0.0" CLEAN="make clean" MAKE="make KERNELRELEASE=\$kernelver" BUILT_MODULE_NAME="ax_usb_nic" DEST_MODULE_LOCATION="/updates/dkms" AUTOINSTALL="yes" EOF' # Build and -weight: 500;">install the ASIX driver -weight: 600;">sudo dkms add -m ax_usb_nic -v 4.0.0 -weight: 600;">sudo dkms build -m ax_usb_nic -v 4.0.0 -weight: 600;">sudo dkms -weight: 500;">install -m ax_usb_nic -v 4.0.0 # Patch the Makefile for DKMS compatibility -weight: 600;">sudo sed -i 's/TARGET = ax88179_178a/TARGET = ax_usb_nic/g' /usr/src/ax_usb_nic-4.0.0/Makefile # Generate the DKMS config file -weight: 600;">sudo bash -c 'cat > /usr/src/ax_usb_nic-4.0.0/dkms.conf <<EOF PACKAGE_NAME="ax_usb_nic" PACKAGE_VERSION="4.0.0" CLEAN="make clean" MAKE="make KERNELRELEASE=\$kernelver" BUILT_MODULE_NAME="ax_usb_nic" DEST_MODULE_LOCATION="/updates/dkms" AUTOINSTALL="yes" EOF' # Build and -weight: 500;">install the ASIX driver -weight: 600;">sudo dkms add -m ax_usb_nic -v 4.0.0 -weight: 600;">sudo dkms build -m ax_usb_nic -v 4.0.0 -weight: 600;">sudo dkms -weight: 500;">install -m ax_usb_nic -v 4.0.0 # Sign the new module with the DKMS key -weight: 600;">sudo kmodsign sha512 /var/lib/shim-signed/mok/MOK.priv /var/lib/shim-signed/mok/MOK.der $(modinfo -n ax_usb_nic) # Force the Linux kernel to load the signed driver -weight: 600;">sudo modprobe ax_usb_nic # Sign the new module with the DKMS key -weight: 600;">sudo kmodsign sha512 /var/lib/shim-signed/mok/MOK.priv /var/lib/shim-signed/mok/MOK.der $(modinfo -n ax_usb_nic) # Force the Linux kernel to load the signed driver -weight: 600;">sudo modprobe ax_usb_nic # Sign the new module with the DKMS key -weight: 600;">sudo kmodsign sha512 /var/lib/shim-signed/mok/MOK.priv /var/lib/shim-signed/mok/MOK.der $(modinfo -n ax_usb_nic) # Force the Linux kernel to load the signed driver -weight: 600;">sudo modprobe ax_usb_nic - The Generic Blindness (cdc_ncm): If you let the system default to the generic Linux standard driver, it connects without throwing kernel panics. But the connection is a ghost. Run ethtool and you get Speed: Unknown!. The generic driver assumes the hardware is smart enough to power on its own Physical Layer (PHY). It isn't. ASIX chips are built cheap; they sit in the dark, waiting for the OS to send a proprietary wake-up command. The generic driver doesn't know the command, so the hardware stays asleep. - The Interrupt Storm (ax88179_178a): Force the native Linux driver, and the kernel immediately spits out -110 (Timeout) and -32 (Broken Pipe) errors, entering an infinite Ethernet crash loop. Here is the punchline: The UGREEN UNO features a "Smart LED Emoji Face." That LCD is driven by an internal microcontroller that constantly spams the USB bus with interrupt polling requests to sync its animations. When the native Linux driver tries to execute a simple read of the Ethernet chip's MAC address, it gets drowned in this hidden hardware interrupt storm. The driver times out, panics, forcefully drops the connection, and the cycle repeats.