diff --git a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c index a372b8ae691f7b9224fb9e4c2c9fe94e524f4cb1..38d2c37b3ba1e978a84a2c55a0f2bdb5df507295 100644 --- a/arch/sparc/kernel/irq.c +++ b/arch/sparc/kernel/irq.c @@ -424,6 +424,10 @@ static int leon_irq_queue(struct irl_vector_elem *p_elem) /** * * @brief execute deferred (low-priority) handlers + * + * @note see todo + * @todo TODO we do not track deferred handler IRQ numbers, so we'll just + * pass -1 for now and hope the user knows what he's doing -.- */ void leon_irq_queue_execute(void) @@ -442,7 +446,7 @@ void leon_irq_queue_execute(void) if (likely(p_elem->handler)) { - if (p_elem->handler(p_elem->data)) + if (p_elem->handler(-1, p_elem->data)) leon_irq_queue(p_elem); else list_add_tail(&p_elem->handler_node, @@ -480,9 +484,9 @@ static int leon_irq_dispatch(unsigned int irq) list_for_each_entry(p_elem, &irl_vector[irq], handler_node) { if (likely(p_elem->priority == ISR_PRIORITY_NOW)) - p_elem->handler(p_elem->data); + p_elem->handler(irq, p_elem->data); else if (leon_irq_queue(p_elem) < 0) - p_elem->handler(p_elem->data); + p_elem->handler(irq, p_elem->data); } return 0; @@ -557,9 +561,9 @@ static int leon_eirq_dispatch(unsigned int irq) * queueing fails */ if (likely(p_elem->priority == ISR_PRIORITY_NOW)) - p_elem->handler(p_elem->data); + p_elem->handler(eirq, p_elem->data); else if (leon_irq_queue(p_elem) < 0) - p_elem->handler(p_elem->data); + p_elem->handler(eirq, p_elem->data); } } diff --git a/include/kernel/irq.h b/include/kernel/irq.h index dc3afdc1547f4e4f776dec1666c03f7b86d92b45..911f76eb4c493b1403cacf55bce4f16af5d4978b 100644 --- a/include/kernel/irq.h +++ b/include/kernel/irq.h @@ -29,7 +29,7 @@ enum irqreturn { typedef enum irqreturn irqreturn_t; -typedef irqreturn_t (*irq_handler_t)(void *); +typedef irqreturn_t (*irq_handler_t)(unsigned int irq, void *); enum isr_exec_priority {ISR_PRIORITY_NOW, ISR_PRIORITY_DEFERRED};