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-generic.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 'bsps/shared/irq/irq-generic.c')
-rw-r--r-- | bsps/shared/irq/irq-generic.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/bsps/shared/irq/irq-generic.c b/bsps/shared/irq/irq-generic.c index a7e8c1163f..59963182ab 100644 --- a/bsps/shared/irq/irq-generic.c +++ b/bsps/shared/irq/irq-generic.c @@ -122,6 +122,32 @@ static inline bool bsp_interrupt_allocate_handler_index( #endif } +rtems_status_code bsp_interrupt_check_and_lock( + rtems_vector_number vector, + rtems_interrupt_handler handler +) +{ + if ( !bsp_interrupt_is_initialized() ) { + return RTEMS_INCORRECT_STATE; + } + + if ( handler == NULL ) { + return RTEMS_INVALID_ADDRESS; + } + + if ( !bsp_interrupt_is_valid_vector( vector ) ) { + return RTEMS_INVALID_ID; + } + + if ( rtems_interrupt_is_in_progress() ) { + return RTEMS_CALLED_FROM_ISR; + } + + bsp_interrupt_lock(); + + return RTEMS_SUCCESSFUL; +} + void bsp_interrupt_initialize(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; @@ -162,25 +188,18 @@ static rtems_status_code bsp_interrupt_handler_install( void *arg ) { + rtems_status_code sc; rtems_interrupt_level level; rtems_vector_number index = 0; rtems_interrupt_entry *head = NULL; bool enable_vector = false; bool replace = RTEMS_INTERRUPT_IS_REPLACE(options); - /* 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 (handler == NULL) { - return RTEMS_INVALID_ADDRESS; - } else if (rtems_interrupt_is_in_progress()) { - return RTEMS_CALLED_FROM_ISR; - } + sc = bsp_interrupt_check_and_lock( vector, handler ); - /* Lock */ - bsp_interrupt_lock(); + if ( sc != RTEMS_SUCCESSFUL ) { + return sc; + } /* Get handler table index */ index = bsp_interrupt_handler_index(vector); @@ -325,6 +344,7 @@ static rtems_status_code bsp_interrupt_handler_remove( void *arg ) { + rtems_status_code sc; rtems_interrupt_level level; rtems_vector_number index = 0; rtems_interrupt_entry *head = NULL; @@ -332,19 +352,11 @@ static rtems_status_code bsp_interrupt_handler_remove( rtems_interrupt_entry *previous = NULL; rtems_interrupt_entry *match = NULL; - /* 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 (handler == NULL) { - return RTEMS_INVALID_ADDRESS; - } else if (rtems_interrupt_is_in_progress()) { - return RTEMS_CALLED_FROM_ISR; - } + sc = bsp_interrupt_check_and_lock( vector, handler ); - /* Lock */ - bsp_interrupt_lock(); + if ( sc != RTEMS_SUCCESSFUL ) { + return sc; + } /* Get handler table index */ index = bsp_interrupt_handler_index(vector); |