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.4 2003/08/07 21:16:49 dillon Exp $
31 * FORE Systems 200-Series Adapter Support
32 * ---------------------------------------
34 * Interrupt processing
38 #include "fore_include.h"
42 * Polling interrupt routine
44 * Polling interrupts are handled by calling all interrupt service
45 * routines for a given level until someone claims to have "handled" the
48 * Called at interrupt level.
54 * 1 an interrupt has been serviced
55 * 0 no interrupts serviced
65 * See if any of our devices are interrupting
67 for ( unit = 0; unit < fore_nunits; unit++ )
69 Fore_unit *fup = fore_units[unit];
74 serviced += fore_intr((void *)fup);
78 * Indicate if we handled an interrupt
80 return (serviced ? 1 : 0);
82 #endif /* defined(sun) */
86 * Device interrupt routine
88 * Called at interrupt level.
91 * arg pointer to device unit structure
94 * 1 device interrupt was serviced
95 * 0 no interrupts serviced
98 #if (defined(BSD) && (BSD <= 199306))
106 Fore_unit *fup = arg;
108 #if (defined(BSD) && (BSD <= 199306))
113 * Try to prevent stuff happening after we've paniced
120 * Get to the microcode shared memory interface
122 if ((aap = fup->fu_aali) == NULL)
126 * Has this card issued an interrupt??
131 if (aap->aali_intr_sent) {
135 * Indicate that we've serviced an interrupt.
137 #if (defined(BSD) && (BSD <= 199306))
142 * Clear the device interrupt
144 switch (fup->fu_config.ac_device) {
147 case DEV_FORE_SBA200E:
148 SBA200E_HCR_SET(*fup->fu_ctlreg, SBA200E_CLR_SBUS_INTR);
151 case DEV_FORE_SBA200:
152 *fup->fu_ctlreg = SBA200_CLR_SBUS_INTR;
156 case DEV_FORE_PCA200E:
157 PCA200E_HCR_SET(*fup->fu_ctlreg, PCA200E_CLR_HBUS_INT);
161 panic("fore_intr: unknown device type");
163 aap->aali_intr_sent = CP_WRITE(0);
166 * Reset the watchdog timer
168 fup->fu_timer = FORE_WATCHDOG;
171 * Device initialization handled separately
173 if ((fup->fu_flags & CUF_INITED) == 0) {
176 * We're just initializing device now, so see if
177 * the initialization command has completed
179 if (CP_READ(aap->aali_init.init_status) &
181 fore_initialize_complete(fup);
184 * If we're still not inited, none of the host
185 * queues are setup yet
187 if ((fup->fu_flags & CUF_INITED) == 0)
192 * Drain the queues of completed work
195 fore_recv_drain(fup);
196 fore_xmit_drain(fup);
199 * Supply more buffers to the CP
201 fore_buf_supply(fup);
205 #if (defined(BSD) && (BSD <= 199306))
214 * Watchdog timeout routine
216 * Called when we haven't heard from the card in a while. Just in case
217 * we missed an interrupt, we'll drain the queues and try to resupply the
218 * CP with more receive buffers. If the CP is partially wedged, hopefully
219 * this will be enough to get it going again.
221 * Called with interrupts locked out.
224 * fup pointer to device unit structure
235 * Try to prevent stuff happening after we've paniced
242 * Reset the watchdog timer
244 fup->fu_timer = FORE_WATCHDOG;
247 * If the device is initialized, nudge it (wink, wink)
249 if (fup->fu_flags & CUF_INITED) {
252 * Drain the queues of completed work
255 fore_recv_drain(fup);
256 fore_xmit_drain(fup);
259 * Supply more buffers to the CP
261 fore_buf_supply(fup);