* 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
This commit is contained in:
@@ -924,7 +924,7 @@ hid_device_control(driver_cookie *cookie, uint32 op,
|
|||||||
if (!device->active)
|
if (!device->active)
|
||||||
return B_ERROR; /* already unplugged */
|
return B_ERROR; /* already unplugged */
|
||||||
|
|
||||||
if (device->is_keyboard)
|
if (device->is_keyboard) {
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case KB_READ:
|
case KB_READ:
|
||||||
while (ring_buffer_readable(device->rbuf) == 0) {
|
while (ring_buffer_readable(device->rbuf) == 0) {
|
||||||
@@ -969,36 +969,33 @@ hid_device_control(driver_cookie *cookie, uint32 op,
|
|||||||
set_leds(device, (uint8 *)arg);
|
set_leds(device, (uint8 *)arg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
} else {
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case MS_READ:
|
case MS_READ:
|
||||||
err = schedule_interrupt_transfer(device);
|
while (ring_buffer_readable(device->rbuf) == 0) {
|
||||||
if (err != B_OK)
|
err = schedule_interrupt_transfer(device);
|
||||||
return err;
|
if (err != B_OK)
|
||||||
// NOTE: this thread is now blocking until
|
return err;
|
||||||
// the semaphore will be released from the
|
// NOTE: this thread is now blocking until
|
||||||
// call_back function
|
// 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));
|
ring_buffer_user_read(device->rbuf, arg, sizeof(mouse_movement));
|
||||||
release_sem(device->sem_lock);
|
return B_OK;
|
||||||
return err;
|
|
||||||
break;
|
|
||||||
case MS_NUM_EVENTS:
|
case MS_NUM_EVENTS:
|
||||||
{
|
return (int32)(ring_buffer_readable(device->rbuf)
|
||||||
int32 count;
|
/ sizeof(mouse_movement));
|
||||||
get_sem_count(device->sem_cb, &count);
|
|
||||||
return count;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MS_SET_CLICKSPEED:
|
case MS_SET_CLICKSPEED:
|
||||||
#ifdef __HAIKU__
|
#ifdef __HAIKU__
|
||||||
return user_memcpy(&device->click_speed, arg, sizeof(bigtime_t));
|
return user_memcpy(&device->click_speed, arg, sizeof(bigtime_t));
|
||||||
@@ -1011,6 +1008,7 @@ hid_device_control(driver_cookie *cookie, uint32 op,
|
|||||||
/* not implemented */
|
/* not implemented */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user