CPM1: Don't send break on TX_STOP, don't interrupt RX/TX when adjusting termios parameters
PATCH 1/1 CPM1: Don't send break on TX_STOP, don't interrupt RX/TX when adjusting termios parameters
From: Nye Liu <[email protected]>
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.
---
drivers/serial/cpm_uart/cpm_uart_core.c +14 -7
@@ -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->smc_brkcr,0 ); +cpm_line_cr_cmd (pinfo,CPM_CR_STOP_TX );clrbits8 (&pinfo->smcp->smc_smcm,SMCM_RX |SMCM_TX );clrbits16 (&pinfo->smcp->smc_smcmr,SMCMR_REN |SMCMR_TEN ); }else { +out_be16 (&pinfo->sccup->scc_brkcr,0 ); +cpm_line_cr_cmd (pinfo,CPM_CR_GRA_STOP_TX );clrbits16 (&pinfo->sccp->scc_sccm,UART_SCCM_TX |UART_SCCM_RX );clrbits32 (&pinfo->sccp->scc_gsmrl,SCC_GSMRL_ENR |SCC_GSMRL_ENT ); }
Signature · 7 lines
Nye Liu [email protected] (818) 772-6235x248 (818) 772-0576 fax "Who would be stupid enough to quote a fictitious character?" -- Don Quixote
Quoted 8 lines · On Fri, 20 Jun 2008 12:46:50 -0700 Nye Liu <[email protected]> wrote:
From: Nye Liu <[email protected]>
Before setting
STOP_TX, set_brkcrto 0 so the SMC does not send a break character. The driver appears to properly re-initialize_brkcrwhen the SMC is restarted.Do not interrupt RX/TX when the termios is being adjusted; it results in corrupted characters appearing on the line.
Please send a Signed-off-by: for this change, as per Documentation/SubmittingPatches, thanks.