My little Lenovo IdeaPad Duet 3 came with a built-in LTE modem. On Windows it “just worked.” On Linux it showed no signal and wouldn’t register. Getting it working turned out to be a two-part story: a quick (slightly embarrassing) SIM check, and then the real work of making Linux talk to this modem — which ModemManager flatly can’t. By the end the thing has a proper mobile-data switch in the GNOME Quick Settings panel, just like Wi-Fi.

If you just want the code: https://github.com/michaelruck/fibocom-l850-gnome-lte.
The symptom
The hardware is a Fibocom L850-GL, which is really an Intel XMM7360 (lspci shows Intel Corporation XMM7360 LTE Advanced Modem [8086:7360]). You find it in a bunch of “LTE” laptop variants.
On Linux the picture was bleak:
mmcli -L→ no modem, or a modem that would never connect.- GNOME’s Mobile Network panel: empty.
- Every signal indicator I could coax out of it said 0 / not registered.
First, the boring check: the SIM
Before blaming the driver, I checked the obvious thing — the SIM — and spotted it quickly: the old prepaid SIM had no credit left, so the network simply refused to register it. An empty SIM produces the exact “no signal, not registered” symptom that looks like a driver bug.
Topped it up, popped it back in, and the modem registered on the first try.
Lesson: check the SIM before you debug anything else. It costs two minutes and saves you from chasing a problem that isn’t there.
Why ModemManager doesn’t drive this modem
With a working SIM, the obvious path is ModemManager + NetworkManager, the way every other modem works. It doesn’t work here, and it’s worth knowing why so you don’t waste a weekend like I almost did again.
The in-kernel driver for the XMM7360 is iosm. It brings up only:
- AT command ports (
/dev/wwan0at0), and - a proprietary
xmmrpcport.
There’s no MBIM/QMI control port. Worse, those AT ports are silent — the L850 won’t answer AT until it’s been initialised and FCC-unlocked over the proprietary RPC channel first. ModemManager (I tested 1.23.4 with the Intel plugin) can’t claim the xmmrpc port either — it just logs “unhandled port type.” So MM has nothing it can actually talk to.
Conclusion: on this modem there is no native ModemManager path, and therefore no native GNOME mobile-data toggle. You need a userspace driver that speaks the proprietary RPC itself.
The working stack: xmm7360-pci
That driver exists: xmm7360-pci. It’s an out-of-tree kernel module plus a Python bring-up script that performs the RPC dance and gives you a plain wwan0 network interface.
sudo apt install build-essential "linux-headers-$(uname -r)"
sudo git clone https://github.com/xmm7360-pci/xmm7360-pci /opt/xmm7360-pci
cd /opt/xmm7360-pci && make
One thing to internalise: this module is out-of-tree and not DKMS-packaged, so every kernel update breaks LTE until you rebuild it:
cd /opt/xmm7360-pci && make clean && make
sudo install -D xmm7360.ko "/lib/modules/$(uname -r)/extra/xmm7360.ko"
sudo depmod -a && sudo modprobe xmm7360
The missing piece: desktop integration
xmm7360-pci gets you online, but it’s a script you run by hand. There’s no boot service, no toggle, no signal readout. I wanted the laptop to behave like a laptop: connect on boot, fail over to Wi-Fi when it’s around, and give me a switch in the top-right with bars and the operator name.
So I wrapped it up into a small project, fibocom-l850-gnome-lte:
- a systemd service that brings the modem up on boot;
- tiny helper scripts to toggle the
wwan0link and report status as JSON; - a GNOME Shell extension that adds a Mobile Data Quick Settings toggle showing operator, RAT and signal in dBm;
- an APN field in the extension preferences, applied through a polkit-guarded helper (no editing config files by hand).
Routing is Wi-Fi-first: the LTE default route gets a higher metric than Wi-Fi, so it only carries traffic when Wi-Fi is gone.
Install is one script:
git clone https://github.com/michaelruck/fibocom-l850-gnome-lte
cd fibocom-l850-gnome-lte
sudo ./install.sh --xmm7360-dir /opt/xmm7360-pci --build
Three gotchas worth knowing
Building this on real hardware turned up a few things the README now warns about:
1. The systemd unit must tolerate exit 1. The bring-up script deliberately exits with code 1 once wwan0 is up (it only stays resident with --dbus). A naive Restart=on-failure turns that into an infinite re-attach loop. The unit uses Type=oneshot + RemainAfterExit=yes + SuccessExitStatus=1 and no Restart=.
2. ModemManager will grab the modem behind your back. Once xmm7360 brings the modem up, those ttyXMM* AT ports do start answering, ModemManager happily adopts the modem, and NetworkManager pops up a second, non-functional mobile toggle — in my case helpfully named after the SIM (“Lidl”). The fix is a udev rule that tells MM to ignore the device:
SUBSYSTEMS=="pci", ATTRS{vendor}=="0x8086", ATTRS{device}=="0x7360", ENV{ID_MM_DEVICE_IGNORE}="1"
After that, mmcli -L reports “No modems were found” and only my toggle remains.
3. Changing the APN needs a module reload. The XMM7360 only accepts its RPC init once per module load. Re-running bring-up while it’s attached fails with ENODEV. So the “set APN” helper reloads xmm7360 before reconnecting.
Try it
The code is on GitHub: https://github.com/michaelruck/fibocom-l850-gnome-lte. It targets GNOME 45–48 and was tested on a Lenovo IdeaPad Duet 3 10IGL5 LTE, but it should help anyone stuck with a Fibocom L850-GL / XMM7360. You install it from the repo, not from extensions.gnome.org: EGO doesn’t allow extensions that call sudo/pkexec (which this one needs, since the modem has no ModemManager service to talk to), and it has a no-AI-generated-code rule that this project — honestly — falls under. So it’s manual install from GitHub.
If you found this because your “LTE laptop” shows no signal on Linux: check the SIM first, then come back and grab the driver. Don’t be me. 🙂

