* [PATCH net-next v2 0/2] Improve wwan qcdm compatibility with user-space tools
@ 2026-07-22 9:04 Daniele Palmas
2026-07-22 9:04 ` [PATCH net-next v2 1/2] net: wwan: add minimalistic IOCTls support also to QCDM port Daniele Palmas
2026-07-22 9:04 ` [PATCH net-next v2 2/2] net: wwan: add exclusive open mode capability to AT and QCDM ports Daniele Palmas
0 siblings, 2 replies; 5+ messages in thread
From: Daniele Palmas @ 2026-07-22 9:04 UTC (permalink / raw)
To: Loic Poulain, Sergey Ryazanov, Johannes Berg, Andrew Lunn,
David Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni
Cc: netdev, Daniele Palmas
Historically, Qualcomm diagnostic port was a serial device, so user-space
tools were developed using tty specific features. One of the most common
tool is, for example, ModemManager libqcdm, available at
https://gitlab.freedesktop.org/mobile-broadband/ModemManager
which requires tcgetattr/tcsetattr and the possibility to get exclusive
device access to properly work.
The wwan qcdm is not really a tty device, but, besides the lack of tty
functions, it behaves as a standard serial Qualcomm diagnostic port, so,
as c230035c2f2f ("net: wwan: core: implement terminal ioctls for AT port"),
this series add support for terminal ioctls also for qcdm ports and
implement the exclusive open mode feature to improve compatibility with
user-space tools.
This is an incremental change which should not affect the existing tools
using wwan which do not rely on the implemented features.
V2: fixed race condition highlighted by Sashiko at
https://sashiko.dev/#/patchset/20260717081935.2071083-1-dnlplm%40gmail.com
Daniele Palmas (2):
net: wwan: add minimalistic IOCTls support also to QCDM port
net: wwan: add exclusive open mode capability to AT and QCDM ports
drivers/net/wwan/wwan_core.c | 33 +++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH net-next v2 1/2] net: wwan: add minimalistic IOCTls support also to QCDM port 2026-07-22 9:04 [PATCH net-next v2 0/2] Improve wwan qcdm compatibility with user-space tools Daniele Palmas @ 2026-07-22 9:04 ` Daniele Palmas 2026-07-22 9:50 ` Loic Poulain 2026-07-22 9:04 ` [PATCH net-next v2 2/2] net: wwan: add exclusive open mode capability to AT and QCDM ports Daniele Palmas 1 sibling, 1 reply; 5+ messages in thread From: Daniele Palmas @ 2026-07-22 9:04 UTC (permalink / raw) To: Loic Poulain, Sergey Ryazanov, Johannes Berg, Andrew Lunn, David Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: netdev, Daniele Palmas Upstream libqcdm requires IOCTLs support to work, so add the current AT minimalistic support also to the QCDM port. Signed-off-by: Daniele Palmas <dnlplm@gmail.com> --- drivers/net/wwan/wwan_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/wwan/wwan_core.c b/drivers/net/wwan/wwan_core.c index ccce2ad74128..8168239e52c3 100644 --- a/drivers/net/wwan/wwan_core.c +++ b/drivers/net/wwan/wwan_core.c @@ -1046,7 +1046,8 @@ static long wwan_port_fops_ioctl(struct file *filp, unsigned int cmd, struct wwan_port *port = filp->private_data; int res; - if (port->type == WWAN_PORT_AT) { /* AT port specific IOCTLs */ + if (port->type == WWAN_PORT_AT || port->type == WWAN_PORT_QCDM) { + /* AT and QCDM port specific IOCTLs */ res = wwan_port_fops_at_ioctl(port, cmd, arg); if (res != -ENOIOCTLCMD) return res; -- 2.43.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net-next v2 1/2] net: wwan: add minimalistic IOCTls support also to QCDM port 2026-07-22 9:04 ` [PATCH net-next v2 1/2] net: wwan: add minimalistic IOCTls support also to QCDM port Daniele Palmas @ 2026-07-22 9:50 ` Loic Poulain 0 siblings, 0 replies; 5+ messages in thread From: Loic Poulain @ 2026-07-22 9:50 UTC (permalink / raw) To: Daniele Palmas Cc: Sergey Ryazanov, Johannes Berg, Andrew Lunn, David Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, netdev On Wed, Jul 22, 2026 at 11:10 AM Daniele Palmas <dnlplm@gmail.com> wrote: > > Upstream libqcdm requires IOCTLs support to work, so add the current > AT minimalistic support also to the QCDM port. > > Signed-off-by: Daniele Palmas <dnlplm@gmail.com> I wonder whether it would be better to introduce a dedicated flag (e.g. WWAN_PORT_TTY_EMU) instead of checking the port type each time. This could scale better if the list of special cases grows. That said, for now this looks good to me. Reviewed-by: Loic Poulain <loic.poulain@oss.qualcomm.com> > --- > drivers/net/wwan/wwan_core.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/wwan/wwan_core.c b/drivers/net/wwan/wwan_core.c > index ccce2ad74128..8168239e52c3 100644 > --- a/drivers/net/wwan/wwan_core.c > +++ b/drivers/net/wwan/wwan_core.c > @@ -1046,7 +1046,8 @@ static long wwan_port_fops_ioctl(struct file *filp, unsigned int cmd, > struct wwan_port *port = filp->private_data; > int res; > > - if (port->type == WWAN_PORT_AT) { /* AT port specific IOCTLs */ > + if (port->type == WWAN_PORT_AT || port->type == WWAN_PORT_QCDM) { > + /* AT and QCDM port specific IOCTLs */ > res = wwan_port_fops_at_ioctl(port, cmd, arg); > if (res != -ENOIOCTLCMD) > return res; > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net-next v2 2/2] net: wwan: add exclusive open mode capability to AT and QCDM ports 2026-07-22 9:04 [PATCH net-next v2 0/2] Improve wwan qcdm compatibility with user-space tools Daniele Palmas 2026-07-22 9:04 ` [PATCH net-next v2 1/2] net: wwan: add minimalistic IOCTls support also to QCDM port Daniele Palmas @ 2026-07-22 9:04 ` Daniele Palmas 2026-07-22 9:41 ` Loic Poulain 1 sibling, 1 reply; 5+ messages in thread From: Daniele Palmas @ 2026-07-22 9:04 UTC (permalink / raw) To: Loic Poulain, Sergey Ryazanov, Johannes Berg, Andrew Lunn, David Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: netdev, Daniele Palmas Add exclusive open mode capability to AT and QCDM ports to improve compatibility with user-space tools using the Qualcomm diagnostic device (e.g. libqcdm). Signed-off-by: Daniele Palmas <dnlplm@gmail.com> --- drivers/net/wwan/wwan_core.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/drivers/net/wwan/wwan_core.c b/drivers/net/wwan/wwan_core.c index 8168239e52c3..8acb09dcb83a 100644 --- a/drivers/net/wwan/wwan_core.c +++ b/drivers/net/wwan/wwan_core.c @@ -22,6 +22,7 @@ #include <linux/termios.h> #include <linux/gnss.h> #include <linux/wwan.h> +#include <linux/tty.h> #include <net/rtnetlink.h> #include <uapi/linux/wwan.h> @@ -79,7 +80,7 @@ struct wwan_device { * @data_lock: Port specific data access serialization * @headroom_len: SKB reserved headroom size * @frag_len: Length to fragment packet - * @at_data: AT port specific data + * @at_data: AT/QCDM port specific data * @gnss: Pointer to GNSS device associated with this port */ struct wwan_port { @@ -98,6 +99,7 @@ struct wwan_port { struct { struct ktermios termios; int mdmbits; + unsigned long flags; } at_data; struct gnss_device *gnss; }; @@ -748,6 +750,14 @@ static int wwan_port_op_start(struct wwan_port *port) goto out_unlock; } + /* Check exclusive open mode for AT and QCDM ports */ + if ((port->type == WWAN_PORT_AT || port->type == WWAN_PORT_QCDM) && + test_bit(TTY_EXCLUSIVE, &port->at_data.flags) && + !capable(CAP_SYS_ADMIN)) { + ret = -EBUSY; + goto out_unlock; + } + /* If port is already started, don't start again */ if (!port->start_count) ret = port->ops->start(port); @@ -769,6 +779,8 @@ static void wwan_port_op_stop(struct wwan_port *port) if (port->ops) port->ops->stop(port); skb_queue_purge(&port->rxq); + if (port->type == WWAN_PORT_AT || port->type == WWAN_PORT_QCDM) + clear_bit(TTY_EXCLUSIVE, &port->at_data.flags); } mutex_unlock(&port->ops_lock); } @@ -1031,6 +1043,22 @@ static long wwan_port_fops_at_ioctl(struct wwan_port *port, unsigned int cmd, break; } + case TIOCEXCL: + set_bit(TTY_EXCLUSIVE, &port->at_data.flags); + break; + + case TIOCNXCL: + clear_bit(TTY_EXCLUSIVE, &port->at_data.flags); + break; + + case TIOCGEXCL: + { + int excl = test_bit(TTY_EXCLUSIVE, &port->at_data.flags); + + ret = put_user(excl, (int __user *)arg); + break; + } + default: ret = -ENOIOCTLCMD; } -- 2.43.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net-next v2 2/2] net: wwan: add exclusive open mode capability to AT and QCDM ports 2026-07-22 9:04 ` [PATCH net-next v2 2/2] net: wwan: add exclusive open mode capability to AT and QCDM ports Daniele Palmas @ 2026-07-22 9:41 ` Loic Poulain 0 siblings, 0 replies; 5+ messages in thread From: Loic Poulain @ 2026-07-22 9:41 UTC (permalink / raw) To: Daniele Palmas Cc: Sergey Ryazanov, Johannes Berg, Andrew Lunn, David Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, netdev On Wed, Jul 22, 2026 at 11:10 AM Daniele Palmas <dnlplm@gmail.com> wrote: > > Add exclusive open mode capability to AT and QCDM ports to improve > compatibility with user-space tools using the Qualcomm diagnostic > device (e.g. libqcdm). > > Signed-off-by: Daniele Palmas <dnlplm@gmail.com> > --- > drivers/net/wwan/wwan_core.c | 30 +++++++++++++++++++++++++++++- > 1 file changed, 29 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/wwan/wwan_core.c b/drivers/net/wwan/wwan_core.c > index 8168239e52c3..8acb09dcb83a 100644 > --- a/drivers/net/wwan/wwan_core.c > +++ b/drivers/net/wwan/wwan_core.c > @@ -22,6 +22,7 @@ > #include <linux/termios.h> > #include <linux/gnss.h> > #include <linux/wwan.h> > +#include <linux/tty.h> > #include <net/rtnetlink.h> > #include <uapi/linux/wwan.h> > > @@ -79,7 +80,7 @@ struct wwan_device { > * @data_lock: Port specific data access serialization > * @headroom_len: SKB reserved headroom size > * @frag_len: Length to fragment packet > - * @at_data: AT port specific data > + * @at_data: AT/QCDM port specific data > * @gnss: Pointer to GNSS device associated with this port > */ > struct wwan_port { > @@ -98,6 +99,7 @@ struct wwan_port { > struct { > struct ktermios termios; > int mdmbits; > + unsigned long flags; > } at_data; > struct gnss_device *gnss; > }; > @@ -748,6 +750,14 @@ static int wwan_port_op_start(struct wwan_port *port) > goto out_unlock; > } > > + /* Check exclusive open mode for AT and QCDM ports */ > + if ((port->type == WWAN_PORT_AT || port->type == WWAN_PORT_QCDM) && > + test_bit(TTY_EXCLUSIVE, &port->at_data.flags) && > + !capable(CAP_SYS_ADMIN)) { > + ret = -EBUSY; > + goto out_unlock; > + } I would recommend simplifying this by relying on the already existing wwan_port flag introducing a WWAN_PORT_EXCLUSIVE. This would also eliminate the need to check the port type in the condition above. > + > /* If port is already started, don't start again */ > if (!port->start_count) > ret = port->ops->start(port); > @@ -769,6 +779,8 @@ static void wwan_port_op_stop(struct wwan_port *port) > if (port->ops) > port->ops->stop(port); > skb_queue_purge(&port->rxq); > + if (port->type == WWAN_PORT_AT || port->type == WWAN_PORT_QCDM) > + clear_bit(TTY_EXCLUSIVE, &port->at_data.flags); > } > mutex_unlock(&port->ops_lock); > } > @@ -1031,6 +1043,22 @@ static long wwan_port_fops_at_ioctl(struct wwan_port *port, unsigned int cmd, > break; > } > > + case TIOCEXCL: > + set_bit(TTY_EXCLUSIVE, &port->at_data.flags); > + break; > + > + case TIOCNXCL: > + clear_bit(TTY_EXCLUSIVE, &port->at_data.flags); > + break; > + > + case TIOCGEXCL: > + { > + int excl = test_bit(TTY_EXCLUSIVE, &port->at_data.flags); > + > + ret = put_user(excl, (int __user *)arg); > + break; > + } > + > default: > ret = -ENOIOCTLCMD; > } > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-07-22 9:51 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-07-22 9:04 [PATCH net-next v2 0/2] Improve wwan qcdm compatibility with user-space tools Daniele Palmas 2026-07-22 9:04 ` [PATCH net-next v2 1/2] net: wwan: add minimalistic IOCTls support also to QCDM port Daniele Palmas 2026-07-22 9:50 ` Loic Poulain 2026-07-22 9:04 ` [PATCH net-next v2 2/2] net: wwan: add exclusive open mode capability to AT and QCDM ports Daniele Palmas 2026-07-22 9:41 ` Loic Poulain
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox