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:
cinap_lenrek 2015-08-05 09:22:07 +02:00
parent 145624eec2
commit f7514acc95
5 changed files with 59 additions and 63 deletions

View file

@ -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,
};

View file

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

View file

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

View file

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

View file

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