diff -ruN linux-2.4.ORIG/arch/ppc/8xx_io/commproc.c linux-2.4/arch/ppc/8xx_io/commproc.c --- linux-2.4.ORIG/arch/ppc/8xx_io/commproc.c 2002-09-28 05:53:19.000000000 -0400 +++ linux-2.4/arch/ppc/8xx_io/commproc.c 2003-01-18 13:34:23.000000000 -0500 @@ -404,13 +404,18 @@ */ bp = (uint *)&cpmp->cp_brgc1; bp += brg; + /* The BRG has a 12-bit counter. For really slow baud rates (or * really fast processors), we may have to further divide by 16. + * + * NOTE: for integer math division, adding (divisor/2) to numerator + * rounds up (if fractional part would be >= .5) for more precision */ - if (((BRG_UART_CLK / rate) - 1) < 4096) - *bp = (((BRG_UART_CLK / rate) - 1) << 1) | CPM_BRG_EN; + + if ((((BRG_UART_CLK + (rate/2))/ rate) - 1) < 4096) + *bp = ((((BRG_UART_CLK +(rate/2)) / rate) - 1) << 1) | CPM_BRG_EN; else - *bp = (((BRG_UART_CLK_DIV16 / rate) - 1) << 1) | + *bp = ((((BRG_UART_CLK_DIV16 + (rate/2))/ rate) - 1) << 1) | CPM_BRG_EN | CPM_BRG_DIV16; }