DDI_ADD_INTR(9F) Kernel Functions for Drivers DDI_ADD_INTR(9F)
NAME
ddi_add_intr, ddi_get_iblock_cookie, ddi_remove_intr - hardware
interrupt handling routines
SYNOPSIS
#include <sys/types.h>
#include <sys/conf.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
int ddi_get_iblock_cookie(
dev_info_t *dip,
uint_t inumber,
ddi_iblock_cookie_t *iblock_cookiep);
int ddi_add_intr(
dev_info_t *dip,
uint_t inumber,
ddi_iblock_cookie_t *iblock_cookiep,
ddi_idevice_cookie_t *idevice_cookiep,
uint_t (*int_handler) (caddr_t),
caddr_t int_handler_arg);
void ddi_remove_intr(
dev_info_t *dip,
uint_t inumber,
ddi_iblock_cookie_t iblock_cookie);
INTERFACE LEVEL
illumos DDI specific (illumos DDI). These interfaces are obsolete.
Use the new interrupt interfaces referenced in
Intro(9F). Refer to
Writing Device Drivers for more information.
PARAMETERS
For
ddi_get_iblock_cookie():
dip Pointer to
dev_info structure.
inumber Interrupt number.
iblock_cookiep Pointer to an interrupt block cookie.
For
ddi_add_intr():
dip Pointer to
dev_info structure.
inumber Interrupt number.
iblock_cookiep Optional pointer to an interrupt block cookie
where a returned interrupt block cookie is stored.
idevice_cookiep Optional pointer to an interrupt device cookie
where a returned interrupt device cookie is
stored.
int_handler Pointer to interrupt handler.
int_handler_arg Argument for interrupt handler.
For
ddi_remove_intr():
dip Pointer to
dev_info structure.
inumber Interrupt number.
iblock_cookie Block cookie which identifies the interrupt handler
to be removed.
DESCRIPTION
ddi_get_iblock_cookie() ddi_get_iblock_cookie() retrieves the interrupt block cookie
associated with a particular interrupt specification. This routine
should be called before
ddi_add_intr() to retrieve the interrupt
block cookie needed to initialize locks (
mutex(9F),
rwlock(9F)) used
by the interrupt routine. The interrupt number
inumber determines for
which interrupt specification to retrieve the cookie.
inumber is
associated with information provided either by the device or the
hardware configuration file (see
sysbus(5),
isa(5), and
driver.conf(5)). If only one interrupt is associated with the device,
inumber should be
0.
On a successful return,
*iblock_cookiep contains information needed
for initializing locks associated with the interrupt specification
corresponding to
inumber (see
mutex_init(9F) and
rw_init(9F)). The
driver can then initialize locks acquired by the interrupt routine
before calling
ddi_add_intr() which prevents a possible race
condition where the driver's interrupt handler is called immediately
after the driver has called
ddi_add_intr() but
before the driver has
initialized the locks. This may happen when an interrupt for a
different device occurs on the same interrupt level. If the interrupt
routine acquires the lock before the lock has been initialized,
undefined behavior may result.
ddi_add_intr() ddi_add_intr() adds an interrupt handler to the system. The interrupt
number
inumber determines which interrupt the handler will be
associated with. (Refer to
ddi_get_iblock_cookie() above.)
On a successful return,
iblock_cookiep contains information used for
initializing locks associated with this interrupt specification (see
mutex_init(9F) and
rw_init(9F)). Note that the interrupt block cookie
is usually obtained using
ddi_get_iblock_cookie() to avoid the race
conditions described above (refer to
ddi_get_iblock_cookie() above).
For this reason,
iblock_cookiep is no longer useful and should be set
to
NULL.
On a successful return,
idevice_cookiep contains a pointer to a
ddi_idevice_cookie_t structure (see
ddi_idevice_cookie(9S))
containing information useful for some devices that have programmable
interrupts. If
idevice_cookiep is set to
NULL, no value is returned.
The routine
intr_handler, with its argument
int_handler_arg, is
called upon receipt of the appropriate interrupt. The interrupt
handler should return
DDI_INTR_CLAIMED if the interrupt was claimed,
DDI_INTR_UNCLAIMED otherwise.
If successful,
ddi_add_intr() returns
DDI_SUCCESS. If the interrupt
information cannot be found on the sun4u architecture, either
DDI_INTR_NOTFOUND or
DDI_FAILURE can be returned. On i86pc and sun4m
architectures, if the interrupt information cannot be found,
DDI_INTR_NOTFOUND is returned.
ddi_remove_intr() ddi_remove_intr() removes an interrupt handler from the system.
Unloadable drivers should call this routine during their
detach(9E) routine to remove their interrupt handler from the system.
The device interrupt routine for this instance of the device will not
execute after
ddi_remove_intr() returns.
ddi_remove_intr() may need
to wait for the device interrupt routine to complete before
returning. Therefore, locks acquired by the interrupt handler should
not be held across the call to
ddi_remove_intr() or deadlock may
result.
For All Three Functions: For certain bus types, you can call these
DDI functions from a high-
interrupt context. These types include
ISA buses. See
sysbus(5) and
isa(5) for details.
RETURN VALUES
ddi_add_intr() and
ddi_get_iblock_cookie() return:
DDI_SUCCESS On success.
DDI_INTR_NOTFOUND On failure to find the interrupt.
DDI_FAILURE On failure.
DDI_FAILURE can also be returned on
failure to find interrupt (
sun4u).
CONTEXT
ddi_add_intr(),
ddi_remove_intr(), and
ddi_get_iblock_cookie() can be
called from user or kernel context.
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Interface Stability | Obsolete |
+--------------------+-----------------+
SEE ALSO
driver.conf(5),
isa(5),
sysbus(5),
attach(9E),
detach(9E),
Intro(9F),
ddi_intr_hilevel(9F),
mutex(9F),
mutex_init(9F),
rw_init(9F),
rwlock(9F),
ddi_idevice_cookie(9S) Writing Device DriversNOTES
ddi_get_iblock_cookie() must not be called
after the driver adds an
interrupt handler for the interrupt specification corresponding to
inumber.
All consumers of these interfaces, checking return codes, should
verify
return_code != DDI_SUCCESS. Checking for specific failure
codes can result in inconsistent behaviors among platforms.
BUGS
The
idevice_cookiep should really point to a data structure that is
specific to the bus architecture that the device operates on.
March 6, 2023 DDI_ADD_INTR(9F)