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 */
Cache object: 0f8f0b2de1404acd3d30685632261185
|