Getting an EM7455 WLAN module working on Linux
I bought a new (used) laptop, a ThinkPad T470s, and realised that a) it had a slot and antennas for a WLAN module, b) I could pick up one of those modules for £30 on eBay, and c) if I took advantage of Three’s free Data Reward SIM I’d have a convenient if limited connection when I can’t find WiFi, without having to tether my phone.
It’s a bit frivolous, perhaps – I can always tether – but seemed like an interesting experiment.
The module arrived, I plugged it in, fiddled the microscopic antenna connectors into place, and turned the computer back on.
The good news was that Ubuntu 21.04 immediately recognised the modem, and even knew the configuration settings for Three internet.
The bad news was that no matter how many times I told it to connect, nothing happened.
I installed the
modem-manager-gui package and ran that from the terminal.
That gave me a bit more information – that the modem wasn’t enabled and needed
to be enabled – but when I clicked on the “enable” button it was still not
enabled. It also gave me something a bit more useful: an error in the terminal
saying “Invalid transition”.
A bit of searching on that lead me to
helpful instructions on installing new firmware on the
card. I followed
those steps, but the
qmi-firmware-update stage failed with “couldn’t open qmi
More searching led me to a thread about flashing the card on OpenWRT, and the important insight that, even if you couldn’t flash it via MBIM, you could get it into a state where it would accept commands over a TTY.
The first thing to do is to stop ModemManager so that it doesn’t get in the way:
sudo systemctl stop ModemManager.service
Update as of ModemManager 1.18.4, you’ll also need to symlink the FCC unlock script if you haven’t done so already:
sudo ln -s /usr/share/ModemManager/fcc-unlock.available.d/1199:9079 \ /etc/ModemManager/fcc-unlock.d/
If you’ve followed the instructions in the link above, obtained the generic
firmware, and extracted it to
/tmp/firmware, you’ll have a couple of files
named something like
Tell the modem to expect the specific firmware versions you’ve
downloaded. In my case, referring to the file names, these were
sudo qmicli -d /dev/cdc-wdm0 -p \ --dms-set-firmware-preference="02.33.03.00,002.072_000,GENERIC"
Take the modem offline and reset it:
sudo qmicli -p -d /dev/cdc-wdm0 --dms-set-operating-mode=offline sudo qmicli -p -d /dev/cdc-wdm0 --dms-set-operating-mode=reset
… and wait for a new
/dev/ttyUSB* to appear. In my case it was
/dev/ttyUSB0. Once it appears, you have a relatively short period of time in
which to perform the next step:
sudo qmi-firmware-update -t /dev/ttyUSB0 --update-download \ /tmp/firmware/SWI9X30C_02.33.03.00.cwe \ /tmp/firmware/SWI9X30C_02.33.03.00_GENERIC_002.072_000.nvu
If that finished successfully, you’ll be able to query the current firmware:
sudo qmicli -d /dev/cdc-wdm0 -p --dms-swi-get-current-firmware
It should look something like this:
[/dev/cdc-wdm0] Successfully retrieved current firmware: Model: EM7455 Boot version: SWI9X30C_02.33.03.00 AMSS version: SWI9X30C_02.33.03.00 SKU ID: 1103339 Package ID: unknown Carrier ID: 1 Config version: 002.072_000
You can now restart ModemManager:
sudo systemctl start ModemManager.service
I found that I had to create a new configuration for the modem, but it doesn’t
seem to be possible to delete an existing connection from the Gnome network
editing interface. I was able to do this via
then on, everything worked as it should.
I assume that my card somehow either didn’t have any radio firmware loaded, or the previous owner managed to mess it up and that’s why they were selling it cheap. Or maybe you have to install some special application on Windows that handles all that. Despite that, these cards seem fairly robust, and as long as it responds to some commands it should be possible to get it into a state where it will accept working firmware.