The patch titled max3100: fixes for the MAX31x0 console has been removed from the -mm tree. Its filename was max3100-add-console-support-for-max3100-fixes-for-the-max31x0-console.patch This patch was dropped because an updated version will be merged The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ ------------------------------------------------------ Subject: max3100: fixes for the MAX31x0 console From: Christian Pellegrin <chripell@xxxxxxxx> Fix problems reported about the MAX31x0 console. RTS is asserted only if flow control is explicitly enabled on kernel command line. Chars inputed during console output are not lost. Signed-off-by: Christian Pellegrin <chripell@xxxxxxxx> Cc: Greg KH <greg@xxxxxxxxx> Cc: Alan Cox <alan@xxxxxxxxxxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Feng Tang <feng.tang@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- drivers/serial/max3100.c | 48 +++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) diff -puN drivers/serial/max3100.c~max3100-add-console-support-for-max3100-fixes-for-the-max31x0-console drivers/serial/max3100.c --- a/drivers/serial/max3100.c~max3100-add-console-support-for-max3100-fixes-for-the-max31x0-console +++ a/drivers/serial/max3100.c @@ -148,6 +148,8 @@ struct max3100_port { struct work_struct console_work; /* char tx timeout */ int console_tout; + /* lock on receiving chars */ + struct mutex rx_lock; #endif }; @@ -193,6 +195,19 @@ static void max3100_calc_parity(struct m *c |= max3100_do_parity(s, *c) << 8; } +static void max3100_flip(struct max3100_port *s) +{ + if (s->port.state->port.tty != NULL) { +#ifdef CONFIG_SERIAL_MAX3100_CONSOLE + mutex_lock(&s->rx_lock); +#endif + tty_flip_buffer_push(s->port.state->port.tty); +#ifdef CONFIG_SERIAL_MAX3100_CONSOLE + mutex_unlock(&s->rx_lock); +#endif + } +} + static void max3100_resume_work(struct work_struct *w) { struct max3100_port *s = container_of(w, struct max3100_port, @@ -243,6 +258,10 @@ static int max3100_handlerx(struct max31 unsigned int ch, flg, status = 0; int ret = 0, cts; +#ifdef CONFIG_SERIAL_MAX3100_CONSOLE + mutex_lock(&s->rx_lock); +#endif + if (rx & MAX3100_R && s->rx_enabled) { dev_dbg(&s->spi->dev, "%s\n", __func__); ch = rx & (s->parity & MAX3100_7BIT ? 0x7f : 0xff); @@ -275,6 +294,10 @@ static int max3100_handlerx(struct max31 uart_handle_cts_change(&s->port, cts ? TIOCM_CTS : 0); } +#ifdef CONFIG_SERIAL_MAX3100_CONSOLE + mutex_unlock(&s->rx_lock); +#endif + return ret; } @@ -330,8 +353,8 @@ static irqreturn_t max3100_ist(int irq, } } - if (rxchars > 16 && s->port.state->port.tty != NULL) { - tty_flip_buffer_push(s->port.state->port.tty); + if (rxchars > 16) { + max3100_flip(s); rxchars = 0; } if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) @@ -342,8 +365,8 @@ static irqreturn_t max3100_ist(int irq, (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)))); - if (rxchars > 0 && s->port.state->port.tty != NULL) - tty_flip_buffer_push(s->port.state->port.tty); + if (rxchars > 0) + max3100_flip(s); return IRQ_HANDLED; } @@ -700,6 +723,7 @@ static void max3100_console_work(struct console_work); unsigned long start; u16 tx, rx; + int rxchars = 0; while (s->console_head != s->console_tail && (s->console_flags & MAX3100_SUSPENDING) == 0) { @@ -711,10 +735,19 @@ static void max3100_console_work(struct !time_after(jiffies, start + s->console_tout)); tx = s->console_buf[s->console_tail]; max3100_calc_parity(s, &tx); - tx |= MAX3100_WD | MAX3100_RTS; + tx |= MAX3100_WD | (s->rts ? MAX3100_RTS : 0); max3100_sr(s, tx, &rx); + if (s->port.state->port.tty != NULL) { + rxchars += max3100_handlerx(s, rx); + if (rxchars > 16) { + max3100_flip(s); + rxchars = 0; + } + } s->console_tail = (s->console_tail + 1) % CONSOLE_BUF_SIZE; } + if (rxchars) + max3100_flip(s); } static void max3100_console_putchar(struct uart_port *port, int ch) @@ -810,6 +843,10 @@ static int max3100_console_setup(struct if (parity == 'o') s->parity |= MAX3100_PARITY_ODD; s->console_tout = 1 + (20 * HZ) / baud; /* jiffies to send 20 bits */ + if (flow != 'n') + s->rts = 1; + else + s->rts = 0; tx |= MAX3100_WC; max3100_sr(s, tx, &rx); @@ -913,6 +950,7 @@ static int __devinit max3100_probe(struc i, retval); #ifdef CONFIG_SERIAL_MAX3100_CONSOLE + mutex_init(&max3100s[i]->rx_lock); if (pdata->console && !max3100_console_registered) { register_console(&max3100_console); max3100_console_registered = 1; _ Patches currently in -mm which might be from chripell@xxxxxxxx are linux-next.patch max3100-add-console-support-for-max3100-fixes-for-the-max31x0-console.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html