>> Problem found via lockdep: >> >> - lpuart_set_termios() calls del_timer_sync(&sport->lpuart_timer) while >> holding sport->port.lock >> >> - sport->lpuart_timer routine is lpuart_timer_func() that calls >> lpuart_copy_rx_to_tty() that acquires same lock. >> >> To fix, move Rx DMA stopping out of lock, as it already is in other places >> in the same file. >> >> While at it, also make Rx DMA start/stop code to look the same is in >> other places in the same file. > > Yeah I saw that too, never really came around to look closer into it. > > Thanks for looking into it. > > You removed the check whether there was an old configuration, I think > the idea of that was that we only resize DMA if it was configured > differently before... Per my code reading, checking for sport->lpuart_dma_rx_use should be enough, this flag will be set only if DMA was previously enabled, >> + if (sport->lpuart_dma_rx_use) { >> + if (!lpuart_start_rx_dma(sport)) { >> sport->lpuart_dma_rx_use = true; > > No need to set to true here, it is guaranteed to be true at this point. I've seen this... However elsewhere in this file (namely in lpuart_resume(), in very similar situation, code is exactly the same, i.e. it sets sport->lpuart_dma_rx_use in both clauses. I thought it could be for a reason (i.e. for readability). Nikita -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html