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
Why did GPS/QMI commands fail?
Because
/dev/cdc-wdm0was missing, soqmiclicould not open the modem control device.Why was
/dev/cdc-wdm0missing?Because
qmi_wwandid not bind to the modem's QMI interface, socdc_wdmdid not create the WDM character device.Why did
qmi_wwannot bind?Because USB interface
1-6:1.8, which should have been handled byqmi_wwan, was already claimed by theoptionserial driver.Why did
optionclaim the QMI interface?The system had legacy/custom Sierra modem configuration involving the
optiondriver, including an invalid/etc/modprobe.d/sierra-em7305.conffile. The serial driver was loading/binding too broadly or too early relative toqmi_wwan.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-wdm0was the visible symptom, but the underlying issue was only clear after inspectinglsusb -tand 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 as1199:9041.[X]Confirmedqmi_wwansupports1199:9041interface 8 and 10.[X]Identified incorrect driver binding: interface 8 bound tooption.[X]Temporarily blockedoptionto allowqmi_wwanto claim interface 8.[X]Restored/dev/cdc-wdm0.[X]Confirmed modem model asEM7355.[X]Confirmed active USB composition 6:DM, NMEA, AT, QMI.[X]Disabled invalid legacy modprobe configuration.[X]Restored serial ports usingoption1/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 fixedttyUSBnumbers, consider adding udev symlinks for stable names such as/dev/gps-nmeaand/dev/modem-at.[ ]Update any scripts that use--device-open-mbimunless the modem is deliberately switched to MBIM. Current composition 6 should use plain QMI.[ ]Keepsierra-em7305.conf.disabledfor 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
qmicliidentified it asEM7355. This report usesEM7355for 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.conffile is unknown. It may have been from a prior workaround or installation attempt. - If the USB device path changes from
1-6in the future, commands that hard-code1-6may need adjustment.lsusb -tanddmesgcan be used to identify the current path. - Interface 8 must remain bound to
qmi_wwanfor/dev/cdc-wdm0to exist.