]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: wwan: core: split port unregister and stop
authorSergey Ryazanov <ryazanov.s.a@gmail.com>
Mon, 26 Jan 2026 06:21:54 +0000 (14:21 +0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 31 Jan 2026 02:26:59 +0000 (18:26 -0800)
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: call the port stop operation, purge queues, release the parent
WWAN device, etc. To reuse as much code as possible, split the port
unregistering function into the deregistration of a regular WWAN port
device, and the common port tearing down code.

In order to keep more code generic, break the device_unregister() call
into device_del() and put_device(), which release the port memory
uniformly.

Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
Reviewed-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
Link: https://patch.msgid.link/20260126062158.308598-5-slark_xiao@163.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/wwan/wwan_core.c

index 76f1d759d2557cef00edc0458c99251604c47a9c..1d9f43ef9b715913f64812a98b53f67ba3dd331d 100644 (file)
@@ -475,6 +475,18 @@ static int wwan_port_register_wwan(struct wwan_port *port)
        return 0;
 }
 
+/* Unregister a regular WWAN port (e.g. AT, MBIM, etc) */
+static void wwan_port_unregister_wwan(struct wwan_port *port)
+{
+       struct wwan_device *wwandev = to_wwan_dev(port->dev.parent);
+
+       dev_set_drvdata(&port->dev, NULL);
+
+       dev_info(&wwandev->dev, "port %s disconnected\n", dev_name(&port->dev));
+
+       device_del(&port->dev);
+}
+
 struct wwan_port *wwan_create_port(struct device *parent,
                                   enum wwan_port_type type,
                                   const struct wwan_port_ops *ops,
@@ -535,18 +547,19 @@ void wwan_remove_port(struct wwan_port *port)
        struct wwan_device *wwandev = to_wwan_dev(port->dev.parent);
 
        mutex_lock(&port->ops_lock);
-       if (port->start_count)
+       if (port->start_count) {
                port->ops->stop(port);
+               port->start_count = 0;
+       }
        port->ops = NULL; /* Prevent any new port operations (e.g. from fops) */
        mutex_unlock(&port->ops_lock);
 
        wake_up_interruptible(&port->waitqueue);
-
        skb_queue_purge(&port->rxq);
-       dev_set_drvdata(&port->dev, NULL);
 
-       dev_info(&wwandev->dev, "port %s disconnected\n", dev_name(&port->dev));
-       device_unregister(&port->dev);
+       wwan_port_unregister_wwan(port);
+
+       put_device(&port->dev);
 
        /* Release related wwan device */
        wwan_remove_dev(wwandev);