rearrange initialization. take more care to leave kbd alone if bios says there is none. Reference: /n/atom/patch/applied/kbdinit Date: Tue Mar 11 02:05:23 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/k10/kbd.c Tue Mar 11 02:03:56 2014 +++ /sys/src/nix/k10/kbd.c Tue Mar 11 02:03:57 2014 @@ -590,6 +590,15 @@ } void +failkbd(void) +{ + sys->noi8042kbd = 1; + iofree(Data); + iofree(Cmd); + print(initfailed); +} + +void kbdinit(void) { int c, try; @@ -597,6 +606,9 @@ if(sys->noi8042kbd) return; + ioalloc(Data, 1, 0, "kbd data"); + ioalloc(Cmd, 1, 0, "kbd cmd"); + /* wait for a quiescent controller */ try = 1000; while(try-- > 0 && (c = inb(Status)) & (Outbusy | Inready)) { @@ -605,8 +617,7 @@ delay(1); } if (try <= 0) { - print(initfailed); - sys->noi8042kbd = 1; + failkbd(); return; } @@ -622,8 +633,7 @@ ccc &= ~Ckbddis; ccc |= Csf | Ckbdint | Cscs1; if(outready() < 0) { - print(initfailed); - sys->noi8042kbd = 1; + failkbd(); return; } @@ -645,13 +655,12 @@ qnoblock(kbdq, 1); addkbdq(kbdq, -1); - ioalloc(Data, 1, 0, "kbd"); - ioalloc(Cmd, 1, 0, "kbd"); - - intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd"); + if(!sys->noi8042kbd){ + intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd"); - kbscans[Int].num = 0; - setleds(kbscans + Int); + kbscans[Int].num = 0; + setleds(kbscans + Int); + } } void