xen_intr_arch_enable_source /* unmask */,
xen_intr_arch_eoi_source /* EOI */,
xen_intr_arch_assign_cpu /* cpu assign */,
- "xen%d", isrc->xi_vector));
-
- return 0;
+ "xen%d", isrc->xi_port));
}
struct xenisrc *
/* TODO: Implement it */
printf("%s: XXX: Not implemented\n", __FUNCTION__);
- return NULL;
+ return (NULL);
}
bool
xen_arch_intr_has_handlers(struct xenisrc *isrc)
{
-
return (!TAILQ_EMPTY(&isrc->xi_intsrc.xai_event->ie_handlers));
}
int error;
error = intr_event_handle(isrc->xi_intsrc.xai_event, frame);
- if (error)
+ if (error != 0) {
+ xen_intr_disable_source(isrc, true);
log(LOG_ERR, "Stray evchn%d: %d\n",
isrc->xi_port, error);
+ }
}
-#if 0
int
xen_arch_intr_add_handler(device_t dev, driver_filter_t filter,
driver_intr_t handler, void *arg, enum intr_type flags,
struct xenisrc *isrc)
{
+ int error;
+
+ KASSERT(!xen_arch_intr_has_handlers(isrc),
+ ("Only one handler is allowed per event channel"));
- return (intr_add_handler(device_get_nameunit(dev), isrc->xi_vector,
- filter, handler, arg, flags, &isrc->xi_cookie));
+ error = intr_event_add_handler(isrc->xi_intsrc.xai_event,
+ device_get_nameunit(dev), filter, handler,
+ arg, intr_priority(flags), flags, &isrc->xi_cookie);
+ if (error != 0)
+ return (error);
+
+ /* Enable the event channel */
+ xen_intr_enable_intr(isrc);
+ xen_intr_enable_source(isrc);
+
+ return (0);
}
int
-xen_arch_intr_describe(struct xenisrc *isrc, const char *descr)
+xen_arch_intr_remove_handler(struct xenisrc *isrc)
{
+ int error;
- return (intr_describe(isrc->xi_vector, isrc->xi_cookie, descr));
+ error = intr_event_remove_handler(isrc->xi_cookie);
+ if (error != 0)
+ return (error);
+
+ /* Disable the event channel */
+ xen_intr_disable_source(isrc, true);
+ xen_intr_disable_intr(isrc);
+
+ return (0);
}
int
-xen_arch_intr_remove_handler(struct xenisrc *isrc)
+xen_arch_intr_describe(struct xenisrc *isrc, const char *descr)
{
- return (intr_remove_handler(isrc->xi_cookie));
+ return (intr_event_describe_handler(isrc->xi_intsrc.xai_event,
+ isrc->xi_cookie, descr));
}
int
xen_arch_intr_event_bind(struct xenisrc *isrc, u_int cpu)
{
- return (intr_event_bind(isrc->xi_intsrc.is_event, cpu));
+ return (intr_event_bind(isrc->xi_intsrc.xai_event, cpu));
}
-#endif