Re: [PATCH] serial: core: Revert port_id use

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 8/8/23 22:26, Tony Lindgren wrote:
Hi,

* Guenter Roeck <linux@xxxxxxxxxxxx> [230806 13:19]:
On Sun, Aug 06, 2023 at 09:20:50AM +0300, Tony Lindgren wrote:
Guenter reports boot issues with duplicate sysfs entries for multiport
drivers. Let's go back to using port->line for now to fix the regression.

With this change, the serial core port device names are not correct for the
hardware specific 8250 single port drivers, but that's a cosmetic issue for
now.

Fixes: d962de6ae51f ("serial: core: Fix serial core port id to not use port->line")
Reported-by: Guenter Roeck <groeck7@xxxxxxxxx>
Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx>

Tested-by: Guenter Roeck <linux@xxxxxxxxxxxx>

Thanks for testing.

Guenter, care to also test the patch below on top of this fix and
see if things still behave for you?

I'll send a proper patch assuming things test fine.


Patch below works for me.

Tested-by: Guenter Roeck <linux@xxxxxxxxxxxx>

Guenter

Regagrds,

Tony

8< --------------------
diff --git a/drivers/tty/serial/serial_base.h b/drivers/tty/serial/serial_base.h
--- a/drivers/tty/serial/serial_base.h
+++ b/drivers/tty/serial/serial_base.h
@@ -16,6 +16,7 @@ struct device;
struct serial_ctrl_device {
  	struct device dev;
+	struct ida ida;
  };
struct serial_port_device {
diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c
--- a/drivers/tty/serial/serial_base_bus.c
+++ b/drivers/tty/serial/serial_base_bus.c
@@ -10,6 +10,7 @@
#include <linux/container_of.h>
  #include <linux/device.h>
+#include <linux/idr.h>
  #include <linux/module.h>
  #include <linux/serial_core.h>
  #include <linux/slab.h>
@@ -112,6 +113,8 @@ struct serial_ctrl_device *serial_base_ctrl_add(struct uart_port *port,
  	if (!ctrl_dev)
  		return ERR_PTR(-ENOMEM);
+ ida_init(&ctrl_dev->ida);
+
  	err = serial_base_device_init(port, &ctrl_dev->dev,
  				      parent, &serial_ctrl_type,
  				      serial_base_ctrl_release,
@@ -142,16 +145,31 @@ struct serial_port_device *serial_base_port_add(struct uart_port *port,
  						struct serial_ctrl_device *ctrl_dev)
  {
  	struct serial_port_device *port_dev;
+	unsigned int min = 0, max = ~0U;
  	int err;
port_dev = kzalloc(sizeof(*port_dev), GFP_KERNEL);
  	if (!port_dev)
  		return ERR_PTR(-ENOMEM);
+ /* Device driver specified port_id vs automatic assignment? */
+	if (port->port_id) {
+		min = port->port_id;
+		max = port->port_id;
+	}
+
+	err = ida_alloc_range(&ctrl_dev->ida, min, max, GFP_KERNEL);
+	if (err < 0) {
+		kfree(port_dev);
+		return ERR_PTR(err);
+	}
+
+	port->port_id = err;
+
  	err = serial_base_device_init(port, &port_dev->dev,
  				      &ctrl_dev->dev, &serial_port_type,
  				      serial_base_port_release,
-				      port->ctrl_id, port->line);
+				      port->ctrl_id, port->port_id);
  	if (err)
  		goto err_put_device;
@@ -165,16 +183,24 @@ struct serial_port_device *serial_base_port_add(struct uart_port *port, err_put_device:
  	put_device(&port_dev->dev);
+	ida_free(&ctrl_dev->ida, port->port_id);
return ERR_PTR(err);
  }
void serial_base_port_device_remove(struct serial_port_device *port_dev)
  {
+	struct serial_ctrl_device *ctrl_dev;
+	struct device *parent;
+
  	if (!port_dev)
  		return;
+ parent = port_dev->dev.parent;
+	ctrl_dev = to_serial_base_ctrl_device(parent);
+
  	device_del(&port_dev->dev);
+	ida_free(&ctrl_dev->ida, port_dev->port->port_id);
  	put_device(&port_dev->dev);
  }




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux