Fibocom L850 LTE on Linux: A ModemManager Dead End, and a GNOME Toggle

Lenovo IdeaPad Duet 3 10IGL5-LTE

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 Mobile Data toggle in GNOME Quick Settings, showing operator, RAT and signal

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 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-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 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 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. 🙂

YouTube Transcript Distiller – A Firefox Add-On That Reads So You Don’t Have To

drowning in media

You open a video. Twelve minutes. You watch. You wait. The one insight you came for arrives at minute nine — buried under filler, recaps, and sponsor breaks.

I built this add-on because I got tired of it.

What it does

YouTube Transcript Distiller fetches the full transcript of any YouTube video, sends it to Google Gemini AI with a customizable prompt, and posts the result directly into the YouTube comment field — formatted and ready to publish.

One click. The important points, right where other viewers can see them.

Why post it as a comment?

A good summary helps everyone. The more users share what a video is actually about, the less time we all waste on clickbait and padded content. YouTube’s own algorithm rewards watch time — this add-on rewards substance.

How to get it

  1. Install the add-on from Firefox Add-Ons
  2. Get a free Gemini API key at aistudio.google.com/app/apikey
  3. Enter the key under add-on settings (gear icon next to the button)
  4. Open any YouTube video with subtitles and click Transcript Distiller

That’s it.

Features

  • AI-powered summary via Google Gemini (free API key required)
  • Posts directly into the YouTube comment field
  • Prompt fully customizable — change the instruction to anything you want
  • Supports 11 languages: Arabic, Chinese, English, French, German, Hindi, Japanese, Korean, Portuguese, Russian, Spanish
  • UI adapts to your browser language automatically
  • Your API key stays in your browser — no tracking, no data collection

Usage statistics

122
summaries created  ·  last used 1 day ago

Response languages

LanguageCount
DE 98
EN 19
ES 2
ZH 2
RU 1

Source code

The full source is on GitHub: github.com/michaelruck/yt-transcript-distiller

Built at

marsgasse.com — Just another Basement Lab

Setup a headless, (wireless) Raspberry Pi with Ubuntu Server 20.04.2 LTS (RPI 3/4/400)

Why the parenthesis around wireless? Because there is an issue with the cloudinit/netplan, I can’t figure out yet. The setup for wifi only works when an ethernet-cable is connected to the Raspi on first boot. After the initial first boot it works without ethernet. Strange!

The procedure is tested with Raspberry Pi 4 B.

  1. Start the Raspberry Pi Imager.
  2. Make a SD-Card with Ubuntu Server 20.04.2 LTS (RPI 3/4/400).
  3. Open the file “network-config” on the SD-Card with notepad++.
  4. This is a yaml configuration file. Yaml is a picky diva. There MUST be no tab-stop in the file. The indentations must all be spaces. Therefore you better switch on the visibility of the non printable characters.
  5. Make your changes. An example is below.
  6. Insert SD-Card in your Raspi.
  7. Connect the ethernet cable.
  8. Boot your Raspi.
  9. After a couple of minutes you will see your Raspi on your wired network. The wifi is not working yet.
  10. Rebooting the Raspi is activating the wifi connection. You can get rid of the ethernet cable now.
  11. Ssh is running. You can login over Wifi with PuTTY . The default login for Ubuntu server is
    User: ubuntu
    PW: ubuntu

Example network-config file

# This file contains a netplan-compatible configuration which cloud-init
# will apply on first-boot. Please refer to the cloud-init documentation and
# the netplan reference for full details:
#
# https://cloudinit.readthedocs.io/
# https://netplan.io/reference
#
# Some additional examples are commented out below

version: 2
ethernets:
  eth0:
    dhcp4: true
    optional: true
wifis:
  wlan0:
#    dhcp4: true
    addresses:
      - 192.168.0.66/24
    gateway4: 192.168.0.1
    nameservers:
      addresses: [192.168.0.1]
    optional: false
    access-points:
      "mywifi_net1":
        password: "mysecretpassword"
#      myworkwifi:
#        password: "correct battery horse staple"
#      workssid:
#        auth:
#          key-management: eap
#          method: peap
#          identity: "me@example.com"
#          password: "passw0rd"
#          ca-certificate: /etc/my_ca.pem
##Reboot after cloud-init completes
#power_state:
#  mode: reboot

Setup a headless, wireless Raspberry Pi

This procedure serves my convenience. No keyboard and mouse tampering. Simple.

Works with any Wifi-enabled Raspberry Pi.

Steps I took for Raspi Zero W and Pi 4 B:

  1. Make a bootable SD-Card with Raspberry PI Imager. For Example “Rasperry Pi OS Lite (32-Bit)”.
  2. Edit the SD-Card.
  3. In the root folder of “boot” create an empty file. Name it “ssh”. This will activate the OpenSSH-Service on next boot.
  4. Prepare Wifi connection by creating the file “wpa_supplicant.conf” in the same folder.
  5. Open the file and insert following text:
country=DE 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev 
update_config=1 
network={
     ssid="WLAN SSID"
     scan_ssid=1
     psk="WLAN PASSWORT"
     key_mgmt=WPA-PSK
}
  1. You have to change “WLAN SSID” and “WLAN PASSWORT” to your needs, of course.
  2. Insert the edited SD-Card into Raspi and boot it.
  3. After booting the Raspi should be visible in your network as “raspberrypi.NETWORKNAME”. This is easy with the help of a network scanner.
  4. Now you can open a ssh connection with PuTTY. Confirm the ssh certificate.
  5. The default login is “pi” with password “raspberry”.
  6. I recommend changing the password with the “passwd” command.
  7. Install other missing software.
  8. Done.

Postscript:

2021-08-23 This does not work with Ubuntu Server 20.04.2 LTS (RPI 3/4/400)

2021-08-30 Instead of the above procedure, in the Raspberry Pi Imager you can type the magic key combination Ctrl-Shift-x for the advanced options.

Source of this information: