From 6e796d9fbe1c8b86f221e1e3e8b9187b4b7d1294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Wed, 9 Jan 2008 21:26:05 +0000 Subject: [PATCH] * applied the same logic with regards to the ringbuffer to the mouse case in the ioctl() hook. Should be considered work in progress. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23330 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/drivers/input/usb_hid/hid.c | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/add-ons/kernel/drivers/input/usb_hid/hid.c b/src/add-ons/kernel/drivers/input/usb_hid/hid.c index dde3290587..51db4301b2 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/hid.c +++ b/src/add-ons/kernel/drivers/input/usb_hid/hid.c @@ -924,7 +924,7 @@ hid_device_control(driver_cookie *cookie, uint32 op, if (!device->active) return B_ERROR; /* already unplugged */ - if (device->is_keyboard) + if (device->is_keyboard) { switch (op) { case KB_READ: while (ring_buffer_readable(device->rbuf) == 0) { @@ -969,36 +969,33 @@ hid_device_control(driver_cookie *cookie, uint32 op, set_leds(device, (uint8 *)arg); break; } - else + } else { switch (op) { case MS_READ: - err = schedule_interrupt_transfer(device); - if (err != B_OK) - return err; - // NOTE: this thread is now blocking until - // the semaphore will be released from the - // call_back function + while (ring_buffer_readable(device->rbuf) == 0) { + err = schedule_interrupt_transfer(device); + if (err != B_OK) + return err; + // NOTE: this thread is now blocking until + // the semaphore will be released from the + // call_back function + + err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL); + if (err != B_OK) + return err; + + err = handle_interrupt_transfer(device); + if (err != B_OK) + return err; + } - err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL); - if (err != B_OK) - return err; - - err = handle_interrupt_transfer(device); - if (err != B_OK) - return err; - - acquire_sem(device->sem_lock); ring_buffer_user_read(device->rbuf, arg, sizeof(mouse_movement)); - release_sem(device->sem_lock); - return err; - break; + return B_OK; + case MS_NUM_EVENTS: - { - int32 count; - get_sem_count(device->sem_cb, &count); - return count; - break; - } + return (int32)(ring_buffer_readable(device->rbuf) + / sizeof(mouse_movement)); + case MS_SET_CLICKSPEED: #ifdef __HAIKU__ return user_memcpy(&device->click_speed, arg, sizeof(bigtime_t)); @@ -1011,6 +1008,7 @@ hid_device_control(driver_cookie *cookie, uint32 op, /* not implemented */ break; } + } return err; }