A short follow-up to the Fibocom L850 story. The GNOME extension that adds a Mobile Data switch to Quick Settings is now published on extensions.gnome.org. You can install the GNOME part with one click:
Getting there took a detour. The first submission was rejected for two reasons. A GNOME extension must never call sudo or pkexec. Extension code runs inside the gnome-shell process. The reviewer also asked whether the code was AI-generated. GNOME does not accept that as-is.
Both points were fair. So I fixed them.
No more privilege escalation from the extension. All privileged work now lives in a small system D-Bus service (org.fibocom.l850). The extension is a pure client. It talks to the service over Gio.DBus.system. There is no Gio.Subprocess, no sudo, no pkexec anywhere. Changing the APN goes through a normal polkit password prompt. This is the architecture it should have had from the start.
On the AI question. Yes, I built this with AI assistance. But it is my own hardware. I use it every day. I tested every path on the real device. I found and fixed several real bugs along the way. The D-Bus rewrite was one of them. I understand the code and I maintain it.
The reworked Version 2 passed review today.
How to install it
The one-click button installs the desktop front-end only. The toggle needs two more things behind it. It needs the system D-Bus service. It needs the out-of-tree xmm7360-pci driver. Only the project repo sets those up. So install.sh from the repo is the real entry point. Run it first. Use the extensions.gnome.org button for the GNOME part after that, or let the installer handle the whole thing.
The --build flag compiles the kernel module and registers it with DKMS. It then rebuilds itself after every kernel update. Full instructions and options are in the repo:
If you have one of these modems, you now get the GNOME part with a single click. The modem is a Fibocom L850-GL. It is really an Intel XMM7360. You find it in the Lenovo IdeaPad Duet 3 and many other LTE laptops.
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.
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 xmmrpc port.
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/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.
a systemd service that brings the modem up on boot;
tiny helper scripts to toggle the wwan0 link 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 noRestart=.
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:
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.