[PATCH v2 13/13] tty: pruss SUART driver
From: Subhasish Ghosh <hidden>
Date: 2011-02-24 10:29:50
Also in:
lkml
Hello, Ok, have implemented the test_and_clear_bit.
On Tuesday 22 February 2011, Subhasish Ghosh wrote:quoted
@@ -122,13 +122,10 @@ static void omapl_pru_tx_chars(structomapl_pru_suart *soft_uart, u32 uart_no) if (!(suart_get_duplex(soft_uart, uart_no) & ePRU_SUART_HALF_TX)) return; - if (down_trylock(&soft_uart->port_sem[uart_no])) - return; - if (uart_circ_empty(xmit) || uart_tx_stopped(&soft_uart->port[uart_no])) { pruss_suart_stop_tx(&soft_uart->port[uart_no]); - up(&soft_uart->port_sem[uart_no]); + soft_uart->tx_empty[uart_no] = true; return; }@@ -259,7 +256,6 @@ static irqreturn_t pruss_suart_interrupt(s32 irq,void *dev_id) pru_intr_clr_isrstatus(dev, uart_num, PRU_TX_INTR); pru_softuart_clr_tx_status(dev, &soft_uart->suart_hdl [port->line]); - up(&soft_uart->port_sem[port->line]); omapl_pru_tx_chars(soft_uart, port->line); } } while (txrx_flag & (PRU_RX_INTR | PRU_TX_INTR));@@ -294,7 +290,10 @@ static void pruss_suart_start_tx(struct uart_port*port) suart_intr_setmask(dev, soft_uart->suart_hdl[port->line].uart_num, PRU_TX_INTR, CHN_TXRX_IE_MASK_CMPLT); - omapl_pru_tx_chars(soft_uart, port->line); + if (soft_uart->tx_empty[port->line] == true) { + soft_uart->tx_empty[port->line] = false; + omapl_pru_tx_chars(soft_uart, port->line); + } }This looks racy, and I think you at least need to take the spinlock in pruss_suart_start_tx(), but I don't fully understand the intention of the code. I guess you could also use a bitmask for tx_empty and use test_and_clear_bit() on that to guarantee atomicity. Arnd