On Thu, May 9, 2024 at 5:16 PM Hans de Goede <hdegoede@xxxxxxxxxx> wrote: > > If a serdev_device_driver is already loaded for a serdev_tty_port when it > gets registered by tty_port_register_device_attr_serdev() then that > driver's probe() method will be called immediately. > > The serdev_device_driver's probe() method should then be able to call > serdev_device_open() successfully, but because UPF_DEAD is still dead > serdev_device_open() will fail with -ENXIO in this scenario: > > serdev_device_open() > ctrl->ops->open() /* this callback being ttyport_open() */ > tty->ops->open() /* this callback being uart_open() */ > tty_port_open() > port->ops->activate() /* this callback being uart_port_activate() */ > Find bit UPF_DEAD is set in uport->flags and fail with errno -ENXIO. > > Fix this be clearing UPF_DEAD before tty_port_register_device_attr_serdev() > note this only moves up the UPD_DEAD clearing a small bit, before: > > tty_port_register_device_attr_serdev(); > mutex_unlock(&tty_port.mutex); > uart_port.flags &= ~UPF_DEAD; > mutex_unlock(&port_mutex); > > after: > > uart_port.flags &= ~UPF_DEAD; > tty_port_register_device_attr_serdev(); > mutex_unlock(&tty_port.mutex); > mutex_unlock(&port_mutex); I guess I have given the tag, anyway since Tony OK with this, no more questions: Reviewed-by: Andy Shevchenko <andy@xxxxxxxxxx> -- With Best Regards, Andy Shevchenko