Skip to content
  • John Baldwin's avatar
    Correct baud rate error calculation. · b47c1eda
    John Baldwin authored
    Shifting right by 1 is not the same as dividing by 2 for signed
    values.  In particular, dividing a signed value by 2 gives the integer
    ceiling of the (e.g. -5 / 2 == -2) whereas shifting right by 1 always
    gives the floor (-5 >> 1 == -3).
    
    An embedded board with a 25 Mhz base clock results in an error of
    -30.5% when used with a baud rate of 115200.  Using division, this
    truncates to -30% and is permitted.  Using the shift, this fails and
    is rejected causing TIOCSETA requests to fail with EINVAL and breaking
    getty(8).
    
    Using division gives the same error range for both over and under baud
    rates and also makes the code match the behavior documented in the
    existing comment about supporting boards with 25 Mhz clocks.
    
    Reported by:	imp
    MFC after:	2 weeks
    Sponsored by:	DARPA
    Differential Revision:	https://reviews.freebsd.org/D24367
    b47c1eda