28 Jun 2026

GPS Modem Troubleshooting Report

1. Executive Summary

On a Panasonic Toughbook CF-31-5 running Xubuntu 26.04 LTS, the Sierra Wireless modem stopped exposing the QMI control device /dev/cdc-wdm0. The system still showed /dev/ttyUSB* serial devices initially, but GPS/QMI tooling failed because commands targeting /dev/cdc-wdm0 could no longer run.

The modem appeared on USB as:

Bus 001 Device 005: ID 1199:9041 Sierra Wireless, Inc. EM7305/EM7355-family Modem

During recovery, qmicli reported the actual modem model as:

Model: 'EM7355'

The final confirmed working state after reboot was:

If 0 -> option      -> /dev/ttyUSB0
If 2 -> option      -> /dev/ttyUSB1
If 3 -> option      -> /dev/ttyUSB2
If 8 -> qmi_wwan    -> /dev/cdc-wdm0

The active USB composition was confirmed as composition 6:

[*] USB composition 6: DM, NMEA, AT, QMI

This is the desired composition for this setup because it provides serial interfaces for diagnostic/AT/NMEA functions and a QMI control interface for qmicli.

The issue was not a failed modem or missing QMI support in the kernel. The immediate failure was that the Linux option serial driver grabbed interface 8, which should have been owned by qmi_wwan. Because qmi_wwan could not bind to interface 8, the kernel did not create /dev/cdc-wdm0.

The recovery was completed by ensuring qmi_wwan claimed interface 8 first, then adding the modem USB ID dynamically to the option1 usb-serial driver so the serial interfaces could bind without taking the QMI interface.

2. Environment and Affected Components

Item Value
Hardware Panasonic Toughbook CF-31-5
Operating system Xubuntu 26.04 LTS
Modem USB ID 1199:9041
Reported model via qmicli EM7355
Initial symptom /dev/cdc-wdm0 disappeared
Serial devices /dev/ttyUSB* existed initially, later restored after fix
Desired QMI driver qmi_wwan
Desired WDM/control driver cdc_wdm
Desired serial driver option / option1 usb-serial layer
QMI interface USB interface 1-6:1.8

3. Symptoms

The primary symptom was that /dev/cdc-wdm0 disappeared. As a result, QMI/GPS management commands failed, including commands like:

sudo qmicli --device-open-mbim -p -d /dev/cdc-wdm0 --dms-swi-get-usb-composition

Later analysis showed that because the modem was active in QMI composition 6, the correct command style should be plain QMI, without --device-open-mbim:

sudo qmicli -p -d /dev/cdc-wdm0 --dms-get-model
sudo qmicli -p -d /dev/cdc-wdm0 --dms-swi-get-usb-composition

Initial dmesg output confirmed that the modem was detected and the QMI-related drivers existed:

usb 1-6: New USB device found, idVendor=1199, idProduct=9041
usb 1-6: Manufacturer: Sierra Wireless, Incorporated
usbcore: registered new interface driver cdc_wdm
usbcore: registered new interface driver qmi_wwan

However, there was initially no successful bind message like:

qmi_wwan 1-6:1.8: cdc-wdm0: USB WDM device

The initial bad lsusb -t state showed interface 8 bound to option instead of qmi_wwan:

|__ Port 006: Dev 005, If 0, Class=Vendor Specific Class, Driver=option, 480M
|__ Port 006: Dev 005, If 2, Class=Vendor Specific Class, Driver=option, 480M
|__ Port 006: Dev 005, If 3, Class=Vendor Specific Class, Driver=option, 480M
|__ Port 006: Dev 005, If 8, Class=Vendor Specific Class, Driver=option, 480M

This was the key failure condition.

4. Root Cause Analysis

4.1. Technical root cause

The modem was in a valid QMI-capable USB composition, but the Linux serial driver option claimed USB interface 1-6:1.8. That interface needed to be claimed by qmi_wwan so that cdc_wdm could create /dev/cdc-wdm0.

When option owned interface 8, the system still had serial-style modem behavior, but it lacked the QMI control device.

The correct binding is:

If 0 -> option
If 2 -> option
If 3 -> option
If 8 -> qmi_wwan

The incorrect binding was:

If 0 -> option
If 2 -> option
If 3 -> option
If 8 -> option

