devkbd: disable mosue/keyboard on shutdown, disable ps2 mouse on init, remove kbdenable()/kbdinit()
on vmware, loading a new kernel sometimes reboots when wiggling the mouse. disabling keyboard and mouse on shutdown fixes the issue. make sure ps2 mouse is disabled on init, will get re-enabled in i8042auxenable(). keyboard isnt special anymore, we can just use the devreset entry point in the device to do the keyboard initialization, so kbdinit()/kbdenable() are not needed anymore.
This commit is contained in:
parent
145624eec2
commit
f7514acc95
5 changed files with 59 additions and 63 deletions
|
@ -152,7 +152,8 @@ i8042auxcmd(int cmd)
|
|||
iunlock(&i8042lock);
|
||||
|
||||
if(c != 0xFA){
|
||||
print("i8042: %2.2ux returned to the %2.2ux command (pc=%#p)\n", c, cmd, getcallerpc(&cmd));
|
||||
print("i8042: %2.2ux returned to the %2.2ux command (pc=%#p)\n",
|
||||
c, cmd, getcallerpc(&cmd));
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -253,11 +254,12 @@ i8042auxenable(void (*putc)(int, int))
|
|||
{
|
||||
char *err = "i8042: aux init failed\n";
|
||||
|
||||
ilock(&i8042lock);
|
||||
|
||||
/* enable kbd/aux xfers and interrupts */
|
||||
ccc &= ~Cauxdis;
|
||||
ccc |= Cauxint;
|
||||
|
||||
ilock(&i8042lock);
|
||||
if(outready() < 0)
|
||||
print(err);
|
||||
outb(Cmd, 0x60); /* write control register */
|
||||
|
@ -274,6 +276,7 @@ i8042auxenable(void (*putc)(int, int))
|
|||
}
|
||||
auxputc = putc;
|
||||
intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN, "kbdaux");
|
||||
|
||||
iunlock(&i8042lock);
|
||||
}
|
||||
|
||||
|
@ -285,6 +288,20 @@ kbdpoll(void)
|
|||
i8042intr(0, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
kbdshutdown(void)
|
||||
{
|
||||
if(nokbd)
|
||||
return;
|
||||
ccc &= ~(Ckbdint|Cauxint);
|
||||
ccc |= (Cauxdis|Ckbddis);
|
||||
outready();
|
||||
outb(Cmd, 0x60);
|
||||
outready();
|
||||
outb(Data, ccc);
|
||||
outready();
|
||||
}
|
||||
|
||||
static Chan *
|
||||
kbdattach(char *spec)
|
||||
{
|
||||
|
@ -371,60 +388,17 @@ kbdwrite(Chan *c, void *a, long n, vlong)
|
|||
return n;
|
||||
}
|
||||
|
||||
Dev kbddevtab = {
|
||||
L'b',
|
||||
"kbd",
|
||||
|
||||
devreset,
|
||||
devinit,
|
||||
devshutdown,
|
||||
kbdattach,
|
||||
kbdwalk,
|
||||
kbdstat,
|
||||
kbdopen,
|
||||
devcreate,
|
||||
kbdclose,
|
||||
kbdread,
|
||||
kbdbread,
|
||||
kbdwrite,
|
||||
devbwrite,
|
||||
devremove,
|
||||
devwstat,
|
||||
};
|
||||
|
||||
|
||||
static char *initfailed = "i8042: kbdinit failed\n";
|
||||
|
||||
static int
|
||||
outbyte(int port, int c)
|
||||
static void
|
||||
kbdreset(void)
|
||||
{
|
||||
outb(port, c);
|
||||
if(outready() < 0) {
|
||||
print(initfailed);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
static char *initfailed = "i8042: init failed\n";
|
||||
int c, try;
|
||||
|
||||
void
|
||||
kbdenable(void)
|
||||
{
|
||||
kbd.q = qopen(1024, Qcoalesce, 0, 0);
|
||||
if(kbd.q == nil)
|
||||
panic("kbdenable");
|
||||
panic("kbdreset");
|
||||
qnoblock(kbd.q, 1);
|
||||
|
||||
ioalloc(Data, 1, 0, "kbd");
|
||||
ioalloc(Cmd, 1, 0, "kbd");
|
||||
|
||||
intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd");
|
||||
}
|
||||
|
||||
void
|
||||
kbdinit(void)
|
||||
{
|
||||
int c, try;
|
||||
|
||||
/* wait for a quiescent controller */
|
||||
try = 1000;
|
||||
while(try-- > 0 && (c = inb(Status)) & (Outbusy | Inready)) {
|
||||
|
@ -440,7 +414,7 @@ kbdinit(void)
|
|||
/* get current controller command byte */
|
||||
outb(Cmd, 0x20);
|
||||
if(inready() < 0){
|
||||
print("i8042: kbdinit can't read ccc\n");
|
||||
print("i8042: can't read ccc\n");
|
||||
ccc = 0;
|
||||
} else
|
||||
ccc = inb(Data);
|
||||
|
@ -448,14 +422,44 @@ kbdinit(void)
|
|||
/* enable kbd xfers and interrupts */
|
||||
ccc &= ~Ckbddis;
|
||||
ccc |= Csf | Ckbdint | Cscs1;
|
||||
|
||||
/* disable ps2 mouse */
|
||||
ccc &= ~Cauxint;
|
||||
ccc |= Cauxdis;
|
||||
|
||||
if(outready() < 0) {
|
||||
print(initfailed);
|
||||
return;
|
||||
}
|
||||
outb(Cmd, 0x60);
|
||||
outready();
|
||||
outb(Data, ccc);
|
||||
outready();
|
||||
|
||||
nokbd = 0;
|
||||
|
||||
/* disable mouse */
|
||||
if (outbyte(Cmd, 0x60) < 0 || outbyte(Data, ccc) < 0)
|
||||
print("i8042: kbdinit mouse disable failed\n");
|
||||
ioalloc(Data, 1, 0, "kbd");
|
||||
ioalloc(Cmd, 1, 0, "kbd");
|
||||
intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd");
|
||||
}
|
||||
|
||||
Dev kbddevtab = {
|
||||
L'b',
|
||||
"kbd",
|
||||
|
||||
kbdreset,
|
||||
devinit,
|
||||
kbdshutdown,
|
||||
kbdattach,
|
||||
kbdwalk,
|
||||
kbdstat,
|
||||
kbdopen,
|
||||
devcreate,
|
||||
kbdclose,
|
||||
kbdread,
|
||||
kbdbread,
|
||||
kbdwrite,
|
||||
devbwrite,
|
||||
devremove,
|
||||
devwstat,
|
||||
};
|
||||
|
||||
|
|
|
@ -96,8 +96,6 @@ int ioreserve(int, int, int, char*);
|
|||
int iprint(char*, ...);
|
||||
int isaconfig(char*, int, ISAConf*);
|
||||
void* kaddr(ulong);
|
||||
void kbdenable(void);
|
||||
void kbdinit(void);
|
||||
#define kmapinval()
|
||||
void ldmxcsr(ulong);
|
||||
void lgdt(ushort[3]);
|
||||
|
|
|
@ -137,7 +137,6 @@ main(void)
|
|||
print("\nPlan 9\n");
|
||||
|
||||
trapinit0();
|
||||
kbdinit();
|
||||
i8253init();
|
||||
cpuidentify();
|
||||
meminit();
|
||||
|
@ -155,7 +154,6 @@ main(void)
|
|||
arch->intrinit();
|
||||
timersinit();
|
||||
mathinit();
|
||||
kbdenable();
|
||||
if(arch->clockenable)
|
||||
arch->clockenable();
|
||||
procinit0();
|
||||
|
|
|
@ -87,8 +87,6 @@ int ioreserve(int, int, int, char*);
|
|||
int iprint(char*, ...);
|
||||
int isaconfig(char*, int, ISAConf*);
|
||||
void* kaddr(uintptr);
|
||||
void kbdenable(void);
|
||||
void kbdinit(void);
|
||||
KMap* kmap(Page*);
|
||||
void kunmap(KMap*);
|
||||
#define kmapinval()
|
||||
|
|
|
@ -486,7 +486,6 @@ main()
|
|||
screeninit();
|
||||
print("\nPlan 9\n");
|
||||
trapinit0();
|
||||
kbdinit();
|
||||
i8253init();
|
||||
cpuidentify();
|
||||
meminit();
|
||||
|
@ -504,7 +503,6 @@ main()
|
|||
arch->intrinit();
|
||||
timersinit();
|
||||
mathinit();
|
||||
kbdenable();
|
||||
if(arch->clockenable)
|
||||
arch->clockenable();
|
||||
procinit0();
|
||||
|
|
Loading…
Reference in a new issue