[ Bottom of Page | Previous Page | Next Page | Contents | Index | Library Home | Legal | Search ]

Understanding the Diagnostic Subsystem for AIX

Example C Source File for TU Interrupt Handler

/*
 *   COMPONENT_NAME: tu_device
 *
 *   FUNCTIONS: device_interrupt
 */

/*** header files ***/
#include <sys/adspace.h>
#include <sys/ioacc.h>
#include <sys/types.h>
#include <sys/sleep.h>
#include <sys/watchdog.h>
#include <sys/trcmacros.h>

#include <sys/pdiagex_dds.h>

/******************************************************************************
*
* NAME:  device_interrupt
*
* FUNCTION:  Interrupt handler for the ....... adapter.
*
* INPUT PARAMETERS:     handle = handle returned from pdiagex_open
*                       data   = data passed to handler during
*                                        initialization.
*
* EXECUTION ENVIRONMENT:  Interrupt
*
* RETURN VALUE DESCRIPTION: none.
*
* EXTERNAL PROCEDURES CALLED: pdiag_dd_read, pdiag_dd_write
*
******************************************************************************/
int device_interrupt(pdiag_info_handle_t handle, char *data_area,
                        int *interrupt_flag, int sleep_flag, int *sleep_word)
{
        ushort  readdata, rc;
        int     interrupt_mask;
        int     offset;
        ulong   writedata;
        pdiagex_opflags_t flags={ PDIAG_MEM_OP,
                                  1,
                                  PDIAG_SING_LOC_ACC,
                                  INTRKMEM,
                                  NULL };

        /******************************************
        * Get value of interrupt status register
        ******************************************/

        rc = pdiag_dd_read(handle, IOSHORT16, offset,
                               (void *)&readdata, &flags);

        *interrupt_flag = 0;

        /***********************************************************
        *  An Interrupt for this resource has occurred, process it.
        ***********************************************************/
        rc = pdiag_dd_write(handle, IOSHORT16, offset, (void *)&writedata,
                            &flags);

        /************************************************************
         * Set a value to the watchdog function that indicates that
         * this is the interrupt expected
         ************************************************************/
        *interrupt_flag |= interrupt_mask;

        /*********************************************
        *  Wake up sleeping application IF necessary
        **********************************************/
        if (sleep_flag) {
                pdiag_dd_interrupt_notify( sleep_word );
        }

        return (0);

} /* end device_intr */

[ Top of Page | Previous Page | Next Page | Contents | Index | Library Home | Legal | Search ]