All of lore.kernel.org
 help / color / mirror / Atom feed
* [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

* [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

* 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

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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.