Fixing the Foxconn T99W175 (Snapdragon X55) WWAN Modem on Linux

Hardware: Lenovo ThinkPad X13 Gen 2 (applies to other ThinkPads with this modem)
Modem: Foxconn T99W175 / Qualcomm Snapdragon X55 5G
OS: Linux Mint (Debian/Ubuntu-based)
Driver: mhi-pci-generic / mhi_wwan_mbim
Carrier: AT&T (US)


The Problem

If you have a Lenovo ThinkPad with the Foxconn T99W175 (Snapdragon X55) WWAN modem and you’re running Linux, you’ve likely experienced one or more of these symptoms:

  • Terrible performance — speeds measured in KB/s instead of MB/s
  • 5-10 second ping times despite being near a tower
  • Windows works perfectly on the same hardware
  • The modem shows as connected but passes little or no data
  • 5G never connects even on a 5G network

This post explains what’s actually causing each issue and how to fix it permanently.


Root Cause 1: PCIe Power Management Killing the Data Channel

The mhi-pci-generic driver that handles this modem on Linux allows the kernel to put the PCIe device into low-power states (ASPM D3hot) during idle periods. The modem does not wake up cleanly from these states, resulting in the MBIM data channel freezing. The bearer shows connected, the IP address is assigned, but rx_bytes never increments — no data flows.

This is why Windows works fine. The Windows driver disables ASPM for this device by default. Linux does not.

Fix: Systemd Service to Force PCIe Power On

Create the following service file:

/etc/systemd/system/modem-stay-awake.service
[Unit]
Description=Force Qualcomm X55 Modem Power to ON
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo on > /sys/bus/pci/devices/0000:08:00.0/power/control'
ExecStartPost=/bin/sh -c 'echo -1 > /sys/bus/pci/devices/0000:08:00.0/power/autosuspend_delay_ms'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Then enable it:

sudo systemctl daemon-reload
sudo systemctl enable modem-stay-awake.service
sudo systemctl start modem-stay-awake.service

Both lines matter. Setting power/control to on prevents ASPM sleep. Setting autosuspend_delay_ms to -1 disables the autosuspend timer. You need both — setting only power/control is not sufficient.

Verify it worked:

cat /sys/bus/pci/devices/0000:08:00.0/power/control
# Should return: on

Root Cause 2: Lenovo FCC Lock

Lenovo ships this modem with a regulatory software lock (FCC lock) that restricts transmit power and 5G access until an unlock script runs. ModemManager includes the unlock script but it must be explicitly enabled by creating a symlink.

Check if it is already enabled:

ls /etc/ModemManager/fcc-unlock.d/105b:e0ab

If that file does not exist, create it:

sudo ln -s /usr/share/ModemManager/fcc-unlock.available.d/105b:e0ab 
  /etc/ModemManager/fcc-unlock.d/105b:e0ab
sudo systemctl restart ModemManager

You can verify the unlock ran successfully by executing the script manually:

sudo /usr/share/ModemManager/fcc-unlock.available.d/105b 
  /org/freedesktop/ModemManager1/Modem/0 wwan0mbim0

It should return: Successfully run Foxconn FCC authentication v2


Root Cause 3: (AT&T-specific) APN Mismatch Preventing 5G

Standard LTE on AT&T uses the APN broadband. However, 5G NR on AT&T requires the APN nrbroadband. If your NetworkManager profile is set to broadband, or if there is a mismatch between the modem’s initial EPS bearer APN and the NM profile APN, 5G will not attach and you may also see repeated bearer connection failures in the ModemManager journal.

You can confirm this mismatch by checking:

mmcli -m 0 | grep "initial bearer apn"
nmcli connection show "AT&T ATT Broadband 1" | grep gsm.apn

If these don’t match, or if either shows broadband instead of nrbroadband, apply the fix below.

Fix: Align Initial Bearer and NM Profile APNs

sudo mmcli -m 0 --3gpp-set-initial-eps-bearer-settings="apn=nrbroadband,ip-type=ipv4v6"
sudo nmcli connection modify "AT&T ATT Broadband 1" gsm.apn nrbroadband
sudo nmcli connection modify "AT&T ATT Broadband 1" gsm.mtu 1420
sudo nmcli connection up "AT&T ATT Broadband 1"

The MTU of 1420 is important for 5G header overhead and prevents fragmentation issues.


Verification

After applying all three fixes and rebooting, verify your configuration:

# PCIe power state
cat /sys/bus/pci/devices/0000:08:00.0/power/control

# Modem status and access technology
mmcli -m 0 | grep "access tech"

# Signal quality
sudo mmcli -m 0 --signal-setup=5 && sleep 6 && mmcli -m 0 --signal-get

# APN in use
mmcli -b 1 | grep apn

With all fixes applied you should see access tech: lte, 5gnr when 5G is available, and signal polling should return real RSRP values rather than just RSSI.


Notes

  • The PCI address 0000:08:00.0 is specific to the ThinkPad X13 Gen 2. Confirm yours with lspci | grep -i foxconn and adjust the systemd service if different.
  • This has been tested on Linux Mint with kernel 6.17 and ModemManager 1.23.4.
  • The FCC unlock symlink path uses the PCI vendor:device ID 105b:e0ab which is specific to the Lenovo variant of this modem. Other vendors (HP, Dell) use different IDs.
  • AT&T’s nrbroadband APN behavior may differ by plan. If you are on a legacy AT&T plan, broadband may be correct for your line.

 

If you have benefited from this information, please leave me a tip here: https://ko-fi.com/Z8Z71DDD77