Compaq AA-RNG2A-TE Network Card User Manual


 
13.1.1 Setting the IPL and Obtaining the Simple Lock
The following code shows how the el_intr( ) routine sets the CPUs IPL
and obtains the simple lock:
static int el_intr(int unit) 1
{
register u_int s;
volatile u_int status;
register struct el_softc *sc = el_softc[unit];
register struct ifnet *ifp = &sc->is_if;
if (el_card_out(sc)) return (INTR_NOT_SERVICED);
2
s = splimp(); 3
simple_lock(&sc->el_softc_lock); 4
1 Declares an argument that specifies the unit number of the network
interface that generated the interrupt.
2 Determines whether the card is still in the socket. If the card is no
longer in the socket, then returns the constant INTR_NOT_SERVICED to
the kernel interrupt dispatcher.
3 Calls the splimp( ) routine to mask all Ethernet hardware interrupts.
4 Calls the simple_lock( ) routine to assert a lock with exclusive access
for the resource that is associated with el_softc_lock.
13.1.2 Rearming the Next Timeout
The following code shows how the el_intr( ) routine rearms the next
timeout:
if (sc->polling_flag)
1
timeout((void *)el_intr, (void *)unit, (1*hz)/el_pollint); 2
1 Determines whether polling was started by testing the polling_flag
flag member in the el_softc data structure for this device.
2 If the polling process was started, calls the timeout( ) routine to
rearm the next timeout. The timeout( ) routine is called with the
following arguments:
A pointer to the el_intr( ) routine, the if_el device drivers
interrupt handler.
The unit variable, which contains the controller number for this
device. This argument is passed to the el_intr( ) routine.
The el_pollint variable, which specifies the amount of time to
delay before calling the el_intr( ) routine.
132 Implementing the Interrupt Section