4.2. Contributing factor: bad/legacy modprobe configuration

A legacy configuration file existed:

/etc/modprobe.d/sierra-em7305.conf:options option vendor=0x1199 product=0x9041

This produced kernel messages such as:

option: unknown parameter 'vendor' ignored
option: unknown parameter 'product' ignored

Those parameters are not valid for the option driver on this system. The file was at minimum noisy and misleading, and it was part of the configuration path that caused confusion around option binding.

The file was disabled by renaming it:

sudo mv /etc/modprobe.d/sierra-em7305.conf /etc/modprobe.d/sierra-em7305.conf.disabled

4.3. Contributing factor: driver support asymmetry

The qmi_wwan module did know about this modem/interface:

alias: usb:v1199p9041d*dc*dsc*dp*ic*isc*ip*in0A*
alias: usb:v1199p9041d*dc*dsc*dp*ic*isc*ip*in08*

However, after disabling the bad options option vendor/product configuration, the serial interfaces did not bind automatically. Adding the USB ID dynamically to the option1 usb-serial driver restored the serial ports:

echo 1199 9041 | sudo tee /sys/bus/usb-serial/drivers/option1/new_id

This allowed option to claim interfaces 0, 2, and 3 while leaving interface 8 with qmi_wwan.

4.4. 5 Whys

  1. Why did GPS/QMI commands fail?

    Because /dev/cdc-wdm0 was missing, so qmicli could not open the modem control device.

  2. Why was /dev/cdc-wdm0 missing?

    Because qmi_wwan did not bind to the modem's QMI interface, so cdc_wdm did not create the WDM character device.

  3. Why did qmi_wwan not bind?

    Because USB interface 1-6:1.8, which should have been handled by qmi_wwan, was already claimed by the option serial driver.

  4. Why did option claim the QMI interface?

    The system had legacy/custom Sierra modem configuration involving the option driver, including an invalid /etc/modprobe.d/sierra-em7305.conf file. The serial driver was loading/binding too broadly or too early relative to qmi_wwan.

  5. Why was this not caught earlier?

    The modem still partially worked as a serial USB device, so the failure appeared as a GPS/QMI problem rather than a USB driver binding problem. The absence of /dev/cdc-wdm0 was the visible symptom, but the underlying issue was only clear after inspecting lsusb -t and seeing interface 8 bound to the wrong driver.

5. Resolution and Recovery

5.1. Step 1: Confirm the bad binding

The bad state was identified with:

lsusb -t

Bad state:

If 8, Driver=option

Good state:

If 8, Driver=qmi_wwan

5.2. Step 2: Temporarily block the serial driver

The option driver was temporarily blocked to allow qmi_wwan to claim interface 8 first:

sudo tee /etc/modprobe.d/disable-option-temporarily.conf >/dev/null <<'EOF'
blacklist option
install option /bin/false
EOF

The modem was then rebound and the QMI modules were loaded:

sudo sh -c 'echo 1-6 > /sys/bus/usb/drivers/usb/unbind'
sudo rmmod option 2>/dev/null || true
sudo rmmod usb_wwan 2>/dev/null || true
sudo modprobe cdc_wdm
sudo modprobe qmi_wwan
sudo sh -c 'echo 1-6 > /sys/bus/usb/drivers/usb/bind'

This restored /dev/cdc-wdm0.

Successful dmesg evidence:

qmi_wwan 1-6:1.8: cdc-wdm0: USB WDM device
qmi_wwan 1-6:1.8 wwan0: register 'qmi_wwan' at usb-0000:00:14.0-6, WWAN/QMI device
qmi_wwan 1-6:1.8 wwp0s20u6i8: renamed from wwan0

5.3. Step 3: Confirm modem model and USB composition

After /dev/cdc-wdm0 returned, qmicli confirmed the modem model:

sudo qmicli -p -d /dev/cdc-wdm0 --dms-get-model

Output:

[/dev/cdc-wdm0] Device model retrieved:
        Model: 'EM7355'

The USB composition was confirmed:

sudo qmicli -p -d /dev/cdc-wdm0 --dms-swi-get-usb-composition

Output:

