Initial import of binutils 2.22 on the new vendor branch
[dragonfly.git] / sys / dev / atm / hfa / fore_intr.c
1 /*
2  *
3  * ===================================
4  * HARP  |  Host ATM Research Platform
5  * ===================================
6  *
7  *
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.
12  *
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.
20  *
21  * Copyright 1994-1998 Network Computing Services, Inc.
22  *
23  * Copies of this Software may be made, however, the above copyright
24  * notice must be reproduced on all copies.
25  *
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.6 2008/03/01 22:03:13 swildner Exp $
28  */
29
30 /*
31  * FORE Systems 200-Series Adapter Support
32  * ---------------------------------------
33  *
34  * Interrupt processing
35  *
36  */
37
38 #include "fore_include.h"
39
40 /*
41  * Device interrupt routine
42  * 
43  * Called at interrupt level.
44  *
45  * Arguments:
46  *      arg             pointer to device unit structure
47  *
48  * Returns:
49  *      1               device interrupt was serviced
50  *      0               no interrupts serviced
51  *
52  */
53 void
54 fore_intr(void *arg)
55 {
56         Fore_unit       *fup = arg;
57         Aali    *aap;
58
59         /*
60          * Try to prevent stuff happening after we've paniced
61          */
62         if (panicstr)
63                 return;
64
65         /*
66          * Get to the microcode shared memory interface
67          */
68         if ((aap = fup->fu_aali) == NULL)
69                 return;
70
71         /*
72          * Has this card issued an interrupt??
73          */
74         if (*fup->fu_psr) {
75                 /*
76                  * Clear the device interrupt
77                  */
78                 switch (fup->fu_config.ac_device) {
79
80                 case DEV_FORE_PCA200E:
81                         PCA200E_HCR_SET(*fup->fu_ctlreg, PCA200E_CLR_HBUS_INT);
82                         break;
83                 default:
84                         panic("fore_intr: unknown device type");
85                 }
86                 aap->aali_intr_sent = CP_WRITE(0);
87
88                 /*
89                  * Reset the watchdog timer
90                  */
91                 fup->fu_timer = FORE_WATCHDOG;
92
93                 /*
94                  * Device initialization handled separately
95                  */
96                 if ((fup->fu_flags & CUF_INITED) == 0) {
97
98                         /*
99                          * We're just initializing device now, so see if
100                          * the initialization command has completed
101                          */
102                         if (CP_READ(aap->aali_init.init_status) & 
103                                                 QSTAT_COMPLETED)
104                                 fore_initialize_complete(fup);
105
106                         /*
107                          * If we're still not inited, none of the host
108                          * queues are setup yet
109                          */
110                         if ((fup->fu_flags & CUF_INITED) == 0)
111                                 return;
112                 }
113
114                 /*
115                  * Drain the queues of completed work
116                  */
117                 fore_cmd_drain(fup);
118                 fore_recv_drain(fup);
119                 fore_xmit_drain(fup);
120
121                 /*
122                  * Supply more buffers to the CP
123                  */
124                 fore_buf_supply(fup);
125         }
126 }
127
128
129 /*
130  * Watchdog timeout routine
131  * 
132  * Called when we haven't heard from the card in a while.  Just in case
133  * we missed an interrupt, we'll drain the queues and try to resupply the
134  * CP with more receive buffers.  If the CP is partially wedged, hopefully
135  * this will be enough to get it going again.
136  *
137  * Called with interrupts locked out.
138  *
139  * Arguments:
140  *      fup             pointer to device unit structure
141  *
142  * Returns:
143  *      none
144  *
145  */
146 void
147 fore_watchdog(Fore_unit *fup)
148 {
149         /*
150          * Try to prevent stuff happening after we've paniced
151          */
152         if (panicstr) {
153                 return;
154         }
155
156         /*
157          * Reset the watchdog timer
158          */
159         fup->fu_timer = FORE_WATCHDOG;
160
161         /*
162          * If the device is initialized, nudge it (wink, wink)
163          */
164         if (fup->fu_flags & CUF_INITED) {
165
166                 /*
167                  * Drain the queues of completed work
168                  */
169                 fore_cmd_drain(fup);
170                 fore_recv_drain(fup);
171                 fore_xmit_drain(fup);
172
173                 /*
174                  * Supply more buffers to the CP
175                  */
176                 fore_buf_supply(fup);
177         }
178
179         return;
180 }