lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID:
 <BYAPR18MB37352E69CB7B685926A574B9A087A@BYAPR18MB3735.namprd18.prod.outlook.com>
Date: Tue, 6 Jan 2026 16:49:50 +0000
From: Sai Krishna Gajula <saikrishnag@...vell.com>
To: Slark Xiao <slark_xiao@....com>,
        "loic.poulain@....qualcomm.com"
	<loic.poulain@....qualcomm.com>,
        "ryazanov.s.a@...il.com"
	<ryazanov.s.a@...il.com>,
        "johannes@...solutions.net"
	<johannes@...solutions.net>,
        "andrew+netdev@...n.ch" <andrew+netdev@...n.ch>,
        "davem@...emloft.net" <davem@...emloft.net>,
        "edumazet@...gle.com"
	<edumazet@...gle.com>,
        "kuba@...nel.org" <kuba@...nel.org>,
        "pabeni@...hat.com" <pabeni@...hat.com>,
        "mani@...nel.org" <mani@...nel.org>
CC: "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
        "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
Subject: RE: [net-next v4 2/8] net: wwan: core: split port creation and
 registration


> -----Original Message-----
> From: Slark Xiao <slark_xiao@....com>
> Sent: Monday, January 5, 2026 3:50 PM
> To: loic.poulain@....qualcomm.com; ryazanov.s.a@...il.com;
> johannes@...solutions.net; andrew+netdev@...n.ch;
> davem@...emloft.net; edumazet@...gle.com; kuba@...nel.org;
> pabeni@...hat.com; mani@...nel.org
> Cc: netdev@...r.kernel.org; linux-kernel@...r.kernel.org
> Subject: [net-next v4 2/8] net: wwan: core: split port creation and
> registration
> 
> From: Sergey Ryazanov <ryazanov. s. a@ gmail. com> Upcoming GNSS (NMEA)
> port type support requires exporting it via the GNSS subsystem. On another
> hand, we still need to do basic WWAN core work: find or allocate the WWAN
> device, make it the 
> From: Sergey Ryazanov <ryazanov.s.a@...il.com>
> 
> Upcoming GNSS (NMEA) port type support requires exporting it via the GNSS
> subsystem. On another hand, we still need to do basic WWAN core
> work: find or allocate the WWAN device, make it the port parent, etc. To reuse
> as much code as possible, split the port creation function into the registration
> of a regular WWAN port device, and basic port struct initialization.
> 
> To be able to use put_device() uniformly, break the device_register() call into
> device_initialize() and device_add() and call device initialization earlier.
> 
> Signed-off-by: Sergey Ryazanov <ryazanov.s.a@...il.com>
> ---
>  drivers/net/wwan/wwan_core.c | 66 ++++++++++++++++++++++--------------
>  1 file changed, 40 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/net/wwan/wwan_core.c b/drivers/net/wwan/wwan_core.c
> index ade8bbffc93e..edee5ff48f28 100644
> --- a/drivers/net/wwan/wwan_core.c
> +++ b/drivers/net/wwan/wwan_core.c
> @@ -361,7 +361,8 @@ static void wwan_port_destroy(struct device *dev)  {
>  	struct wwan_port *port = to_wwan_port(dev);
> 
> -	ida_free(&minors, MINOR(port->dev.devt));
> +	if (dev->class == &wwan_class)
> +		ida_free(&minors, MINOR(dev->devt));
>  	mutex_destroy(&port->data_lock);
>  	mutex_destroy(&port->ops_lock);
>  	kfree(port);
> @@ -440,6 +441,41 @@ static int __wwan_port_dev_assign_name(struct
> wwan_port *port, const char *fmt)
>  	return dev_set_name(&port->dev, "%s", buf);  }
> 
> +/* Register a regular WWAN port device (e.g. AT, MBIM, etc.) */ static
> +int wwan_port_register_wwan(struct wwan_port *port) {

As per kernel style, braces need to be on next line 
int wwan_port_register_wwan(struct wwan_port *port) 
{
...
}

> +	struct wwan_device *wwandev = to_wwan_dev(port->dev.parent);
> +	char namefmt[0x20];
> +	int minor, err;
> +
> +	/* A port is exposed as character device, get a minor */
> +	minor = ida_alloc_range(&minors, 0, WWAN_MAX_MINORS - 1,
> GFP_KERNEL);
> +	if (minor < 0)
> +		return minor;
> +
> +	port->dev.class = &wwan_class;
> +	port->dev.devt = MKDEV(wwan_major, minor);
> +
> +	/* allocate unique name based on wwan device id, port type and
> number */
> +	snprintf(namefmt, sizeof(namefmt), "wwan%u%s%%d", wwandev-
> >id,
> +		 wwan_port_types[port->type].devsuf);
> +
> +	/* Serialize ports registration */
> +	mutex_lock(&wwan_register_lock);
> +
> +	__wwan_port_dev_assign_name(port, namefmt);
> +	err = device_add(&port->dev);
> +
> +	mutex_unlock(&wwan_register_lock);
> +
> +	if (err)
> +		return err;
Please check, if freeing with ida_free is required before returning err.
if (err) {
    ida_free(&minors, minor);
    return err;
}
> +
> +	dev_info(&wwandev->dev, "port %s attached\n", dev_name(&port-
> >dev));
> +
> +	return 0;
> +}
> +
>  struct wwan_port *wwan_create_port(struct device *parent,
>  				   enum wwan_port_type type,
>  				   const struct wwan_port_ops *ops, @@ -
> 448,8 +484,7 @@ struct wwan_port *wwan_create_port(struct device
> *parent,  {
>  	struct wwan_device *wwandev;
>  	struct wwan_port *port;
> -	char namefmt[0x20];
> -	int minor, err;
> +	int err;
> 
>  	if (type > WWAN_PORT_MAX || !ops)
>  		return ERR_PTR(-EINVAL);
> @@ -461,17 +496,9 @@ struct wwan_port *wwan_create_port(struct device
> *parent,
>  	if (IS_ERR(wwandev))
>  		return ERR_CAST(wwandev);
> 
> -	/* A port is exposed as character device, get a minor */
> -	minor = ida_alloc_range(&minors, 0, WWAN_MAX_MINORS - 1,
> GFP_KERNEL);
> -	if (minor < 0) {
> -		err = minor;
> -		goto error_wwandev_remove;
> -	}
> -
>  	port = kzalloc(sizeof(*port), GFP_KERNEL);
>  	if (!port) {
>  		err = -ENOMEM;
> -		ida_free(&minors, minor);
>  		goto error_wwandev_remove;
>  	}
> 
> @@ -485,27 +512,14 @@ struct wwan_port *wwan_create_port(struct device
> *parent,
>  	mutex_init(&port->data_lock);
> 
>  	port->dev.parent = &wwandev->dev;
> -	port->dev.class = &wwan_class;
>  	port->dev.type = &wwan_port_dev_type;
> -	port->dev.devt = MKDEV(wwan_major, minor);
>  	dev_set_drvdata(&port->dev, drvdata);
> +	device_initialize(&port->dev);
> 
> -	/* allocate unique name based on wwan device id, port type and
> number */
> -	snprintf(namefmt, sizeof(namefmt), "wwan%u%s%%d", wwandev-
> >id,
> -		 wwan_port_types[port->type].devsuf);
> -
> -	/* Serialize ports registration */
> -	mutex_lock(&wwan_register_lock);
> -
> -	__wwan_port_dev_assign_name(port, namefmt);
> -	err = device_register(&port->dev);
> -
> -	mutex_unlock(&wwan_register_lock);
> -
> +	err = wwan_port_register_wwan(port);
>  	if (err)
>  		goto error_put_device;
> 
> -	dev_info(&wwandev->dev, "port %s attached\n", dev_name(&port-
> >dev));
>  	return port;
> 
>  error_put_device:
> --
> 2.25.1
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