]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/sfxge/common/efx_intr.c
OpenZFS: MFV 2.0-rc3-gfc5966
[FreeBSD/FreeBSD.git] / sys / dev / sfxge / common / efx_intr.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2007-2016 Solarflare Communications Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  *    this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright notice,
13  *    this list of conditions and the following disclaimer in the documentation
14  *    and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * The views and conclusions contained in the software and documentation are
29  * those of the authors and should not be interpreted as representing official
30  * policies, either expressed or implied, of the FreeBSD Project.
31  */
32
33 #include <sys/cdefs.h>
34 __FBSDID("$FreeBSD$");
35
36 #include "efx.h"
37 #include "efx_impl.h"
38
39 #if EFSYS_OPT_SIENA
40
41 static  __checkReturn   efx_rc_t
42 siena_intr_init(
43         __in            efx_nic_t *enp,
44         __in            efx_intr_type_t type,
45         __in            efsys_mem_t *esmp);
46
47 static                  void
48 siena_intr_enable(
49         __in            efx_nic_t *enp);
50
51 static                  void
52 siena_intr_disable(
53         __in            efx_nic_t *enp);
54
55 static                  void
56 siena_intr_disable_unlocked(
57         __in            efx_nic_t *enp);
58
59 static  __checkReturn   efx_rc_t
60 siena_intr_trigger(
61         __in            efx_nic_t *enp,
62         __in            unsigned int level);
63
64 static                  void
65 siena_intr_fini(
66         __in            efx_nic_t *enp);
67
68 static                  void
69 siena_intr_status_line(
70         __in            efx_nic_t *enp,
71         __out           boolean_t *fatalp,
72         __out           uint32_t *qmaskp);
73
74 static                  void
75 siena_intr_status_message(
76         __in            efx_nic_t *enp,
77         __in            unsigned int message,
78         __out           boolean_t *fatalp);
79
80 static                  void
81 siena_intr_fatal(
82         __in            efx_nic_t *enp);
83
84 static  __checkReturn   boolean_t
85 siena_intr_check_fatal(
86         __in            efx_nic_t *enp);
87
88 #endif /* EFSYS_OPT_SIENA */
89
90 #if EFSYS_OPT_SIENA
91 static const efx_intr_ops_t     __efx_intr_siena_ops = {
92         siena_intr_init,                /* eio_init */
93         siena_intr_enable,              /* eio_enable */
94         siena_intr_disable,             /* eio_disable */
95         siena_intr_disable_unlocked,    /* eio_disable_unlocked */
96         siena_intr_trigger,             /* eio_trigger */
97         siena_intr_status_line,         /* eio_status_line */
98         siena_intr_status_message,      /* eio_status_message */
99         siena_intr_fatal,               /* eio_fatal */
100         siena_intr_fini,                /* eio_fini */
101 };
102 #endif  /* EFSYS_OPT_SIENA */
103
104 #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
105 static const efx_intr_ops_t     __efx_intr_ef10_ops = {
106         ef10_intr_init,                 /* eio_init */
107         ef10_intr_enable,               /* eio_enable */
108         ef10_intr_disable,              /* eio_disable */
109         ef10_intr_disable_unlocked,     /* eio_disable_unlocked */
110         ef10_intr_trigger,              /* eio_trigger */
111         ef10_intr_status_line,          /* eio_status_line */
112         ef10_intr_status_message,       /* eio_status_message */
113         ef10_intr_fatal,                /* eio_fatal */
114         ef10_intr_fini,                 /* eio_fini */
115 };
116 #endif  /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
117
118         __checkReturn   efx_rc_t
119 efx_intr_init(
120         __in            efx_nic_t *enp,
121         __in            efx_intr_type_t type,
122         __in_opt        efsys_mem_t *esmp)
123 {
124         efx_intr_t *eip = &(enp->en_intr);
125         const efx_intr_ops_t *eiop;
126         efx_rc_t rc;
127
128         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
129         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
130
131         if (enp->en_mod_flags & EFX_MOD_INTR) {
132                 rc = EINVAL;
133                 goto fail1;
134         }
135
136         eip->ei_esmp = esmp;
137         eip->ei_type = type;
138         eip->ei_level = 0;
139
140         enp->en_mod_flags |= EFX_MOD_INTR;
141
142         switch (enp->en_family) {
143 #if EFSYS_OPT_SIENA
144         case EFX_FAMILY_SIENA:
145                 eiop = &__efx_intr_siena_ops;
146                 break;
147 #endif  /* EFSYS_OPT_SIENA */
148
149 #if EFSYS_OPT_HUNTINGTON
150         case EFX_FAMILY_HUNTINGTON:
151                 eiop = &__efx_intr_ef10_ops;
152                 break;
153 #endif  /* EFSYS_OPT_HUNTINGTON */
154
155 #if EFSYS_OPT_MEDFORD
156         case EFX_FAMILY_MEDFORD:
157                 eiop = &__efx_intr_ef10_ops;
158                 break;
159 #endif  /* EFSYS_OPT_MEDFORD */
160
161 #if EFSYS_OPT_MEDFORD2
162         case EFX_FAMILY_MEDFORD2:
163                 eiop = &__efx_intr_ef10_ops;
164                 break;
165 #endif  /* EFSYS_OPT_MEDFORD2 */
166
167         default:
168                 EFSYS_ASSERT(B_FALSE);
169                 rc = ENOTSUP;
170                 goto fail2;
171         }
172
173         if ((rc = eiop->eio_init(enp, type, esmp)) != 0)
174                 goto fail3;
175
176         eip->ei_eiop = eiop;
177
178         return (0);
179
180 fail3:
181         EFSYS_PROBE(fail3);
182 fail2:
183         EFSYS_PROBE(fail2);
184 fail1:
185         EFSYS_PROBE1(fail1, efx_rc_t, rc);
186
187         return (rc);
188 }
189
190                 void
191 efx_intr_fini(
192         __in    efx_nic_t *enp)
193 {
194         efx_intr_t *eip = &(enp->en_intr);
195         const efx_intr_ops_t *eiop = eip->ei_eiop;
196
197         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
198         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
199         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
200
201         eiop->eio_fini(enp);
202
203         enp->en_mod_flags &= ~EFX_MOD_INTR;
204 }
205
206                         void
207 efx_intr_enable(
208         __in            efx_nic_t *enp)
209 {
210         efx_intr_t *eip = &(enp->en_intr);
211         const efx_intr_ops_t *eiop = eip->ei_eiop;
212
213         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
214         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
215
216         eiop->eio_enable(enp);
217 }
218
219                         void
220 efx_intr_disable(
221         __in            efx_nic_t *enp)
222 {
223         efx_intr_t *eip = &(enp->en_intr);
224         const efx_intr_ops_t *eiop = eip->ei_eiop;
225
226         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
227         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
228
229         eiop->eio_disable(enp);
230 }
231
232                         void
233 efx_intr_disable_unlocked(
234         __in            efx_nic_t *enp)
235 {
236         efx_intr_t *eip = &(enp->en_intr);
237         const efx_intr_ops_t *eiop = eip->ei_eiop;
238
239         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
240         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
241
242         eiop->eio_disable_unlocked(enp);
243 }
244
245         __checkReturn   efx_rc_t
246 efx_intr_trigger(
247         __in            efx_nic_t *enp,
248         __in            unsigned int level)
249 {
250         efx_intr_t *eip = &(enp->en_intr);
251         const efx_intr_ops_t *eiop = eip->ei_eiop;
252
253         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
254         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
255
256         return (eiop->eio_trigger(enp, level));
257 }
258
259                         void
260 efx_intr_status_line(
261         __in            efx_nic_t *enp,
262         __out           boolean_t *fatalp,
263         __out           uint32_t *qmaskp)
264 {
265         efx_intr_t *eip = &(enp->en_intr);
266         const efx_intr_ops_t *eiop = eip->ei_eiop;
267
268         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
269         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
270
271         eiop->eio_status_line(enp, fatalp, qmaskp);
272 }
273
274                         void
275 efx_intr_status_message(
276         __in            efx_nic_t *enp,
277         __in            unsigned int message,
278         __out           boolean_t *fatalp)
279 {
280         efx_intr_t *eip = &(enp->en_intr);
281         const efx_intr_ops_t *eiop = eip->ei_eiop;
282
283         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
284         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
285
286         eiop->eio_status_message(enp, message, fatalp);
287 }
288
289                 void
290 efx_intr_fatal(
291         __in    efx_nic_t *enp)
292 {
293         efx_intr_t *eip = &(enp->en_intr);
294         const efx_intr_ops_t *eiop = eip->ei_eiop;
295
296         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
297         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
298
299         eiop->eio_fatal(enp);
300 }
301
302 /* ************************************************************************* */
303 /* ************************************************************************* */
304 /* ************************************************************************* */
305
306 #if EFSYS_OPT_SIENA
307
308 static  __checkReturn   efx_rc_t
309 siena_intr_init(
310         __in            efx_nic_t *enp,
311         __in            efx_intr_type_t type,
312         __in            efsys_mem_t *esmp)
313 {
314         efx_intr_t *eip = &(enp->en_intr);
315         efx_oword_t oword;
316         efx_rc_t rc;
317
318         if ((esmp == NULL) || (EFSYS_MEM_SIZE(esmp) < EFX_INTR_SIZE)) {
319                 rc = EINVAL;
320                 goto fail1;
321         }
322
323         /*
324          * bug17213 workaround.
325          *
326          * Under legacy interrupts, don't share a level between fatal
327          * interrupts and event queue interrupts. Under MSI-X, they
328          * must share, or we won't get an interrupt.
329          */
330         if (enp->en_family == EFX_FAMILY_SIENA &&
331             eip->ei_type == EFX_INTR_LINE)
332                 eip->ei_level = 0x1f;
333         else
334                 eip->ei_level = 0;
335
336         /* Enable all the genuinely fatal interrupts */
337         EFX_SET_OWORD(oword);
338         EFX_SET_OWORD_FIELD(oword, FRF_AZ_ILL_ADR_INT_KER_EN, 0);
339         EFX_SET_OWORD_FIELD(oword, FRF_AZ_RBUF_OWN_INT_KER_EN, 0);
340         EFX_SET_OWORD_FIELD(oword, FRF_AZ_TBUF_OWN_INT_KER_EN, 0);
341         if (enp->en_family >= EFX_FAMILY_SIENA)
342                 EFX_SET_OWORD_FIELD(oword, FRF_CZ_SRAM_PERR_INT_P_KER_EN, 0);
343         EFX_BAR_WRITEO(enp, FR_AZ_FATAL_INTR_REG_KER, &oword);
344
345         /* Set up the interrupt address register */
346         EFX_POPULATE_OWORD_3(oword,
347             FRF_AZ_NORM_INT_VEC_DIS_KER, (type == EFX_INTR_MESSAGE) ? 1 : 0,
348             FRF_AZ_INT_ADR_KER_DW0, EFSYS_MEM_ADDR(esmp) & 0xffffffff,
349             FRF_AZ_INT_ADR_KER_DW1, EFSYS_MEM_ADDR(esmp) >> 32);
350         EFX_BAR_WRITEO(enp, FR_AZ_INT_ADR_REG_KER, &oword);
351
352         return (0);
353
354 fail1:
355         EFSYS_PROBE1(fail1, efx_rc_t, rc);
356
357         return (rc);
358 }
359
360 static                  void
361 siena_intr_enable(
362         __in            efx_nic_t *enp)
363 {
364         efx_intr_t *eip = &(enp->en_intr);
365         efx_oword_t oword;
366
367         EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
368
369         EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_LEVE_SEL, eip->ei_level);
370         EFX_SET_OWORD_FIELD(oword, FRF_AZ_DRV_INT_EN_KER, 1);
371         EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
372 }
373
374 static                  void
375 siena_intr_disable(
376         __in            efx_nic_t *enp)
377 {
378         efx_oword_t oword;
379
380         EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
381         EFX_SET_OWORD_FIELD(oword, FRF_AZ_DRV_INT_EN_KER, 0);
382         EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
383
384         EFSYS_SPIN(10);
385 }
386
387 static                  void
388 siena_intr_disable_unlocked(
389         __in            efx_nic_t *enp)
390 {
391         efx_oword_t oword;
392
393         EFSYS_BAR_READO(enp->en_esbp, FR_AZ_INT_EN_REG_KER_OFST,
394                         &oword, B_FALSE);
395         EFX_SET_OWORD_FIELD(oword, FRF_AZ_DRV_INT_EN_KER, 0);
396         EFSYS_BAR_WRITEO(enp->en_esbp, FR_AZ_INT_EN_REG_KER_OFST,
397             &oword, B_FALSE);
398 }
399
400 static  __checkReturn   efx_rc_t
401 siena_intr_trigger(
402         __in            efx_nic_t *enp,
403         __in            unsigned int level)
404 {
405         efx_intr_t *eip = &(enp->en_intr);
406         efx_oword_t oword;
407         unsigned int count;
408         uint32_t sel;
409         efx_rc_t rc;
410
411         /* bug16757: No event queues can be initialized */
412         EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EV));
413
414         if (level >= EFX_NINTR_SIENA) {
415                 rc = EINVAL;
416                 goto fail1;
417         }
418
419         if (level > EFX_MASK32(FRF_AZ_KER_INT_LEVE_SEL))
420                 return (ENOTSUP); /* avoid EFSYS_PROBE() */
421
422         sel = level;
423
424         /* Trigger a test interrupt */
425         EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
426         EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_LEVE_SEL, sel);
427         EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_KER, 1);
428         EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
429
430         /*
431          * Wait up to 100ms for the interrupt to be raised before restoring
432          * KER_INT_LEVE_SEL. Ignore a failure to raise (the caller will
433          * observe this soon enough anyway), but always reset KER_INT_LEVE_SEL
434          */
435         count = 0;
436         do {
437                 EFSYS_SPIN(100);        /* 100us */
438
439                 EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
440         } while (EFX_OWORD_FIELD(oword, FRF_AZ_KER_INT_KER) && ++count < 1000);
441
442         EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_LEVE_SEL, eip->ei_level);
443         EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
444
445         return (0);
446
447 fail1:
448         EFSYS_PROBE1(fail1, efx_rc_t, rc);
449
450         return (rc);
451 }
452
453 static  __checkReturn   boolean_t
454 siena_intr_check_fatal(
455         __in            efx_nic_t *enp)
456 {
457         efx_intr_t *eip = &(enp->en_intr);
458         efsys_mem_t *esmp = eip->ei_esmp;
459         efx_oword_t oword;
460
461         /* Read the syndrome */
462         EFSYS_MEM_READO(esmp, 0, &oword);
463
464         if (EFX_OWORD_FIELD(oword, FSF_AZ_NET_IVEC_FATAL_INT) != 0) {
465                 EFSYS_PROBE(fatal);
466
467                 /* Clear the fatal interrupt condition */
468                 EFX_SET_OWORD_FIELD(oword, FSF_AZ_NET_IVEC_FATAL_INT, 0);
469                 EFSYS_MEM_WRITEO(esmp, 0, &oword);
470
471                 return (B_TRUE);
472         }
473
474         return (B_FALSE);
475 }
476
477 static                  void
478 siena_intr_status_line(
479         __in            efx_nic_t *enp,
480         __out           boolean_t *fatalp,
481         __out           uint32_t *qmaskp)
482 {
483         efx_intr_t *eip = &(enp->en_intr);
484         efx_dword_t dword;
485
486         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
487         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
488
489         /*
490          * Read the queue mask and implicitly acknowledge the
491          * interrupt.
492          */
493         EFX_BAR_READD(enp, FR_BZ_INT_ISR0_REG, &dword, B_FALSE);
494         *qmaskp = EFX_DWORD_FIELD(dword, EFX_DWORD_0);
495
496         EFSYS_PROBE1(qmask, uint32_t, *qmaskp);
497
498         if (*qmaskp & (1U << eip->ei_level))
499                 *fatalp = siena_intr_check_fatal(enp);
500         else
501                 *fatalp = B_FALSE;
502 }
503
504 static                  void
505 siena_intr_status_message(
506         __in            efx_nic_t *enp,
507         __in            unsigned int message,
508         __out           boolean_t *fatalp)
509 {
510         efx_intr_t *eip = &(enp->en_intr);
511
512         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
513         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
514
515         if (message == eip->ei_level)
516                 *fatalp = siena_intr_check_fatal(enp);
517         else
518                 *fatalp = B_FALSE;
519 }
520
521 static          void
522 siena_intr_fatal(
523         __in    efx_nic_t *enp)
524 {
525 #if EFSYS_OPT_DECODE_INTR_FATAL
526         efx_oword_t fatal;
527         efx_oword_t mem_per;
528
529         EFX_BAR_READO(enp, FR_AZ_FATAL_INTR_REG_KER, &fatal);
530         EFX_ZERO_OWORD(mem_per);
531
532         if (EFX_OWORD_FIELD(fatal, FRF_AZ_SRM_PERR_INT_KER) != 0 ||
533             EFX_OWORD_FIELD(fatal, FRF_AZ_MEM_PERR_INT_KER) != 0)
534                 EFX_BAR_READO(enp, FR_AZ_MEM_STAT_REG, &mem_per);
535
536         if (EFX_OWORD_FIELD(fatal, FRF_AZ_SRAM_OOB_INT_KER) != 0)
537                 EFSYS_ERR(enp->en_esip, EFX_ERR_SRAM_OOB, 0, 0);
538
539         if (EFX_OWORD_FIELD(fatal, FRF_AZ_BUFID_DC_OOB_INT_KER) != 0)
540                 EFSYS_ERR(enp->en_esip, EFX_ERR_BUFID_DC_OOB, 0, 0);
541
542         if (EFX_OWORD_FIELD(fatal, FRF_AZ_MEM_PERR_INT_KER) != 0)
543                 EFSYS_ERR(enp->en_esip, EFX_ERR_MEM_PERR,
544                     EFX_OWORD_FIELD(mem_per, EFX_DWORD_0),
545                     EFX_OWORD_FIELD(mem_per, EFX_DWORD_1));
546
547         if (EFX_OWORD_FIELD(fatal, FRF_AZ_RBUF_OWN_INT_KER) != 0)
548                 EFSYS_ERR(enp->en_esip, EFX_ERR_RBUF_OWN, 0, 0);
549
550         if (EFX_OWORD_FIELD(fatal, FRF_AZ_TBUF_OWN_INT_KER) != 0)
551                 EFSYS_ERR(enp->en_esip, EFX_ERR_TBUF_OWN, 0, 0);
552
553         if (EFX_OWORD_FIELD(fatal, FRF_AZ_RDESCQ_OWN_INT_KER) != 0)
554                 EFSYS_ERR(enp->en_esip, EFX_ERR_RDESQ_OWN, 0, 0);
555
556         if (EFX_OWORD_FIELD(fatal, FRF_AZ_TDESCQ_OWN_INT_KER) != 0)
557                 EFSYS_ERR(enp->en_esip, EFX_ERR_TDESQ_OWN, 0, 0);
558
559         if (EFX_OWORD_FIELD(fatal, FRF_AZ_EVQ_OWN_INT_KER) != 0)
560                 EFSYS_ERR(enp->en_esip, EFX_ERR_EVQ_OWN, 0, 0);
561
562         if (EFX_OWORD_FIELD(fatal, FRF_AZ_EVF_OFLO_INT_KER) != 0)
563                 EFSYS_ERR(enp->en_esip, EFX_ERR_EVFF_OFLO, 0, 0);
564
565         if (EFX_OWORD_FIELD(fatal, FRF_AZ_ILL_ADR_INT_KER) != 0)
566                 EFSYS_ERR(enp->en_esip, EFX_ERR_ILL_ADDR, 0, 0);
567
568         if (EFX_OWORD_FIELD(fatal, FRF_AZ_SRM_PERR_INT_KER) != 0)
569                 EFSYS_ERR(enp->en_esip, EFX_ERR_SRAM_PERR,
570                     EFX_OWORD_FIELD(mem_per, EFX_DWORD_0),
571                     EFX_OWORD_FIELD(mem_per, EFX_DWORD_1));
572 #else
573         EFSYS_ASSERT(0);
574 #endif
575 }
576
577 static          void
578 siena_intr_fini(
579         __in    efx_nic_t *enp)
580 {
581         efx_oword_t oword;
582
583         /* Clear the interrupt address register */
584         EFX_ZERO_OWORD(oword);
585         EFX_BAR_WRITEO(enp, FR_AZ_INT_ADR_REG_KER, &oword);
586 }
587
588 #endif /* EFSYS_OPT_SIENA */