* 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.
This commit is contained in:
Joel Sherrill
2009-10-09 13:46:39 +00:00
parent bbf6253a77
commit 031b57caa3
4 changed files with 22 additions and 0 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
}