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

linuxkernelnetworking

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.


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

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.

  • 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.

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

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.

Step 1: Automating the Fetch

Install the compilation toolchain, bypass the web portal, and drop the source code into a staging directory.

# Install the required Linux headers and compilation toolchain
sudo apt-get update
sudo apt-get install -y dkms build-essential linux-headers-$(uname -r) git curl wget

# Pull the latest official ASIX AX88179 Linux driver and extract it
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 {} wget -O /tmp/ax88179a_linux.tar.bz2 {}

# Extract into a properly named staging directory
sudo mkdir -p /usr/src/ax_usb_nic-4.0.0
sudo tar -xf /tmp/ax88179a_linux.tar.bz2 -C /usr/src/ax_usb_nic-4.0.0 --strip-components=1

Step 2: Arbitration and Blacklists

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.

cd /usr/src/ax_usb_nic-4.0.0

# Install ASIX udev rules and hardware blacklists
sudo make udev_install
sudo make blacklist_install

# Purge the conflicting network modules from active memory
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
sudo update-initramfs -u

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

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.

# Patch the Makefile for DKMS compatibility
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
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 install the ASIX driver
sudo dkms add -m ax_usb_nic -v 4.0.0
sudo dkms build -m ax_usb_nic -v 4.0.0
sudo dkms install -m ax_usb_nic -v 4.0.0

Step 4: Bypassing the Secure Boot Bouncer

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.

# Sign the new module with the DKMS key
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
sudo modprobe ax_usb_nic

📝 System Status

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.