Re: [PATCH] atmel_serial: RS485: receiving enabled when sending data
From: Claudio Scordino <hidden>
Date: 2011-08-23 10:06:56
Also in:
linux-arm-kernel, lkml
Subsystem:
microchip at91 serial driver, the rest, tty layer and serial drivers · Maintainers:
Richard Genoud, Linus Torvalds, Greg Kroah-Hartman, Jiri Slaby
Il 23/08/2011 11:30, Russell King - ARM Linux ha scritto:
On Tue, Aug 23, 2011 at 10:30:46AM +0200, Claudio Scordino wrote:quoted
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index af9b781..5f6c745 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c@@ -339,8 +339,9 @@ 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) - atmel_start_rx(port); + if ((atmel_port->rs485.flags& SER_RS485_ENABLED)&& + !(atmel_port->rs485.flags& SER_RS485_RX_DURING_TX)) + atmel_start_rx(port);However, this is incorrect formatting. The code following the 'if' ends up being indented by two tabs. This illustrates why the whole idea that tabs should only be used for indenting is wrong. You end up with either what you have above, or: if ((atmel_port->rs485.flags& SER_RS485_ENABLED)&& !(atmel_port->rs485.flags& SER_RS485_RX_DURING_TX)) atmel_start_rx(port); both of which are dire for readability. The only sane way to do this is to ignore that stupid "indentation by tabs only" thing and do it as the kernel code has _always_ been done over the last 19 years: if ((atmel_port->rs485.flags& SER_RS485_ENABLED)&& !(atmel_port->rs485.flags& SER_RS485_RX_DURING_TX)) atmel_start_rx(port); IOW, use spaces to align the wrapped 'if' statement.quoted
+ 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);And here it makes it look like there's a missing brace.
I understand. So the right patch should be the following one. Best regards, Claudio 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: Bernhard Roth <redacted> Signed-off-by: Claudio Scordino <redacted> --- drivers/tty/serial/atmel_serial.c | 9 ++++++--- include/linux/serial.h | 1 + 2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index af9b781..c7232a9 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c@@ -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); }
diff --git a/include/linux/serial.h b/include/linux/serial.h
index ef91406..97ff8e2 100644
--- a/include/linux/serial.h
+++ b/include/linux/serial.h@@ -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
--
1.7.1