/* * Retry wait for characters, for read. * No locks may be held. * May run on any CPU - does not talk to device driver. */ boolean_t char_read_done( register io_req_t ior) { register struct tty *tp = (struct tty *)ior->io_dev_ptr; register spl_t s = spltty(); simple_lock(&tp->t_lock); if (tp->t_inq.c_cc <= 0 || (tp->t_state & TS_CARR_ON) == 0) { queue_delayed_reply(&tp->t_delayed_read, ior, char_read_done); simple_unlock(&tp->t_lock); splx(s); return FALSE; } ior->io_residual = ior->io_count - q_to_b(&tp->t_inq, ior->io_data, (int)ior->io_count); if (tp->t_state & TS_RTS_DOWN) { (*tp->t_mctl)(tp, TM_RTS, DMBIS); tp->t_state &= ~TS_RTS_DOWN; } simple_unlock(&tp->t_lock); splx(s); (void) ds_read_done(ior); return TRUE; }
boolean_t kbd_read_done( io_req_t ior) { register int s, count; s = SPLKD(); kdq_lock(&kbd_queue); if (kdq_empty(&kbd_queue)) { ior->io_done = kbd_read_done; mpenqueue_tail(&kbd_read_queue, (queue_entry_t)ior); kdq_unlock(&kbd_queue); splx(s); return (FALSE); } count = 0; while (!kdq_empty(&kbd_queue) && count < ior->io_count) { register kd_event *ev; ev = kdq_get(&kbd_queue); *(kd_event *)(&ior->io_data[count]) = *ev; count += sizeof(kd_event); } kdq_unlock(&kbd_queue); splx(s); ior->io_residual = ior->io_count - count; ds_read_done(ior); return (TRUE); }
boolean_t tty_close_read_reply( register io_req_t ior) { ior->io_residual = ior->io_count; ior->io_error = D_DEVICE_DOWN; (void) ds_read_done(ior); return TRUE; }