mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
![Truxton Fulton](/assets/img/avatar_default.png)
I have a system (Biostar IDEQ210M mini-pc with a VIA chipset) which will not reboot unless a keyboard is plugged in to it. I have tried all combinations of the kernel "reboot=x,y" flags to no avail. Rebooting by any method will leave the system in a wedged state (at the "Restarting system" message). I finally tracked the problem down to the machine's refusal to fully reboot unless the keyboard controller status register had bit 2 set. This is the "System flag" which when set, indicates successful completion of the keyboard controller self-test (Basic Assurance Test, BAT). I suppose that something is trying to protect against sporadic reboots unless the keyboard controller is in a good state (a keyboard is present), but I need this machine to be headless. I found that setting the system flag (via the command byte) before giving the "pulse reset line" command will allow the reboot to proceed. The patch is simple, and I think it should be fine for everybody whether they have this type of machine or not. This affects the "hard" reboot (as done when the kernel boot flags "reboot=c,h" are used). Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
38 lines
711 B
C
38 lines
711 B
C
/*
|
|
* arch/i386/mach-generic/mach_reboot.h
|
|
*
|
|
* Machine specific reboot functions for generic.
|
|
* Split out from reboot.c by Osamu Tomita <tomita@cinet.co.jp>
|
|
*/
|
|
#ifndef _MACH_REBOOT_H
|
|
#define _MACH_REBOOT_H
|
|
|
|
static inline void kb_wait(void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < 0x10000; i++)
|
|
if ((inb_p(0x64) & 0x02) == 0)
|
|
break;
|
|
}
|
|
|
|
static inline void mach_reboot(void)
|
|
{
|
|
int i;
|
|
for (i = 0; i < 100; i++) {
|
|
kb_wait();
|
|
udelay(50);
|
|
outb(0x60, 0x64); /* write Controller Command Byte */
|
|
udelay(50);
|
|
kb_wait();
|
|
udelay(50);
|
|
outb(0x14, 0x60); /* set "System flag" */
|
|
udelay(50);
|
|
kb_wait();
|
|
udelay(50);
|
|
outb(0xfe, 0x64); /* pulse reset low */
|
|
udelay(50);
|
|
}
|
|
}
|
|
|
|
#endif /* !_MACH_REBOOT_H */
|