On Mon, Aug 4, 2014 at 12:43 PM, Martin Pieuchot <[email protected]> wrote:
> On 04/06/14(Wed) 17:02, Stefan Sperling wrote: > > On Wed, Jun 04, 2014 at 09:51:08AM -0400, Eduardo Lopes wrote: > > > Hi, > > > > > > With this snapshot, the same steps yeld a kernel trap: > > > > > > uvm_fault(0xfffffe8135047b68, 0x0, 0, 1) -> e > > > kernel: page fault trap, code=0 > > > Stopped at pms_enable_alps+0xbd: movl 0(%r12),%eax > > > > > > ddb trace: > > > > > > pms_enable_alps() at pms_enable_alps+0xbd > > > pms_protocol_lookup() at pms_protocol_lookup+0x34 > > > pms_change_state() at pms_change_state+0x106 > > > wsmouseopen() at wsmouseopen+0xbf > > > spec_open() at spec_open+0x213 > > > VOP_OPEN() at VOP_OPEN+0x3f > > > vn_open() at vn_open+0x16f > > > doopenat() at doopenat+0x132 > > > syscall() at syscall+0x297 > > > --- syscall (number 5) --- > > > end trace frame: 0x0, count: -9 > > > 0x343ce1f5d0a: > > > > Try disabling wsmoused as a workaround. > > There is a known bug, perhaps related: > > http://marc.info/?l=openbsd-misc&m=137811690307634&w=2 > > I tried tracking this down once but didn't get very far. > > Could you try the diff below and tell me if it fixes your problem? > > on my X201 - with and without patch - kernel trap after several switching on my X220 - with patch - in X work only touchpad after several switching, trackpoint and mouse(usb) don't work > Index: pms.c > =================================================================== > RCS file: /home/ncvs/src/sys/dev/pckbc/pms.c,v > retrieving revision 1.52 > diff -u -p -r1.52 pms.c > --- pms.c 12 Jul 2014 18:48:52 -0000 1.52 > +++ pms.c 24 Jul 2014 08:09:04 -0000 > @@ -26,6 +26,7 @@ > > #include <sys/param.h> > #include <sys/systm.h> > +#include <sys/rwlock.h> > #include <sys/device.h> > #include <sys/ioctl.h> > #include <sys/malloc.h> > @@ -148,6 +149,8 @@ struct pms_softc { /* driver status inf > #define PMS_STATE_ENABLED 1 > #define PMS_STATE_SUSPENDED 2 > > + struct rwlock sc_state_lock; > + > int sc_dev_enable; > #define PMS_DEV_IGNORE 0x00 > #define PMS_DEV_PRIMARY 0x01 > @@ -662,6 +665,8 @@ pmsattach(struct device *parent, struct > a.accessops = &pms_accessops; > a.accesscookie = sc; > > + rw_init(&sc->sc_state_lock, "pmsst"); > + > /* > * Attach the wsmouse, saving a handle to it. > * Note that we don't need to check this pointer against NULL > @@ -762,8 +767,13 @@ int > pms_enable(void *v) > { > struct pms_softc *sc = v; > + int rv; > > - return pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_PRIMARY); > + rw_enter_write(&sc->sc_state_lock); > + rv = pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_PRIMARY); > + rw_exit_write(&sc->sc_state_lock); > + > + return (rv); > } > > void > @@ -771,7 +781,9 @@ pms_disable(void *v) > { > struct pms_softc *sc = v; > > + rw_enter_write(&sc->sc_state_lock); > pms_change_state(sc, PMS_STATE_DISABLED, PMS_DEV_PRIMARY); > + rw_exit_write(&sc->sc_state_lock); > } > > int > @@ -789,8 +801,13 @@ int > pms_sec_enable(void *v) > { > struct pms_softc *sc = v; > + int rv; > + > + rw_enter_write(&sc->sc_state_lock); > + rv = pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_SECONDARY); > + rw_exit_write(&sc->sc_state_lock); > > - return (pms_change_state(sc, PMS_STATE_ENABLED, > PMS_DEV_SECONDARY)); > + return (rv); > } > > void > @@ -798,7 +815,9 @@ pms_sec_disable(void *v) > { > struct pms_softc *sc = v; > > + rw_enter_write(&sc->sc_state_lock); > pms_change_state(sc, PMS_STATE_DISABLED, PMS_DEV_SECONDARY); > + rw_exit_write(&sc->sc_state_lock); > } > > int > > -- Alexandr Shadchin
