I have a pretty outdated embedded linux driven system with v18.104.22.168 kernel, which came without USBNET and CDC_ETHER modules. I compiled those modules to be able to attach a certain USB-LAN stick, that works with the CDC driver, which is loaded by the USBNET module. Now I copied the modules to the folder
It is possible to load the cdc_ether module using
modprobe gives me an error.
After insmodding the usbnet module,
usbnet: exports duplicate symbol usbnet_resume (owned by kernel).
Also if I try to unload the usbnet module I get the error:
FATAL: Module usbnet is builtin
After insmodding the cdc_ether module
dmesg shows success:
eth1: register 'cdc_ether' at usb-mxc-ehci.0-1, CDC Ethernet Device, fc:8f:c4:06:e8:9c
usbcore: registered new interface driver cdc_ether
If I start up cdc_ether module manually there is an ethernet adapter
eth1 available to the system, which in turn can be sucessfully configured using
How is it possible to autoload the module when the stick gets plugged in? I have had a look at the
udev driver rules, which seem to load kernel modules, and also at the modules.* files in
/lib/modules/22.214.171.124/ ... no luck. What is the missing piece to get this working?
I just found out, looking in the compile time configuration file
/proc/config.gz that the usbnet module was supposed to be builtin by the company that compiled my kernel as it is stated there
So I basically need to run the cdc_ether module when the stick is plugged in by a udev rule, right?
I was able to grab the
modules.* files that have been built and put them into the old kernel folder
/lib/modules/126.96.36.199/. The effect is,
modprobe now knows the modules when trying to load them using modprobe.
Since usbnet module is built in, it runs right away from the startup. Only cdc_ether module needs to be started then. After getting modprobing to work I need hotplugging mechanism. For ease of coding I added cdc_ether to
/etc/modules. The module is loaded at bootup.
I had the network configuration file
/etc/network/interfaces edited properly bit the new interface
eth1 would never get its IP when it was brought up, because it was somehow already configured. So I added a udev rule which flushes the addresses of each eth-device that gets taken down.
#ACTION=="add",SUBSYSTEM=="usb",DRIVER=="cdc_ether",RUN+="/sbin/modprobe cdc_ether" ACTION=="add",SUBSYSTEM=="net",RUN+="/sbin/ifup %k" ACTION=="remove",SUBSYSTEM=="net",RUN+="/sbin/ifdown %k",RUN+="/sbin/ip addr flush %k"
I can't get the hotplug module loading to work, that's why I seem to have to stick with the loading at system startup.