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 device”.

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

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 SWI9X30C_02.33.03.00.cwe and SWI9X30C_02.33.03.00_GENERIC_002.072_000.nvu.

Tell the modem to expect the specific firmware versions you’ve downloaded. In my case, referring to the file names, these were 02.33.03.00 and 002.072_000 (and GENERIC):

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 nm-connection-editor. From 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.