• Hans de Goede's avatar
    misc: lis3lv02d: Fix false-positive WARN on various HP models · 3641762c
    Hans de Goede authored
    Before this commit lis3lv02d_get_pwron_wait() had a WARN_ONCE() to catch
    a potential divide by 0. WARN macros should only be used to catch internal
    kernel bugs and that is not the case here. We have been receiving a lot of
    bug reports about kernel backtraces caused by this WARN.
    
    The div value being checked comes from the lis3->odrs[] array. Which
    is sized to be a power-of-2 matching the number of bits in lis3->odr_mask.
    
    The only lis3 model where this array is not entirely filled with non zero
    values. IOW the only model where we can hit the div == 0 check is the
    3dc ("8 bits 3DC sensor") model:
    
    int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000};
    
    Note the 0 value at index 0, according to the datasheet an odr index of 0
    means "Power-down mode". HP typically uses a lis3 accelerometer for HDD
    fall protection. What I believe is happening here is that on newer
    HP devices, which only contain a SDD, the BIOS is leaving the lis3 device
    powered-down since it is not used for HDD fall protection.
    
    Note that the lis3_3dc_rates array initializer only specifies 10 values,
    which matches the datasheet. So it also contains 6 zero values at the end.
    
    Replace the WARN with a normal check, which treats an odr index of 0
    as power-down and uses a normal dev_err() to report the error in case
    odr index point past the initialized part of the array.
    
    Fixes: 1510dd59 ("lis3lv02d: avoid divide by zero due to unchecked")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=785814
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1817027
    BugLink: https://bugs.centos.org/view.php?id=10720
    Link: https://lore.kernel.org/r/20210217102501.31758-1-hdegoede@redhat.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3641762c
lis3lv02d.c 33.5 KB