Re: [PATCH] lis3lv02d: Avoid zero-division

From: Takashi Iwai
Date: Mon Nov 14 2011 - 09:59:12 EST


At Fri, 11 Nov 2011 19:11:06 +0100,
Ãric Piel wrote:
>
> Op 08-11-11 07:19, Takashi Iwai schreef:
> > At Tue, 08 Nov 2011 04:57:42 +0100,
> > Ãric Piel wrote:
> >>
> >> Op 03-11-11 13:09, Takashi Iwai schreef:
> >>> In some weird situation, HP DriveGuard chip can't read ODR value
> >>> correctly, and it results in a zero-division Oops in lis3lv02d driver.
> >>> This patch fixes the Oops by checking the value appopriately, and skips
> >>> if any weird value is read.
> >> Hi Takashi,
> >> Actually, a similar patch already just landed in linus' tree:
> >> 1510dd5954 (lis3lv02d: avoid divide by zero due to unchecked)
> >>
> >> However, in the patch applied, the device is disabled (until next
> >> reboot) while in yours, the sleep is just skipped. Does it work again
> >> after the read of odr fails? If so, maybe I could improve the current
> >> version by, after the odr read fails, sleeping a long and safe time and
> >> then trying to read the odr again. Then if it fails again, we give up,
> >> otherwise the device can be used again.
> >
> > I guess it's possible to use the device afterward. The possible
> > reason is either the chip is set to an invalid mode or ACPI isn't set
> > up properly. But this path usually means that ACPI does work more or
> > less since you could read WHOAMI.
> >
> >> Do you have such a device yourself? Could you let me know if after a
> >> failing read of the odr, the device keeps working?
> >
> > I have a machine but I'm not quite sure how to reproduce this error.
> > It happened casually during the installation of a new system, so it's
> > not so trivial to switch the module during it...
> Dear Takashi,
>
> I've looked more at the error. Now it seems to me that the fact that
> get_odr() returns 0 is not because there is a problem with the device
> but just because it is powered off: for the "3dc" device, this reflects
> in rate of 0. We assume that the ACPI code does turn the device on, but
> it might not do it, or the device might still need more time to fully
> initialize. So, just turning the device on and waiting a bit long should
> work fine.

Sounds reasonable. FWIW, I got the zero-division error only in a rare
case, while the installation of a system.

> However, looking for the spec document of lis3dc (or hp3dc), I couldn't
> find any reference to such device. I've found documents for lis3dh, with
> apparently same registers and WHOAMI value. However, contrarily to what
> is currently expected, it's a 16-bit device, not 8-bit. So my main
> question is: are you sure the device you have is 8-bit? Isn't your
> device a 16-bit lis3dh? Do you have the spec of lis3dc/hp3dc?

The device works with 8bit mode well, and the values I get from the
joystick device is almost same as the old lis3 chip on other HP
laptops. So I suppose this is 8bit device.

I have also no spec for this chip. I was informed from HP a little
bit about their new stuff to add the support in hp_accel driver, but
not in details, unfortunately.


thanks,

Takashi
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/