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