Re: pckbd: go back to using table 2 by default

2018-01-02 Thread Dave Voutila

> 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

2018-01-02 Thread Job Snijders
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

2018-01-02 Thread joshua stein
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);