net: wwan: core: split port unregister and stop

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>
This commit is contained in:
Sergey Ryazanov 2026-01-26 14:21:54 +08:00 committed by Jakub Kicinski
parent dccd23a673
commit 0868ea3471

View 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);