Re: [PATCH] serial: core: Fix serial_base_match() after fixing controller port name

From: Jiri Slaby
Date: Thu Aug 03 2023 - 01:13:45 EST


On 02. 08. 23, 13:48, Tony Lindgren wrote:
While fixing DEVNAME to be more usable, I broke serial_base_match() as
the ctrl and port prefix for device seemed unnecessary.

It's not completely clear to me what you are actually fixing. Please elaborate in more detail.

Let's fix the issue by checking against dev->type and drv->name.

Fixes: 1ef2c2df1199 ("serial: core: Fix serial core controller port name to show controller id")


Reported-by: kernel test robot <oliver.sang@xxxxxxxxx>

Then we are missing a Link here.

Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx>
---
drivers/tty/serial/serial_base.h | 3 +++
drivers/tty/serial/serial_base_bus.c | 10 ++++++++--
drivers/tty/serial/serial_ctrl.c | 2 +-
drivers/tty/serial/serial_port.c | 2 +-
4 files changed, 13 insertions(+), 4 deletions(-)

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
@@ -6,6 +6,9 @@
* Author: Tony Lindgren <tony@xxxxxxxxxxx>
*/
+#define SERIAL_BASE_CTRL_NAME "ctrl"
+#define SERIAL_BASE_PORT_NAME "port"

Could you make those char[] instead? The compiler/linker will hopefully (will it?) de-dup the occurrences, but the arrays would look cleaner and safer from this POV.

#define to_serial_base_ctrl_device(d) container_of((d), struct serial_ctrl_device, dev)
#define to_serial_base_port_device(d) container_of((d), struct serial_port_device, dev)
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
@@ -29,9 +29,15 @@ static const struct device_type serial_port_type = {
static int serial_base_match(struct device *dev, struct device_driver *drv)
{
- int len = strlen(drv->name);
+ if (dev->type == &serial_ctrl_type &&
+ !strncmp(SERIAL_BASE_CTRL_NAME, drv->name, 4))
+ return 1;
- return !strncmp(dev_name(dev), drv->name, len);
+ if (dev->type == &serial_port_type &&
+ !strncmp(SERIAL_BASE_PORT_NAME, drv->name, 4))
+ return 1;
+
+ return 0;
}
static struct bus_type serial_base_bus_type = {
diff --git a/drivers/tty/serial/serial_ctrl.c b/drivers/tty/serial/serial_ctrl.c
--- a/drivers/tty/serial/serial_ctrl.c
+++ b/drivers/tty/serial/serial_ctrl.c
@@ -47,7 +47,7 @@ void serial_ctrl_unregister_port(struct uart_driver *drv, struct uart_port *port
}
static struct device_driver serial_ctrl_driver = {
- .name = "ctrl",
+ .name = SERIAL_BASE_CTRL_NAME,
.suppress_bind_attrs = true,
.probe = serial_ctrl_probe,
.remove = serial_ctrl_remove,
diff --git a/drivers/tty/serial/serial_port.c b/drivers/tty/serial/serial_port.c
--- a/drivers/tty/serial/serial_port.c
+++ b/drivers/tty/serial/serial_port.c
@@ -83,7 +83,7 @@ void uart_remove_one_port(struct uart_driver *drv, struct uart_port *port)
EXPORT_SYMBOL(uart_remove_one_port);
static struct device_driver serial_port_driver = {
- .name = "port",
+ .name = SERIAL_BASE_PORT_NAME,
.suppress_bind_attrs = true,
.probe = serial_port_probe,
.remove = serial_port_remove,

--
js
suse labs