Lines Matching refs:client

85 static bool __evdev_is_filtered(struct evdev_client *client,  in __evdev_is_filtered()  argument
97 mask = client->evmasks[0]; in __evdev_is_filtered()
106 mask = client->evmasks[type]; in __evdev_is_filtered()
111 static void __evdev_flush_queue(struct evdev_client *client, unsigned int type) in __evdev_flush_queue() argument
114 unsigned int mask = client->bufsize - 1; in __evdev_flush_queue()
120 head = client->tail; in __evdev_flush_queue()
121 client->packet_head = client->tail; in __evdev_flush_queue()
126 for (i = client->tail; i != client->head; i = (i + 1) & mask) { in __evdev_flush_queue()
127 ev = &client->buffer[i]; in __evdev_flush_queue()
138 client->buffer[head].time = ev->time; in __evdev_flush_queue()
139 client->buffer[head].type = ev->type; in __evdev_flush_queue()
140 client->buffer[head].code = ev->code; in __evdev_flush_queue()
141 client->buffer[head].value = ev->value; in __evdev_flush_queue()
149 client->packet_head = head; in __evdev_flush_queue()
153 client->head = head; in __evdev_flush_queue()
156 static void __evdev_queue_syn_dropped(struct evdev_client *client) in __evdev_queue_syn_dropped() argument
161 time = client->clk_type == EV_CLK_REAL ? in __evdev_queue_syn_dropped()
163 client->clk_type == EV_CLK_MONO ? in __evdev_queue_syn_dropped()
172 client->buffer[client->head++] = ev; in __evdev_queue_syn_dropped()
173 client->head &= client->bufsize - 1; in __evdev_queue_syn_dropped()
175 if (unlikely(client->head == client->tail)) { in __evdev_queue_syn_dropped()
177 client->tail = (client->head - 1) & (client->bufsize - 1); in __evdev_queue_syn_dropped()
178 client->packet_head = client->tail; in __evdev_queue_syn_dropped()
182 static void evdev_queue_syn_dropped(struct evdev_client *client) in evdev_queue_syn_dropped() argument
186 spin_lock_irqsave(&client->buffer_lock, flags); in evdev_queue_syn_dropped()
187 __evdev_queue_syn_dropped(client); in evdev_queue_syn_dropped()
188 spin_unlock_irqrestore(&client->buffer_lock, flags); in evdev_queue_syn_dropped()
191 static int evdev_set_clk_type(struct evdev_client *client, unsigned int clkid) in evdev_set_clk_type() argument
211 if (client->clk_type != clk_type) { in evdev_set_clk_type()
212 client->clk_type = clk_type; in evdev_set_clk_type()
218 spin_lock_irqsave(&client->buffer_lock, flags); in evdev_set_clk_type()
220 if (client->head != client->tail) { in evdev_set_clk_type()
221 client->packet_head = client->head = client->tail; in evdev_set_clk_type()
222 __evdev_queue_syn_dropped(client); in evdev_set_clk_type()
225 spin_unlock_irqrestore(&client->buffer_lock, flags); in evdev_set_clk_type()
231 static void __pass_event(struct evdev_client *client, in __pass_event() argument
234 client->buffer[client->head++] = *event; in __pass_event()
235 client->head &= client->bufsize - 1; in __pass_event()
237 if (unlikely(client->head == client->tail)) { in __pass_event()
242 client->tail = (client->head - 2) & (client->bufsize - 1); in __pass_event()
244 client->buffer[client->tail].time = event->time; in __pass_event()
245 client->buffer[client->tail].type = EV_SYN; in __pass_event()
246 client->buffer[client->tail].code = SYN_DROPPED; in __pass_event()
247 client->buffer[client->tail].value = 0; in __pass_event()
249 client->packet_head = client->tail; in __pass_event()
253 client->packet_head = client->head; in __pass_event()
254 kill_fasync(&client->fasync, SIGIO, POLL_IN); in __pass_event()
258 static void evdev_pass_values(struct evdev_client *client, in evdev_pass_values() argument
262 struct evdev *evdev = client->evdev; in evdev_pass_values()
267 if (client->revoked) in evdev_pass_values()
270 event.time = ktime_to_timeval(ev_time[client->clk_type]); in evdev_pass_values()
273 spin_lock(&client->buffer_lock); in evdev_pass_values()
276 if (__evdev_is_filtered(client, v->type, v->code)) in evdev_pass_values()
281 if (client->packet_head == client->head) in evdev_pass_values()
290 __pass_event(client, &event); in evdev_pass_values()
293 spin_unlock(&client->buffer_lock); in evdev_pass_values()
306 struct evdev_client *client; in evdev_events() local
316 client = rcu_dereference(evdev->grab); in evdev_events()
318 if (client) in evdev_events()
319 evdev_pass_values(client, vals, count, ev_time); in evdev_events()
321 list_for_each_entry_rcu(client, &evdev->client_list, node) in evdev_events()
322 evdev_pass_values(client, vals, count, ev_time); in evdev_events()
340 struct evdev_client *client = file->private_data; in evdev_fasync() local
342 return fasync_helper(fd, file, on, &client->fasync); in evdev_fasync()
347 struct evdev_client *client = file->private_data; in evdev_flush() local
348 struct evdev *evdev = client->evdev; in evdev_flush()
352 if (evdev->exist && !client->revoked) in evdev_flush()
371 static int evdev_grab(struct evdev *evdev, struct evdev_client *client) in evdev_grab() argument
382 rcu_assign_pointer(evdev->grab, client); in evdev_grab()
387 static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client) in evdev_ungrab() argument
392 if (grab != client) in evdev_ungrab()
403 struct evdev_client *client) in evdev_attach_client() argument
406 list_add_tail_rcu(&client->node, &evdev->client_list); in evdev_attach_client()
411 struct evdev_client *client) in evdev_detach_client() argument
414 list_del_rcu(&client->node); in evdev_detach_client()
455 struct evdev_client *client; in evdev_hangup() local
458 list_for_each_entry(client, &evdev->client_list, node) in evdev_hangup()
459 kill_fasync(&client->fasync, SIGIO, POLL_HUP); in evdev_hangup()
467 struct evdev_client *client = file->private_data; in evdev_release() local
468 struct evdev *evdev = client->evdev; in evdev_release()
472 evdev_ungrab(evdev, client); in evdev_release()
475 evdev_detach_client(evdev, client); in evdev_release()
478 kfree(client->evmasks[i]); in evdev_release()
480 kvfree(client); in evdev_release()
502 struct evdev_client *client; in evdev_open() local
505 client = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); in evdev_open()
506 if (!client) in evdev_open()
507 client = vzalloc(size); in evdev_open()
508 if (!client) in evdev_open()
511 client->bufsize = bufsize; in evdev_open()
512 spin_lock_init(&client->buffer_lock); in evdev_open()
513 client->evdev = evdev; in evdev_open()
514 evdev_attach_client(evdev, client); in evdev_open()
520 file->private_data = client; in evdev_open()
526 evdev_detach_client(evdev, client); in evdev_open()
527 kvfree(client); in evdev_open()
534 struct evdev_client *client = file->private_data; in evdev_write() local
535 struct evdev *evdev = client->evdev; in evdev_write()
546 if (!evdev->exist || client->revoked) { in evdev_write()
568 static int evdev_fetch_next_event(struct evdev_client *client, in evdev_fetch_next_event() argument
573 spin_lock_irq(&client->buffer_lock); in evdev_fetch_next_event()
575 have_event = client->packet_head != client->tail; in evdev_fetch_next_event()
577 *event = client->buffer[client->tail++]; in evdev_fetch_next_event()
578 client->tail &= client->bufsize - 1; in evdev_fetch_next_event()
581 spin_unlock_irq(&client->buffer_lock); in evdev_fetch_next_event()
589 struct evdev_client *client = file->private_data; in evdev_read() local
590 struct evdev *evdev = client->evdev; in evdev_read()
599 if (!evdev->exist || client->revoked) in evdev_read()
602 if (client->packet_head == client->tail && in evdev_read()
614 evdev_fetch_next_event(client, &event)) { in evdev_read()
627 client->packet_head != client->tail || in evdev_read()
628 !evdev->exist || client->revoked); in evdev_read()
640 struct evdev_client *client = file->private_data; in evdev_poll() local
641 struct evdev *evdev = client->evdev; in evdev_poll()
646 if (evdev->exist && !client->revoked) in evdev_poll()
651 if (client->packet_head != client->tail) in evdev_poll()
914 static int evdev_handle_get_val(struct evdev_client *client, in evdev_handle_get_val() argument
930 spin_lock(&client->buffer_lock); in evdev_handle_get_val()
936 __evdev_flush_queue(client, type); in evdev_handle_get_val()
938 spin_unlock_irq(&client->buffer_lock); in evdev_handle_get_val()
942 evdev_queue_syn_dropped(client); in evdev_handle_get_val()
973 static int evdev_revoke(struct evdev *evdev, struct evdev_client *client, in evdev_revoke() argument
976 client->revoked = true; in evdev_revoke()
977 evdev_ungrab(evdev, client); in evdev_revoke()
985 static int evdev_set_mask(struct evdev_client *client, in evdev_set_mask() argument
1010 spin_lock_irqsave(&client->buffer_lock, flags); in evdev_set_mask()
1011 oldmask = client->evmasks[type]; in evdev_set_mask()
1012 client->evmasks[type] = mask; in evdev_set_mask()
1013 spin_unlock_irqrestore(&client->buffer_lock, flags); in evdev_set_mask()
1021 static int evdev_get_mask(struct evdev_client *client, in evdev_get_mask() argument
1038 mask = client->evmasks[type]; in evdev_get_mask()
1062 struct evdev_client *client = file->private_data; in evdev_do_ioctl() local
1063 struct evdev *evdev = client->evdev; in evdev_do_ioctl()
1118 return evdev_grab(evdev, client); in evdev_do_ioctl()
1120 return evdev_ungrab(evdev, client); in evdev_do_ioctl()
1126 return evdev_revoke(evdev, client, file); in evdev_do_ioctl()
1135 return evdev_get_mask(client, in evdev_do_ioctl()
1147 return evdev_set_mask(client, in evdev_do_ioctl()
1156 return evdev_set_clk_type(client, i); in evdev_do_ioctl()
1185 return evdev_handle_get_val(client, dev, EV_KEY, dev->key, in evdev_do_ioctl()
1189 return evdev_handle_get_val(client, dev, EV_LED, dev->led, in evdev_do_ioctl()
1193 return evdev_handle_get_val(client, dev, EV_SND, dev->snd, in evdev_do_ioctl()
1197 return evdev_handle_get_val(client, dev, EV_SW, dev->sw, in evdev_do_ioctl()
1289 struct evdev_client *client = file->private_data; in evdev_ioctl_handler() local
1290 struct evdev *evdev = client->evdev; in evdev_ioctl_handler()
1297 if (!evdev->exist || client->revoked) { in evdev_ioctl_handler()