Lines Matching refs:sc

139 atkbdc_assert_kbd_intr(struct atkbdc_softc *sc)  in atkbdc_assert_kbd_intr()  argument
141 if ((sc->ram[0] & KBD_ENABLE_KBD_INT) != 0) { in atkbdc_assert_kbd_intr()
142 sc->kbd.irq_active = true; in atkbdc_assert_kbd_intr()
143 vm_isa_pulse_irq(sc->ctx, sc->kbd.irq, sc->kbd.irq); in atkbdc_assert_kbd_intr()
148 atkbdc_assert_aux_intr(struct atkbdc_softc *sc) in atkbdc_assert_aux_intr() argument
150 if ((sc->ram[0] & KBD_ENABLE_AUX_INT) != 0) { in atkbdc_assert_aux_intr()
151 sc->aux.irq_active = true; in atkbdc_assert_aux_intr()
152 vm_isa_pulse_irq(sc->ctx, sc->aux.irq, sc->aux.irq); in atkbdc_assert_aux_intr()
157 atkbdc_kbd_queue_data(struct atkbdc_softc *sc, uint8_t val) in atkbdc_kbd_queue_data() argument
159 assert(pthread_mutex_isowned_np(&sc->mtx)); in atkbdc_kbd_queue_data()
161 if (sc->kbd.bcnt < FIFOSZ) { in atkbdc_kbd_queue_data()
162 sc->kbd.buffer[sc->kbd.bwr] = val; in atkbdc_kbd_queue_data()
163 sc->kbd.bwr = (sc->kbd.bwr + 1) % FIFOSZ; in atkbdc_kbd_queue_data()
164 sc->kbd.bcnt++; in atkbdc_kbd_queue_data()
165 sc->status |= KBDS_KBD_BUFFER_FULL; in atkbdc_kbd_queue_data()
166 sc->outport |= KBDO_KBD_OUTFULL; in atkbdc_kbd_queue_data()
171 return (sc->kbd.bcnt < FIFOSZ); in atkbdc_kbd_queue_data()
175 atkbdc_kbd_read(struct atkbdc_softc *sc) in atkbdc_kbd_read() argument
214 assert(pthread_mutex_isowned_np(&sc->mtx)); in atkbdc_kbd_read()
216 if (sc->ram[0] & KBD_TRANSLATION) { in atkbdc_kbd_read()
217 while (ps2kbd_read(sc->ps2kbd_sc, &val) != -1) { in atkbdc_kbd_read()
224 atkbdc_kbd_queue_data(sc, val); in atkbdc_kbd_read()
228 while (sc->kbd.bcnt < FIFOSZ) { in atkbdc_kbd_read()
229 if (ps2kbd_read(sc->ps2kbd_sc, &val) != -1) in atkbdc_kbd_read()
230 atkbdc_kbd_queue_data(sc, val); in atkbdc_kbd_read()
236 if (((sc->ram[0] & KBD_DISABLE_AUX_PORT) || in atkbdc_kbd_read()
237 ps2mouse_fifocnt(sc->ps2mouse_sc) == 0) && sc->kbd.bcnt > 0) in atkbdc_kbd_read()
238 atkbdc_assert_kbd_intr(sc); in atkbdc_kbd_read()
242 atkbdc_aux_poll(struct atkbdc_softc *sc) in atkbdc_aux_poll() argument
244 if (ps2mouse_fifocnt(sc->ps2mouse_sc) > 0) { in atkbdc_aux_poll()
245 sc->status |= KBDS_AUX_BUFFER_FULL | KBDS_KBD_BUFFER_FULL; in atkbdc_aux_poll()
246 sc->outport |= KBDO_AUX_OUTFULL; in atkbdc_aux_poll()
247 atkbdc_assert_aux_intr(sc); in atkbdc_aux_poll()
252 atkbdc_kbd_poll(struct atkbdc_softc *sc) in atkbdc_kbd_poll() argument
254 assert(pthread_mutex_isowned_np(&sc->mtx)); in atkbdc_kbd_poll()
256 atkbdc_kbd_read(sc); in atkbdc_kbd_poll()
260 atkbdc_poll(struct atkbdc_softc *sc) in atkbdc_poll() argument
262 atkbdc_aux_poll(sc); in atkbdc_poll()
263 atkbdc_kbd_poll(sc); in atkbdc_poll()
267 atkbdc_dequeue_data(struct atkbdc_softc *sc, uint8_t *buf) in atkbdc_dequeue_data() argument
269 assert(pthread_mutex_isowned_np(&sc->mtx)); in atkbdc_dequeue_data()
271 if (ps2mouse_read(sc->ps2mouse_sc, buf) == 0) { in atkbdc_dequeue_data()
272 if (ps2mouse_fifocnt(sc->ps2mouse_sc) == 0) { in atkbdc_dequeue_data()
273 if (sc->kbd.bcnt == 0) in atkbdc_dequeue_data()
274 sc->status &= ~(KBDS_AUX_BUFFER_FULL | in atkbdc_dequeue_data()
277 sc->status &= ~(KBDS_AUX_BUFFER_FULL); in atkbdc_dequeue_data()
278 sc->outport &= ~KBDO_AUX_OUTFULL; in atkbdc_dequeue_data()
281 atkbdc_poll(sc); in atkbdc_dequeue_data()
285 if (sc->kbd.bcnt > 0) { in atkbdc_dequeue_data()
286 *buf = sc->kbd.buffer[sc->kbd.brd]; in atkbdc_dequeue_data()
287 sc->kbd.brd = (sc->kbd.brd + 1) % FIFOSZ; in atkbdc_dequeue_data()
288 sc->kbd.bcnt--; in atkbdc_dequeue_data()
289 if (sc->kbd.bcnt == 0) { in atkbdc_dequeue_data()
290 sc->status &= ~KBDS_KBD_BUFFER_FULL; in atkbdc_dequeue_data()
291 sc->outport &= ~KBDO_KBD_OUTFULL; in atkbdc_dequeue_data()
294 atkbdc_poll(sc); in atkbdc_dequeue_data()
297 if (ps2mouse_fifocnt(sc->ps2mouse_sc) == 0 && sc->kbd.bcnt == 0) { in atkbdc_dequeue_data()
298 sc->status &= ~(KBDS_AUX_BUFFER_FULL | KBDS_KBD_BUFFER_FULL); in atkbdc_dequeue_data()
306 struct atkbdc_softc *sc; in atkbdc_data_handler() local
312 sc = arg; in atkbdc_data_handler()
315 pthread_mutex_lock(&sc->mtx); in atkbdc_data_handler()
317 sc->curcmd = 0; in atkbdc_data_handler()
318 if (sc->ctrlbyte != 0) { in atkbdc_data_handler()
319 *eax = sc->ctrlbyte & 0xff; in atkbdc_data_handler()
320 sc->ctrlbyte = 0; in atkbdc_data_handler()
323 atkbdc_dequeue_data(sc, &buf); in atkbdc_data_handler()
327 sc->status &= ~KBDS_CTRL_FLAG; in atkbdc_data_handler()
328 pthread_mutex_unlock(&sc->mtx); in atkbdc_data_handler()
332 if (sc->status & KBDS_CTRL_FLAG) { in atkbdc_data_handler()
336 switch (sc->curcmd) { in atkbdc_data_handler()
338 sc->ram[0] = *eax; in atkbdc_data_handler()
339 if (sc->ram[0] & KBD_SYS_FLAG_BIT) in atkbdc_data_handler()
340 sc->status |= KBDS_SYS_FLAG; in atkbdc_data_handler()
342 sc->status &= ~KBDS_SYS_FLAG; in atkbdc_data_handler()
345 sc->outport = *eax; in atkbdc_data_handler()
348 ps2mouse_write(sc->ps2mouse_sc, *eax, 0); in atkbdc_data_handler()
349 atkbdc_poll(sc); in atkbdc_data_handler()
352 atkbdc_kbd_queue_data(sc, *eax); in atkbdc_data_handler()
355 ps2mouse_write(sc->ps2mouse_sc, *eax, 1); in atkbdc_data_handler()
356 sc->status |= (KBDS_AUX_BUFFER_FULL | KBDS_KBD_BUFFER_FULL); in atkbdc_data_handler()
357 atkbdc_aux_poll(sc); in atkbdc_data_handler()
361 if (sc->curcmd >= 0x61 && sc->curcmd <= 0x7f) { in atkbdc_data_handler()
364 byten = (sc->curcmd - 0x60) & 0x1f; in atkbdc_data_handler()
365 sc->ram[byten] = *eax & 0xff; in atkbdc_data_handler()
370 sc->curcmd = 0; in atkbdc_data_handler()
371 sc->status &= ~KBDS_CTRL_FLAG; in atkbdc_data_handler()
373 pthread_mutex_unlock(&sc->mtx); in atkbdc_data_handler()
380 ps2kbd_write(sc->ps2kbd_sc, *eax); in atkbdc_data_handler()
381 atkbdc_poll(sc); in atkbdc_data_handler()
383 pthread_mutex_unlock(&sc->mtx); in atkbdc_data_handler()
392 struct atkbdc_softc *sc; in atkbdc_sts_ctl_handler() local
398 sc = arg; in atkbdc_sts_ctl_handler()
401 pthread_mutex_lock(&sc->mtx); in atkbdc_sts_ctl_handler()
405 *eax = sc->status; in atkbdc_sts_ctl_handler()
406 pthread_mutex_unlock(&sc->mtx); in atkbdc_sts_ctl_handler()
411 sc->curcmd = 0; in atkbdc_sts_ctl_handler()
412 sc->status |= KBDS_CTRL_FLAG; in atkbdc_sts_ctl_handler()
413 sc->ctrlbyte = 0; in atkbdc_sts_ctl_handler()
417 sc->ctrlbyte = CTRL_CMD_FLAG | sc->ram[0]; in atkbdc_sts_ctl_handler()
420 sc->ctrlbyte = CTRL_CMD_FLAG | 0x55; in atkbdc_sts_ctl_handler()
424 sc->ctrlbyte = CTRL_CMD_FLAG | 0; in atkbdc_sts_ctl_handler()
427 sc->ctrlbyte = CTRL_CMD_FLAG | 0; in atkbdc_sts_ctl_handler()
430 sc->ctrlbyte = CTRL_CMD_FLAG | sc->outport; in atkbdc_sts_ctl_handler()
436 sc->curcmd = *eax; in atkbdc_sts_ctl_handler()
439 sc->ram[0] |= KBD_DISABLE_KBD_PORT; in atkbdc_sts_ctl_handler()
442 sc->ram[0] &= ~KBD_DISABLE_KBD_PORT; in atkbdc_sts_ctl_handler()
443 if (sc->kbd.bcnt > 0) in atkbdc_sts_ctl_handler()
444 sc->status |= KBDS_KBD_BUFFER_FULL; in atkbdc_sts_ctl_handler()
445 atkbdc_poll(sc); in atkbdc_sts_ctl_handler()
448 sc->curcmd = *eax; in atkbdc_sts_ctl_handler()
451 sc->ram[0] |= KBD_DISABLE_AUX_PORT; in atkbdc_sts_ctl_handler()
452 ps2mouse_toggle(sc->ps2mouse_sc, 0); in atkbdc_sts_ctl_handler()
453 sc->status &= ~(KBDS_AUX_BUFFER_FULL | KBDS_KBD_BUFFER_FULL); in atkbdc_sts_ctl_handler()
454 sc->outport &= ~KBDS_AUX_BUFFER_FULL; in atkbdc_sts_ctl_handler()
457 sc->ram[0] &= ~KBD_DISABLE_AUX_PORT; in atkbdc_sts_ctl_handler()
458 ps2mouse_toggle(sc->ps2mouse_sc, 1); in atkbdc_sts_ctl_handler()
459 if (ps2mouse_fifocnt(sc->ps2mouse_sc) > 0) in atkbdc_sts_ctl_handler()
460 sc->status |= KBDS_AUX_BUFFER_FULL | KBDS_KBD_BUFFER_FULL; in atkbdc_sts_ctl_handler()
472 sc->ctrlbyte = CTRL_CMD_FLAG | sc->ram[byten]; in atkbdc_sts_ctl_handler()
477 pthread_mutex_unlock(&sc->mtx); in atkbdc_sts_ctl_handler()
479 if (sc->ctrlbyte != 0) { in atkbdc_sts_ctl_handler()
480 sc->status |= KBDS_KBD_BUFFER_FULL; in atkbdc_sts_ctl_handler()
481 sc->status &= ~KBDS_AUX_BUFFER_FULL; in atkbdc_sts_ctl_handler()
482 atkbdc_assert_kbd_intr(sc); in atkbdc_sts_ctl_handler()
483 } else if (ps2mouse_fifocnt(sc->ps2mouse_sc) > 0 && in atkbdc_sts_ctl_handler()
484 (sc->ram[0] & KBD_DISABLE_AUX_PORT) == 0) { in atkbdc_sts_ctl_handler()
485 sc->status |= KBDS_AUX_BUFFER_FULL | KBDS_KBD_BUFFER_FULL; in atkbdc_sts_ctl_handler()
486 atkbdc_assert_aux_intr(sc); in atkbdc_sts_ctl_handler()
487 } else if (sc->kbd.bcnt > 0 && (sc->ram[0] & KBD_DISABLE_KBD_PORT) == 0) { in atkbdc_sts_ctl_handler()
488 sc->status |= KBDS_KBD_BUFFER_FULL; in atkbdc_sts_ctl_handler()
489 atkbdc_assert_kbd_intr(sc); in atkbdc_sts_ctl_handler()
496 atkbdc_event(struct atkbdc_softc *sc, int iskbd) in atkbdc_event() argument
498 pthread_mutex_lock(&sc->mtx); in atkbdc_event()
501 atkbdc_kbd_poll(sc); in atkbdc_event()
503 atkbdc_aux_poll(sc); in atkbdc_event()
504 pthread_mutex_unlock(&sc->mtx); in atkbdc_event()
511 struct atkbdc_softc *sc; in atkbdc_init() local
514 sc = calloc(1, sizeof(struct atkbdc_softc)); in atkbdc_init()
515 sc->ctx = ctx; in atkbdc_init()
517 pthread_mutex_init(&sc->mtx, NULL); in atkbdc_init()
525 iop.arg = sc; in atkbdc_init()
536 iop.arg = sc; in atkbdc_init()
542 sc->kbd.irq = KBD_DEV_IRQ; in atkbdc_init()
545 sc->aux.irq = AUX_DEV_IRQ; in atkbdc_init()
547 sc->ps2kbd_sc = ps2kbd_init(sc); in atkbdc_init()
548 sc->ps2mouse_sc = ps2mouse_init(sc); in atkbdc_init()