3 * ===================================
4 * HARP | Host ATM Research Platform
5 * ===================================
8 * This Host ATM Research Platform ("HARP") file (the "Software") is
9 * made available by Network Computing Services, Inc. ("NetworkCS")
10 * "AS IS". NetworkCS does not provide maintenance, improvements or
11 * support of any kind.
13 * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
14 * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
15 * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
16 * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
17 * In no event shall NetworkCS be responsible for any damages, including
18 * but not limited to consequential damages, arising from or relating to
19 * any use of the Software or related support.
21 * Copyright 1994-1998 Network Computing Services, Inc.
23 * Copies of this Software may be made, however, the above copyright
24 * notice must be reproduced on all copies.
26 * @(#) $FreeBSD: src/sys/dev/hfa/fore_intr.c,v 1.3 1999/08/28 00:41:50 peter Exp $
27 * @(#) $DragonFly: src/sys/dev/atm/hfa/fore_intr.c,v 1.5 2005/02/01 00:51:50 joerg Exp $
31 * FORE Systems 200-Series Adapter Support
32 * ---------------------------------------
34 * Interrupt processing
38 #include "fore_include.h"
41 * Device interrupt routine
43 * Called at interrupt level.
46 * arg pointer to device unit structure
49 * 1 device interrupt was serviced
50 * 0 no interrupts serviced
61 * Try to prevent stuff happening after we've paniced
67 * Get to the microcode shared memory interface
69 if ((aap = fup->fu_aali) == NULL)
73 * Has this card issued an interrupt??
77 * Clear the device interrupt
79 switch (fup->fu_config.ac_device) {
81 case DEV_FORE_PCA200E:
82 PCA200E_HCR_SET(*fup->fu_ctlreg, PCA200E_CLR_HBUS_INT);
85 panic("fore_intr: unknown device type");
87 aap->aali_intr_sent = CP_WRITE(0);
90 * Reset the watchdog timer
92 fup->fu_timer = FORE_WATCHDOG;
95 * Device initialization handled separately
97 if ((fup->fu_flags & CUF_INITED) == 0) {
100 * We're just initializing device now, so see if
101 * the initialization command has completed
103 if (CP_READ(aap->aali_init.init_status) &
105 fore_initialize_complete(fup);
108 * If we're still not inited, none of the host
109 * queues are setup yet
111 if ((fup->fu_flags & CUF_INITED) == 0)
116 * Drain the queues of completed work
119 fore_recv_drain(fup);
120 fore_xmit_drain(fup);
123 * Supply more buffers to the CP
125 fore_buf_supply(fup);
131 * Watchdog timeout routine
133 * Called when we haven't heard from the card in a while. Just in case
134 * we missed an interrupt, we'll drain the queues and try to resupply the
135 * CP with more receive buffers. If the CP is partially wedged, hopefully
136 * this will be enough to get it going again.
138 * Called with interrupts locked out.
141 * fup pointer to device unit structure
152 * Try to prevent stuff happening after we've paniced
159 * Reset the watchdog timer
161 fup->fu_timer = FORE_WATCHDOG;
164 * If the device is initialized, nudge it (wink, wink)
166 if (fup->fu_flags & CUF_INITED) {
169 * Drain the queues of completed work
172 fore_recv_drain(fup);
173 fore_xmit_drain(fup);
176 * Supply more buffers to the CP
178 fore_buf_supply(fup);