summaryrefslogtreecommitdiffstats
path: root/bsps/shared/irq/irq-generic.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-06-24 17:14:03 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-07-26 19:57:31 +0200
commit63d9e840b735248d17644101996ffbefb07ab23f (patch)
treea6655d7efe2eddd3bec9c8e2d497eae05b4a1fef /bsps/shared/irq/irq-generic.c
parentbsps/irq: Use rtems_interrupt_entry (diff)
downloadrtems-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.c60
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);