summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_intr.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2008-03-17 22:42:01 +0000
committerjhb <jhb@FreeBSD.org>2008-03-17 22:42:01 +0000
commitc04bb048f627b5ef992c77aced92b491f4c8974a (patch)
tree57731c0991b2b903b93e4762f94fa493eb565f3b /sys/kern/kern_intr.c
parent10c89ab0d1faf7de0ab559184da2c88cbbe093fa (diff)
downloadFreeBSD-src-c04bb048f627b5ef992c77aced92b491f4c8974a.zip
FreeBSD-src-c04bb048f627b5ef992c77aced92b491f4c8974a.tar.gz
Simplify the interrupt code a bit:
- Always include the ie_disable and ie_eoi methods in 'struct intr_event' and collapse down to one intr_event_create() routine. The disable and eoi hooks simply aren't used currently in the !INTR_FILTER case. - Expand 'disab' to 'disable' in a few places. - Use function casts for arm and i386:intr_eoi_src() instead of wrapper routines since to trim one extra indirection. Compiled on: {arm,amd64,i386,ia64,ppc,sparc64} x {FILTER, !FILTER} Tested on: {amd64,i386} x {FILTER, !FILTER}
Diffstat (limited to 'sys/kern/kern_intr.c')
-rw-r--r--sys/kern/kern_intr.c52
1 files changed, 6 insertions, 46 deletions
diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c
index 9114430..b66e5f9 100644
--- a/sys/kern/kern_intr.c
+++ b/sys/kern/kern_intr.c
@@ -238,43 +238,9 @@ intr_event_update(struct intr_event *ie)
CTR2(KTR_INTR, "%s: updated %s", __func__, ie->ie_fullname);
}
-#ifndef INTR_FILTER
-int
-intr_event_create(struct intr_event **event, void *source, int flags,
- void (*enable)(void *), int (*assign_cpu)(void *, u_char), const char *fmt,
- ...)
-{
- struct intr_event *ie;
- va_list ap;
-
- /* The only valid flag during creation is IE_SOFT. */
- if ((flags & ~IE_SOFT) != 0)
- return (EINVAL);
- ie = malloc(sizeof(struct intr_event), M_ITHREAD, M_WAITOK | M_ZERO);
- ie->ie_source = source;
- ie->ie_enable = enable;
- ie->ie_assign_cpu = assign_cpu;
- ie->ie_flags = flags;
- ie->ie_cpu = NOCPU;
- TAILQ_INIT(&ie->ie_handlers);
- mtx_init(&ie->ie_lock, "intr event", NULL, MTX_DEF);
-
- va_start(ap, fmt);
- vsnprintf(ie->ie_name, sizeof(ie->ie_name), fmt, ap);
- va_end(ap);
- strlcpy(ie->ie_fullname, ie->ie_name, sizeof(ie->ie_fullname));
- mtx_pool_lock(mtxpool_sleep, &event_list);
- TAILQ_INSERT_TAIL(&event_list, ie, ie_list);
- mtx_pool_unlock(mtxpool_sleep, &event_list);
- if (event != NULL)
- *event = ie;
- CTR2(KTR_INTR, "%s: created %s", __func__, ie->ie_name);
- return (0);
-}
-#else
int
-intr_event_create(struct intr_event **event, void *source, int flags,
- void (*enable)(void *), void (*eoi)(void *), void (*disab)(void *),
+intr_event_create(struct intr_event **event, void *source,int flags,
+ void (*disable)(void *), void (*enable)(void *), void (*eoi)(void *),
int (*assign_cpu)(void *, u_char), const char *fmt, ...)
{
struct intr_event *ie;
@@ -285,10 +251,10 @@ intr_event_create(struct intr_event **event, void *source, int flags,
return (EINVAL);
ie = malloc(sizeof(struct intr_event), M_ITHREAD, M_WAITOK | M_ZERO);
ie->ie_source = source;
+ ie->ie_disable = disable;
ie->ie_enable = enable;
- ie->ie_assign_cpu = assign_cpu;
ie->ie_eoi = eoi;
- ie->ie_disab = disab;
+ ie->ie_assign_cpu = assign_cpu;
ie->ie_flags = flags;
ie->ie_cpu = NOCPU;
TAILQ_INIT(&ie->ie_handlers);
@@ -306,7 +272,6 @@ intr_event_create(struct intr_event **event, void *source, int flags,
CTR2(KTR_INTR, "%s: created %s", __func__, ie->ie_name);
return (0);
}
-#endif
/*
* Bind an interrupt event to the specified CPU. Note that not all
@@ -943,13 +908,8 @@ swi_add(struct intr_event **eventp, const char *name, driver_intr_t handler,
if (!(ie->ie_flags & IE_SOFT))
return (EINVAL);
} else {
-#ifdef INTR_FILTER
error = intr_event_create(&ie, NULL, IE_SOFT,
NULL, NULL, NULL, NULL, "swi%d:", pri);
-#else
- error = intr_event_create(&ie, NULL, IE_SOFT,
- NULL, NULL, "swi%d:", pri);
-#endif
if (error)
return (error);
if (eventp != NULL)
@@ -1405,8 +1365,8 @@ intr_event_handle(struct intr_event *ie, struct trapframe *frame)
if (ie->ie_eoi != NULL)
ie->ie_eoi(ie->ie_source);
} else {
- if (ie->ie_disab != NULL)
- ie->ie_disab(ie->ie_source);
+ if (ie->ie_disable != NULL)
+ ie->ie_disable(ie->ie_source);
}
critical_exit();
OpenPOWER on IntegriCloud