Skip to content

Commit

Permalink
i386: fix machine rebooting
Browse files Browse the repository at this point in the history
Commit 59f4e7d fixed machine rebooting
on Truxton's machine (when no keyboard was present).  But it broke it on
Lee's machine.

The patch reinstates the old (pre-59f4e7d572980a521b7bdba74ab71b21f5995538)
code and if that doesn't work out, try the new,
post-59f4e7d572980a521b7bdba74ab71b21f5995538 code instead.

Cc: Lee Garrett <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Andi Kleen <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Truxton Fulton authored and Linus Torvalds committed Jul 22, 2007
1 parent bd78432 commit 8b93789
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion include/asm-i386/mach-default/mach_reboot.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,37 @@ static inline void kb_wait(void)
static inline void mach_reboot(void)
{
int i;

/* old method, works on most machines */
for (i = 0; i < 10; i++) {
kb_wait();
udelay(50);
outb(0xfe, 0x64); /* pulse reset low */
udelay(50);
}

/* New method: sets the "System flag" which, when set, indicates
* successful completion of the keyboard controller self-test (Basic
* Assurance Test, BAT). This is needed for some machines with no
* keyboard plugged in. This read-modify-write sequence sets only the
* system flag
*/
for (i = 0; i < 10; i++) {
int cmd;

outb(0x20, 0x64); /* read Controller Command Byte */
udelay(50);
kb_wait();
udelay(50);
cmd = inb(0x60);
udelay(50);
kb_wait();
udelay(50);
outb(0x60, 0x64); /* write Controller Command Byte */
udelay(50);
kb_wait();
udelay(50);
outb(0x14, 0x60); /* set "System flag" */
outb(cmd | 0x04, 0x60); /* set "System flag" */
udelay(50);
kb_wait();
udelay(50);
Expand Down

0 comments on commit 8b93789

Please sign in to comment.