diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-10-09 13:46:39 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-10-09 13:46:39 +0000 |
commit | 031b57caa39e182fc851f79fcd6e279074710689 (patch) | |
tree | 84dae621acd6f9414c17e35c3c185333ab9c7e44 /cpukit | |
parent | 2009-10-09 Sebastian Huber <Sebastian.Huber@embedded-brains.de> (diff) | |
download | rtems-031b57caa39e182fc851f79fcd6e279074710689.tar.bz2 |
2009-10-09 Sebastian Huber <Sebastian.Huber@embedded-brains.de>
* cpukit/sapi/include/rtems/io.h: Documentation.
* cpukit/sapi/src/ioregisterdriver.c: Call from interrupt context is
an error.
* cpukit/sapi/src/iounregisterdriver.c: Disable preemption during
critical section.
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/ChangeLog | 8 | ||||
-rw-r--r-- | cpukit/sapi/include/rtems/io.h | 2 | ||||
-rw-r--r-- | cpukit/sapi/src/ioregisterdriver.c | 3 | ||||
-rw-r--r-- | cpukit/sapi/src/iounregisterdriver.c | 9 |
4 files changed, 22 insertions, 0 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index 1fb491d02e..14be906af1 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,11 @@ +2009-10-09 Sebastian Huber <Sebastian.Huber@embedded-brains.de> + + * cpukit/sapi/include/rtems/io.h: Documentation. + * cpukit/sapi/src/ioregisterdriver.c: Call from interrupt context is + an error. + * cpukit/sapi/src/iounregisterdriver.c: Disable preemption during + critical section. + 2009-10-09 Chris Johns <chrisj@rtems.org> * libmisc/shell/main_mknod.c: Fixed build problem with networking diff --git a/cpukit/sapi/include/rtems/io.h b/cpukit/sapi/include/rtems/io.h index ba867c46f3..bf0057e5e6 100644 --- a/cpukit/sapi/include/rtems/io.h +++ b/cpukit/sapi/include/rtems/io.h @@ -92,6 +92,7 @@ rtems_status_code rtems_io_driver_io_error( * @retval RTEMS_INVALID_NUMBER Invalid major number. * @retval RTEMS_TOO_MANY No major number available. * @retval RTEMS_RESOURCE_IN_USE Major number in use. + * @retval RTEMS_CALLED_FROM_ISR Called from interrupt context. * @retval * Status code depends on rtems_io_initialize(). */ rtems_status_code rtems_io_register_driver( @@ -105,6 +106,7 @@ rtems_status_code rtems_io_register_driver( * * @retval RTEMS_SUCCESSFUL Device driver successfully unregistered. * @retval RTEMS_UNSATISFIED Invalid major number. + * @retval RTEMS_CALLED_FROM_ISR Called from interrupt context. */ rtems_status_code rtems_io_unregister_driver( rtems_device_major_number major diff --git a/cpukit/sapi/src/ioregisterdriver.c b/cpukit/sapi/src/ioregisterdriver.c index f511aadf09..8a81e5c0ee 100644 --- a/cpukit/sapi/src/ioregisterdriver.c +++ b/cpukit/sapi/src/ioregisterdriver.c @@ -68,6 +68,9 @@ rtems_status_code rtems_io_register_driver( { rtems_device_major_number major_limit = _IO_Number_of_drivers; + if ( rtems_interrupt_is_in_progress() ) + return RTEMS_CALLED_FROM_ISR; + if ( registered_major == NULL ) return RTEMS_INVALID_ADDRESS; diff --git a/cpukit/sapi/src/iounregisterdriver.c b/cpukit/sapi/src/iounregisterdriver.c index 5761138b09..631ffbfd82 100644 --- a/cpukit/sapi/src/iounregisterdriver.c +++ b/cpukit/sapi/src/iounregisterdriver.c @@ -17,6 +17,8 @@ #include <rtems/system.h> #include <rtems/io.h> +#include <rtems/rtems/intr.h> +#include <rtems/score/thread.h> #include <string.h> /* @@ -36,13 +38,20 @@ rtems_status_code rtems_io_unregister_driver( rtems_device_major_number major ) { + if ( rtems_interrupt_is_in_progress() ) + return RTEMS_CALLED_FROM_ISR; + if ( major < _IO_Number_of_drivers ) { + _Thread_Disable_dispatch(); memset( &_IO_Driver_address_table[major], 0, sizeof( rtems_driver_address_table ) ); + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; } + return RTEMS_UNSATISFIED; } |