summaryrefslogtreecommitdiffstats
path: root/cpukit/sapi
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2009-10-09 13:46:39 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2009-10-09 13:46:39 +0000
commit031b57caa39e182fc851f79fcd6e279074710689 (patch)
tree84dae621acd6f9414c17e35c3c185333ab9c7e44 /cpukit/sapi
parent2009-10-09 Sebastian Huber <Sebastian.Huber@embedded-brains.de> (diff)
downloadrtems-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/sapi')
-rw-r--r--cpukit/sapi/include/rtems/io.h2
-rw-r--r--cpukit/sapi/src/ioregisterdriver.c3
-rw-r--r--cpukit/sapi/src/iounregisterdriver.c9
3 files changed, 14 insertions, 0 deletions
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;
}