summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-12-23 07:29:47 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-01-27 08:09:05 +0100
commit2145853b009e939dfbe14869b710133f50500a26 (patch)
treecb4504a3f442a83ea508a03b31aa8379b42790ed /c
parentbsps/arm: Fix broken switch statement (diff)
downloadrtems-2145853b009e939dfbe14869b710133f50500a26.tar.bz2
score: Fix simple timecounter support
Close #2502.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c51
-rw-r--r--c/src/lib/libbsp/m68k/mcf52235/clock/clock.c19
-rw-r--r--c/src/lib/libbsp/m68k/mcf5225x/clock/clock.c19
-rw-r--r--c/src/lib/libbsp/m68k/mcf5329/clock/clock.c19
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/clock/clock.c51
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c34
-rw-r--r--c/src/lib/libbsp/shared/clockdrv_shell.h16
-rw-r--r--c/src/lib/libbsp/sparc/erc32/clock/ckinit.c10
-rw-r--r--c/src/lib/libbsp/sparc/leon2/clock/ckinit.c13
-rw-r--r--c/src/lib/libbsp/sparc/leon3/clock/ckinit.c31
-rw-r--r--c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c15
-rw-r--r--c/src/lib/libcpu/arm/lpc22xx/clock/clockdrv.c32
12 files changed, 188 insertions, 122 deletions
diff --git a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c
index e78684c8d2..d481c440a9 100644
--- a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c
+++ b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c
@@ -23,7 +23,12 @@
/* This is defined in clockdrv_shell.h */
static void Clock_isr(void *arg);
-static rtems_timecounter_simple _ARMV7M_TC;
+typedef struct {
+ rtems_timecounter_simple base;
+ bool countflag;
+} ARMV7M_Timecounter;
+
+static ARMV7M_Timecounter _ARMV7M_TC;
static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc)
{
@@ -32,11 +37,25 @@ static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc)
return systick->cvr;
}
-static bool _ARMV7M_TC_is_pending(rtems_timecounter_simple *tc)
+static bool _ARMV7M_TC_is_pending(rtems_timecounter_simple *base)
{
- volatile ARMV7M_SCB *scb = _ARMV7M_SCB;
+ ARMV7M_Timecounter *tc = (ARMV7M_Timecounter *) base;
+ rtems_interrupt_level level;
+ bool countflag;
+
+ rtems_interrupt_disable(level);
+
+ countflag = tc->countflag;
+ if (!countflag) {
+ volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
+
+ countflag = ((systick->csr & ARMV7M_SYSTICK_CSR_COUNTFLAG) != 0);
+ tc->countflag = countflag;
+ }
+
+ rtems_interrupt_enable(level);
- return ((scb->icsr & ARMV7M_SCB_ICSR_PENDSTSET) != 0);
+ return countflag;
}
static uint32_t _ARMV7M_TC_get_timecount(struct timecounter *tc)
@@ -48,19 +67,26 @@ static uint32_t _ARMV7M_TC_get_timecount(struct timecounter *tc)
);
}
-static void _ARMV7M_TC_tick(void)
-{
- rtems_timecounter_simple_downcounter_tick(&_ARMV7M_TC, _ARMV7M_TC_get);
-}
-
-static void _ARMV7M_Systick_at_tick(void)
+static void _ARMV7M_TC_at_tick(rtems_timecounter_simple *base)
{
+ ARMV7M_Timecounter *tc = (ARMV7M_Timecounter *) base;
volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
+ tc->countflag = false;
+
/* Clear COUNTFLAG */
systick->csr;
}
+static void _ARMV7M_TC_tick(void)
+{
+ rtems_timecounter_simple_downcounter_tick(
+ &_ARMV7M_TC.base,
+ _ARMV7M_TC_get,
+ _ARMV7M_TC_at_tick
+ );
+}
+
static void _ARMV7M_Systick_handler(void)
{
_ARMV7M_Interrupt_service_enter();
@@ -95,7 +121,7 @@ static void _ARMV7M_Systick_initialize(void)
| ARMV7M_SYSTICK_CSR_CLKSOURCE;
rtems_timecounter_simple_install(
- &_ARMV7M_TC,
+ &_ARMV7M_TC.base,
freq,
interval,
_ARMV7M_TC_get_timecount
@@ -111,9 +137,6 @@ static void _ARMV7M_Systick_cleanup(void)
#define Clock_driver_timecounter_tick() _ARMV7M_TC_tick()
-#define Clock_driver_support_at_tick() \
- _ARMV7M_Systick_at_tick()
-
#define Clock_driver_support_initialize_hardware() \
_ARMV7M_Systick_initialize()
diff --git a/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c b/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
index fdc1ed6111..4b5f4afc51 100644
--- a/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
+++ b/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
@@ -32,18 +32,19 @@ static uint32_t mcf52235_tc_get_timecount(struct timecounter *tc)
);
}
-static void mcf52235_tc_tick(void)
+static void mcf52235_tc_at_tick(rtems_timecounter_simple *tc)
{
- rtems_timecounter_simple_downcounter_tick(&mcf52235_tc, mcf52235_tc_get);
+ MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF;
}
-/*
- * Periodic interval timer interrupt handler
- */
-#define Clock_driver_support_at_tick() \
- do { \
- MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF; \
- } while (0) \
+static void mcf52235_tc_tick(void)
+{
+ rtems_timecounter_simple_downcounter_tick(
+ &mcf52235_tc,
+ mcf52235_tc_get,
+ mcf52235_tc_at_tick
+ );
+}
/*
* Attach clock interrupt handler
diff --git a/c/src/lib/libbsp/m68k/mcf5225x/clock/clock.c b/c/src/lib/libbsp/m68k/mcf5225x/clock/clock.c
index 743bd1ff94..ee97e5035c 100644
--- a/c/src/lib/libbsp/m68k/mcf5225x/clock/clock.c
+++ b/c/src/lib/libbsp/m68k/mcf5225x/clock/clock.c
@@ -32,18 +32,19 @@ static uint32_t mcf5225x_tc_get_timecount(struct timecounter *tc)
);
}
-static void mcf5225x_tc_tick(void)
+static void mcf5225x_tc_at_tick(rtems_timecounter_simple *tc)
{
- rtems_timecounter_simple_downcounter_tick(&mcf5225x_tc, mcf5225x_tc_get);
+ MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF;
}
-/*
- * Periodic interval timer interrupt handler
- */
-#define Clock_driver_support_at_tick() \
- do { \
- MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF; \
- } while (0) \
+static void mcf5225x_tc_tick(void)
+{
+ rtems_timecounter_simple_downcounter_tick(
+ &mcf5225x_tc,
+ mcf5225x_tc_get,
+ mcf5225x_tc_at_tick
+ );
+}
/*
* Attach clock interrupt handler
diff --git a/c/src/lib/libbsp/m68k/mcf5329/clock/clock.c b/c/src/lib/libbsp/m68k/mcf5329/clock/clock.c
index 94c5bb0b04..5741b3081d 100644
--- a/c/src/lib/libbsp/m68k/mcf5329/clock/clock.c
+++ b/c/src/lib/libbsp/m68k/mcf5329/clock/clock.c
@@ -32,18 +32,19 @@ static uint32_t mcf5329_tc_get_timecount(struct timecounter *tc)
);
}
-static void mcf5329_tc_tick(void)
+static void mcf5329_tc_at_tick(rtems_timecounter_simple *tc)
{
- rtems_timecounter_simple_downcounter_tick(&mcf5329_tc, mcf5329_tc_get);
+ MCF_PIT3_PCSR |= MCF_PIT_PCSR_PIF;
}
-/*
- * Periodic interval timer interrupt handler
- */
-#define Clock_driver_support_at_tick() \
- do { \
- MCF_PIT3_PCSR |= MCF_PIT_PCSR_PIF; \
- } while (0) \
+static void mcf5329_tc_tick(void)
+{
+ rtems_timecounter_simple_downcounter_tick(
+ &mcf5329_tc,
+ mcf5329_tc_get,
+ mcf5329_tc_at_tick
+ );
+}
/*
* Attach clock interrupt handler
diff --git a/c/src/lib/libbsp/m68k/uC5282/clock/clock.c b/c/src/lib/libbsp/m68k/uC5282/clock/clock.c
index 46e045cae3..1489d7efad 100644
--- a/c/src/lib/libbsp/m68k/uC5282/clock/clock.c
+++ b/c/src/lib/libbsp/m68k/uC5282/clock/clock.c
@@ -17,6 +17,17 @@
#include <mcf5282/mcf5282.h>
/*
+ * CPU load counters
+ * Place in static RAM so updates don't hit the SDRAM
+ */
+#define IDLE_COUNTER __SRAMBASE.idle_counter
+#define FILTERED_IDLE __SRAMBASE.filtered_idle
+#define MAX_IDLE_COUNT __SRAMBASE.max_idle_count
+#define PITC_PER_TICK __SRAMBASE.pitc_per_tick
+#define NSEC_PER_PITC __SRAMBASE.nsec_per_pitc
+#define FILTER_SHIFT 6
+
+/*
* Use INTC0 base
*/
#define CLOCK_VECTOR (64+58)
@@ -42,34 +53,24 @@ static uint32_t uC5282_tc_get_timecount(struct timecounter *tc)
);
}
-static void uC5282_tc_tick(void)
+static void uC5282_tc_at_tick(rtems_timecounter_simple *tc)
{
- rtems_timecounter_simple_downcounter_tick(&uC5282_tc, uC5282_tc_get);
+ unsigned idle = IDLE_COUNTER;
+ IDLE_COUNTER = 0;
+ if (idle > MAX_IDLE_COUNT)
+ MAX_IDLE_COUNT = idle;
+ FILTERED_IDLE = idle + FILTERED_IDLE - (FILTERED_IDLE>>FILTER_SHIFT);
+ MCF5282_PIT3_PCSR |= MCF5282_PIT_PCSR_PIF;
}
-/*
- * CPU load counters
- * Place in static RAM so updates don't hit the SDRAM
- */
-#define IDLE_COUNTER __SRAMBASE.idle_counter
-#define FILTERED_IDLE __SRAMBASE.filtered_idle
-#define MAX_IDLE_COUNT __SRAMBASE.max_idle_count
-#define PITC_PER_TICK __SRAMBASE.pitc_per_tick
-#define NSEC_PER_PITC __SRAMBASE.nsec_per_pitc
-#define FILTER_SHIFT 6
-
-/*
- * Periodic interval timer interrupt handler
- */
-#define Clock_driver_support_at_tick() \
- do { \
- unsigned idle = IDLE_COUNTER; \
- IDLE_COUNTER = 0; \
- if (idle > MAX_IDLE_COUNT) \
- MAX_IDLE_COUNT = idle; \
- FILTERED_IDLE = idle + FILTERED_IDLE - (FILTERED_IDLE>>FILTER_SHIFT);\
- MCF5282_PIT3_PCSR |= MCF5282_PIT_PCSR_PIF; \
- } while (0)
+static void uC5282_tc_tick(void)
+{
+ rtems_timecounter_simple_downcounter_tick(
+ &uC5282_tc,
+ uC5282_tc_get,
+ uC5282_tc_at_tick
+ );
+}
/*
* Attach clock interrupt handler
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
index 4de9a520ab..c0b8905b20 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
@@ -55,18 +55,22 @@ static uint32_t mpc55xx_tc_get_timecount(struct timecounter *tc)
);
}
-static void mpc55xx_tc_tick(void)
-{
- rtems_timecounter_simple_upcounter_tick(&mpc55xx_tc, mpc55xx_tc_get);
-}
-
-static void mpc55xx_clock_at_tick(void)
+static void mpc55xx_tc_at_tick(rtems_timecounter_simple *tc)
{
union EMIOS_CSR_tag csr = MPC55XX_ZERO_FLAGS;
csr.B.FLAG = 1;
EMIOS.CH [MPC55XX_CLOCK_EMIOS_CHANNEL].CSR.R = csr.R;
}
+static void mpc55xx_tc_tick(void)
+{
+ rtems_timecounter_simple_upcounter_tick(
+ &mpc55xx_tc,
+ mpc55xx_tc_get,
+ mpc55xx_tc_at_tick
+ );
+}
+
static void mpc55xx_clock_handler_install(rtems_isr_entry isr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
@@ -174,12 +178,7 @@ static uint32_t mpc55xx_tc_get_timecount(struct timecounter *tc)
);
}
-static void mpc55xx_tc_tick(void)
-{
- rtems_timecounter_simple_downcounter_tick(&mpc55xx_tc, mpc55xx_tc_get);
-}
-
-static void mpc55xx_clock_at_tick(void)
+static void mpc55xx_tc_at_tick(rtems_timecounter_simple *tc)
{
volatile PIT_RTI_CHANNEL_tag *channel =
&PIT_RTI.CHANNEL [MPC55XX_CLOCK_PIT_CHANNEL];
@@ -188,6 +187,15 @@ static void mpc55xx_clock_at_tick(void)
channel->TFLG.R = tflg.R;
}
+static void mpc55xx_tc_tick(void)
+{
+ rtems_timecounter_simple_downcounter_tick(
+ &mpc55xx_tc,
+ mpc55xx_tc_get,
+ mpc55xx_tc_at_tick
+ );
+}
+
static void mpc55xx_clock_handler_install(rtems_isr_entry isr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
@@ -238,8 +246,6 @@ static void mpc55xx_clock_cleanup(void)
#endif
#define Clock_driver_timecounter_tick() mpc55xx_tc_tick()
-#define Clock_driver_support_at_tick() \
- mpc55xx_clock_at_tick()
#define Clock_driver_support_initialize_hardware() \
mpc55xx_clock_initialize()
#define Clock_driver_support_install_isr(isr, old_isr) \
diff --git a/c/src/lib/libbsp/shared/clockdrv_shell.h b/c/src/lib/libbsp/shared/clockdrv_shell.h
index d546fb81e7..96b962f217 100644
--- a/c/src/lib/libbsp/shared/clockdrv_shell.h
+++ b/c/src/lib/libbsp/shared/clockdrv_shell.h
@@ -44,6 +44,13 @@
#define Clock_driver_support_find_timer()
#endif
+/**
+ * @brief Do nothing by default.
+ */
+#ifndef Clock_driver_support_at_tick
+ #define Clock_driver_support_at_tick()
+#endif
+
/*
* A specialized clock driver may use for example rtems_timecounter_tick_simple()
* instead of the default.
@@ -108,7 +115,14 @@ rtems_isr Clock_isr(
&& _Thread_Executing->Start.entry_point
== (Thread_Entry) rtems_configuration_get_idle_task()
) {
- _Timecounter_Tick_simple(interval, (*tc->tc_get_timecount)(tc));
+ ISR_lock_Context lock_context;
+
+ _Timecounter_Acquire(&lock_context);
+ _Timecounter_Tick_simple(
+ interval,
+ (*tc->tc_get_timecount)(tc),
+ &lock_context
+ );
}
Clock_driver_support_at_tick();
diff --git a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c
index 46f99a5e7d..f2d493e73d 100644
--- a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c
@@ -36,8 +36,6 @@
*/
#define CLOCK_VECTOR ERC32_TRAP_TYPE( ERC32_INTERRUPT_REAL_TIME_CLOCK )
-#define Clock_driver_support_at_tick()
-
#define Clock_driver_support_install_isr( _new, _old ) \
do { \
_old = set_vector( _new, CLOCK_VECTOR, 1 ); \
@@ -66,11 +64,17 @@ static uint32_t erc32_tc_get_timecount( struct timecounter *tc )
);
}
+static void erc32_tc_at_tick( rtems_timecounter_simple *tc )
+{
+ /* Nothing to do */
+}
+
static void erc32_tc_tick( void )
{
rtems_timecounter_simple_downcounter_tick(
&erc32_tc,
- erc32_tc_get
+ erc32_tc_get,
+ erc32_tc_at_tick
);
}
diff --git a/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c
index 3dd68e080a..6c2cf98ce2 100644
--- a/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c
@@ -51,9 +51,18 @@ static uint32_t leon2_tc_get_timecount( struct timecounter *tc )
);
}
+static void leon2_tc_at_tick( rtems_timecounter_simple *tc )
+{
+ /* Nothing to do */
+}
+
static void leon2_tc_tick( void )
{
- rtems_timecounter_simple_downcounter_tick( &leon2_tc, leon2_tc_get );
+ rtems_timecounter_simple_downcounter_tick(
+ &leon2_tc,
+ leon2_tc_get,
+ leon2_tc_at_tick
+ );
}
/*
@@ -62,8 +71,6 @@ static void leon2_tc_tick( void )
#define CLOCK_VECTOR LEON_TRAP_TYPE( LEON_INTERRUPT_TIMER1 )
-#define Clock_driver_support_at_tick()
-
#define Clock_driver_support_install_isr( _new, _old ) \
do { \
_old = set_vector( _new, CLOCK_VECTOR, 1 ); \
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
index b82b457866..5d645dcd36 100644
--- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
@@ -69,15 +69,6 @@ static uint32_t leon3_tc_get_timecount_irqmp(struct timecounter *tc)
return LEON3_IrqCtrl_Regs->timestamp[0].counter;
}
-static void leon3_tc_tick(void)
-{
- if (leon3_tc_use_irqmp) {
- rtems_timecounter_tick();
- } else {
- rtems_timecounter_simple_downcounter_tick(&leon3_tc, leon3_tc_get);
- }
-}
-
static void leon3_clock_profiling_interrupt_delay(void)
{
#ifdef RTEMS_PROFILING
@@ -111,10 +102,24 @@ static void leon3_clock_profiling_interrupt_delay(void)
#endif
}
-#define Clock_driver_support_at_tick() \
- do { \
- leon3_clock_profiling_interrupt_delay(); \
- } while (0)
+static void leon3_tc_at_tick( rtems_timecounter_simple *tc )
+{
+ leon3_clock_profiling_interrupt_delay();
+}
+
+static void leon3_tc_tick(void)
+{
+ if (leon3_tc_use_irqmp) {
+ leon3_clock_profiling_interrupt_delay();
+ rtems_timecounter_tick();
+ } else {
+ rtems_timecounter_simple_downcounter_tick(
+ &leon3_tc,
+ leon3_tc_get,
+ leon3_tc_at_tick
+ );
+ }
+}
#define Adjust_clkirq_for_node() do { clkirq += LEON3_CLOCK_INDEX; } while(0)
diff --git a/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c b/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c
index b29f140a02..58e95d1e64 100644
--- a/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c
+++ b/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c
@@ -29,7 +29,6 @@
#undef CLOCK_DRIVER_ISRS_PER_TICK
#undef CLOCK_DRIVER_USE_FAST_IDLE
*/
-#define Clock_driver_support_at_tick()
/*
* Number of Clock ticks since initialization
@@ -87,11 +86,17 @@ static uint32_t tlib_tc_get_timecount(struct timecounter *tc)
);
}
+static void tlib_tc_at_tick(rtems_timecounter_simple *tc)
+{
+ /* Nothing to do? */
+}
+
static void tlib_tc_tick(void)
{
rtems_timecounter_simple_downcounter_tick(
&tlib_tc,
- tlib_tc_get
+ tlib_tc_get,
+ tlib_tc_at_tick
);
}
@@ -130,16 +135,10 @@ void Clock_isr(void *arg_unused)
} while ( _Thread_Executing == _Thread_Idle &&
_Thread_Heir == _Thread_Executing);
- Clock_driver_support_at_tick();
return;
#else
- /*
- * Add custom handling at every tick from bsp.h
- */
- Clock_driver_support_at_tick();
-
#ifdef CLOCK_DRIVER_ISRS_PER_TICK
/*
* The driver is multiple ISRs per clock tick.
diff --git a/c/src/lib/libcpu/arm/lpc22xx/clock/clockdrv.c b/c/src/lib/libcpu/arm/lpc22xx/clock/clockdrv.c
index 4887d2a8e0..463125b459 100644
--- a/c/src/lib/libcpu/arm/lpc22xx/clock/clockdrv.c
+++ b/c/src/lib/libcpu/arm/lpc22xx/clock/clockdrv.c
@@ -45,9 +45,26 @@ static uint32_t lpc22xx_tc_get_timecount(struct timecounter *tc)
);
}
+/**
+ * When we get the clock interrupt
+ * - clear the interrupt bit?
+ * - restart the timer?
+ */
+static void lpc22xx_tc_at_tick(rtems_timecounter_simple *tc)
+{
+ if (!(T0IR & 0x01))
+ return;
+ T0IR = 0x01;
+ VICVectAddr = 0x00;
+}
+
static void lpc22xx_tc_tick(void)
{
- rtems_timecounter_simple_upcounter_tick(&lpc22xx_tc, lpc22xx_tc_get);
+ rtems_timecounter_simple_upcounter_tick(
+ &lpc22xx_tc,
+ lpc22xx_tc_get,
+ lpc22xx_tc_at_tick
+ );
}
/* Replace the first value with the clock's interrupt name. */
@@ -63,19 +80,6 @@ rtems_irq_connect_data clock_isr_data = {
/* use the /shared/clockdrv_shell.h code template */
/**
- * When we get the clock interrupt
- * - clear the interrupt bit?
- * - restart the timer?
- */
-#define Clock_driver_support_at_tick() \
- do { \
- if (!(T0IR & 0x01)) \
- return; \
- T0IR = 0x01; \
- VICVectAddr = 0x00; \
- } while(0)
-
-/**
* Installs the clock ISR. You shouldn't need to change this.
*/
#define Clock_driver_support_install_isr( _new, _old ) \