Hi Petr,

On Wed, Feb 12, 2020 at 05:33:59PM +0100, Petr Štetiar wrote:
> Daniel Golle <dan...@makrotopia.org> [2020-02-12 16:37:36]:
> 
> ...
> 
> > ++static inline int ar933x_uart_is_half_duplex(struct ar933x_uart_port *up)
> > ++{
> 
> That function name is quite confusing as it's checking for 485/HD.

If someone wants to implement other half-duplex uses, one could add
more detection flags here (see atmel_serial.c where SER_ISO7816_ENABLED
has been added recently).

> 
> > ++  return (up->port.rs485.flags & SER_RS485_ENABLED) &&
> > ++            !(up->port.rs485.flags & SER_RS485_RX_DURING_TX);
> > ++}
> 
> ...

Comes from atmel_serial.c and looks sane to me:
static inline int atmel_uart_is_half_duplex(struct uart_port *port)
{
        return (port->rs485.flags & SER_RS485_ENABLED) &&
                !(port->rs485.flags & SER_RS485_RX_DURING_TX);
}

How else would you solve that?

> 
> > +-  if (!uart_circ_empty(xmit))
> > ++  if (!uart_circ_empty(xmit)) {
> > +           ar933x_uart_start_tx_interrupt(up);
> > ++  } else if (ar933x_uart_is_half_duplex(up)) {
> > ++          ar933x_uart_wait_tx_complete(up);
> > ++          ar933x_uart_rx_flush(up);
> > ++          ar933x_uart_start_rx_interrupt(up);
> > ++  }
> 
> This change looks strange, how are these two related? Where do you re-enable
> the TX interrupts in that 485/HD case?

So let's first look at it how it was before my change:
If the circular buffer is non-empty, enable the TX interrupt which
will soon call ar933x_uart_tx_chars() again to send more characters.
If the circular buffer is empty, do nothing and return.

So now I change the behaviour only in case there are no more characters
left to send (ie. uart_circ_empty(xmit)) and handle the half-duplex
emulation by waiting for transmission to complete, flushing everything
received in the meantime and re-enabling the RX interrupt which was
disabled before starting to transmit in the half-duplex case a few
lines above.



Cheers


Daniel

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to