[PATCH 1/1] CPM1: Don't send break on TX_STOP, don't interrupt RX/TX when adjusting termios parameters

Previous thread: [PATCH 1/2] net: Add the CPU id to skb->queue_mapping's upper 8 bits by Jeff Kirsher on Tuesday, June 24, 2008 - 7:27 pm. (5 messages)

Next thread: Linux 2.6.26-rc8 by Linus Torvalds on Tuesday, June 24, 2008 - 10:31 pm. (1 message)
To: <linux-kernel@...>
Date: Tuesday, June 24, 2008 - 7:58 pm

From: Nye Liu <nyet@mrv.com>

Before setting STOP_TX, set _brkcr to 0 so the SMC does not send a break
character. The driver appears to properly re-initialize _brkcr when the SMC is
restarted.

Do not interrupt RX/TX when the termios is being adjusted; it results in
corrupted characters appearing on the line.

Signed-off-by: Nye Liu <nyet@mrv.com>

---

diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c
index a19dc7e..babd06b 100644
--- a/drivers/serial/cpm_uart/cpm_uart_core.c
+++ b/drivers/serial/cpm_uart/cpm_uart_core.c
@@ -476,10 +476,13 @@ static void cpm_uart_shutdown(struct uart_port *port)
}

/* Shut them really down and reinit buffer descriptors */
- if (IS_SMC(pinfo))
+ if (IS_SMC(pinfo)) {
+ out_be16(&pinfo->smcup->smc_brkcr, 0);
cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX);
- else
+ } else {
+ out_be16(&pinfo->sccup->scc_brkcr, 0);
cpm_line_cr_cmd(pinfo, CPM_CR_GRA_STOP_TX);
+ }

cpm_uart_initbd(pinfo);
}
@@ -590,9 +593,11 @@ static void cpm_uart_set_termios(struct uart_port *port,
* enables, because we want to put them back if they were
* present.
*/
- prev_mode = in_be16(&smcp->smc_smcmr);
- out_be16(&smcp->smc_smcmr, smcr_mk_clen(bits) | cval | SMCMR_SM_UART);
- setbits16(&smcp->smc_smcmr, (prev_mode & (SMCMR_REN | SMCMR_TEN)));
+ prev_mode = in_be16(&smcp->smc_smcmr) & (SMCMR_REN | SMCMR_TEN);
+ /* Output in *one* operation, so we don't interrupt RX/TX if they
+ * were already enabled. */
+ out_be16(&smcp->smc_smcmr, smcr_mk_clen(bits) | cval |
+ SMCMR_SM_UART | prev_mode);
} else {
out_be16(&sccp->scc_psmr, (sbits << 12) | scval);
}
@@ -1324,12 +1329,14 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
udbg_putc = NULL;
#endif

- cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX);
-
if (IS_SMC(pinfo)) {
+ out_be16(&pinfo->smcup...

Previous thread: [PATCH 1/2] net: Add the CPU id to skb->queue_mapping's upper 8 bits by Jeff Kirsher on Tuesday, June 24, 2008 - 7:27 pm. (5 messages)

Next thread: Linux 2.6.26-rc8 by Linus Torvalds on Tuesday, June 24, 2008 - 10:31 pm. (1 message)