This works for me. I just installed the latest snapshot, synced the source, applied your patch, built and installed and it works just fine.
Hate Gmail for patches, though. Thanks. Hope I replied in time to make the 5.3 cut. :) Kent. On Mon, Feb 11, 2013 at 2:34 AM, Martin Pieuchot <mpieuc...@nolizard.org> wrote: > Hi Kent, > > On 14/01/13(Mon) 10:05, Kent Fritz wrote: >> On Fri, Jan 11, 2013 at 5:29 PM, Stefan Sperling <s...@openbsd.org> wrote: >> > I see. So this is happening during pms_probe() which runs before the >> > protocol is selected. Maybe fix it like this? I think the code should >> > cope with hardware that returns unrecognizable garbage. But I don't >> > know very much about PS/2. >> > >> > Thanks for pinning down the problem! >> > >> > Index: pckbc.c >> > =================================================================== >> > RCS file: /cvs/src/sys/dev/ic/pckbc.c,v >> > retrieving revision 1.31 >> > diff -u -p -r1.31 pckbc.c >> > --- pckbc.c 17 Oct 2012 19:16:10 -0000 1.31 >> > +++ pckbc.c 12 Jan 2013 01:25:41 -0000 >> > @@ -620,6 +620,11 @@ pckbc_poll_cmd1(struct pckbc_internal *t >> > #ifdef PCKBCDEBUG >> > printf("pckbc_cmd: lost 0x%x\n", c); >> > #endif >> > + /* Don't retry cmd forever. */ >> > + if (cmd->retries++ >= 5) { >> > + cmd->status = EIO; >> > + return; >> > + } >> > } >> > >> > while (cmd->responseidx < cmd->responselen) { >> >> That patch works fine. Tested on i386 on nT-i1250. Thanks for >> pointing me in the right direction! > > Could you try the diff below and tell me if it also fix your problem? I > believe it's better to handle the bat failure core (0xfc) like we > already do with the bat completion code rather than exiting for any > value.. > > M. > > Index: pckbc.c > =================================================================== > RCS file: /home/ncvs/src/sys/dev/ic/pckbc.c,v > retrieving revision 1.31 > diff -u -p -r1.31 pckbc.c > --- pckbc.c 17 Oct 2012 19:16:10 -0000 1.31 > +++ pckbc.c 11 Feb 2013 10:24:49 -0000 > @@ -48,6 +48,12 @@ > #include <dev/pckbc/pckbdvar.h> > #endif > > +#ifdef PCKBCDEBUG > +#define DPRINTF(x...) do { printf(x); } while (0); > +#else > +#define DPRINTF(x...) > +#endif > + > /* descriptor for one device command */ > struct pckbc_devcmd { > TAILQ_ENTRY(pckbc_devcmd) next; > @@ -102,9 +108,10 @@ int pckbcintr_internal(struct pckbc_inte > > const char *pckbc_slot_names[] = { "kbd", "aux" }; > > -#define KBC_DEVCMD_ACK 0xfa > -#define KBC_DEVCMD_RESEND 0xfe > -#define KBC_DEVCMD_BAT 0xaa > +#define KBC_DEVCMD_ACK 0xfa > +#define KBC_DEVCMD_RESEND 0xfe > +#define KBC_DEVCMD_BAT_DONE 0xaa > +#define KBC_DEVCMD_BAT_FAIL 0xfc > > #define KBD_DELAY DELAY(8) > > @@ -587,39 +594,32 @@ pckbc_poll_cmd1(struct pckbc_internal *t > break; > } > > - if (c == KBC_DEVCMD_ACK) { > + switch (c) { > + case KBC_DEVCMD_ACK: > cmd->cmdidx++; > continue; > - } > /* > * Some legacy free PCs keep returning Basic Assurance Test > * (BAT) instead of something usable, so fail gracefully. > */ > - if (c == KBC_DEVCMD_RESEND || c == KBC_DEVCMD_BAT) { > -#ifdef PCKBCDEBUG > - printf("pckbc_cmd: %s\n", > + case KBC_DEVCMD_RESEND: > + case KBC_DEVCMD_BAT_DONE: > + case KBC_DEVCMD_BAT_FAIL: > + DPRINTF("pckbc_cmd: %s\n", > c == KBC_DEVCMD_RESEND ? "RESEND": "BAT"); > -#endif > if (cmd->retries++ < 5) > continue; > - else { > -#ifdef PCKBCDEBUG > - printf("pckbc: cmd failed\n"); > -#endif > - cmd->status = ENXIO; > - return; > - } > - } > - if (c == -1) { > -#ifdef PCKBCDEBUG > - printf("pckbc_cmd: timeout\n"); > -#endif > + > + DPRINTF("pckbc_cmd: cmd failed\n"); > + cmd->status = ENXIO; > + return; > + case -1: > + DPRINTF("pckbc_cmd: timeout\n"); > cmd->status = EIO; > return; > + default: > + DPRINTF("pckbc_cmd: lost 0x%x\n", c); > } > -#ifdef PCKBCDEBUG > - printf("pckbc_cmd: lost 0x%x\n", c); > -#endif > } > > while (cmd->responseidx < cmd->responselen) {