• Bruno Randolf's avatar
    ath5k: fix I/Q calibration (for real) · 86415d43
    Bruno Randolf authored
    I/Q calibration was completely broken, resulting in a high number of CRC errors
    on received packets. before i could see around 10% to 20% CRC errors, with this
    patch they are between 0% and 3%.
    
    1.) the removal of the mask in commit "ath5k: Fix I/Q calibration
    (f1cf2dbd)" resulted in no mask beeing used
    when writing the I/Q values into the register. additional errors in the
    calculation of the values (see 2.) resulted too high numbers, exceeding the
    masks, so wrong values like 0xfffffffe were written. to be safe we should
    always use the bitmask when writing parts of a register.
    
    2.) using a (s32) cast for q_coff is a wrong conversion to signed, since we
    convert to a signed value later by substracting 128. this resulted in too low
    numbers for Q many times, which were limited to -16 by the boundary check later
    on.
    
    3.) checked everything against the HAL sources and took over comments and minor
    optimizations from there.
    
    4.) we can't use ENABLE_BITS when we want to write a number (the number can
    contain zeros). also always write the correction values first and set ENABLE
    bit last, like the HAL does.
    Signed-off-by: default avatarBruno Randolf <br1@einfach.org>
    Cc: stable@kernel.org
    Acked-by: default avatarNick Kossifidis <mickflemm@gmail.com>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
    86415d43
reg.h 94.6 KB