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 $
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>
46 __RCSID("@(#) $FreeBSD: src/sys/dev/hea/eni_intr.c,v 1.4 1999/08/28 00:41:44 peter Exp $");
49 static void eni_suni_intr __P((Eni_unit *));
52 * SUNI Interrupt processing
54 * Currently, we don't do anything more then clear the interrupt
58 * eup pointer to device unit structure
71 SuniInt = eup->eu_suni[SUNI_IS_REG];
74 if ( SuniInt & SUNI_RSOPI )
75 val = eup->eu_suni[SUNI_RSOP_REG];
78 if ( SuniInt & SUNI_RLOPI )
79 val = eup->eu_suni[SUNI_RLOP_REG];
82 if ( SuniInt & SUNI_RPOPI )
83 val = eup->eu_suni[SUNI_RPOP_IS_REG];
86 if ( SuniInt & SUNI_RACPI )
87 val = eup->eu_suni[SUNI_RACP_REG];
90 if ( SuniInt & SUNI_TACPI )
91 val = eup->eu_suni[SUNI_TACP_REG];
94 if ( SuniInt & SUNI_TROOLI )
95 val = eup->eu_suni[SUNI_CLOCK_REG];
98 /* Cleared when reading Master Interrupt Status Reg */
101 if ( SuniInt & SUNI_RDOOLI )
102 val = eup->eu_suni[SUNI_CLOCK_REG];
108 * Device interrupt routine
110 * Service an interrupt from this device
113 * eup pointer to device unit structure
119 #if defined(BSD) && BSD < 199506
127 Eni_unit *eup = (Eni_unit *)arg;
128 #if defined(BSD) && BSD < 199506
130 #endif /* BSD < 199506 */
133 * Read and acknowledge any interrupts
135 u_long mask = eup->eu_midway[MIDWAY_ISA];
137 * Read the error statistics counter
139 u_long sval = eup->eu_midway[MIDWAY_STAT];
142 * Update statistics from adapter
144 eup->eu_trash += ( sval >> 16 );
145 eup->eu_ovfl += ( sval & 0xffff );
148 * We handle any DMA completes first so
149 * that we can free resources for use
150 * during transmit and especially receive
153 * Handle RX DMA Complete
155 if ( mask & ENI_INT_RX_DMA ) {
156 eni_recv_drain ( eup );
160 * Handle TX DMA Complete
162 if ( mask & ENI_INT_TX_DMA ) {
163 eni_xmit_drain ( eup );
167 * Look for any PDUs in service list
169 if ( mask & ENI_INT_SERVICE ) {
170 eni_do_service ( eup );
174 * Handle miscelaneous interrupts
176 if ( mask & ENI_INT_STAT ) { /* STAT_OVFL */
177 log ( LOG_INFO, "eni_intr: stat_ovfl: 0x%lx\n", sval );
179 if ( mask & ENI_INT_SUNI ) { /* SUNI_INTR */
180 eni_suni_intr ( eup );
182 if ( mask & ENI_INT_DMA_ERR ) { /* DMA Error */
184 "eni_intr: DMA Error\n" );
186 * We don't know how to recover from DMA errors
187 * yet. The adapter has disabled any further
188 * processing and we're going to leave it like
191 #if defined(BSD) && BSD < 199506
192 return serviced; /* Leave now */
194 return; /* Leave now */
197 if ( mask & ENI_INT_IDEN ) {
199 "eni_intr: TX DMA Ident mismatch\n" );
201 * Something in the TX buffer has really gotten messed
202 * up. Since this is most likely a driver bug, and
203 * the adapter has shut everything down, leave it
207 return 0; /* Leave now */
209 return; /* Leave now */
212 if ( mask & ENI_INT_DMA_OVFL )
213 eup->eu_stats.eni_st_drv.drv_xm_dmaovfl++;
214 if ( mask & ENI_INT_DMA_LERR ) {
216 "eni_intr: DMA LERR\n" );