Jump to content

Intel XMM 7360

From ArchWiki


This article or section is out of date.

Reason: Since Linux 5.18 the mainline iosm driver exposes this modem, and ModemManager speaks its native RPC protocol since commit 87c88dc2 on 2026-05-24, so the out-of-tree driver described below is no longer required. See #Native ModemManager support. (Discuss in Talk:Intel XMM 7360)

Thinkpads with an AMD processor since 2020 (e.g. Lenovo Thinkpad L/T14 (AMD) Gen 1, Lenovo ThinkPad T14s (AMD) Gen 1, Lenovo Thinkpad L15 (AMD) Gen 1) connect only PCIe to the LTE modem.

Fibocom "supports" Linux only in USB mode. There is no sign of an official driver being developed. For newer generations (L860 ?), Lenovo is developing a driver.

To get this hardware working on Linux, the only solution is an alpha stage driver, written with Python 3, found at https://github.com/xmm7360/xmm7360-pci.

This driver is intended to work with Fibocom L850-GL LTE, without switching to USB (since it is not supported on AMD models) but with direct commands to the modem. To verify if you have this hardware, do the following:

$ lspci -nnd 8086:7360
05:00.0 Wireless controller [0d40]: Intel Corporation XMM7360 LTE Advanced Modem [8086:7360] (rev 01)

Preparation

Note The modem must first be activated under Windows. If it is deactivated, attempting to open the channel will result in the error message:
INFO:root:Attach failed - waiting to see if we just weren't ready

Install linux-headers and base-devel along with acpi_call, python-pyroute2 and python-configargparse.

Remove the PIN in Windows and check that it is a working card.

Alternatively echo the PIN with

# echo "AT+CPIN=\"0000\"" >> /dev/ttyXMM1

after the make && make load steps.

