Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2455 → Rev 2456

/branches/rcu/kernel/genarch/src/kbd/i8042.c
49,6 → 49,7
#include <interrupt.h>
#include <sysinfo/sysinfo.h>
#include <ipc/irq.h>
#include <generic/synch/rcu.h>
 
/* Keyboard commands. */
#define KBD_ENABLE 0xf4
107,13 → 108,11
i8042_data_write(i8042_COMMAND);
i8042_wait();
 
spinlock_lock(&i8042_kbd_irq.lock);
i8042_kbd_irq.notif_cfg.notify = false;
spinlock_unlock(&i8042_kbd_irq.lock);
//rcu_read_lock() is not needed, ints are disabled
//rcu: atomic update doesn't need reallocation
rcu_dereference_pointer(i8042_kbd_irq.notif_cfg).notify = false;
spinlock_lock(&i8042_mouse_irq.lock);
i8042_mouse_irq.notif_cfg.notify = false;
spinlock_unlock(&i8042_mouse_irq.lock);
rcu_dereference_pointer(i8042_mouse_irq.notif_cfg).notify = false;
interrupts_restore(ipl);
}
121,15 → 120,15
void i8042_release(void)
{
ipl_t ipl = interrupts_disable();
//rcu: atomic update doesn't need reallocation
spinlock_lock(&i8042_kbd_irq.lock);
if (i8042_kbd_irq.notif_cfg.answerbox)
i8042_kbd_irq.notif_cfg.notify = true;
if (rcu_dereference_pointer(i8042_kbd_irq.notif_cfg).answerbox)
rcu_dereference_pointer(i8042_kbd_irq.notif_cfg).notify = true;
spinlock_unlock(&i8042_kbd_irq.lock);
spinlock_lock(&i8042_mouse_irq.lock);
if (i8042_mouse_irq.notif_cfg.answerbox)
i8042_mouse_irq.notif_cfg.notify = true;
if (rcu_dereference_pointer(i8042_mouse_irq.notif_cfg).answerbox)
rcu_dereference_pointer(i8042_mouse_irq.notif_cfg).notify = true;
spinlock_unlock(&i8042_mouse_irq.lock);
interrupts_restore(ipl);
142,7 → 141,7
 
static void i8042_kbd_irq_handler(irq_t *irq, void *arg, ...)
{
if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
if (rcu_dereference_pointer(irq->notif_cfg).notify && rcu_dereference_pointer(irq->notif_cfg).answerbox)
ipc_irq_send_notif(irq);
else {
uint8_t x;
164,7 → 163,7
 
static void i8042_mouse_irq_handler(irq_t *irq, void *arg, ...)
{
if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
if (rcu_dereference_pointer(irq->notif_cfg).notify && rcu_dereference_pointer(irq->notif_cfg).answerbox)
ipc_irq_send_notif(irq);
}