[/dev/cdc-wdm0] Successfully retrieved USB compositions:
            USB composition 1: HIP, DM, NMEA, AT, MDM1, MS
        [*] USB composition 6: DM, NMEA, AT, QMI
            USB composition 7: DM, NMEA, AT, RMNET1, RMNET2, RMNET3
            USB composition 8: DM, NMEA, AT, MBIM
            USB composition 9: MBIM
            USB composition 10: NMEA, MBIM
            USB composition 11: DM, MBIM
            USB composition 12: DM, NMEA, MBIM
            USB composition 14: Dual configuration: USB composition 6 and USB composition 9
            USB composition 19: Dual configuration: USB composition 7 and USB composition 9

No USB composition change was needed. Composition 6 was correct for QMI + AT/NMEA usage.

5.4. Step 4: Restore serial ports without stealing QMI

After qmi_wwan owned interface 8, the serial ID was added dynamically to the option1 usb-serial driver:

echo 1199 9041 | sudo tee /sys/bus/usb-serial/drivers/option1/new_id

This restored the serial ports while keeping QMI intact.

Working state before reboot:

|__ Port 006: Dev 005, If 0, Class=Vendor Specific Class, Driver=option, 480M
|__ Port 006: Dev 005, If 2, Class=Vendor Specific Class, Driver=option, 480M
|__ Port 006: Dev 005, If 3, Class=Vendor Specific Class, Driver=option, 480M
|__ Port 006: Dev 005, If 8, Class=Vendor Specific Class, Driver=qmi_wwan, 480M

Devices restored:

/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2
/dev/cdc-wdm0

5.5. Step 5: Make the fix persistent

The bad legacy file was disabled:

sudo mv /etc/modprobe.d/sierra-em7305.conf /etc/modprobe.d/sierra-em7305.conf.disabled 2>/dev/null || true

A QMI-first soft dependency was created:

sudo tee /etc/modprobe.d/em7355-qmi-first.conf >/dev/null <<'EOF'
softdep option pre: qmi_wwan cdc_wdm
EOF

A udev rule was created to add the modem USB ID to the option1 usb-serial driver:

sudo tee /etc/udev/rules.d/99-em7355-option-serial.rules >/dev/null <<'EOF'
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1199", ATTR{idProduct}=="9041", RUN+="/bin/sh -c 'modprobe option; echo 1199 9041 > /sys/bus/usb-serial/drivers/option1/new_id 2>/dev/null || true'"
EOF

Rules/initramfs were refreshed:

sudo udevadm control --reload-rules
sudo update-initramfs -u 2>/dev/null || true

5.6. Step 6: Validate after reboot

After reboot, the system showed the desired layout:

|__ Port 006: Dev 004, If 0, Class=Vendor Specific Class, Driver=option, 480M
|__ Port 006: Dev 004, If 2, Class=Vendor Specific Class, Driver=option, 480M
|__ Port 006: Dev 004, If 3, Class=Vendor Specific Class, Driver=option, 480M
|__ Port 006: Dev 004, If 8, Class=Vendor Specific Class, Driver=qmi_wwan, 480M

Device nodes existed:

crw------- 1 root root    180, 0 Jun 28 00:16 /dev/cdc-wdm0
crw-rw---- 1 root dialout 188, 0 Jun 28 00:16 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 Jun 28 00:16 /dev/ttyUSB1
crw-rw---- 1 root dialout 188, 2 Jun 28 00:16 /dev/ttyUSB2

qmicli validation succeeded:

sudo qmicli -p -d /dev/cdc-wdm0 --dms-get-model

Output:

[/dev/cdc-wdm0] Device model retrieved:
        Model: 'EM7355'

6. Current Known-Good Configuration

6.1. Driver binding

If 0 -> option
If 2 -> option
If 3 -> option
If 8 -> qmi_wwan

6.2. Device nodes

/dev/cdc-wdm0
/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2

6.3. Modem composition

USB composition 6: DM, NMEA, AT, QMI

6.4. Correct QMI command style

Because the active composition is QMI, use plain QMI commands:

sudo qmicli -p -d /dev/cdc-wdm0 --dms-get-model
sudo qmicli -p -d /dev/cdc-wdm0 --dms-swi-get-usb-composition

Do not use --device-open-mbim unless the modem is intentionally switched to an MBIM composition such as composition 8, 9, 10, 11, 12, 14, or 19.

7. Action Items

