Lines Matching refs:sc

111 static	void		mseintr_locked(mse_softc_t *sc);
121 mse_softc_t *sc;
124 sc = device_get_softc(dev);
126 mtx_init(&sc->sc_lock, "mse", NULL, MTX_DEF);
127 callout_init_mtx(&sc->sc_callout, &sc->sc_lock, 0);
130 sc->sc_intr = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
132 if (sc->sc_intr == NULL) {
133 bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port);
134 mtx_destroy(&sc->sc_lock);
138 if (bus_setup_intr(dev, sc->sc_intr, INTR_TYPE_TTY | INTR_MPSAFE,
139 NULL, mseintr, sc, &sc->sc_ih)) {
140 bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port);
141 bus_release_resource(dev, SYS_RES_IRQ, rid, sc->sc_intr);
142 mtx_destroy(&sc->sc_lock);
146 sc->mode.accelfactor = (flags & MSE_CONFIG_ACCEL) >> 4;
148 sc->sc_dev = make_dev(&mse_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600,
150 sc->sc_dev->si_drv1 = sc;
151 sc->sc_ndev = make_dev(&mse_cdevsw, 1, UID_ROOT, GID_WHEEL, 0600,
153 sc->sc_ndev->si_drv1 = sc;
160 mse_softc_t *sc;
163 sc = device_get_softc(dev);
164 MSE_LOCK(sc);
165 if (sc->sc_flags & MSESC_OPEN) {
166 MSE_UNLOCK(sc);
171 sc->sc_mousetype = MSE_NONE;
172 MSE_UNLOCK(sc);
174 destroy_dev(sc->sc_dev);
175 destroy_dev(sc->sc_ndev);
178 bus_teardown_intr(dev, sc->sc_intr, sc->sc_ih);
179 bus_release_resource(dev, SYS_RES_IRQ, rid, sc->sc_intr);
180 bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port);
182 callout_drain(&sc->sc_callout);
183 mtx_destroy(&sc->sc_lock);
194 mse_softc_t *sc = dev->si_drv1;
196 MSE_LOCK(sc);
197 if (sc->sc_mousetype == MSE_NONE) {
198 MSE_UNLOCK(sc);
201 if (sc->sc_flags & MSESC_OPEN) {
202 MSE_UNLOCK(sc);
205 sc->sc_flags |= MSESC_OPEN;
206 sc->sc_obuttons = sc->sc_buttons = MOUSE_MSC_BUTTONS;
207 sc->sc_deltax = sc->sc_deltay = 0;
208 sc->sc_bytesread = sc->mode.packetsize = MOUSE_MSC_PACKETSIZE;
209 sc->sc_watchdog = FALSE;
210 callout_reset(&sc->sc_callout, hz * 2, msetimeout, dev);
211 sc->mode.level = 0;
212 sc->status.flags = 0;
213 sc->status.button = sc->status.obutton = 0;
214 sc->status.dx = sc->status.dy = sc->status.dz = 0;
219 (*sc->sc_enablemouse)(sc->sc_port);
220 MSE_UNLOCK(sc);
230 mse_softc_t *sc = dev->si_drv1;
232 MSE_LOCK(sc);
233 callout_stop(&sc->sc_callout);
234 (*sc->sc_disablemouse)(sc->sc_port);
235 sc->sc_flags &= ~MSESC_OPEN;
236 MSE_UNLOCK(sc);
248 mse_softc_t *sc = dev->si_drv1;
255 MSE_LOCK(sc);
256 while (sc->sc_flags & MSESC_READING) {
258 MSE_UNLOCK(sc);
261 sc->sc_flags |= MSESC_WANT;
262 error = mtx_sleep(sc, &sc->sc_lock, MSEPRI | PCATCH, "mseread",
265 MSE_UNLOCK(sc);
269 sc->sc_flags |= MSESC_READING;
271 if (sc->sc_bytesread >= sc->mode.packetsize) {
272 while (sc->sc_deltax == 0 && sc->sc_deltay == 0 &&
273 (sc->sc_obuttons ^ sc->sc_buttons) == 0) {
276 sc->sc_flags |= MSESC_WANT;
277 error = mtx_sleep(sc, &sc->sc_lock, MSEPRI | PCATCH,
288 sc->sc_bytes[0] = sc->mode.syncmask[1]
289 | (sc->sc_buttons & ~sc->mode.syncmask[0]);
290 if (sc->sc_deltax > 127)
291 sc->sc_deltax = 127;
292 if (sc->sc_deltax < -127)
293 sc->sc_deltax = -127;
294 sc->sc_deltay = -sc->sc_deltay; /* Otherwise mousey goes wrong way */
295 if (sc->sc_deltay > 127)
296 sc->sc_deltay = 127;
297 if (sc->sc_deltay < -127)
298 sc->sc_deltay = -127;
299 sc->sc_bytes[1] = sc->sc_deltax;
300 sc->sc_bytes[2] = sc->sc_deltay;
301 sc->sc_bytes[3] = sc->sc_bytes[4] = 0;
302 sc->sc_bytes[5] = sc->sc_bytes[6] = 0;
303 sc->sc_bytes[7] = MOUSE_SYS_EXTBUTTONS;
304 sc->sc_obuttons = sc->sc_buttons;
305 sc->sc_deltax = sc->sc_deltay = 0;
306 sc->sc_bytesread = 0;
308 xfer = min(uio->uio_resid, sc->mode.packetsize - sc->sc_bytesread);
309 MSE_UNLOCK(sc);
310 error = uiomove(&sc->sc_bytes[sc->sc_bytesread], xfer, uio);
311 MSE_LOCK(sc);
313 sc->sc_flags &= ~MSESC_READING;
315 sc->sc_bytesread += xfer;
316 if (sc->sc_flags & MSESC_WANT) {
317 sc->sc_flags &= ~MSESC_WANT;
318 MSE_UNLOCK(sc);
319 wakeup(sc);
321 MSE_UNLOCK(sc);
331 mse_softc_t *sc = dev->si_drv1;
338 MSE_LOCK(sc);
339 *(mousehw_t *)addr = sc->hw;
340 if (sc->mode.level == 0)
342 MSE_UNLOCK(sc);
346 MSE_LOCK(sc);
347 *(mousemode_t *)addr = sc->mode;
348 switch (sc->mode.level) {
357 MSE_UNLOCK(sc);
368 MSE_LOCK(sc);
370 MSE_UNLOCK(sc);
373 sc->mode.accelfactor =
375 sc->mode.level = ((mousemode_t *)addr)->level;
376 switch (sc->mode.level) {
378 sc->sc_bytesread = sc->mode.packetsize
382 sc->sc_bytesread = sc->mode.packetsize
386 MSE_UNLOCK(sc);
390 MSE_LOCK(sc);
391 *(int *)addr = sc->mode.level;
392 MSE_UNLOCK(sc);
398 MSE_LOCK(sc);
399 sc->mode.level = *(int *)addr;
400 sc->sc_bytesread = sc->mode.packetsize
402 MSE_UNLOCK(sc);
405 MSE_LOCK(sc);
406 sc->mode.level = *(int *)addr;
407 sc->sc_bytesread = sc->mode.packetsize
409 MSE_UNLOCK(sc);
417 MSE_LOCK(sc);
418 status = sc->status;
419 sc->status.flags = 0;
420 sc->status.obutton = sc->status.button;
421 sc->status.button = 0;
422 sc->status.dx = 0;
423 sc->status.dy = 0;
424 sc->status.dz = 0;
425 MSE_UNLOCK(sc);
451 mse_softc_t *sc = dev->si_drv1;
454 MSE_LOCK(sc);
456 if (sc->sc_bytesread != sc->mode.packetsize ||
457 sc->sc_deltax != 0 || sc->sc_deltay != 0 ||
458 (sc->sc_obuttons ^ sc->sc_buttons) != 0)
461 selrecord(td, &sc->sc_selp);
463 MSE_UNLOCK(sc);
474 mse_softc_t *sc;
477 sc = dev->si_drv1;
478 MSE_ASSERT_LOCKED(sc);
479 if (sc->sc_watchdog) {
482 mseintr_locked(sc);
484 sc->sc_watchdog = TRUE;
485 callout_schedule(&sc->sc_callout, hz);
494 mse_softc_t *sc = arg;
496 MSE_LOCK(sc);
497 mseintr_locked(sc);
498 MSE_UNLOCK(sc);
502 mseintr_locked(mse_softc_t *sc)
526 if ((sc->sc_flags & MSESC_OPEN) == 0)
529 (*sc->sc_getmouse)(sc->sc_port, &dx, &dy, &but);
530 if (sc->mode.accelfactor > 0) {
532 dx = dx * dx / sc->mode.accelfactor;
538 dy = dy * dy / sc->mode.accelfactor;
544 sc->sc_deltax += dx;
545 sc->sc_deltay += dy;
546 sc->sc_buttons = but;
549 sc->status.dx += dx;
550 sc->status.dy += dy;
551 sc->status.flags |= ((dx || dy) ? MOUSE_POSCHANGED : 0)
552 | (sc->status.button ^ but);
553 sc->status.button = but;
555 sc->sc_watchdog = FALSE;
560 if (sc->sc_deltax != 0 || sc->sc_deltay != 0 ||
561 (sc->sc_obuttons ^ sc->sc_buttons) != 0) {
562 if (sc->sc_flags & MSESC_WANT) {
563 sc->sc_flags &= ~MSESC_WANT;
564 wakeup(sc);
566 selwakeuppri(&sc->sc_selp, MSEPRI);