Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 21 Aug 2004 14:07:44 -0600
From:      "Justin T. Gibbs" <gibbs@scsiguy.com>
To:        Brian Somers <brian@Awfulhak.org>
Cc:        cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sys/isa psm.c
Message-ID:  <2EBB6525AF8622BD86E3D2C9@aslan.scsiguy.com>
In-Reply-To: <20040821195714.232ea67f@dev.lan.Awfulhak.org>
References:  <200408171812.i7HICbLM078769@repoman.freebsd.org> <20040819051134.7f088757@dev.lan.Awfulhak.org> <20040821195714.232ea67f@dev.lan.Awfulhak.org>

next in thread | previous in thread | raw e-mail | index | archive | help
> I'm not sure why these changes (psm 1.79) would have made things work for
> you - perhaps you're booting your machine with the KVM pointing somewhere
> else and as a result, avoiding doing the data read in psmprobe() is fixing
> the problems result?  If so do we need to do a similar tweak to moused to
> defer the recording of cur_proto[1]?

As explained in the commit message, the reason this helps is because the
KVM emulation gets the sync bits wrong if you explicitly ask for a data
packet.  It doesn't matter if you have the system selected or not.

As for why it works for me and many others, I can only assume that the
sync bits turn out to be zero.  I have verified this on my system.

Since the psm driver performs sync detection and out-of-sync discard,
it seems to me that moused should not be trying to do the same thing.
Outside of doing that, changing the PSM driver to export a zero
syncmask anytime NEED_SYNC is set will ensure that moused doesn't
get confused.

Index: psm.c
===================================================================
RCS file: /usr/cvs/src/sys/isa/psm.c,v
retrieving revision 1.79
diff -d -u -r1.79 psm.c
--- psm.c	17 Aug 2004 18:12:37 -0000	1.79
+++ psm.c	21 Aug 2004 20:06:40 -0000
@@ -1752,6 +1752,10 @@
     case MOUSE_GETMODE:
 	s = spltty();
         *(mousemode_t *)addr = sc->mode;
+        if ((sc->flags & PSM_NEED_SYNCBITS) != 0) {
+            ((mousemode_t *)addr)->syncmask[0] = 0;
+            ((mousemode_t *)addr)->syncmask[1] = 0;
+        }
         ((mousemode_t *)addr)->resolution = 
 	    MOUSE_RES_LOW - sc->mode.resolution;
 	switch (sc->mode.level) {

> BTW, while I was in there I noticed this:
> 
>     if (sc->config & PSM_CONFIG_NOCHECKSYNC)
>         sc->dflt_mode.syncmask[0] = 0;
>     else
>         sc->dflt_mode.syncmask[0] = vendortype[i].syncmask;
>     if (sc->config & PSM_CONFIG_FORCETAP)
>         sc->mode.syncmask[0] &= ~MOUSE_PS2_TAP;
>         ^^^^^^^^^^^^^^^^^^^^
>     sc->dflt_mode.syncmask[1] = 0;      /* syncbits */
>     sc->mode = sc->dflt_mode;
>     sc->mode.packetsize = vendortype[i].packetsize;
> 
> which looks somewhat bogus as the whole sc->mode structure is overwritten
> two lines later!  Perhaps it should be dflt_mode.syncmask[0] that's tweaked?

Yes, it is bogus.

> Also, the use of sc->syncerrors seems broken.  It's never reset to zero...

Its reset to zero if a mouse packet isn't completed before a packet
timeout fires.  It seems that the counter should be reset in other cases
too, but I would need to study the driver further before changing that.
is not received withing

--
Justin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2EBB6525AF8622BD86E3D2C9>