diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-06-24 17:14:03 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-07-26 19:57:31 +0200 |
commit | 63d9e840b735248d17644101996ffbefb07ab23f (patch) | |
tree | a6655d7efe2eddd3bec9c8e2d497eae05b4a1fef /bsps/shared/irq/irq-handler-iterate.c | |
parent | bsps/irq: Use rtems_interrupt_entry (diff) | |
download | rtems-63d9e840b735248d17644101996ffbefb07ab23f.tar.bz2 |
bsps/irq: Add bsp_interrupt_check_and_lock()
Return RTEMS_INCORRECT_STATE instead of RTEMS_INTERNAL_ERROR in case the
interrupt support is not initialized. This is similar to
rtems_timer_server_fire_after() for example.
Update #3269.
Diffstat (limited to '')
-rw-r--r-- | bsps/shared/irq/irq-handler-iterate.c | 51 |
1 files changed, 14 insertions, 37 deletions
diff --git a/bsps/shared/irq/irq-handler-iterate.c b/bsps/shared/irq/irq-handler-iterate.c index 3c642b075e..385cb8db2d 100644 --- a/bsps/shared/irq/irq-handler-iterate.c +++ b/bsps/shared/irq/irq-handler-iterate.c @@ -36,39 +36,26 @@ #include <bsp/irq-generic.h> -/** - * @brief Iterates over all installed interrupt handler of a vector. - * - * @ingroup bsp_interrupt - * - * @return In addition to the standard status codes this function returns - * RTEMS_INTERNAL_ERROR if the BSP interrupt support is not initialized. - * - * @see rtems_interrupt_handler_iterate(). - */ -static rtems_status_code bsp_interrupt_handler_iterate( - rtems_vector_number vector, +rtems_status_code rtems_interrupt_handler_iterate( + rtems_vector_number vector, rtems_interrupt_per_handler_routine routine, - void *arg + void *arg ) { - rtems_interrupt_entry *current = NULL; - rtems_option options = 0; - rtems_vector_number index = 0; + rtems_status_code sc; + rtems_vector_number index; + rtems_option options; + rtems_interrupt_entry *current; - /* Check parameters and system state */ - if (!bsp_interrupt_is_initialized()) { - return RTEMS_INTERNAL_ERROR; - } else if (!bsp_interrupt_is_valid_vector(vector)) { - return RTEMS_INVALID_ID; - } else if (rtems_interrupt_is_in_progress()) { - return RTEMS_CALLED_FROM_ISR; - } + sc = bsp_interrupt_check_and_lock( + vector, + (rtems_interrupt_handler) routine + ); - /* Lock */ - bsp_interrupt_lock(); + if ( sc != RTEMS_SUCCESSFUL ) { + return sc; + } - /* Interate */ index = bsp_interrupt_handler_index(vector); current = &bsp_interrupt_handler_table [index]; if (!bsp_interrupt_is_empty_handler_entry(current)) { @@ -80,17 +67,7 @@ static rtems_status_code bsp_interrupt_handler_iterate( } while (current != NULL); } - /* Unlock */ bsp_interrupt_unlock(); return RTEMS_SUCCESSFUL; } - -rtems_status_code rtems_interrupt_handler_iterate( - rtems_vector_number vector, - rtems_interrupt_per_handler_routine routine, - void *arg -) -{ - return bsp_interrupt_handler_iterate(vector, routine, arg); -} |