Re: 2.6 kernel won't reboot on AMD system - 8042 problem?

David N. Welton
2004-08-13T12:58:43Z

Vojtech Pavlik wrote:

> Now I think the problem lies in that that on your i8042 issuing a
> command doesn't clear the AUXDATA bit. It's only cleared by data from
> the keyboard.

> This is likely a bug in you i8042 firmware (or hw, if it's just an
> ASIC).

Well, that has always seemed likely to me, given that rebooting without
a keyboard is something that works on pretty much everyone else's
machines! But to some degree the bug ought to be worked around.

> I suppose we can get rid of the checking of data source and negation and
> be done with it.

That helps, but there are still situation(s?) where it's not a complete
solution. It's good enough for what I need, though.

Starting with no keyboard, plug one in:

$ drivers/input/serio/i8042.c: aa <- i8042 (interrupt, aux, 0) [161928]

drivers/input/serio/i8042.c: 60 -> i8042 (command) [162009]

drivers/input/serio/i8042.c: 46 -> i8042 (parameter) [162009]

drivers/input/serio/i8042.c: d4 -> i8042 (command) [162151]

drivers/input/serio/i8042.c: f2 -> i8042 (parameter) [162151]

drivers/input/serio/i8042.c: fe <- i8042 (interrupt, aux, 0) [162343]

drivers/input/serio/i8042.c: d4 -> i8042 (command) [162424]

drivers/input/serio/i8042.c: ed -> i8042 (parameter) [162424]

drivers/input/serio/i8042.c: fe <- i8042 (interrupt, aux, 0) [162616]

drivers/input/serio/i8042.c: 60 -> i8042 (command) [162697]

drivers/input/serio/i8042.c: 44 -> i8042 (parameter) [162697]

drivers/input/serio/i8042.c: aa <- i8042 (interrupt, aux, 0) [162989]

drivers/input/serio/i8042.c: 60 -> i8042 (command) [163070]

drivers/input/serio/i8042.c: 46 -> i8042 (parameter) [163070]

drivers/input/serio/i8042.c: d4 -> i8042 (command) [163212]

drivers/input/serio/i8042.c: f2 -> i8042 (parameter) [163212]

drivers/input/serio/i8042.c: fa <- i8042 (interrupt, kbd, 0) [163404]

drivers/input/serio/i8042.c: ab <- i8042 (interrupt, kbd, 0) [163485]

drivers/input/serio/i8042.c: 41 <- i8042 (interrupt, kbd, 0) [163566]

drivers/input/serio/i8042.c: d4 -> i8042 (command) [163792]

drivers/input/serio/i8042.c: ed -> i8042 (parameter) [163792]

drivers/input/serio/i8042.c: fa <- i8042 (interrupt, kbd, 0) [163983]

drivers/input/serio/i8042.c: 60 -> i8042 (command) [164209]

drivers/input/serio/i8042.c: 44 -> i8042 (parameter) [164209]

Oops, it doesn't respond to anything... We unplug it and plug it back in
again. This time it's ok:

$ drivers/input/serio/i8042.c: aa <- i8042 (interrupt, kbd, 0) [191951]

drivers/input/serio/i8042.c: 60 -> i8042 (command) [192032]

drivers/input/serio/i8042.c: 45 -> i8042 (parameter) [192032]

drivers/input/serio/i8042.c: f2 -> i8042 (kbd-data) [192174]

drivers/input/serio/i8042.c: fa <- i8042 (interrupt, kbd, 1) [192247]

drivers/input/serio/i8042.c: ab <- i8042 (interrupt, kbd, 1) [192329]

drivers/input/serio/i8042.c: 41 <- i8042 (interrupt, kbd, 1) [192410]

drivers/input/serio/i8042.c: ed -> i8042 (kbd-data) [192491]

drivers/input/serio/i8042.c: fa <- i8042 (interrupt, kbd, 1) [192565]

drivers/input/serio/i8042.c: 00 -> i8042 (kbd-data) [192646]

drivers/input/serio/i8042.c: fa <- i8042 (interrupt, kbd, 1) [192719]

drivers/input/serio/i8042.c: f3 -> i8042 (kbd-data) [192801]

drivers/input/serio/i8042.c: fa <- i8042 (interrupt, kbd, 1) [192874]

drivers/input/serio/i8042.c: 00 -> i8042 (kbd-data) [192956]

drivers/input/serio/i8042.c: fa <- i8042 (interrupt, kbd, 1) [193029]

drivers/input/serio/i8042.c: f4 -> i8042 (kbd-data) [193110]

drivers/input/serio/i8042.c: fa <- i8042 (interrupt, kbd, 1) [193184]

input: AT Translated Set 2 keyboard on isa0060/serio0

This, because it checks in i8042_interrupt to see if the nefarious
STR_AUXDATA is set, which it is... According to your hypothesis,
plugging the keyboard in and hitting a few keys would have cleared the
AUXDATA bit, so the next time around it works fine.

Thanks,
--
David N. Welton
davidw@eidetix.com