Subversion Repositories HelenOS

Rev

Rev 1920 | Rev 1922 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1920 Rev 1921
Line 61... Line 61...
61
#include <ddi/irq.h>
61
#include <ddi/irq.h>
62
#include <adt/hash_table.h>
62
#include <adt/hash_table.h>
63
#include <arch/types.h>
63
#include <arch/types.h>
64
#include <typedefs.h>
64
#include <typedefs.h>
65
#include <synch/spinlock.h>
65
#include <synch/spinlock.h>
-
 
66
#include <atomic.h>
66
#include <arch.h>
67
#include <arch.h>
67
 
68
 
68
/**
69
/**
69
 * Spinlock protecting the hash table.
70
 * Spinlock protecting the hash table.
70
 * This lock must be taken only when interrupts are disabled.
71
 * This lock must be taken only when interrupts are disabled.
Line 125... Line 126...
125
 *
126
 *
126
 */
127
 */
127
void irq_initialize(irq_t *irq)
128
void irq_initialize(irq_t *irq)
128
{
129
{
129
    link_initialize(&irq->link);
130
    link_initialize(&irq->link);
-
 
131
    spinlock_initialize(&irq->lock, "irq.lock");
130
    irq->inr = -1;
132
    irq->inr = -1;
131
    irq->devno = -1;
133
    irq->devno = -1;
132
    irq->notif = 0;
-
 
133
    irq->trigger = 0;
134
    irq->trigger = 0;
134
    irq->claim = NULL;
135
    irq->claim = NULL;
135
    irq->handler = NULL;
136
    irq->handler = NULL;
136
    irq->arg = NULL;
137
    irq->arg = NULL;
-
 
138
    irq->notif_answerbox = NULL;
-
 
139
    irq->code = NULL;
-
 
140
    atomic_set(&irq->counter, 0);
137
}
141
}
138
 
142
 
139
/** Register IRQ for device.
143
/** Register IRQ for device.
140
 *
144
 *
141
 * The irq structure must be filled with information
145
 * The irq structure must be filled with information
Line 218... Line 222...
218
 */
222
 */
219
bool irq_ht_compare(unative_t *key, count_t keys, link_t *item)
223
bool irq_ht_compare(unative_t *key, count_t keys, link_t *item)
220
{
224
{
221
    irq_t *irq = hash_table_get_instance(item, irq_t, link);
225
    irq_t *irq = hash_table_get_instance(item, irq_t, link);
222
    inr_t *inr = (inr_t *) key;
226
    inr_t *inr = (inr_t *) key;
-
 
227
    bool rv;
223
   
228
   
-
 
229
    spinlock_lock(&irq->lock);
224
    return ((irq->inr == *inr) && (irq->claim() == IRQ_ACCEPT));
230
    rv = ((irq->inr == *inr) && (irq->claim() == IRQ_ACCEPT));
-
 
231
    spinlock_unlock(&irq->lock);
-
 
232
 
-
 
233
    return rv;
225
}
234
}
226
 
235
 
227
/** Compute hash index for the key.
236
/** Compute hash index for the key.
228
 *
237
 *
229
 * This function computes hash index into
238
 * This function computes hash index into
Line 257... Line 266...
257
 * @return True on match or false otherwise.
266
 * @return True on match or false otherwise.
258
 */
267
 */
259
bool irq_lin_compare(unative_t *key, count_t keys, link_t *item)
268
bool irq_lin_compare(unative_t *key, count_t keys, link_t *item)
260
{
269
{
261
    irq_t *irq = list_get_instance(item, irq_t, link);
270
    irq_t *irq = list_get_instance(item, irq_t, link);
-
 
271
    bool rv;
-
 
272
   
-
 
273
    spinlock_lock(&irq->lock);
-
 
274
    rv = (irq->claim() == IRQ_ACCEPT);
-
 
275
    spinlock_unlock(&irq->lock);
262
   
276
   
263
    return (irq->claim() == IRQ_ACCEPT);
277
    return rv;
264
}
278
}
265
 
279
 
266
/** @}
280
/** @}
267
 */
281
 */