The pfxedtinit() entry point is called only in response to a VECTOR line. However, a VECTOR line need not contain a probe or exprobe test of the hardware.
The driver should not assume that its hardware exists; instead it should use the badaddr() kernel function to test the addresses passed in the edt_t object to make sure they are usable (see "Testing Device Physical Addresses").
Example 18-1 displays a skeleton version of the pfxedtinit() entry point of a hypothetical GIO device driver. This example uses GIO-specific functions that are described in a following section, "GIO-Specific Kernel Functions".
Example 18-1 : GIO Driver edtinit() Entry Point
#include <sys/edt.h> void hypoth_edtinit(register struct edt *e) { int slot, val; /* Check to see if the device is present */ if(badaddr_val(e->e_base, sizeof(int), &val) || (val && GBD_MASK) != GBD_BOARD_ID) { if (showconfig) cmn_err (CE_CONT, "gbdedtinit: board not installed."); return; } /* figure out slot from base on VECTOR line in /* system file*/ if(e->e_base == (caddr_t)0xBf400000) slot = GIO_SLOT_0; else if(e->e_base == (caddr_t)0xBF600000) slot = GIO_SLOT_1; else { cmn_err (CE_NOTE, "ERROR from edtinit: Bad base address %x\n",e->e_base); return; } #ifdef IP20 /* For Indigo R4000, set up board as a realtime bus master */ setgioconfig(slot,GIO64_ARB_EXP0_RT|GIO64_ARB_EXP0_MST); #endif #ifdef (IP22|IP26) /* For Indy, Indigo2, set up board as a pipelined realtime bus master */ setgioconfig(slot,GIO64_ARB_EXP0_RT|GIO64_ARB_EXP0_PIPED); #endif /* Save the device addresses, because * they won't be available later. */ gbd_device[slot == GIO_SLOT_0 ? 0 : 1] = (struct gbd_device *)e->e_base; gbd_memory[slot == GIO_SLOT_0 ? 0 : 1] = (char *)e->e_base2; /* Where "unit_#" is any parameter passed to /* the interrupt handler (gbdintr) */ setgiovector(GIO_INTERRUPT_1,slot,gbdintr,unit_#); }