Lines Matching full:state

50 #define	debugf(state, fmt, args...)	printf("uinput: " fmt "\n", ##args)  argument
52 #define debugf(state, fmt, args...) argument
57 #define UINPUT_LOCK(state) sx_xlock(&(state)->ucs_lock) argument
58 #define UINPUT_UNLOCK(state) sx_unlock(&(state)->ucs_lock) argument
59 #define UINPUT_LOCK_ASSERT(state) sx_assert(&(state)->ucs_lock, SA_LOCKED) argument
60 #define UINPUT_EMPTYQ(state) \ argument
61 ((state)->ucs_buffer_head == (state)->ucs_buffer_tail)
160 struct uinput_cdev_state *state = evdev_get_softc(evdev); in uinput_ev_event() local
165 UINPUT_LOCK(state); in uinput_ev_event()
166 if (state->ucs_state == UINPUT_RUNNING) { in uinput_ev_event()
167 uinput_enqueue_event(state, type, code, value); in uinput_ev_event()
168 uinput_notify(state); in uinput_ev_event()
170 UINPUT_UNLOCK(state); in uinput_ev_event()
174 uinput_enqueue_event(struct uinput_cdev_state *state, uint16_t type, in uinput_enqueue_event() argument
179 UINPUT_LOCK_ASSERT(state); in uinput_enqueue_event()
181 head = state->ucs_buffer_head; in uinput_enqueue_event()
182 tail = (state->ucs_buffer_tail + 1) % UINPUT_BUFFER_SIZE; in uinput_enqueue_event()
184 microtime(&state->ucs_buffer[tail].time); in uinput_enqueue_event()
185 state->ucs_buffer[tail].type = type; in uinput_enqueue_event()
186 state->ucs_buffer[tail].code = code; in uinput_enqueue_event()
187 state->ucs_buffer[tail].value = value; in uinput_enqueue_event()
188 state->ucs_buffer_tail = tail; in uinput_enqueue_event()
192 debugf(state, "state %p: buffer overflow", state); in uinput_enqueue_event()
195 state->ucs_buffer_head = head; in uinput_enqueue_event()
202 struct uinput_cdev_state *state; in uinput_open() local
204 state = malloc(sizeof(struct uinput_cdev_state), M_EVDEV, in uinput_open()
206 state->ucs_evdev = evdev_alloc(); in uinput_open()
208 sx_init(&state->ucs_lock, "uinput"); in uinput_open()
209 knlist_init(&state->ucs_selp.si_note, &state->ucs_lock, uinput_knllock, in uinput_open()
212 devfs_set_cdevpriv(state, uinput_dtor); in uinput_open()
219 struct uinput_cdev_state *state = (struct uinput_cdev_state *)data; in uinput_dtor() local
221 evdev_free(state->ucs_evdev); in uinput_dtor()
223 knlist_clear(&state->ucs_selp.si_note, 0); in uinput_dtor()
224 seldrain(&state->ucs_selp); in uinput_dtor()
225 knlist_destroy(&state->ucs_selp.si_note); in uinput_dtor()
226 sx_destroy(&state->ucs_lock); in uinput_dtor()
233 struct uinput_cdev_state *state; in uinput_read() local
237 ret = devfs_get_cdevpriv((void **)&state); in uinput_read()
241 debugf(state, "read %zd bytes by thread %d", uio->uio_resid, in uinput_read()
250 UINPUT_LOCK(state); in uinput_read()
252 if (state->ucs_state != UINPUT_RUNNING) in uinput_read()
255 if (ret == 0 && UINPUT_EMPTYQ(state)) { in uinput_read()
260 state->ucs_blocked = true; in uinput_read()
261 ret = sx_sleep(state, &state->ucs_lock, in uinput_read()
267 while (ret == 0 && !UINPUT_EMPTYQ(state) && remaining > 0) { in uinput_read()
268 event = &state->ucs_buffer[state->ucs_buffer_head]; in uinput_read()
269 state->ucs_buffer_head = (state->ucs_buffer_head + 1) % in uinput_read()
275 UINPUT_UNLOCK(state); in uinput_read()
283 struct uinput_cdev_state *state; in uinput_write() local
288 ret = devfs_get_cdevpriv((void **)&state); in uinput_write()
292 debugf(state, "write %zd bytes by thread %d", uio->uio_resid, in uinput_write()
295 UINPUT_LOCK(state); in uinput_write()
297 if (state->ucs_state != UINPUT_RUNNING) { in uinput_write()
300 debugf(state, "write size not multiple of " in uinput_write()
307 uinput_setup_provider(state, &userdev); in uinput_write()
312 debugf(state, "write size not multiple of " in uinput_write()
319 ret = evdev_push_event(state->ucs_evdev, event.type, in uinput_write()
324 UINPUT_UNLOCK(state); in uinput_write()
330 uinput_setup_dev(struct uinput_cdev_state *state, struct input_id *id, in uinput_setup_dev() argument
337 evdev_set_name(state->ucs_evdev, name); in uinput_setup_dev()
338 evdev_set_id(state->ucs_evdev, id->bustype, id->vendor, id->product, in uinput_setup_dev()
340 state->ucs_state = UINPUT_CONFIGURED; in uinput_setup_dev()
346 uinput_setup_provider(struct uinput_cdev_state *state, in uinput_setup_provider() argument
352 debugf(state, "setup_provider called, udev=%p", udev); in uinput_setup_provider()
354 ret = uinput_setup_dev(state, &udev->id, udev->name, in uinput_setup_provider()
361 if (!bit_test(state->ucs_evdev->ev_abs_flags, i)) in uinput_setup_provider()
368 evdev_set_absinfo(state->ucs_evdev, i, &absinfo); in uinput_setup_provider()
377 struct uinput_cdev_state *state; in uinput_poll() local
380 if (devfs_get_cdevpriv((void **)&state) != 0) in uinput_poll()
383 debugf(state, "poll by thread %d", td->td_tid); in uinput_poll()
390 UINPUT_LOCK(state); in uinput_poll()
391 if (!UINPUT_EMPTYQ(state)) in uinput_poll()
394 state->ucs_selected = true; in uinput_poll()
395 selrecord(td, &state->ucs_selp); in uinput_poll()
397 UINPUT_UNLOCK(state); in uinput_poll()
406 struct uinput_cdev_state *state; in uinput_kqfilter() local
409 ret = devfs_get_cdevpriv((void **)&state); in uinput_kqfilter()
420 kn->kn_hook = (caddr_t)state; in uinput_kqfilter()
422 knlist_add(&state->ucs_selp.si_note, kn, 0); in uinput_kqfilter()
429 struct uinput_cdev_state *state; in uinput_kqread() local
432 state = (struct uinput_cdev_state *)kn->kn_hook; in uinput_kqread()
434 UINPUT_LOCK_ASSERT(state); in uinput_kqread()
436 ret = !UINPUT_EMPTYQ(state); in uinput_kqread()
443 struct uinput_cdev_state *state; in uinput_kqdetach() local
445 state = (struct uinput_cdev_state *)kn->kn_hook; in uinput_kqdetach()
446 knlist_remove(&state->ucs_selp.si_note, kn, 0); in uinput_kqdetach()
450 uinput_notify(struct uinput_cdev_state *state) in uinput_notify() argument
453 UINPUT_LOCK_ASSERT(state); in uinput_notify()
455 if (state->ucs_blocked) { in uinput_notify()
456 state->ucs_blocked = false; in uinput_notify()
457 wakeup(state); in uinput_notify()
459 if (state->ucs_selected) { in uinput_notify()
460 state->ucs_selected = false; in uinput_notify()
461 selwakeup(&state->ucs_selp); in uinput_notify()
463 KNOTE_LOCKED(&state->ucs_selp.si_note, 0); in uinput_notify()
467 uinput_ioctl_sub(struct uinput_cdev_state *state, u_long cmd, caddr_t data) in uinput_ioctl_sub() argument
474 UINPUT_LOCK_ASSERT(state); in uinput_ioctl_sub()
482 if (state->ucs_state != UINPUT_RUNNING) in uinput_ioctl_sub()
486 snprintf(data, len, "event%d", state->ucs_evdev->ev_unit); in uinput_ioctl_sub()
492 if (state->ucs_state != UINPUT_CONFIGURED) in uinput_ioctl_sub()
495 evdev_set_methods(state->ucs_evdev, state, &uinput_ev_methods); in uinput_ioctl_sub()
496 evdev_set_flag(state->ucs_evdev, EVDEV_FLAG_SOFTREPEAT); in uinput_ioctl_sub()
497 evdev_set_flag(state->ucs_evdev, EVDEV_FLAG_MT_KEEPID); in uinput_ioctl_sub()
498 ret = evdev_register(state->ucs_evdev); in uinput_ioctl_sub()
500 state->ucs_state = UINPUT_RUNNING; in uinput_ioctl_sub()
504 if (state->ucs_state != UINPUT_RUNNING) in uinput_ioctl_sub()
507 evdev_unregister(state->ucs_evdev); in uinput_ioctl_sub()
508 bzero(state->ucs_evdev, sizeof(struct evdev_dev)); in uinput_ioctl_sub()
509 state->ucs_state = UINPUT_NEW; in uinput_ioctl_sub()
513 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
517 return (uinput_setup_dev(state, &us->id, us->name, in uinput_ioctl_sub()
521 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
528 evdev_set_abs_bit(state->ucs_evdev, uabs->code); in uinput_ioctl_sub()
529 evdev_set_absinfo(state->ucs_evdev, uabs->code, in uinput_ioctl_sub()
534 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
537 evdev_support_event(state->ucs_evdev, intdata); in uinput_ioctl_sub()
541 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
544 evdev_support_key(state->ucs_evdev, intdata); in uinput_ioctl_sub()
548 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
551 evdev_support_rel(state->ucs_evdev, intdata); in uinput_ioctl_sub()
555 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
558 evdev_set_abs_bit(state->ucs_evdev, intdata); in uinput_ioctl_sub()
562 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
565 evdev_support_msc(state->ucs_evdev, intdata); in uinput_ioctl_sub()
569 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
572 evdev_support_led(state->ucs_evdev, intdata); in uinput_ioctl_sub()
576 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
579 evdev_support_snd(state->ucs_evdev, intdata); in uinput_ioctl_sub()
583 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
590 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
598 evdev_set_phys(state->ucs_evdev, buf); in uinput_ioctl_sub()
602 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
607 evdev_set_serial(state->ucs_evdev, buf); in uinput_ioctl_sub()
611 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
614 evdev_support_sw(state->ucs_evdev, intdata); in uinput_ioctl_sub()
618 if (state->ucs_state == UINPUT_RUNNING || in uinput_ioctl_sub()
621 evdev_support_prop(state->ucs_evdev, intdata); in uinput_ioctl_sub()
628 if (state->ucs_state == UINPUT_RUNNING) in uinput_ioctl_sub()
645 struct uinput_cdev_state *state; in uinput_ioctl() local
648 ret = devfs_get_cdevpriv((void **)&state); in uinput_ioctl()
652 debugf(state, "ioctl called: cmd=0x%08lx, data=%p", cmd, data); in uinput_ioctl()
654 UINPUT_LOCK(state); in uinput_ioctl()
655 ret = uinput_ioctl_sub(state, cmd, data); in uinput_ioctl()
656 UINPUT_UNLOCK(state); in uinput_ioctl()