7.1. Completed

  • [X] Confirmed modem was detected on USB as 1199:9041.
  • [X] Confirmed qmi_wwan supports 1199:9041 interface 8 and 10.
  • [X] Identified incorrect driver binding: interface 8 bound to option.
  • [X] Temporarily blocked option to allow qmi_wwan to claim interface 8.
  • [X] Restored /dev/cdc-wdm0.
  • [X] Confirmed modem model as EM7355.
  • [X] Confirmed active USB composition 6: DM, NMEA, AT, QMI.
  • [X] Disabled invalid legacy modprobe configuration.
  • [X] Restored serial ports using option1/new_id.
  • [X] Added persistent QMI-first rule and udev serial binding rule.
  • [X] Rebooted and confirmed working state.

7.2. Recommended follow-up

  • [ ]

    Save a backup copy of these files:

    sudo cp /etc/modprobe.d/em7355-qmi-first.conf ~/em7355-qmi-first.conf.backup
    sudo cp /etc/udev/rules.d/99-em7355-option-serial.rules ~/99-em7355-option-serial.rules.backup
    
  • [ ]

    After future kernel or OS updates, verify the driver layout:

    lsusb -t
    ls -l /dev/cdc-wdm*
    ls -l /dev/ttyUSB*
    sudo qmicli -p -d /dev/cdc-wdm0 --dms-get-model
    
  • [ ] If GPS scripts depend on fixed ttyUSB numbers, consider adding udev symlinks for stable names such as /dev/gps-nmea and /dev/modem-at.
  • [ ] Update any scripts that use --device-open-mbim unless the modem is deliberately switched to MBIM. Current composition 6 should use plain QMI.
  • [ ] Keep sierra-em7305.conf.disabled for reference temporarily, then delete it after several successful reboots/updates.

8. Quick Reference

8.1. Good state

If 8, Driver=qmi_wwan
/dev/cdc-wdm0 exists
/dev/ttyUSB0-2 exist

8.2. Bad state

If 8, Driver=option
/dev/cdc-wdm0 missing

8.3. Fast diagnostic commands

lsusb -t
ls -l /dev/cdc-wdm* 2>/dev/null
ls -l /dev/ttyUSB* 2>/dev/null
sudo qmicli -p -d /dev/cdc-wdm0 --dms-get-model
sudo qmicli -p -d /dev/cdc-wdm0 --dms-swi-get-usb-composition

8.4. Emergency manual recovery

Use this only if /dev/cdc-wdm0 disappears again because interface 8 is stolen by option.

# Temporarily stop option from holding the QMI interface.
sudo sh -c 'echo 1-6:1.8 > /sys/bus/usb/drivers/option/unbind' 2>/dev/null || true

# Ensure QMI support is loaded.
sudo modprobe cdc_wdm
sudo modprobe qmi_wwan

# Bind interface 8 to qmi_wwan.
sudo sh -c 'echo 1-6:1.8 > /sys/bus/usb/drivers/qmi_wwan/bind'

# Restore serial interfaces if needed.
sudo modprobe option
echo 1199 9041 | sudo tee /sys/bus/usb-serial/drivers/option1/new_id

8.5. Persistent configuration files

/etc/modprobe.d/em7355-qmi-first.conf:

softdep option pre: qmi_wwan cdc_wdm

/etc/udev/rules.d/99-em7355-option-serial.rules:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1199", ATTR{idProduct}=="9041", RUN+="/bin/sh -c 'modprobe option; echo 1199 9041 > /sys/bus/usb-serial/drivers/option1/new_id 2>/dev/null || true'"

9. Notes and Caveats

  • The modem was initially described as an EM7305, but qmicli identified it as EM7355. This report uses EM7355 for the working configuration while preserving the original context.
  • The modem did not require a USB composition change. Composition 6 was already active and correct.
  • The exact historical reason for the old sierra-em7305.conf file is unknown. It may have been from a prior workaround or installation attempt.
  • If the USB device path changes from 1-6 in the future, commands that hard-code 1-6 may need adjustment. lsusb -t and dmesg can be used to identify the current path.
  • Interface 8 must remain bound to qmi_wwan for /dev/cdc-wdm0 to exist.
Tags: xubuntu linux gps gpsd qmi toughbook sierra wireless modem