DDI_INTR_ADD_HANDLER(9F) Kernel Functions for Drivers DDI_INTR_ADD_HANDLER(9F)

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


Committed

SEE 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