Replace 0000 with your pin code. (c.f. https://github.com/xmm7360/xmm7360-pci/pull/21/files)

Installation

The factual accuracy of this article or section is disputed.

Reason: Should we not point users to the xmm7360-usb-modeswitch-gitAUR, xmm7360-pci-spat-dkms-gitAUR and xmm7360-pci-spat-utils-gitAUR packages instead of building from source and installing files without having them tracked by pacman? (Discuss in Talk:Intel XMM 7360)
$ git clone https://github.com/xmm7360/xmm7360-pci.git
$ cd xmm7360-pci
$ make && make load
# python3 rpc/open_xdatachannel.py --apn apn.url
# echo "nameserver 1.1.1.1" >> /etc/resolv.conf
# ip link set wwan0 up

Linux Kernel support and Modem Manager integration

Support for this device has been added since Linux 5.18 (see torvalds/linux@1f52d7b). ModemManager accesses such WWAN modems via MBIM interface, provided by the iosm kernel module. The GL-860 does provide a MBIM interface, the GL-850 does not. Fibocom/Intel do not seem to care, there is no announcement/rumor that they will be implementing it.

That is why xmm7360-pci/issue/31 correctly states that even with the kernel driver, the modem does not work: With iosm kernel module loaded, the interface shows up as /dev/wwan0at0 and /dev/wwan0at1, and is seen by mmcli -L, but journalctl yields SIM not inserted:

ModemManager:   <info>  [device /sys/devices/pci0000:00/0000:00:02.5/0000:05:00.0]
                        creating modem with plugin 'Intel' and '3' ports
ModemManager:   <warn>  [plugin/intel] could not grab port wwan0at0:
                        Cannot add port 'wwan/wwan0at0', unhandled port type
ModemManager:   <info>  [base-manager] modem for device '/sys/devices/pci0000:00/0000:00:02.5/0000:05:00.0'
                        successfully created
ModemManager:   <warn>  [modem3] couldn't load supported IP families: SIM not inserted
ModemManager:   <info>  [modem3] state changed (unknown -> locked)
ModemManager:   <warn>  [modem3] modem couldn't be initialized: Couldn't check unlock status: SIM not inserted
ModemManager:   <info>  [modem3] state changed (locked -> failed)
ModemManager:   <warn>  [modem3] error initializing: Modem in failed state: sim-missing
ModemManager:   <info>  [1673136941.3379] manager: (wwan0at1): new Broadband device
                        (/org/freedesktop/NetworkManager/Devices/11)
NetworkManager: <info>  [1673136941.3382] device (wwan0at1): state change: unmanaged -> unavailable
                        (reason 'managed', sys-iface-state: 'external')
NetworkManager: <info>  [1673136941.3385] device (wwan0at1): modem state 'failed'
NetworkManager: <info>  [1673136941.3387] modem-broadband[wwan0at1]:
                        failed to retrieve SIM object: No SIM object available

There is ongoing development in ModemManager/issue/612: A patch was accepted in Linux 6.2rc1 that adds a low-level mbim.rpc interface intended to ultimately be used as kernel module which shall be script-glued into ModemManager (and be compatible to the xmm7360-pci python3 rpc/open_xdatachannel.py script). However, that repo is no longer maintained. However, some users did manage to get the module to work within ModemManager.

See also

  • fibocom-l850-gnome-lte — systemd service that brings the modem up on boot, helper scripts, and a GNOME Quick Settings toggle (mobile data on/off, signal, APN) built on top of xmm7360-pci. Ships a udev ID_MM_DEVICE_IGNORE rule for the phantom ModemManager/NetworkManager mobile toggle described above.

Native ModemManager support

ModemManager implements the XMM7360's native RPC protocol since the 1.25 development cycle. It drives the modem entirely through the mainline iosm driver's ports (/dev/wwan0at0, /dev/wwan0at1, /dev/wwan0xmmrpc0) — no out-of-tree driver and no USB mode switching.

ModemManager version

As of July 2026 ModemManager 1.26 has not been released and modemmanager (1.24.2) lacks the support, so a build from git main is required. Snapshots up to the 1.25.95-dev tag crash on this modem (assertion failure in RPC message parsing, ModemManager issue 1034); use a commit at or after the fix (merged 2026-05-24). Note that git main requires libqmi from git (newer than libqmi); if you have no QMI hardware, configuring ModemManager with -D qmi=false -D qrtr=false avoids that dependency entirely — the XMM7360 does not use QMI. Beware that building through arch-meson, as a PKGBUILD would, enables all auto features and thus pulls the qcom-soc plugin — and with it QMI — back in despite those two options; add -D plugin_qcom_soc=disabled as well.

FCC unlock

ModemManager ships an unlock script for this modem (/usr/share/ModemManager/fcc-unlock.available.d/8086:7360). Two caveats:

  • The script requires xxd (e.g. tinyxxd). Without it, it writes an empty request and then blocks forever on the reply — a silent hang with no error.
  • Enabling it the documented way (symlink in /etc/ModemManager/fcc-unlock.d/) can crash ModemManager: the unlock script and the daemon then use /dev/wwan0xmmrpc0 concurrently and the interleaved streams time out (ModemManager issue 1028). It is more reliable to run the script standalone before the daemon opens the port, with a drop-in:
/etc/systemd/system/ModemManager.service.d/fcc-unlock.conf
[Service]
ExecStartPre=-/usr/local/bin/wwan-fcc-unlock
/usr/local/bin/wwan-fcc-unlock
#!/usr/bin/env bash
for _ in {1..30}; do [[ -c /dev/wwan0xmmrpc0 ]] && break; sleep 1; done
[[ -c /dev/wwan0xmmrpc0 ]] || exit 0   # no modem present
exec timeout 30 bash /usr/share/ModemManager/fcc-unlock.available.d/8086:7360 dummy wwan0xmmrpc0

The unlock persists until the modem loses power, so re-running it on every daemon start is harmless.

Firmware quirks

  • PCI runtime power management crashes the modem firmware (ModemManager issue 992). Disable it with a udev rule:
/etc/udev/rules.d/99-wwan-nopm.rules
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", ATTR{device}=="0x7360", ATTR{power/control}="on"
  • Crashed firmware is recognizable by msg timeout and PORT open refused, phase A-CD_READY (or phase A-ROM, meaning the modem dropped back into its boot ROM without firmware) in the kernel log; the AT ports return I/O errors on open, which ModemManager reports as unhandled port type / Failed to find primary AT port. Warm reboots, driver reloads and PCI remove/rescan do not recover it, as none of them cut the modem's power. A full power-off does, and so does the ACPI reset method described in #Suspend and resume. Note that a single unhandled port type warning, for one of the two AT ports, is normal and appears on a perfectly healthy modem — ModemManager only grabs one of them. It indicates crashed firmware only together with the kernel messages above, when both AT ports fail to open.

Suspend and resume

On some machines the modem does not survive suspend. It dies on resume, not on suspend entry, and independently of runtime power management — that is, with power/control=on as well. Such platforms cut the modem's power on S3/S4 entry without abstracting it as an ACPI power resource, and do not restore it on resume until a device-specific reset method is called, so its PCI configuration space cannot be restored and the device stays dead until reboot [1]. Compare the power resource quirk proposed for the HP EliteBook 855 G7.

If the firmware exposes a _RST method for the modem, the kernel offers it as a PCI reset method, and the modem can be revived without powering the machine off:

$ cat /sys/bus/pci/devices/0000:05:00.0/reset_method
acpi bus

With acpi listed, the following script brings a dead modem back — on a ThinkPad T14s AMD Gen 1 the method is \_SB.PCI0.GPP5.L850._RST:

/usr/local/bin/wwan-resume-reset
#!/usr/bin/env bash
SLOT="$(lspci -Dn -d 8086:7360)"
SLOT="${SLOT%% *}"
D=/sys/bus/pci/devices/$SLOT
if [[ ! -e "$D/reset_method" ]]; then exit 0; fi
echo "$SLOT" > /sys/bus/pci/drivers/iosm/unbind
sleep 1
echo acpi > "$D/reset_method"
echo 1 > "$D/reset"
sleep 5
echo "$SLOT" > /sys/bus/pci/drivers/iosm/bind
systemctl restart ModemManager.service

The modem loses its FCC unlock along with its power, hence the ModemManager restart: with the unlock wired as ExecStartPre (see #FCC unlock) that is all it takes. To have this happen after every resume, pull the script from a unit:

/etc/systemd/system/wwan-resume-reset.service
[Unit]
Description=Reset the WWAN modem after resume
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/wwan-resume-reset
TimeoutStartSec=120

[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

Enable the unit. Roughly 50 seconds pass between resume and a connected modem.

Connecting

With the above in place the modem appears in mmcli -L and a standard NetworkManager GSM profile works:

# nmcli connection add type gsm ifname "*" con-name wwan gsm.apn your.apn connection.autoconnect yes connection.metered yes