diff -Nru linux-2.6.12-rc4.org/drivers/serial/cpm_uart/cpm_uart_core.c linux-2.6.12-rc4.new/drivers/serial/cpm_uart/cpm_uart_core.c --- linux-2.6.12-rc4.org/drivers/serial/cpm_uart/cpm_uart_core.c 2005-05-07 01:20:31.000000000 -0400 +++ linux-2.6.12-rc4.new/drivers/serial/cpm_uart/cpm_uart_core.c 2005-05-19 13:48:58.000000000 -0400 @@ -335,23 +335,25 @@ pr_debug("CPM uart[%d]:IRQ\n", port->line); if (IS_SMC(pinfo)) { - events = smcp->smc_smce; + while ((events = smcp->smc_smce) & (SMCM_BRKE | SMCM_RX | SMCM_TX)) { + smcp->smc_smce = events; if (events & SMCM_BRKE) - uart_handle_break(port); + uart_handle_break(port); if (events & SMCM_RX) - cpm_uart_int_rx(port, regs); + cpm_uart_int_rx(port, regs); if (events & SMCM_TX) - cpm_uart_int_tx(port, regs); - smcp->smc_smce = events; + cpm_uart_int_tx(port, regs); + } } else { - events = sccp->scc_scce; + while ((events = sccp->scc_scce) & (UART_SCCM_BRKE | UART_SCCM_RX | UART_SCCM_TX)) { + sccp->scc_scce = events; if (events & UART_SCCM_BRKE) - uart_handle_break(port); + uart_handle_break(port); if (events & UART_SCCM_RX) - cpm_uart_int_rx(port, regs); + cpm_uart_int_rx(port, regs); if (events & UART_SCCM_TX) - cpm_uart_int_tx(port, regs); - sccp->scc_scce = events; + cpm_uart_int_tx(port, regs); + } } return (events) ? IRQ_HANDLED : IRQ_NONE; }