I’m running into an issue with a USB Ethernet dongle( TP-Link UE306 USB 3.0 Type-A to Gigabit Ethernet Network Adapter) not creating a network interface on a custom OpenWrt build for Raspberry Pi 5.
This device is ASIX AX88179B (0b95:1790), which uses the ax88179_178a driver. It presents as CDC Ethernet (ic02/isc06), not MBIM (ic0e), so kmod-usb-net-cdc-mbim doesn’t seem applicable here.
The device reports as ASIX AX88179B (0b95:1790) with interface class ic02/isc06 (CDC Ethernet), not ic0e (MBIM), so kmod-usb-net-cdc-mbim does not seem applicable here. The expected driver is ax88179_178a , and those modules are present and loaded. The issue is that the driver never binds and no interface gets created. Since the same adapter works fine for me on OpenWrt 24.10.5, this points more toward a regression or build/module mismatch in the newer image than a missing MBIM package.
The AX88179B is a USB 3.2 Gen1 to Gigabit Ethernet controller with integrated 10/100/1000Mbps Gigabit Ethernet PHY. AX88179B supports Windows 11/10/8.x, Linux/Android/Chrome OS, Nintendo Switch in-box drivers, and iOS/iPadOS/macOS/Linux native CDC-NCM driver for driverless, Plug & Play.
which likely means you need kmod-usb-net-cdc-ncm installed
This adapter has 3 USB configurations.
In the example given the active configuration is Cfg#= 2 that works with Driver=cdc_ncm. Cfg#= 1 is vendor proprietary, see below. Cfg#= 3 is Cls=02(comm.) Sub=06, so it should work with Driver=cdc_ether.
Assuming there is no adapter specific hotplug script in place, Cfg#= 2 is the default configuration.
There is a udev rule ("50-ax_usb_nic.rules") provided by the manufacturer with the driver sources:
The logic is simple - if the current configuration is not 1, then set it to 1, and then probably the vendor-specific driver will pick it up.
So, we can easily implement the same logic in OpenWrt using hotplug and set any configuration number we want. For example, with cfg#3 set cdc_ether should be able to pick it up.
That makes sense. On 24.10.5 the device is clearly using config #2 (CDC NCM, subclass 0d) with the cdc_ncm driver, which is what brings the interface up.
It looks like in the newer build the kernel is either not selecting config #2 anymore or cdc_ncm isn’t being used, which would explain why no interface gets created.
Forcing the USB configuration via hotplug seems like a good workaround. I’ll try forcing config #2 first since that’s known to work, and if needed test config #3 with cdc_ether as a fallback.
I’ll try this in the evening and report back with results — can’t risk bringing the network down during work hours
to /etc/rc.local if the adapter always is plugged into the same port at boot (given by the x-y).
A better long term fix is creating a "cfgselector" driver for ax88179_178a similar to the one I added to r8152 a while ago:
But I really wish we weren't having these issues. If the vendors have to add these class functions as separate configurations then they could at least add some dummy class function to the first configuration. Anything would to to prevent the Linux USB core from changing the default configuration.
You know what i was thinking the same. May be i should start with including that package in custom build and see if that fixes it before doing manual intervention.
I have an ASIX adapter and a test device I could use to try the workaround.
Would someone please explain more on where to modify the configuration.
Here is the output of /sys/kernel/debug/usb/devices: