[PATCH net-next v2 0/3] net: wwan: support DTR/RTS on AT ports via MHI IP_CTRL

From: Peter Hunt

Date: Thu Aug 06 2026 - 12:03:31 EST


The WWAN character device emulates the TTY modem-control ioctls
(TIOCMGET/TIOCMSET/...) for AT and QCDM ports, but the result is only
stored in port->at_data.mdmbits and never reaches the port driver. A
driver therefore cannot act on the host raising or dropping DTR/RTS.

This matters for Qualcomm/Sierra SDX55/SDX65 MHI modems (e.g. Sierra
EM9291): they withhold unsolicited AT result codes (URCs such as +CREG,
and OMA-DM/LwM2M session indications) on an AT port until the host
asserts DTR, while still answering solicited commands. mhi_wwan_ctrl
exposes the DUN (AT) ports but had no way to signal DTR, so URCs never
reached userspace -- unlike the TTY-based USB and legacy PCIe drivers for
the same hardware, where the TTY layer raises DTR on open.

Patch 1 adds optional ->tiocmget/->tiocmset ops to wwan_port_ops and
wires them into the AT/QCDM ioctl path (drivers without them keep today's
store-only behaviour). Patch 2 enumerates the IP_CTRL channel -- a
standard Qualcomm MHI control channel, not Sierra-specific -- on the
Sierra em919x/em929x config, which is the device tested. Patch 3
implements ->tiocmset in mhi_wwan_ctrl over IP_CTRL, and mirrors TTY
semantics by raising DTR/RTS on open and dropping on close, so existing
userspace (ModemManager, terminal tools) behaves as it does with the
TTY-based stacks.

The IP_CTRL channel is bound by a second mhi_driver inside mhi_wwan_ctrl
with its own callbacks, leaving the AT/QMI/MBIM data path untouched; the
control device for each MHI controller is tracked per-controller so
multiple modems are supported. The consumer is device-agnostic (it binds
purely by channel name), so any Qualcomm modem whose pci_generic config
enumerates IP_CTRL gets DTR support with no driver change.

Note: the series spans two subsystems -- patch 2 touches drivers/bus/mhi
(MHI BUS), patches 1 and 3 touch drivers/net/wwan and include/linux/wwan.h
(WWAN / netdev). Patch 3 depends on patch 1 at build time; patch 2 is
independent (without it, ->tiocmset simply returns -EIO). Suggest taking
the series through net-next with an Ack from the MHI maintainer on patch 2,
but happy to split if the maintainers prefer.

Tested on a Sierra EM9291 (SDX65) over PCIe/MHI: with the series, opening
/dev/wwan0at0 raises DTR and +CREG / +DMI OMA-DM URCs stream, including a
successful LwM2M server registration; without it, no URCs appear.

Changes in v2 (patch 3 only):
- Use __le32 for mhi_dtr_ctrl_msg fields and cpu_to_le32() on assignment
(Loic Poulain)
- Use guard(mutex) instead of manual lock/unlock in mhi_wwan_ctrl_send_dtr
(Loic Poulain)
- Return 0 (not -EIO) when IP_CTRL channel is not enumerated so that
TIOCMSET does not regress for devices without IP_CTRL (Loic Poulain)

v1: https://lore.kernel.org/netdev/20260804233411.1953445-1-peter.hunt@xxxxxxxxxxxx/

Peter Hunt (3):
net: wwan: core: propagate modem control signals to port drivers
bus: mhi: host: pci_generic: enumerate IP_CTRL channel for Sierra
EM919x/EM929x
net: wwan: mhi_wwan_ctrl: drive DTR/RTS via the IP_CTRL channel

drivers/bus/mhi/host/pci_generic.c | 2 +
drivers/net/wwan/mhi_wwan_ctrl.c | 183 ++++++++++++++++++++++++++++-
drivers/net/wwan/wwan_core.c | 12 +-
include/linux/wwan.h | 4 +
4 files changed, 199 insertions(+), 2 deletions(-)

--
2.43.0