|
@@ -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);
|