Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83cac9f3 authored by Bernhard Roth's avatar Bernhard Roth Committed by Greg Kroah-Hartman
Browse files

atmel_serial: RS485: receiving enabled when sending data



By default the atmel_serial driver in RS485 mode disables receiving data until
all data in the send buffer has been sent. This flag allows to receive data
even whilst sending data.

Signed-off-by: default avatarBernhard Roth <br@pwrnet.de>
Signed-off-by: default avatarClaudio Scordino <claudio@evidence.eu.com>
Acked-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 019dc9ea
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -104,6 +104,9 @@
	rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
	rs485conf.delay_rts_after_send = ...;

	/* Set this flag if you want to receive data even whilst sending data */
	rs485conf.flags |= SER_RS485_RX_DURING_TX;

	if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) {
		/* Error handling. See errno. */
	}
+6 −3
Original line number Diff line number Diff line
@@ -339,7 +339,8 @@ static void atmel_stop_tx(struct uart_port *port)
	/* Disable interrupts */
	UART_PUT_IDR(port, atmel_port->tx_done_mask);

	if (atmel_port->rs485.flags & SER_RS485_ENABLED)
	if ((atmel_port->rs485.flags & SER_RS485_ENABLED) &&
	    !(atmel_port->rs485.flags & SER_RS485_RX_DURING_TX))
		atmel_start_rx(port);
}

@@ -356,7 +357,8 @@ static void atmel_start_tx(struct uart_port *port)
			   really need this.*/
			return;

		if (atmel_port->rs485.flags & SER_RS485_ENABLED)
		if ((atmel_port->rs485.flags & SER_RS485_ENABLED) &&
		    !(atmel_port->rs485.flags & SER_RS485_RX_DURING_TX))
			atmel_stop_rx(port);

		/* re-enable PDC transmit */
@@ -680,7 +682,8 @@ static void atmel_tx_dma(struct uart_port *port)
		/* Enable interrupts */
		UART_PUT_IER(port, atmel_port->tx_done_mask);
	} else {
		if (atmel_port->rs485.flags & SER_RS485_ENABLED) {
		if ((atmel_port->rs485.flags & SER_RS485_ENABLED) &&
		    !(atmel_port->rs485.flags & SER_RS485_RX_DURING_TX)) {
			/* DMA done, stop TX, start RX for RS485 */
			atmel_start_rx(port);
		}
+1 −0
Original line number Diff line number Diff line
@@ -211,6 +211,7 @@ struct serial_rs485 {
#define SER_RS485_RTS_ON_SEND		(1 << 1)
#define SER_RS485_RTS_AFTER_SEND	(1 << 2)
#define SER_RS485_RTS_BEFORE_SEND	(1 << 3)
#define SER_RS485_RX_DURING_TX		(1 << 4)
	__u32	delay_rts_before_send;	/* Milliseconds */
	__u32	delay_rts_after_send;	/* Milliseconds */
	__u32	padding[5];		/* Memory is cheap, new structs