Re: pckbd: go back to using table 2 by default
> On Jan 2, 2018, at 13:37, Job Snijders wrote: > > I often observed on my Thinkpad x270 that after an upgrade via bsd.rd, > the first reboot resulted in keystrokes being garbage (and at second > reboot everything was fine again). You just explained why I saw what I saw this morning post-upgrade on my x270. I feel better now knowing it wasn’t just me. :-) -Dave
Re: pckbd: go back to using table 2 by default
Hi all, I often observed on my Thinkpad x270 that after an upgrade via bsd.rd, the first reboot resulted in keystrokes being garbage (and at second reboot everything was fine again). The below patch seems to be an improvement. Kind regards, Job On Tue, Jan 02, 2018 at 09:36:49AM -0600, joshua stein wrote: > In 2007 I changed this code to use table 3 by default, falling back > on table 2 (the previous default) or 1. This was done just to make > the keyboard on the OQO model 01 work, and these devices are long > gone. > > 10 years later, some newer Lenovo machines seem to have trouble > trying this mode which can occasionally leave the keyboard in a > state where it generates bogus keys when typing. It also causes a > long delay when booting because the table changes have to timeout: > > pckbd: trying table 3 > pckbc_cmd: lost 0xee > pckbc_cmd: timeout > pckbd: table set of 3 failed > pckbd: trying table 2 > pckbc_cmd: lost 0xee > pckbc_cmd: timeout > pckbd: table set of 2 failed > pckbd: trying table 1 > pckbc_cmd: lost 0xee > pckbc_cmd: timeout > pckbd: table set of 1 failed > pckbd: settling on table 1 > > This patch reverts back to using table 2 by default and if it says > it was already in table 2, leaves it alone rather than forcibly > changing to that mode again, which is how Linux behaves. > > > Index: sys/dev/pckbc/pckbd.c > === > RCS file: /cvs/src/sys/dev/pckbc/pckbd.c,v > retrieving revision 1.43 > diff -u -p -u -p -r1.43 pckbd.c > --- sys/dev/pckbc/pckbd.c 14 Apr 2016 07:06:03 - 1.43 > +++ sys/dev/pckbc/pckbd.c 2 Jan 2018 15:21:05 - > @@ -214,8 +214,7 @@ int > pckbd_set_xtscancode(pckbc_tag_t kbctag, pckbc_slot_t kbcslot, > struct pckbd_internal *id) > { > - /* default to have the 8042 translate the keyboard with table 3. */ > - int table = 3; > + int table; > > if (pckbc_xt_translation(kbctag)) { > #ifdef DEBUG > @@ -234,12 +233,21 @@ pckbd_set_xtscancode(pckbc_tag_t kbctag, > if (id != NULL) > id->t_translating = 0; > } else { > - if (id != NULL) > + if (id != NULL) { > id->t_translating = 1; > + if (id->t_table == 0) { > + /* > + * Don't bother explicitly setting into set 2, > + * it's the default. > + */ > + id->t_table = 2; > + return (0); > + } > + } > } > > /* keep falling back until we hit a table that looks usable. */ > - for (; table >= 1; table--) { > + for (table = 3; table >= 1; table--) { > u_char cmd[2]; > #ifdef DEBUG > printf("pckbd: trying table %d\n", table); >
pckbd: go back to using table 2 by default
In 2007 I changed this code to use table 3 by default, falling back on table 2 (the previous default) or 1. This was done just to make the keyboard on the OQO model 01 work, and these devices are long gone. 10 years later, some newer Lenovo machines seem to have trouble trying this mode which can occasionally leave the keyboard in a state where it generates bogus keys when typing. It also causes a long delay when booting because the table changes have to timeout: pckbd: trying table 3 pckbc_cmd: lost 0xee pckbc_cmd: timeout pckbd: table set of 3 failed pckbd: trying table 2 pckbc_cmd: lost 0xee pckbc_cmd: timeout pckbd: table set of 2 failed pckbd: trying table 1 pckbc_cmd: lost 0xee pckbc_cmd: timeout pckbd: table set of 1 failed pckbd: settling on table 1 This patch reverts back to using table 2 by default and if it says it was already in table 2, leaves it alone rather than forcibly changing to that mode again, which is how Linux behaves. Index: sys/dev/pckbc/pckbd.c === RCS file: /cvs/src/sys/dev/pckbc/pckbd.c,v retrieving revision 1.43 diff -u -p -u -p -r1.43 pckbd.c --- sys/dev/pckbc/pckbd.c 14 Apr 2016 07:06:03 - 1.43 +++ sys/dev/pckbc/pckbd.c 2 Jan 2018 15:21:05 - @@ -214,8 +214,7 @@ int pckbd_set_xtscancode(pckbc_tag_t kbctag, pckbc_slot_t kbcslot, struct pckbd_internal *id) { - /* default to have the 8042 translate the keyboard with table 3. */ - int table = 3; + int table; if (pckbc_xt_translation(kbctag)) { #ifdef DEBUG @@ -234,12 +233,21 @@ pckbd_set_xtscancode(pckbc_tag_t kbctag, if (id != NULL) id->t_translating = 0; } else { - if (id != NULL) + if (id != NULL) { id->t_translating = 1; + if (id->t_table == 0) { + /* +* Don't bother explicitly setting into set 2, +* it's the default. +*/ + id->t_table = 2; + return (0); + } + } } /* keep falling back until we hit a table that looks usable. */ - for (; table >= 1; table--) { + for (table = 3; table >= 1; table--) { u_char cmd[2]; #ifdef DEBUG printf("pckbd: trying table %d\n", table);