On 2024/2/5 17:07, Tony Lindgren wrote: > * Yicong Yang <yangyicong@xxxxxxxxxx> [240205 08:55]: >> On 2024/2/5 14:51, Tony Lindgren wrote: >>> Can you please confirm if this still happens also with commit 6f699743aebf >>> ("serial: core: Fix runtime PM handling for pending tx")? It adds a check >>> for -EINPROGRESS. >> >> Tested nagetive on latest v6.8-rc3. Paste the current code snippet below in __uart_start(): > > OK thanks for confirming it. > >> In our issue case, the dev->power.runtime_status == RPM_RESUMING as analyzed in >> commit. So we cannot pass the pm_runtime_active() check and the chars will still >> be pending. > > OK > >> Do you mean something like below? >> >> static int serial_port_runtime_suspend(struct device *dev) >> { >> struct serial_port_device *port_dev = to_serial_base_port_device(dev); >> struct uart_port *port; >> unsigned long flags; >> int ret = 0; >> >> port = port_dev->port; >> >> if (port->flags & UPF_DEAD) >> return ret; >> >> spin_lock_irqsave(&port->lock, flags); >> if (__serial_port_busy(port)) { >> port->ops->start_tx(port); >> ret = -EBUSY; >> } >> spin_unlock_irqrestore(&port->lock, flags); >> >> return ret; >> } > > Yes the above should work. > >> If so will the port fail to suspend after flushing the pending chars? Considering >> underlay driver like amba-pl011 doesn't implement runtime power management, does >> anyone will get the port into suspend routine later? I'm not quite sure about it. > > Hmm yeah you may need to also call pm_runtime_mark_last_busy() to > ensure the port gets idled later on. Not sure if PM runtime core does that for > you on returning -EBUSY, worth checking it :) In this if the runtime_suspend() callback return -EBUSY, rpm core will try to repeat to try to suspend the device. So this shall be ok. So I respin a v2 as suggested: https://lore.kernel.org/all/20240206073322.5560-1-yangyicong@xxxxxxxxxx/ > > The PM runtime hierarchy will block the serial port controller driver from > suspending, so the port drivers won't runtime suspend. > >> In the patch's implementation the pending chars will be flushed in runtime_resume() >> callback and rpm_resume() will try to call rpm_idle() later. > > On serial_port_runtime_suspend() the serial port controller will be active, so > you can call start_tx() directly. > > Regards, > > Tony > > . >