Lines Matching +full:coexist +full:- +full:support

1 /*-
3 * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@FreeBSD.org>
104 struct evdev_dev *evdev = dev->si_drv1;
113 buffer_size = evdev->ev_report_size * DEF_RING_REPORTS;
119 client->ec_buffer_size = buffer_size;
120 client->ec_buffer_head = 0;
121 client->ec_buffer_tail = 0;
122 client->ec_buffer_ready = 0;
124 client->ec_evdev = evdev;
125 mtx_init(&client->ec_buffer_mtx, "evclient", "evdev", MTX_DEF);
126 knlist_init_mtx(&client->ec_selp.si_note, &client->ec_buffer_mtx);
132 if (dev->si_drv1 == NULL)
141 client->ec_revoked = true;
156 EVDEV_LIST_LOCK(client->ec_evdev);
157 if (!client->ec_revoked)
158 evdev_dispose_client(client->ec_evdev, client);
159 EVDEV_LIST_UNLOCK(client->ec_evdev);
161 if (client->ec_evdev->ev_lock_type != EV_LOCK_MTX)
163 knlist_clear(&client->ec_selp.si_note, 0);
164 seldrain(&client->ec_selp);
165 knlist_destroy(&client->ec_selp.si_note);
166 funsetown(&client->ec_sigio);
167 mtx_destroy(&client->ec_buffer_mtx);
190 debugf(client, "read %zd bytes by thread %d", uio->uio_resid,
191 uio->uio_td->td_tid);
193 if (client->ec_revoked)
203 /* Zero-sized reads are allowed for error checking */
204 if (uio->uio_resid != 0 && uio->uio_resid < evsize)
207 remaining = uio->uio_resid / evsize;
216 client->ec_blocked = true;
217 ret = mtx_sleep(client, &client->ec_buffer_mtx,
219 if (ret == 0 && client->ec_revoked)
226 head = client->ec_buffer + client->ec_buffer_head;
238 client->ec_buffer_head =
239 (client->ec_buffer_head + 1) % client->ec_buffer_size;
240 remaining--;
255 struct evdev_dev *evdev = dev->si_drv1;
270 debugf(client, "write %zd bytes by thread %d", uio->uio_resid,
271 uio->uio_td->td_tid);
273 if (client->ec_revoked || evdev == NULL)
283 if (uio->uio_resid % evsize != 0) {
288 while (uio->uio_resid > 0 && ret == 0) {
316 debugf(client, "poll by thread %d", td->td_tid);
318 if (client->ec_revoked)
326 client->ec_selected = true;
327 selrecord(td, &client->ec_selp);
345 if (client->ec_revoked)
348 switch(kn->kn_filter) {
350 kn->kn_fop = &evdev_cdev_filterops;
355 kn->kn_hook = (caddr_t)client;
357 knlist_add(&client->ec_selp.si_note, kn, 0);
367 client = (struct evdev_client *)kn->kn_hook;
371 if (client->ec_revoked) {
372 kn->kn_flags |= EV_EOF;
375 kn->kn_data = EVDEV_CLIENT_SIZEQ(client) *
387 client = (struct evdev_client *)kn->kn_hook;
388 knlist_remove(&client->ec_selp.si_note, kn, 0);
395 struct evdev_dev *evdev = dev->si_drv1;
407 if (client->ec_revoked || evdev == NULL)
414 if (evdev->ev_kdb_active) {
416 if (evdev->ev_kdb_active) {
417 evdev->ev_kdb_active = false;
418 if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH)
421 if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH)
430 return (fsetown(*(int *)data, &client->ec_sigio));
433 *(int *)data = fgetown(&client->ec_sigio);
441 client->ec_async = true;
443 client->ec_async = false;
458 /* evdev fixed-length ioctls handling */
466 evdev->ev_id.bustype, evdev->ev_id.vendor,
467 evdev->ev_id.product);
468 memcpy(data, &evdev->ev_id, sizeof(struct input_id));
475 memcpy(data, evdev->ev_rep, sizeof(evdev->ev_rep));
492 if (evdev->ev_methods == NULL ||
493 evdev->ev_methods->ev_get_keycode == NULL)
497 evdev->ev_methods->ev_get_keycode(evdev, ke);
505 if (evdev->ev_methods == NULL ||
506 evdev->ev_methods->ev_set_keycode == NULL)
510 evdev->ev_methods->ev_set_keycode(evdev, ke);
514 if (evdev->ev_absinfo == NULL)
517 memcpy(data, &evdev->ev_absinfo[cmd - EVIOCGABS(0)],
522 if (evdev->ev_absinfo == NULL)
525 code = cmd - EVIOCSABS(0);
526 /* mt-slot number can not be changed */
555 if (dev->si_drv1 != NULL && !client->ec_revoked) {
565 client->ec_clock_id = EV_CLOCK_REALTIME;
568 client->ec_clock_id = EV_CLOCK_MONOTONIC;
575 /* evdev variable-length ioctls handling */
579 limit = MIN(strlen(evdev->ev_name) + 1, len);
580 memcpy(data, evdev->ev_name, limit);
581 td->td_retval[0] = limit;
585 if (evdev->ev_shortname[0] == 0)
588 limit = MIN(strlen(evdev->ev_shortname) + 1, len);
589 memcpy(data, evdev->ev_shortname, limit);
590 td->td_retval[0] = limit;
594 if (evdev->ev_serial[0] == 0)
597 limit = MIN(strlen(evdev->ev_serial) + 1, len);
598 memcpy(data, evdev->ev_serial, limit);
599 td->td_retval[0] = limit;
604 memcpy(data, evdev->ev_prop_flags, limit);
605 td->td_retval[0] = limit;
610 if (evdev->ev_mt == NULL)
619 MIN(len / sizeof(int32_t) - 1, MAXIMAL_MT_SLOT(evdev) + 1);
629 memcpy(data, evdev->ev_key_states, limit);
631 td->td_retval[0] = limit;
638 memcpy(data, evdev->ev_led_states, limit);
640 td->td_retval[0] = limit;
647 memcpy(data, evdev->ev_snd_states, limit);
649 td->td_retval[0] = limit;
656 memcpy(data, evdev->ev_sw_states, limit);
658 td->td_retval[0] = limit;
662 type_num = IOCBASECMD(cmd) - EVIOCGBIT(0, 0);
680 bitmap = evdev->ev_type_flags;
684 bitmap = evdev->ev_key_flags;
688 bitmap = evdev->ev_rel_flags;
692 bitmap = evdev->ev_abs_flags;
696 bitmap = evdev->ev_msc_flags;
700 bitmap = evdev->ev_led_flags;
704 bitmap = evdev->ev_snd_flags;
708 bitmap = evdev->ev_sw_flags;
713 * We don't support EV_FF now, so let's
717 td->td_retval[0] = len;
732 td->td_retval[0] = len;
740 EVDEV_LIST_LOCK_ASSERT(client->ec_evdev);
742 client->ec_revoked = true;
751 if (client->ec_blocked) {
752 client->ec_blocked = false;
755 if (client->ec_selected) {
756 client->ec_selected = false;
757 selwakeup(&client->ec_selp);
759 KNOTE_LOCKED(&client->ec_selp.si_note, 0);
761 if (client->ec_async && client->ec_sigio != NULL)
762 pgsigio(&client->ec_sigio, SIGIO, 0);
779 /* Try to coexist with cuse-backed input/event devices */
780 while ((ret = make_dev_s(&mda, &evdev->ev_cdev, "input/event%d", unit))
785 evdev->ev_unit = unit;
794 destroy_dev(evdev->ev_cdev);
802 switch (client->ec_clock_id) {
805 * XXX: FreeBSD does not support true POSIX monotonic clock.
827 head = client->ec_buffer_head;
828 tail = client->ec_buffer_tail;
829 ready = client->ec_buffer_ready;
830 count = client->ec_buffer_size;
836 head = (tail + count - 1) % count;
837 client->ec_buffer[head] = (struct input_event) {
850 client->ec_buffer_head = head;
851 client->ec_buffer_ready = head;
854 client->ec_buffer[tail].type = type;
855 client->ec_buffer[tail].code = code;
856 client->ec_buffer[tail].value = value;
857 client->ec_buffer_tail = (tail + 1) % count;
862 for (; ready != client->ec_buffer_tail;
864 client->ec_buffer[ready].time = time;
865 client->ec_buffer_ready = client->ec_buffer_tail;
875 head = client->ec_buffer_head;
876 tail = client->ec_buffer_tail;
877 ready = client->ec_buffer_ready;
878 size = client->ec_buffer_size;
887 event = &client->ec_buffer[i];
893 printf("type=%d code=%d value=%d ", event->type,
894 event->code, event->value);
897 printf("<- head\n");
899 printf("<- tail\n");
901 printf("<- ready\n");
916 i = head = client->ec_buffer_head;
917 tail = client->ec_buffer_tail;
918 count = client->ec_buffer_size;
919 client->ec_buffer_ready = client->ec_buffer_tail;
921 while (i != client->ec_buffer_tail) {
922 event = &client->ec_buffer[i];
926 if (event->type == type)
930 if (event->type == EV_SYN && event->code == SYN_REPORT) {
934 client->ec_buffer_ready = (tail + 1) % count;
938 memcpy(&client->ec_buffer[tail], event,
941 last_was_syn = (event->type == EV_SYN &&
942 event->code == SYN_REPORT);
947 client->ec_buffer_head = i;
948 client->ec_buffer_tail = tail;