Lines Matching refs:state

52 #define	debugf(state, fmt, args...)	printf("uinput: " fmt "\n", ##args)  argument
54 #define debugf(state, fmt, args...) argument
59 #define UINPUT_LOCK(state) sx_xlock(&(state)->ucs_lock) argument
60 #define UINPUT_UNLOCK(state) sx_unlock(&(state)->ucs_lock) argument
61 #define UINPUT_LOCK_ASSERT(state) sx_assert(&(state)->ucs_lock, SA_LOCKED) argument
62 #define UINPUT_EMPTYQ(state) \ argument
63 ((state)->ucs_buffer_head == (state)->ucs_buffer_tail)
165 struct uinput_cdev_state *state = evdev_get_softc(evdev); in uinput_ev_event() local
170 UINPUT_LOCK(state); in uinput_ev_event()
171 if (state->ucs_state == UINPUT_RUNNING) { in uinput_ev_event()
172 uinput_enqueue_event(state, type, code, value); in uinput_ev_event()
173 uinput_notify(state); in uinput_ev_event()
175 UINPUT_UNLOCK(state); in uinput_ev_event()
179 uinput_enqueue_event(struct uinput_cdev_state *state, uint16_t type, in uinput_enqueue_event() argument
184 UINPUT_LOCK_ASSERT(state); in uinput_enqueue_event()
186 head = state->ucs_buffer_head; in uinput_enqueue_event()
187 tail = (state->ucs_buffer_tail + 1) % UINPUT_BUFFER_SIZE; in uinput_enqueue_event()
189 microtime(&state->ucs_buffer[tail].time); in uinput_enqueue_event()
190 state->ucs_buffer[tail].type = type; in uinput_enqueue_event()
191 state->ucs_buffer[tail].code = code; in uinput_enqueue_event()
192 state->ucs_buffer[tail].value = value; in uinput_enqueue_event()
193 state->ucs_buffer_tail = tail; in uinput_enqueue_event()
197 debugf(state, "state %p: buffer overflow", state); in uinput_enqueue_event()
200 state->ucs_buffer_head = head; in uinput_enqueue_event()
207 struct uinput_cdev_state *state; in uinput_open() local
209 state = malloc(sizeof(struct uinput_cdev_state), M_EVDEV, in uinput_open()
211 state->ucs_evdev = evdev_alloc(); in uinput_open()
213 sx_init(&state->ucs_lock, "uinput"); in uinput_open()
214 knlist_init(&state->ucs_selp.si_note, &state->ucs_lock, uinput_knllock, in uinput_open()
218 devfs_set_cdevpriv(state, uinput_dtor); in uinput_open()
225 struct uinput_cdev_state *state = (struct uinput_cdev_state *)data; in uinput_dtor() local
227 evdev_free(state->ucs_evdev); in uinput_dtor()
229 knlist_clear(&state->ucs_selp.si_note, 0); in uinput_dtor()
230 seldrain(&state->ucs_selp); in uinput_dtor()
231 knlist_destroy(&state->ucs_selp.si_note); in uinput_dtor()
232 sx_destroy(&state->ucs_lock); in uinput_dtor()
239 struct uinput_cdev_state *state; in uinput_read() local
243 ret = devfs_get_cdevpriv((void **)&state); in uinput_read()
247 debugf(state, "read %zd bytes by thread %d", uio->uio_resid, in uinput_read()
256 UINPUT_LOCK(state); in uinput_read()
258 if (state->ucs_state != UINPUT_RUNNING) in uinput_read()
261 if (ret == 0 && UINPUT_EMPTYQ(state)) { in uinput_read()
266 state->ucs_blocked = true; in uinput_read()
267 ret = sx_sleep(state, &state->ucs_lock, in uinput_read()
273 while (ret == 0 && !UINPUT_EMPTYQ(state) && remaining > 0) { in uinput_read()
274 event = &state->ucs_buffer[state->ucs_buffer_head]; in uinput_read()
275 state->ucs_buffer_head = (state->ucs_buffer_head + 1) % in uinput_read()
281 UINPUT_UNLOCK(state); in uinput_read()
289 struct uinput_cdev_state *state; in uinput_write() local
294 ret = devfs_get_cdevpriv((void **)&state); in uinput_write()
298 debugf(state, "write %zd bytes by thread %d", uio->uio_resid, in uinput_write()
301 UINPUT_LOCK(state); in uinput_write()
303 if (state->ucs_state != UINPUT_RUNNING) { in uinput_write()
306 debugf(state, "write size not multiple of " in uinput_write()
313 uinput_setup_provider(state, &userdev); in uinput_write()
318 debugf(state, "write size not multiple of " in uinput_write()
325 ret = evdev_push_event(state->ucs_evdev, event.type, in uinput_write()
330 UINPUT_UNLOCK(state); in uinput_write()
336 uinput_setup_dev(struct uinput_cdev_state *state, struct input_id *id, in uinput_setup_dev() argument
343 evdev_set_name(state->ucs_evdev, name); in uinput_setup_dev()
344 evdev_set_id(state->ucs_evdev, id->bustype, id->vendor, id->product, in uinput_setup_dev()
346 state->ucs_state = UINPUT_CONFIGURED; in uinput_setup_dev()
352 uinput_setup_provider(struct uinput_cdev_state *state, in uinput_setup_provider() argument
358 debugf(state, "setup_provider called, udev=%p", udev); in uinput_setup_provider()
360 ret = uinput_setup_dev(state, &udev->id, udev->name, in uinput_setup_provider()
367 if (!bit_test(state->ucs_evdev->ev_abs_flags, i)) in uinput_setup_provider()
374 evdev_set_absinfo(state->ucs_evdev, i, &absinfo); in uinput_setup_provider()
383 struct uinput_cdev_state *state; in uinput_poll() local
386 if (devfs_get_cdevpriv((void **)&state) != 0) in uinput_poll()
389 debugf(state, "poll by thread %d", td->td_tid); in uinput_poll()
396 UINPUT_LOCK(state); in uinput_poll()
397 if (!UINPUT_EMPTYQ(state)) in uinput_poll()
400 state->ucs_selected = true; in uinput_poll()
401 selrecord(td, &state->ucs_selp); in uinput_poll()
403 UINPUT_UNLOCK(state); in uinput_poll()
412 struct uinput_cdev_state *state; in uinput_kqfilter() local
415 ret = devfs_get_cdevpriv((void **)&state); in uinput_kqfilter()
426 kn->kn_hook = (caddr_t)state; in uinput_kqfilter()
428 knlist_add(&state->ucs_selp.si_note, kn, 0); in uinput_kqfilter()
435 struct uinput_cdev_state *state; in uinput_kqread() local
438 state = (struct uinput_cdev_state *)kn->kn_hook; in uinput_kqread()
440 UINPUT_LOCK_ASSERT(state); in uinput_kqread()
442 ret = !UINPUT_EMPTYQ(state); in uinput_kqread()
449 struct uinput_cdev_state *state; in uinput_kqdetach() local
451 state = (struct uinput_cdev_state *)kn->kn_hook; in uinput_kqdetach()
452 knlist_remove(&state->ucs_selp.si_note, kn, 0); in uinput_kqdetach()
456 uinput_notify(struct uinput_cdev_state *state) in uinput_notify() argument
459 UINPUT_LOCK_ASSERT(state); in uinput_notify()
461 if (state->ucs_blocked) { in uinput_notify()
462 state->ucs_blocked = false; in uinput_notify()
463 wakeup(state); in uinput_notify()
465 if (state->ucs_selected) { in uinput_notify()
466 state->ucs_selected = false; in uinput_notify()
467 selwakeup(&state->ucs_selp); in uinput_notify()
469 KNOTE_LOCKED(&state->ucs_selp.si_note, 0); in uinput_notify()
473 uinput_ioctl_sub(struct uinput_cdev_state *state, u_long cmd, caddr_t data) in uinput_ioctl_sub() argument
480 UINPUT_LOCK_ASSERT(state); in uinput_ioctl_sub()
488 if (state->ucs_state != UINPUT_RUNNING) in uinput_ioctl_sub()
492 snprintf(data, len, "event%d", state->ucs_evdev->ev_unit); in uinput_ioctl_sub()
498 if (state->ucs_state != UINPUT_CONFIGURED) in uinput_ioctl_sub()
501 evdev_set_methods(state->ucs_evdev, state, &uinput_ev_methods); in uinput_ioctl_sub()
502 evdev_set_flag(state->ucs_evdev, EVDEV_FLAG_SOFTREPEAT); in uinput_ioctl_sub()
503 ret = evdev_register(state->ucs_evdev); in uinput_ioctl_sub()
505 state->ucs_state = UINPUT_RUNNING; in uinput_ioctl_sub()
509 if (state->ucs_state != UINPUT_RUNNING) in uinput_ioctl_sub()
512 evdev_unregister(state->ucs_evdev); in uinput_ioctl_sub()
513 bzero(state->ucs_evdev, sizeof(struct evdev_dev)); in uinput_ioctl_sub()
514 state->ucs_state = UINPUT_NEW; in uinput_ioctl_sub()
518 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
522 return (uinput_setup_dev(state, &us->id, us->name, in uinput_ioctl_sub()
526 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
533 evdev_support_abs(state->ucs_evdev, uabs->code, in uinput_ioctl_sub()
540 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
543 evdev_support_event(state->ucs_evdev, intdata); in uinput_ioctl_sub()
547 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
550 evdev_support_key(state->ucs_evdev, intdata); in uinput_ioctl_sub()
554 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
557 evdev_support_rel(state->ucs_evdev, intdata); in uinput_ioctl_sub()
561 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
564 evdev_set_abs_bit(state->ucs_evdev, intdata); in uinput_ioctl_sub()
568 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
571 evdev_support_msc(state->ucs_evdev, intdata); in uinput_ioctl_sub()
575 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
578 evdev_support_led(state->ucs_evdev, intdata); in uinput_ioctl_sub()
582 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
585 evdev_support_snd(state->ucs_evdev, intdata); in uinput_ioctl_sub()
589 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
596 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
604 evdev_set_phys(state->ucs_evdev, buf); in uinput_ioctl_sub()
608 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
613 evdev_set_serial(state->ucs_evdev, buf); in uinput_ioctl_sub()
617 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
620 evdev_support_sw(state->ucs_evdev, intdata); in uinput_ioctl_sub()
624 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
627 evdev_support_prop(state->ucs_evdev, intdata); in uinput_ioctl_sub()
634 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
651 struct uinput_cdev_state *state; in uinput_ioctl() local
654 ret = devfs_get_cdevpriv((void **)&state); in uinput_ioctl()
658 debugf(state, "ioctl called: cmd=0x%08lx, data=%p", cmd, data); in uinput_ioctl()
660 UINPUT_LOCK(state); in uinput_ioctl()
661 ret = uinput_ioctl_sub(state, cmd, data); in uinput_ioctl()
662 UINPUT_UNLOCK(state); in uinput_ioctl()