13.1.8 Indicating That the Interrupt Was Serviced

The following code shows how the el_intr( ) routine indicates that the interrupt was serviced:

return INTR_SERVICED;

}

1

1

Returns the INTR_SERVICED constant to the kernel interrupt dispatcher to indicate that el_intr( ) serviced the shared interrupt.

13.2 Implementing the el_rint Routine

The if_el driver’s el_rint( ) routine is the receive interrupt completion routine. It performs the following tasks:

Counts the receive interrupt and reads the receive status (Section 13.2.1)

Pulls the packets from the FIFO buffer (Section 13.2.2)

Examines the first part of the packet (Section 13.2.3)

Copies the received packet into the mbuf (Section 13.2.4)

Discards a packet (Section 13.2.5)

13.2.1Counting the Receive Interrupt and Reading the Receive Status

The following code shows how the el_rint( ) routine counts the receive interrupt and reads the receive status:

#define RXLOOP ((16*1024)/64)

1

static void el_rint(struct el_softc *sc, struct ifnet *ifp)

{

int len, i, count=RXLOOP; volatile short status; struct mbuf *m; unsigned char *dat; unsigned int in;

struct ether_header eh;

sc->rint++;

2

status = READ_RXS(sc);

3

1

2

3

Defines a constant that represents the maximum number of packets in a 16K receive buffer.

Increments the receive interrupt counter.

Calls the READ_RXS macro to read the receive status.

Implementing the Interrupt Section 13–5

Page 143
Image 143
Compaq AA-RNG2A-TE manual Implementing the elrint Routine, Indicating That the Interrupt Was Serviced