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/hea/eni_intr.c,v 1.4 1999/08/28 00:41:44 peter Exp $
27 * @(#) $DragonFly: src/sys/dev/atm/hea/eni_intr.c,v 1.2 2003/06/17 04:28:26 dillon Exp $
31 * Efficient ENI Adapter Support
32 * -----------------------------
34 * Interrupt processing
38 #include <netatm/kern_include.h>
40 #include <dev/hea/eni_stats.h>
41 #include <dev/hea/eni.h>
42 #include <dev/hea/eni_suni.h>
43 #include <dev/hea/eni_var.h>
45 static void eni_suni_intr __P((Eni_unit *));
48 * SUNI Interrupt processing
50 * Currently, we don't do anything more then clear the interrupt
54 * eup pointer to device unit structure
67 SuniInt = eup->eu_suni[SUNI_IS_REG];
70 if ( SuniInt & SUNI_RSOPI )
71 val = eup->eu_suni[SUNI_RSOP_REG];
74 if ( SuniInt & SUNI_RLOPI )
75 val = eup->eu_suni[SUNI_RLOP_REG];
78 if ( SuniInt & SUNI_RPOPI )
79 val = eup->eu_suni[SUNI_RPOP_IS_REG];
82 if ( SuniInt & SUNI_RACPI )
83 val = eup->eu_suni[SUNI_RACP_REG];
86 if ( SuniInt & SUNI_TACPI )
87 val = eup->eu_suni[SUNI_TACP_REG];
90 if ( SuniInt & SUNI_TROOLI )
91 val = eup->eu_suni[SUNI_CLOCK_REG];
94 /* Cleared when reading Master Interrupt Status Reg */
97 if ( SuniInt & SUNI_RDOOLI )
98 val = eup->eu_suni[SUNI_CLOCK_REG];
104 * Device interrupt routine
106 * Service an interrupt from this device
109 * eup pointer to device unit structure
115 #if defined(BSD) && BSD < 199506
123 Eni_unit *eup = (Eni_unit *)arg;
124 #if defined(BSD) && BSD < 199506
126 #endif /* BSD < 199506 */
129 * Read and acknowledge any interrupts
131 u_long mask = eup->eu_midway[MIDWAY_ISA];
133 * Read the error statistics counter
135 u_long sval = eup->eu_midway[MIDWAY_STAT];
138 * Update statistics from adapter
140 eup->eu_trash += ( sval >> 16 );
141 eup->eu_ovfl += ( sval & 0xffff );
144 * We handle any DMA completes first so
145 * that we can free resources for use
146 * during transmit and especially receive
149 * Handle RX DMA Complete
151 if ( mask & ENI_INT_RX_DMA ) {
152 eni_recv_drain ( eup );
156 * Handle TX DMA Complete
158 if ( mask & ENI_INT_TX_DMA ) {
159 eni_xmit_drain ( eup );
163 * Look for any PDUs in service list
165 if ( mask & ENI_INT_SERVICE ) {
166 eni_do_service ( eup );
170 * Handle miscelaneous interrupts
172 if ( mask & ENI_INT_STAT ) { /* STAT_OVFL */
173 log ( LOG_INFO, "eni_intr: stat_ovfl: 0x%lx\n", sval );
175 if ( mask & ENI_INT_SUNI ) { /* SUNI_INTR */
176 eni_suni_intr ( eup );
178 if ( mask & ENI_INT_DMA_ERR ) { /* DMA Error */
180 "eni_intr: DMA Error\n" );
182 * We don't know how to recover from DMA errors
183 * yet. The adapter has disabled any further
184 * processing and we're going to leave it like
187 #if defined(BSD) && BSD < 199506
188 return serviced; /* Leave now */
190 return; /* Leave now */
193 if ( mask & ENI_INT_IDEN ) {
195 "eni_intr: TX DMA Ident mismatch\n" );
197 * Something in the TX buffer has really gotten messed
198 * up. Since this is most likely a driver bug, and
199 * the adapter has shut everything down, leave it
203 return 0; /* Leave now */
205 return; /* Leave now */
208 if ( mask & ENI_INT_DMA_OVFL )
209 eup->eu_stats.eni_st_drv.drv_xm_dmaovfl++;
210 if ( mask & ENI_INT_DMA_LERR ) {
212 "eni_intr: DMA LERR\n" );