DDI_INTR_ADD_HANDLER(9F) Kernel Functions for Drivers
NAME
ddi_intr_add_handler,
ddi_intr_remove_handler - add or remove interrupt
handler
SYNOPSIS
#include <sys/types.h> #include <sys/conf.h> #include <sys/ddi.h> #include <sys/sunddi.h> typedef uint_t (ddi_intr_handler_t)(
caddr_t arg1,
caddr_t arg2);
int ddi_intr_add_handler(
ddi_intr_handle_t h,
ddi_intr_handler_t inthandler,
void *arg1,
void *arg2);
int ddi_intr_remove_handler(
ddi_intr_handle_t h);
INTERFACE LEVEL
illumos DDI specific (illumos DDI).
PARAMETERS
h DDI interrupt handle
inthandler Pointer to interrupt handler function
arg1 First argument for the interrupt handler
arg2 Second, optional, argument for the interrupt handler
DESCRIPTION
The
ddi_intr_add_handler() function adds an interrupt handler given by
the
inthandler argument to the system with the handler arguments
arg1 and
arg2 for the previously allocated interrupt handle specified by the
h pointer. The arguments
arg1 and
arg2 are passed as the first and
second arguments, respectively, to the interrupt handler
inthandler.
The definition of the interrupt handler,
ddi_intr_handler_t is provided
in the manual synposis and can also be found in <
sys/ddi_intr.h>.
The routine
inthandler with the arguments
arg1 and
arg2 is called upon
receipt of the appropriate interrupt. The interrupt handler should
return DDI_INTR_CLAIMED if the interrupt is claimed and
DDI_INTR_UNCLAIMED otherwise.
The
ddi_intr_add_handler() function must be called after
ddi_intr_alloc(), but before
ddi_intr_enable(9F) is called. The
interrupt must be enabled through
ddi_intr_enable(9F) or
ddi_intr_block_enable(9F) before it can be used.
The
ddi_intr_remove_handler() function removes the handler association,
added previously with
ddi_intr_add_handler(), for the interrupt
identified by the interrupt handle
h argument. Unloadable drivers
should call this routine during their
detach(9E) routine to remove the
interrupt handler from the system.
The
ddi_intr_remove_handler() function is used to disassociate the
handler after the interrupt is disabled to remove duplicated interrupt
handles. See
ddi_intr_dup_handler(9F) for duplicated interrupt
handles. If a handler is duplicated with the
ddi_intr_dup_handler(9F) function, all added and duplicated instances of the handler must be
removed with
ddi_intr_remove_handler() in order for the handler to be
completely removed.
CONTEXT
The
ddi_intr_add_handler() and
ddi_intr_remove_handler() functions can
be called from kernel non-interrupt context.
RETURN VALUES
The
ddi_intr_add_handler() and
ddi_intr_remove_handler() functions
return:
DDI_SUCCESS On success.
DDI_EINVAL On encountering invalid input parameters.
DDI_FAILURE On any implementation specific failure.
INTERFACE STABILITY
CommittedSEE ALSO
attributes(7),
attach(9E),
detach(9E),
ddi_intr_alloc(9F),
ddi_intr_block_enable(9F),
ddi_intr_disable(9F),
ddi_intr_dup_handler(9F),
ddi_intr_enable(9F),
ddi_intr_free(9F),
ddi_intr_get_supported_types(9F),
mutex(9F),
mutex_init(9F),
rw_init(9F),
rwlock(9F) Writing Device Drivers.
NOTES
When checking the return value of the
ddi_intr_add_handler() and
ddi_intr_remove_handler() functions (and more generally other DDI
functions) callers should always write the check by comparing to
DDI_SUCCESS. Put differently checks should look like:
int ret;
uintptr_t msi_index = ...;
...
ret = ddi_intr_add_handler(h, intr_func, state, (void *)msi_index);
if (ret != DDI_SUCCESS) {
/* Perform clean up activities */
}
Additional error codes may be added over time and checking only for
DDI_FAILURE could lead to missing that such an error had occurred.
If a device driver that uses
MSI and
MSI-X interrupts resets the
device, the device might reset its configuration space modifications.
Such a reset could cause a device driver to lose any
MSI and
MSI-X interrupt usage settings that have been applied.
The second argument,
arg2, is optional. Device drivers are free to use
the two arguments however they see fit. There is no officially
recommended model or restrictions. For example, an interrupt handler
may wish to use the first argument as the pointer to its softstate and
the second argument as the value of the MSI vector.
illumos January 7, 2025 illumos