Lines Matching full:state
50 #define debugf(state, fmt, args...) printf("uinput: " fmt "\n", ##args)
52 #define debugf(state, fmt, args...)
57 #define UINPUT_LOCK(state) sx_xlock(&(state)->ucs_lock)
58 #define UINPUT_UNLOCK(state) sx_unlock(&(state)->ucs_lock)
59 #define UINPUT_LOCK_ASSERT(state) sx_assert(&(state)->ucs_lock, SA_LOCKED)
60 #define UINPUT_EMPTYQ(state) \
61 ((state)->ucs_buffer_head == (state)->ucs_buffer_tail)
159 struct uinput_cdev_state *state = evdev_get_softc(evdev);
164 UINPUT_LOCK(state);
165 if (state->ucs_state == UINPUT_RUNNING) {
166 uinput_enqueue_event(state, type, code, value);
167 uinput_notify(state);
169 UINPUT_UNLOCK(state);
173 uinput_enqueue_event(struct uinput_cdev_state *state, uint16_t type,
178 UINPUT_LOCK_ASSERT(state);
180 head = state->ucs_buffer_head;
181 tail = (state->ucs_buffer_tail + 1) % UINPUT_BUFFER_SIZE;
183 microtime(&state->ucs_buffer[tail].time);
184 state->ucs_buffer[tail].type = type;
185 state->ucs_buffer[tail].code = code;
186 state->ucs_buffer[tail].value = value;
187 state->ucs_buffer_tail = tail;
191 debugf(state, "state %p: buffer overflow", state);
194 state->ucs_buffer_head = head;
201 struct uinput_cdev_state *state;
203 state = malloc(sizeof(struct uinput_cdev_state), M_EVDEV,
205 state->ucs_evdev = evdev_alloc();
207 sx_init(&state->ucs_lock, "uinput");
208 knlist_init(&state->ucs_selp.si_note, &state->ucs_lock, uinput_knllock,
211 devfs_set_cdevpriv(state, uinput_dtor);
218 struct uinput_cdev_state *state = (struct uinput_cdev_state *)data;
220 evdev_free(state->ucs_evdev);
222 knlist_clear(&state->ucs_selp.si_note, 0);
223 seldrain(&state->ucs_selp);
224 knlist_destroy(&state->ucs_selp.si_note);
225 sx_destroy(&state->ucs_lock);
232 struct uinput_cdev_state *state;
236 ret = devfs_get_cdevpriv((void **)&state);
240 debugf(state, "read %zd bytes by thread %d", uio->uio_resid,
249 UINPUT_LOCK(state);
251 if (state->ucs_state != UINPUT_RUNNING)
254 if (ret == 0 && UINPUT_EMPTYQ(state)) {
259 state->ucs_blocked = true;
260 ret = sx_sleep(state, &state->ucs_lock,
266 while (ret == 0 && !UINPUT_EMPTYQ(state) && remaining > 0) {
267 event = &state->ucs_buffer[state->ucs_buffer_head];
268 state->ucs_buffer_head = (state->ucs_buffer_head + 1) %
274 UINPUT_UNLOCK(state);
282 struct uinput_cdev_state *state;
287 ret = devfs_get_cdevpriv((void **)&state);
291 debugf(state, "write %zd bytes by thread %d", uio->uio_resid,
294 UINPUT_LOCK(state);
296 if (state->ucs_state != UINPUT_RUNNING) {
299 debugf(state, "write size not multiple of "
306 uinput_setup_provider(state, &userdev);
311 debugf(state, "write size not multiple of "
318 ret = evdev_push_event(state->ucs_evdev, event.type,
323 UINPUT_UNLOCK(state);
329 uinput_setup_dev(struct uinput_cdev_state *state, struct input_id *id,
336 evdev_set_name(state->ucs_evdev, name);
337 evdev_set_id(state->ucs_evdev, id->bustype, id->vendor, id->product,
339 state->ucs_state = UINPUT_CONFIGURED;
345 uinput_setup_provider(struct uinput_cdev_state *state,
351 debugf(state, "setup_provider called, udev=%p", udev);
353 ret = uinput_setup_dev(state, &udev->id, udev->name,
360 if (!bit_test(state->ucs_evdev->ev_abs_flags, i))
367 evdev_set_absinfo(state->ucs_evdev, i, &absinfo);
376 struct uinput_cdev_state *state;
379 if (devfs_get_cdevpriv((void **)&state) != 0)
382 debugf(state, "poll by thread %d", td->td_tid);
389 UINPUT_LOCK(state);
390 if (!UINPUT_EMPTYQ(state))
393 state->ucs_selected = true;
394 selrecord(td, &state->ucs_selp);
396 UINPUT_UNLOCK(state);
405 struct uinput_cdev_state *state;
408 ret = devfs_get_cdevpriv((void **)&state);
419 kn->kn_hook = (caddr_t)state;
421 knlist_add(&state->ucs_selp.si_note, kn, 0);
428 struct uinput_cdev_state *state;
431 state = (struct uinput_cdev_state *)kn->kn_hook;
433 UINPUT_LOCK_ASSERT(state);
435 ret = !UINPUT_EMPTYQ(state);
442 struct uinput_cdev_state *state;
444 state = (struct uinput_cdev_state *)kn->kn_hook;
445 knlist_remove(&state->ucs_selp.si_note, kn, 0);
449 uinput_notify(struct uinput_cdev_state *state)
452 UINPUT_LOCK_ASSERT(state);
454 if (state->ucs_blocked) {
455 state->ucs_blocked = false;
456 wakeup(state);
458 if (state->ucs_selected) {
459 state->ucs_selected = false;
460 selwakeup(&state->ucs_selp);
462 KNOTE_LOCKED(&state->ucs_selp.si_note, 0);
466 uinput_ioctl_sub(struct uinput_cdev_state *state, u_long cmd, caddr_t data)
473 UINPUT_LOCK_ASSERT(state);
481 if (state->ucs_state != UINPUT_RUNNING)
485 snprintf(data, len, "event%d", state->ucs_evdev->ev_unit);
491 if (state->ucs_state != UINPUT_CONFIGURED)
494 evdev_set_methods(state->ucs_evdev, state, &uinput_ev_methods);
495 evdev_set_flag(state->ucs_evdev, EVDEV_FLAG_SOFTREPEAT);
496 evdev_set_flag(state->ucs_evdev, EVDEV_FLAG_MT_KEEPID);
497 ret = evdev_register(state->ucs_evdev);
499 state->ucs_state = UINPUT_RUNNING;
503 if (state->ucs_state != UINPUT_RUNNING)
506 evdev_unregister(state->ucs_evdev);
507 bzero(state->ucs_evdev, sizeof(struct evdev_dev));
508 state->ucs_state = UINPUT_NEW;
512 if (state->ucs_state == UINPUT_RUNNING)
516 return (uinput_setup_dev(state, &us->id, us->name,
520 if (state->ucs_state == UINPUT_RUNNING)
527 evdev_set_abs_bit(state->ucs_evdev, uabs->code);
528 evdev_set_absinfo(state->ucs_evdev, uabs->code,
533 if (state->ucs_state == UINPUT_RUNNING ||
536 evdev_support_event(state->ucs_evdev, intdata);
540 if (state->ucs_state == UINPUT_RUNNING ||
543 evdev_support_key(state->ucs_evdev, intdata);
547 if (state->ucs_state == UINPUT_RUNNING ||
550 evdev_support_rel(state->ucs_evdev, intdata);
554 if (state->ucs_state == UINPUT_RUNNING ||
557 evdev_set_abs_bit(state->ucs_evdev, intdata);
561 if (state->ucs_state == UINPUT_RUNNING ||
564 evdev_support_msc(state->ucs_evdev, intdata);
568 if (state->ucs_state == UINPUT_RUNNING ||
571 evdev_support_led(state->ucs_evdev, intdata);
575 if (state->ucs_state == UINPUT_RUNNING ||
578 evdev_support_snd(state->ucs_evdev, intdata);
582 if (state->ucs_state == UINPUT_RUNNING ||
589 if (state->ucs_state == UINPUT_RUNNING)
597 evdev_set_phys(state->ucs_evdev, buf);
601 if (state->ucs_state == UINPUT_RUNNING)
606 evdev_set_serial(state->ucs_evdev, buf);
610 if (state->ucs_state == UINPUT_RUNNING ||
613 evdev_support_sw(state->ucs_evdev, intdata);
617 if (state->ucs_state == UINPUT_RUNNING ||
620 evdev_support_prop(state->ucs_evdev, intdata);
627 if (state->ucs_state == UINPUT_RUNNING)
644 struct uinput_cdev_state *state;
647 ret = devfs_get_cdevpriv((void **)&state);
651 debugf(state, "ioctl called: cmd=0x%08lx, data=%p", cmd, data);
653 UINPUT_LOCK(state);
654 ret = uinput_ioctl_sub(state, cmd, data);
655 UINPUT_UNLOCK(state);