xref: /dpdk/drivers/common/sfc_efx/base/efx_intr.c (revision 672386c1e9e1f64f7aa3b1360ad22dc737ea8d72)
15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
25e111ed8SAndrew Rybchenko  *
3*672386c1SAndrew Rybchenko  * Copyright(c) 2019-2021 Xilinx, Inc.
45e111ed8SAndrew Rybchenko  * Copyright(c) 2007-2019 Solarflare Communications Inc.
55e111ed8SAndrew Rybchenko  */
65e111ed8SAndrew Rybchenko 
75e111ed8SAndrew Rybchenko #include "efx.h"
85e111ed8SAndrew Rybchenko #include "efx_impl.h"
95e111ed8SAndrew Rybchenko 
105e111ed8SAndrew Rybchenko 
115e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA
125e111ed8SAndrew Rybchenko 
135e111ed8SAndrew Rybchenko static	__checkReturn	efx_rc_t
145e111ed8SAndrew Rybchenko siena_intr_init(
155e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
165e111ed8SAndrew Rybchenko 	__in		efx_intr_type_t type,
175e111ed8SAndrew Rybchenko 	__in		efsys_mem_t *esmp);
185e111ed8SAndrew Rybchenko 
195e111ed8SAndrew Rybchenko static			void
205e111ed8SAndrew Rybchenko siena_intr_enable(
215e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp);
225e111ed8SAndrew Rybchenko 
235e111ed8SAndrew Rybchenko static			void
245e111ed8SAndrew Rybchenko siena_intr_disable(
255e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp);
265e111ed8SAndrew Rybchenko 
275e111ed8SAndrew Rybchenko static			void
285e111ed8SAndrew Rybchenko siena_intr_disable_unlocked(
295e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp);
305e111ed8SAndrew Rybchenko 
315e111ed8SAndrew Rybchenko static	__checkReturn	efx_rc_t
325e111ed8SAndrew Rybchenko siena_intr_trigger(
335e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
345e111ed8SAndrew Rybchenko 	__in		unsigned int level);
355e111ed8SAndrew Rybchenko 
365e111ed8SAndrew Rybchenko static			void
375e111ed8SAndrew Rybchenko siena_intr_fini(
385e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp);
395e111ed8SAndrew Rybchenko 
405e111ed8SAndrew Rybchenko static			void
415e111ed8SAndrew Rybchenko siena_intr_status_line(
425e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
435e111ed8SAndrew Rybchenko 	__out		boolean_t *fatalp,
445e111ed8SAndrew Rybchenko 	__out		uint32_t *qmaskp);
455e111ed8SAndrew Rybchenko 
465e111ed8SAndrew Rybchenko static			void
475e111ed8SAndrew Rybchenko siena_intr_status_message(
485e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
495e111ed8SAndrew Rybchenko 	__in		unsigned int message,
505e111ed8SAndrew Rybchenko 	__out		boolean_t *fatalp);
515e111ed8SAndrew Rybchenko 
525e111ed8SAndrew Rybchenko static			void
535e111ed8SAndrew Rybchenko siena_intr_fatal(
545e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp);
555e111ed8SAndrew Rybchenko 
565e111ed8SAndrew Rybchenko static	__checkReturn	boolean_t
575e111ed8SAndrew Rybchenko siena_intr_check_fatal(
585e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp);
595e111ed8SAndrew Rybchenko 
605e111ed8SAndrew Rybchenko 
615e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */
625e111ed8SAndrew Rybchenko 
635e111ed8SAndrew Rybchenko 
645e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA
655e111ed8SAndrew Rybchenko static const efx_intr_ops_t	__efx_intr_siena_ops = {
665e111ed8SAndrew Rybchenko 	siena_intr_init,		/* eio_init */
675e111ed8SAndrew Rybchenko 	siena_intr_enable,		/* eio_enable */
685e111ed8SAndrew Rybchenko 	siena_intr_disable,		/* eio_disable */
695e111ed8SAndrew Rybchenko 	siena_intr_disable_unlocked,	/* eio_disable_unlocked */
705e111ed8SAndrew Rybchenko 	siena_intr_trigger,		/* eio_trigger */
715e111ed8SAndrew Rybchenko 	siena_intr_status_line,		/* eio_status_line */
725e111ed8SAndrew Rybchenko 	siena_intr_status_message,	/* eio_status_message */
735e111ed8SAndrew Rybchenko 	siena_intr_fatal,		/* eio_fatal */
745e111ed8SAndrew Rybchenko 	siena_intr_fini,		/* eio_fini */
755e111ed8SAndrew Rybchenko };
765e111ed8SAndrew Rybchenko #endif	/* EFSYS_OPT_SIENA */
775e111ed8SAndrew Rybchenko 
785e111ed8SAndrew Rybchenko #if EFX_OPTS_EF10()
795e111ed8SAndrew Rybchenko static const efx_intr_ops_t	__efx_intr_ef10_ops = {
805e111ed8SAndrew Rybchenko 	ef10_intr_init,			/* eio_init */
815e111ed8SAndrew Rybchenko 	ef10_intr_enable,		/* eio_enable */
825e111ed8SAndrew Rybchenko 	ef10_intr_disable,		/* eio_disable */
835e111ed8SAndrew Rybchenko 	ef10_intr_disable_unlocked,	/* eio_disable_unlocked */
845e111ed8SAndrew Rybchenko 	ef10_intr_trigger,		/* eio_trigger */
855e111ed8SAndrew Rybchenko 	ef10_intr_status_line,		/* eio_status_line */
865e111ed8SAndrew Rybchenko 	ef10_intr_status_message,	/* eio_status_message */
875e111ed8SAndrew Rybchenko 	ef10_intr_fatal,		/* eio_fatal */
885e111ed8SAndrew Rybchenko 	ef10_intr_fini,			/* eio_fini */
895e111ed8SAndrew Rybchenko };
905e111ed8SAndrew Rybchenko #endif	/* EFX_OPTS_EF10() */
915e111ed8SAndrew Rybchenko 
9290ff7b9bSAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD
9390ff7b9bSAndrew Rybchenko static const efx_intr_ops_t	__efx_intr_rhead_ops = {
9490ff7b9bSAndrew Rybchenko 	rhead_intr_init,		/* eio_init */
9590ff7b9bSAndrew Rybchenko 	rhead_intr_enable,		/* eio_enable */
9690ff7b9bSAndrew Rybchenko 	rhead_intr_disable,		/* eio_disable */
9790ff7b9bSAndrew Rybchenko 	rhead_intr_disable_unlocked,	/* eio_disable_unlocked */
9890ff7b9bSAndrew Rybchenko 	rhead_intr_trigger,		/* eio_trigger */
9990ff7b9bSAndrew Rybchenko 	rhead_intr_status_line,		/* eio_status_line */
10090ff7b9bSAndrew Rybchenko 	rhead_intr_status_message,	/* eio_status_message */
10190ff7b9bSAndrew Rybchenko 	rhead_intr_fatal,		/* eio_fatal */
10290ff7b9bSAndrew Rybchenko 	rhead_intr_fini,		/* eio_fini */
10390ff7b9bSAndrew Rybchenko };
10490ff7b9bSAndrew Rybchenko #endif	/* EFSYS_OPT_RIVERHEAD */
10590ff7b9bSAndrew Rybchenko 
1065e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_intr_init(__in efx_nic_t * enp,__in efx_intr_type_t type,__in_opt efsys_mem_t * esmp)1075e111ed8SAndrew Rybchenko efx_intr_init(
1085e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
1095e111ed8SAndrew Rybchenko 	__in		efx_intr_type_t type,
1105e111ed8SAndrew Rybchenko 	__in_opt	efsys_mem_t *esmp)
1115e111ed8SAndrew Rybchenko {
1125e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
1135e111ed8SAndrew Rybchenko 	const efx_intr_ops_t *eiop;
1145e111ed8SAndrew Rybchenko 	efx_rc_t rc;
1155e111ed8SAndrew Rybchenko 
1165e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
1175e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
1185e111ed8SAndrew Rybchenko 
1195e111ed8SAndrew Rybchenko 	if (enp->en_mod_flags & EFX_MOD_INTR) {
1205e111ed8SAndrew Rybchenko 		rc = EINVAL;
1215e111ed8SAndrew Rybchenko 		goto fail1;
1225e111ed8SAndrew Rybchenko 	}
1235e111ed8SAndrew Rybchenko 
1245e111ed8SAndrew Rybchenko 	eip->ei_esmp = esmp;
1255e111ed8SAndrew Rybchenko 	eip->ei_type = type;
1265e111ed8SAndrew Rybchenko 	eip->ei_level = 0;
1275e111ed8SAndrew Rybchenko 
1285e111ed8SAndrew Rybchenko 	enp->en_mod_flags |= EFX_MOD_INTR;
1295e111ed8SAndrew Rybchenko 
1305e111ed8SAndrew Rybchenko 	switch (enp->en_family) {
1315e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA
1325e111ed8SAndrew Rybchenko 	case EFX_FAMILY_SIENA:
1335e111ed8SAndrew Rybchenko 		eiop = &__efx_intr_siena_ops;
1345e111ed8SAndrew Rybchenko 		break;
1355e111ed8SAndrew Rybchenko #endif	/* EFSYS_OPT_SIENA */
1365e111ed8SAndrew Rybchenko 
1375e111ed8SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON
1385e111ed8SAndrew Rybchenko 	case EFX_FAMILY_HUNTINGTON:
1395e111ed8SAndrew Rybchenko 		eiop = &__efx_intr_ef10_ops;
1405e111ed8SAndrew Rybchenko 		break;
1415e111ed8SAndrew Rybchenko #endif	/* EFSYS_OPT_HUNTINGTON */
1425e111ed8SAndrew Rybchenko 
1435e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD
1445e111ed8SAndrew Rybchenko 	case EFX_FAMILY_MEDFORD:
1455e111ed8SAndrew Rybchenko 		eiop = &__efx_intr_ef10_ops;
1465e111ed8SAndrew Rybchenko 		break;
1475e111ed8SAndrew Rybchenko #endif	/* EFSYS_OPT_MEDFORD */
1485e111ed8SAndrew Rybchenko 
1495e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD2
1505e111ed8SAndrew Rybchenko 	case EFX_FAMILY_MEDFORD2:
1515e111ed8SAndrew Rybchenko 		eiop = &__efx_intr_ef10_ops;
1525e111ed8SAndrew Rybchenko 		break;
1535e111ed8SAndrew Rybchenko #endif	/* EFSYS_OPT_MEDFORD2 */
1545e111ed8SAndrew Rybchenko 
15590ff7b9bSAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD
15690ff7b9bSAndrew Rybchenko 	case EFX_FAMILY_RIVERHEAD:
15790ff7b9bSAndrew Rybchenko 		eiop = &__efx_intr_rhead_ops;
15890ff7b9bSAndrew Rybchenko 		break;
15990ff7b9bSAndrew Rybchenko #endif	/* EFSYS_OPT_RIVERHEAD */
16090ff7b9bSAndrew Rybchenko 
1615e111ed8SAndrew Rybchenko 	default:
1625e111ed8SAndrew Rybchenko 		EFSYS_ASSERT(B_FALSE);
1635e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
1645e111ed8SAndrew Rybchenko 		goto fail2;
1655e111ed8SAndrew Rybchenko 	}
1665e111ed8SAndrew Rybchenko 
1675e111ed8SAndrew Rybchenko 	if ((rc = eiop->eio_init(enp, type, esmp)) != 0)
1685e111ed8SAndrew Rybchenko 		goto fail3;
1695e111ed8SAndrew Rybchenko 
1705e111ed8SAndrew Rybchenko 	eip->ei_eiop = eiop;
1715e111ed8SAndrew Rybchenko 
1725e111ed8SAndrew Rybchenko 	return (0);
1735e111ed8SAndrew Rybchenko 
1745e111ed8SAndrew Rybchenko fail3:
1755e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail3);
1765e111ed8SAndrew Rybchenko fail2:
1775e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail2);
1785e111ed8SAndrew Rybchenko fail1:
1795e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
1805e111ed8SAndrew Rybchenko 
1815e111ed8SAndrew Rybchenko 	return (rc);
1825e111ed8SAndrew Rybchenko }
1835e111ed8SAndrew Rybchenko 
1845e111ed8SAndrew Rybchenko 		void
efx_intr_fini(__in efx_nic_t * enp)1855e111ed8SAndrew Rybchenko efx_intr_fini(
1865e111ed8SAndrew Rybchenko 	__in	efx_nic_t *enp)
1875e111ed8SAndrew Rybchenko {
1885e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
1895e111ed8SAndrew Rybchenko 	const efx_intr_ops_t *eiop = eip->ei_eiop;
1905e111ed8SAndrew Rybchenko 
1915e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
1925e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
1935e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
1945e111ed8SAndrew Rybchenko 
1955e111ed8SAndrew Rybchenko 	eiop->eio_fini(enp);
1965e111ed8SAndrew Rybchenko 
1975e111ed8SAndrew Rybchenko 	enp->en_mod_flags &= ~EFX_MOD_INTR;
1985e111ed8SAndrew Rybchenko }
1995e111ed8SAndrew Rybchenko 
2005e111ed8SAndrew Rybchenko 			void
efx_intr_enable(__in efx_nic_t * enp)2015e111ed8SAndrew Rybchenko efx_intr_enable(
2025e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp)
2035e111ed8SAndrew Rybchenko {
2045e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
2055e111ed8SAndrew Rybchenko 	const efx_intr_ops_t *eiop = eip->ei_eiop;
2065e111ed8SAndrew Rybchenko 
2075e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
2085e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
2095e111ed8SAndrew Rybchenko 
2105e111ed8SAndrew Rybchenko 	eiop->eio_enable(enp);
2115e111ed8SAndrew Rybchenko }
2125e111ed8SAndrew Rybchenko 
2135e111ed8SAndrew Rybchenko 			void
efx_intr_disable(__in efx_nic_t * enp)2145e111ed8SAndrew Rybchenko efx_intr_disable(
2155e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp)
2165e111ed8SAndrew Rybchenko {
2175e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
2185e111ed8SAndrew Rybchenko 	const efx_intr_ops_t *eiop = eip->ei_eiop;
2195e111ed8SAndrew Rybchenko 
2205e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
2215e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
2225e111ed8SAndrew Rybchenko 
2235e111ed8SAndrew Rybchenko 	eiop->eio_disable(enp);
2245e111ed8SAndrew Rybchenko }
2255e111ed8SAndrew Rybchenko 
2265e111ed8SAndrew Rybchenko 			void
efx_intr_disable_unlocked(__in efx_nic_t * enp)2275e111ed8SAndrew Rybchenko efx_intr_disable_unlocked(
2285e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp)
2295e111ed8SAndrew Rybchenko {
2305e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
2315e111ed8SAndrew Rybchenko 	const efx_intr_ops_t *eiop = eip->ei_eiop;
2325e111ed8SAndrew Rybchenko 
2335e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
2345e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
2355e111ed8SAndrew Rybchenko 
2365e111ed8SAndrew Rybchenko 	eiop->eio_disable_unlocked(enp);
2375e111ed8SAndrew Rybchenko }
2385e111ed8SAndrew Rybchenko 
2395e111ed8SAndrew Rybchenko 
2405e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_intr_trigger(__in efx_nic_t * enp,__in unsigned int level)2415e111ed8SAndrew Rybchenko efx_intr_trigger(
2425e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
2435e111ed8SAndrew Rybchenko 	__in		unsigned int level)
2445e111ed8SAndrew Rybchenko {
2455e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
2465e111ed8SAndrew Rybchenko 	const efx_intr_ops_t *eiop = eip->ei_eiop;
2475e111ed8SAndrew Rybchenko 
2485e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
2495e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
2505e111ed8SAndrew Rybchenko 
2515e111ed8SAndrew Rybchenko 	return (eiop->eio_trigger(enp, level));
2525e111ed8SAndrew Rybchenko }
2535e111ed8SAndrew Rybchenko 
2545e111ed8SAndrew Rybchenko 			void
efx_intr_status_line(__in efx_nic_t * enp,__out boolean_t * fatalp,__out uint32_t * qmaskp)2555e111ed8SAndrew Rybchenko efx_intr_status_line(
2565e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
2575e111ed8SAndrew Rybchenko 	__out		boolean_t *fatalp,
2585e111ed8SAndrew Rybchenko 	__out		uint32_t *qmaskp)
2595e111ed8SAndrew Rybchenko {
2605e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
2615e111ed8SAndrew Rybchenko 	const efx_intr_ops_t *eiop = eip->ei_eiop;
2625e111ed8SAndrew Rybchenko 
2635e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
2645e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
2655e111ed8SAndrew Rybchenko 
2665e111ed8SAndrew Rybchenko 	eiop->eio_status_line(enp, fatalp, qmaskp);
2675e111ed8SAndrew Rybchenko }
2685e111ed8SAndrew Rybchenko 
2695e111ed8SAndrew Rybchenko 			void
efx_intr_status_message(__in efx_nic_t * enp,__in unsigned int message,__out boolean_t * fatalp)2705e111ed8SAndrew Rybchenko efx_intr_status_message(
2715e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
2725e111ed8SAndrew Rybchenko 	__in		unsigned int message,
2735e111ed8SAndrew Rybchenko 	__out		boolean_t *fatalp)
2745e111ed8SAndrew Rybchenko {
2755e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
2765e111ed8SAndrew Rybchenko 	const efx_intr_ops_t *eiop = eip->ei_eiop;
2775e111ed8SAndrew Rybchenko 
2785e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
2795e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
2805e111ed8SAndrew Rybchenko 
2815e111ed8SAndrew Rybchenko 	eiop->eio_status_message(enp, message, fatalp);
2825e111ed8SAndrew Rybchenko }
2835e111ed8SAndrew Rybchenko 
2845e111ed8SAndrew Rybchenko 		void
efx_intr_fatal(__in efx_nic_t * enp)2855e111ed8SAndrew Rybchenko efx_intr_fatal(
2865e111ed8SAndrew Rybchenko 	__in	efx_nic_t *enp)
2875e111ed8SAndrew Rybchenko {
2885e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
2895e111ed8SAndrew Rybchenko 	const efx_intr_ops_t *eiop = eip->ei_eiop;
2905e111ed8SAndrew Rybchenko 
2915e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
2925e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
2935e111ed8SAndrew Rybchenko 
2945e111ed8SAndrew Rybchenko 	eiop->eio_fatal(enp);
2955e111ed8SAndrew Rybchenko }
2965e111ed8SAndrew Rybchenko 
2975e111ed8SAndrew Rybchenko 
2985e111ed8SAndrew Rybchenko /* ************************************************************************* */
2995e111ed8SAndrew Rybchenko /* ************************************************************************* */
3005e111ed8SAndrew Rybchenko /* ************************************************************************* */
3015e111ed8SAndrew Rybchenko 
3025e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA
3035e111ed8SAndrew Rybchenko 
3045e111ed8SAndrew Rybchenko static	__checkReturn	efx_rc_t
siena_intr_init(__in efx_nic_t * enp,__in efx_intr_type_t type,__in efsys_mem_t * esmp)3055e111ed8SAndrew Rybchenko siena_intr_init(
3065e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
3075e111ed8SAndrew Rybchenko 	__in		efx_intr_type_t type,
3085e111ed8SAndrew Rybchenko 	__in		efsys_mem_t *esmp)
3095e111ed8SAndrew Rybchenko {
3105e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
3115e111ed8SAndrew Rybchenko 	efx_oword_t oword;
3125e111ed8SAndrew Rybchenko 	efx_rc_t rc;
3135e111ed8SAndrew Rybchenko 
3145e111ed8SAndrew Rybchenko 	if ((esmp == NULL) || (EFSYS_MEM_SIZE(esmp) < EFX_INTR_SIZE)) {
3155e111ed8SAndrew Rybchenko 		rc = EINVAL;
3165e111ed8SAndrew Rybchenko 		goto fail1;
3175e111ed8SAndrew Rybchenko 	}
3185e111ed8SAndrew Rybchenko 
3195e111ed8SAndrew Rybchenko 	/*
3205e111ed8SAndrew Rybchenko 	 * bug17213 workaround.
3215e111ed8SAndrew Rybchenko 	 *
3225e111ed8SAndrew Rybchenko 	 * Under legacy interrupts, don't share a level between fatal
3235e111ed8SAndrew Rybchenko 	 * interrupts and event queue interrupts. Under MSI-X, they
3245e111ed8SAndrew Rybchenko 	 * must share, or we won't get an interrupt.
3255e111ed8SAndrew Rybchenko 	 */
3265e111ed8SAndrew Rybchenko 	if (enp->en_family == EFX_FAMILY_SIENA &&
3275e111ed8SAndrew Rybchenko 	    eip->ei_type == EFX_INTR_LINE)
3285e111ed8SAndrew Rybchenko 		eip->ei_level = 0x1f;
3295e111ed8SAndrew Rybchenko 	else
3305e111ed8SAndrew Rybchenko 		eip->ei_level = 0;
3315e111ed8SAndrew Rybchenko 
3325e111ed8SAndrew Rybchenko 	/* Enable all the genuinely fatal interrupts */
3335e111ed8SAndrew Rybchenko 	EFX_SET_OWORD(oword);
3345e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_ILL_ADR_INT_KER_EN, 0);
3355e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_RBUF_OWN_INT_KER_EN, 0);
3365e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_TBUF_OWN_INT_KER_EN, 0);
3375e111ed8SAndrew Rybchenko 	if (enp->en_family >= EFX_FAMILY_SIENA)
3385e111ed8SAndrew Rybchenko 		EFX_SET_OWORD_FIELD(oword, FRF_CZ_SRAM_PERR_INT_P_KER_EN, 0);
3395e111ed8SAndrew Rybchenko 	EFX_BAR_WRITEO(enp, FR_AZ_FATAL_INTR_REG_KER, &oword);
3405e111ed8SAndrew Rybchenko 
3415e111ed8SAndrew Rybchenko 	/* Set up the interrupt address register */
3425e111ed8SAndrew Rybchenko 	EFX_POPULATE_OWORD_3(oword,
3435e111ed8SAndrew Rybchenko 	    FRF_AZ_NORM_INT_VEC_DIS_KER, (type == EFX_INTR_MESSAGE) ? 1 : 0,
3445e111ed8SAndrew Rybchenko 	    FRF_AZ_INT_ADR_KER_DW0, EFSYS_MEM_ADDR(esmp) & 0xffffffff,
3455e111ed8SAndrew Rybchenko 	    FRF_AZ_INT_ADR_KER_DW1, EFSYS_MEM_ADDR(esmp) >> 32);
3465e111ed8SAndrew Rybchenko 	EFX_BAR_WRITEO(enp, FR_AZ_INT_ADR_REG_KER, &oword);
3475e111ed8SAndrew Rybchenko 
3485e111ed8SAndrew Rybchenko 	return (0);
3495e111ed8SAndrew Rybchenko 
3505e111ed8SAndrew Rybchenko fail1:
3515e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
3525e111ed8SAndrew Rybchenko 
3535e111ed8SAndrew Rybchenko 	return (rc);
3545e111ed8SAndrew Rybchenko }
3555e111ed8SAndrew Rybchenko 
3565e111ed8SAndrew Rybchenko static			void
siena_intr_enable(__in efx_nic_t * enp)3575e111ed8SAndrew Rybchenko siena_intr_enable(
3585e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp)
3595e111ed8SAndrew Rybchenko {
3605e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
3615e111ed8SAndrew Rybchenko 	efx_oword_t oword;
3625e111ed8SAndrew Rybchenko 
3635e111ed8SAndrew Rybchenko 	EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
3645e111ed8SAndrew Rybchenko 
3655e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_LEVE_SEL, eip->ei_level);
3665e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_DRV_INT_EN_KER, 1);
3675e111ed8SAndrew Rybchenko 	EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
3685e111ed8SAndrew Rybchenko }
3695e111ed8SAndrew Rybchenko 
3705e111ed8SAndrew Rybchenko static			void
siena_intr_disable(__in efx_nic_t * enp)3715e111ed8SAndrew Rybchenko siena_intr_disable(
3725e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp)
3735e111ed8SAndrew Rybchenko {
3745e111ed8SAndrew Rybchenko 	efx_oword_t oword;
3755e111ed8SAndrew Rybchenko 
3765e111ed8SAndrew Rybchenko 	EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
3775e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_DRV_INT_EN_KER, 0);
3785e111ed8SAndrew Rybchenko 	EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
3795e111ed8SAndrew Rybchenko 
3805e111ed8SAndrew Rybchenko 	EFSYS_SPIN(10);
3815e111ed8SAndrew Rybchenko }
3825e111ed8SAndrew Rybchenko 
3835e111ed8SAndrew Rybchenko static			void
siena_intr_disable_unlocked(__in efx_nic_t * enp)3845e111ed8SAndrew Rybchenko siena_intr_disable_unlocked(
3855e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp)
3865e111ed8SAndrew Rybchenko {
3875e111ed8SAndrew Rybchenko 	efx_oword_t oword;
3885e111ed8SAndrew Rybchenko 
3895e111ed8SAndrew Rybchenko 	EFSYS_BAR_READO(enp->en_esbp, FR_AZ_INT_EN_REG_KER_OFST,
3905e111ed8SAndrew Rybchenko 			&oword, B_FALSE);
3915e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_DRV_INT_EN_KER, 0);
3925e111ed8SAndrew Rybchenko 	EFSYS_BAR_WRITEO(enp->en_esbp, FR_AZ_INT_EN_REG_KER_OFST,
3935e111ed8SAndrew Rybchenko 	    &oword, B_FALSE);
3945e111ed8SAndrew Rybchenko }
3955e111ed8SAndrew Rybchenko 
3965e111ed8SAndrew Rybchenko static	__checkReturn	efx_rc_t
siena_intr_trigger(__in efx_nic_t * enp,__in unsigned int level)3975e111ed8SAndrew Rybchenko siena_intr_trigger(
3985e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
3995e111ed8SAndrew Rybchenko 	__in		unsigned int level)
4005e111ed8SAndrew Rybchenko {
4015e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
4025e111ed8SAndrew Rybchenko 	efx_oword_t oword;
4035e111ed8SAndrew Rybchenko 	unsigned int count;
4045e111ed8SAndrew Rybchenko 	uint32_t sel;
4055e111ed8SAndrew Rybchenko 	efx_rc_t rc;
4065e111ed8SAndrew Rybchenko 
4075e111ed8SAndrew Rybchenko 	/* bug16757: No event queues can be initialized */
4085e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EV));
4095e111ed8SAndrew Rybchenko 
4105e111ed8SAndrew Rybchenko 	if (level >= EFX_NINTR_SIENA) {
4115e111ed8SAndrew Rybchenko 		rc = EINVAL;
4125e111ed8SAndrew Rybchenko 		goto fail1;
4135e111ed8SAndrew Rybchenko 	}
4145e111ed8SAndrew Rybchenko 
4155e111ed8SAndrew Rybchenko 	if (level > EFX_MASK32(FRF_AZ_KER_INT_LEVE_SEL))
4165e111ed8SAndrew Rybchenko 		return (ENOTSUP); /* avoid EFSYS_PROBE() */
4175e111ed8SAndrew Rybchenko 
4185e111ed8SAndrew Rybchenko 	sel = level;
4195e111ed8SAndrew Rybchenko 
4205e111ed8SAndrew Rybchenko 	/* Trigger a test interrupt */
4215e111ed8SAndrew Rybchenko 	EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
4225e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_LEVE_SEL, sel);
4235e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_KER, 1);
4245e111ed8SAndrew Rybchenko 	EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
4255e111ed8SAndrew Rybchenko 
4265e111ed8SAndrew Rybchenko 	/*
4275e111ed8SAndrew Rybchenko 	 * Wait up to 100ms for the interrupt to be raised before restoring
4285e111ed8SAndrew Rybchenko 	 * KER_INT_LEVE_SEL. Ignore a failure to raise (the caller will
4295e111ed8SAndrew Rybchenko 	 * observe this soon enough anyway), but always reset KER_INT_LEVE_SEL
4305e111ed8SAndrew Rybchenko 	 */
4315e111ed8SAndrew Rybchenko 	count = 0;
4325e111ed8SAndrew Rybchenko 	do {
4335e111ed8SAndrew Rybchenko 		EFSYS_SPIN(100);	/* 100us */
4345e111ed8SAndrew Rybchenko 
4355e111ed8SAndrew Rybchenko 		EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
4365e111ed8SAndrew Rybchenko 	} while (EFX_OWORD_FIELD(oword, FRF_AZ_KER_INT_KER) && ++count < 1000);
4375e111ed8SAndrew Rybchenko 
4385e111ed8SAndrew Rybchenko 	EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_LEVE_SEL, eip->ei_level);
4395e111ed8SAndrew Rybchenko 	EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
4405e111ed8SAndrew Rybchenko 
4415e111ed8SAndrew Rybchenko 	return (0);
4425e111ed8SAndrew Rybchenko 
4435e111ed8SAndrew Rybchenko fail1:
4445e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
4455e111ed8SAndrew Rybchenko 
4465e111ed8SAndrew Rybchenko 	return (rc);
4475e111ed8SAndrew Rybchenko }
4485e111ed8SAndrew Rybchenko 
4495e111ed8SAndrew Rybchenko static	__checkReturn	boolean_t
siena_intr_check_fatal(__in efx_nic_t * enp)4505e111ed8SAndrew Rybchenko siena_intr_check_fatal(
4515e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp)
4525e111ed8SAndrew Rybchenko {
4535e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
4545e111ed8SAndrew Rybchenko 	efsys_mem_t *esmp = eip->ei_esmp;
4555e111ed8SAndrew Rybchenko 	efx_oword_t oword;
4565e111ed8SAndrew Rybchenko 
4575e111ed8SAndrew Rybchenko 	/* Read the syndrome */
4585e111ed8SAndrew Rybchenko 	EFSYS_MEM_READO(esmp, 0, &oword);
4595e111ed8SAndrew Rybchenko 
4605e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(oword, FSF_AZ_NET_IVEC_FATAL_INT) != 0) {
4615e111ed8SAndrew Rybchenko 		EFSYS_PROBE(fatal);
4625e111ed8SAndrew Rybchenko 
4635e111ed8SAndrew Rybchenko 		/* Clear the fatal interrupt condition */
4645e111ed8SAndrew Rybchenko 		EFX_SET_OWORD_FIELD(oword, FSF_AZ_NET_IVEC_FATAL_INT, 0);
4655e111ed8SAndrew Rybchenko 		EFSYS_MEM_WRITEO(esmp, 0, &oword);
4665e111ed8SAndrew Rybchenko 
4675e111ed8SAndrew Rybchenko 		return (B_TRUE);
4685e111ed8SAndrew Rybchenko 	}
4695e111ed8SAndrew Rybchenko 
4705e111ed8SAndrew Rybchenko 	return (B_FALSE);
4715e111ed8SAndrew Rybchenko }
4725e111ed8SAndrew Rybchenko 
4735e111ed8SAndrew Rybchenko static			void
siena_intr_status_line(__in efx_nic_t * enp,__out boolean_t * fatalp,__out uint32_t * qmaskp)4745e111ed8SAndrew Rybchenko siena_intr_status_line(
4755e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
4765e111ed8SAndrew Rybchenko 	__out		boolean_t *fatalp,
4775e111ed8SAndrew Rybchenko 	__out		uint32_t *qmaskp)
4785e111ed8SAndrew Rybchenko {
4795e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
4805e111ed8SAndrew Rybchenko 	efx_dword_t dword;
4815e111ed8SAndrew Rybchenko 
4825e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
4835e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
4845e111ed8SAndrew Rybchenko 
4855e111ed8SAndrew Rybchenko 	/*
4865e111ed8SAndrew Rybchenko 	 * Read the queue mask and implicitly acknowledge the
4875e111ed8SAndrew Rybchenko 	 * interrupt.
4885e111ed8SAndrew Rybchenko 	 */
4895e111ed8SAndrew Rybchenko 	EFX_BAR_READD(enp, FR_BZ_INT_ISR0_REG, &dword, B_FALSE);
4905e111ed8SAndrew Rybchenko 	*qmaskp = EFX_DWORD_FIELD(dword, EFX_DWORD_0);
4915e111ed8SAndrew Rybchenko 
4925e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(qmask, uint32_t, *qmaskp);
4935e111ed8SAndrew Rybchenko 
4945e111ed8SAndrew Rybchenko 	if (*qmaskp & (1U << eip->ei_level))
4955e111ed8SAndrew Rybchenko 		*fatalp = siena_intr_check_fatal(enp);
4965e111ed8SAndrew Rybchenko 	else
4975e111ed8SAndrew Rybchenko 		*fatalp = B_FALSE;
4985e111ed8SAndrew Rybchenko }
4995e111ed8SAndrew Rybchenko 
5005e111ed8SAndrew Rybchenko static			void
siena_intr_status_message(__in efx_nic_t * enp,__in unsigned int message,__out boolean_t * fatalp)5015e111ed8SAndrew Rybchenko siena_intr_status_message(
5025e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
5035e111ed8SAndrew Rybchenko 	__in		unsigned int message,
5045e111ed8SAndrew Rybchenko 	__out		boolean_t *fatalp)
5055e111ed8SAndrew Rybchenko {
5065e111ed8SAndrew Rybchenko 	efx_intr_t *eip = &(enp->en_intr);
5075e111ed8SAndrew Rybchenko 
5085e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
5095e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
5105e111ed8SAndrew Rybchenko 
5115e111ed8SAndrew Rybchenko 	if (message == eip->ei_level)
5125e111ed8SAndrew Rybchenko 		*fatalp = siena_intr_check_fatal(enp);
5135e111ed8SAndrew Rybchenko 	else
5145e111ed8SAndrew Rybchenko 		*fatalp = B_FALSE;
5155e111ed8SAndrew Rybchenko }
5165e111ed8SAndrew Rybchenko 
5175e111ed8SAndrew Rybchenko 
5185e111ed8SAndrew Rybchenko static		void
siena_intr_fatal(__in efx_nic_t * enp)5195e111ed8SAndrew Rybchenko siena_intr_fatal(
5205e111ed8SAndrew Rybchenko 	__in	efx_nic_t *enp)
5215e111ed8SAndrew Rybchenko {
5225e111ed8SAndrew Rybchenko #if EFSYS_OPT_DECODE_INTR_FATAL
5235e111ed8SAndrew Rybchenko 	efx_oword_t fatal;
5245e111ed8SAndrew Rybchenko 	efx_oword_t mem_per;
5255e111ed8SAndrew Rybchenko 
5265e111ed8SAndrew Rybchenko 	EFX_BAR_READO(enp, FR_AZ_FATAL_INTR_REG_KER, &fatal);
5275e111ed8SAndrew Rybchenko 	EFX_ZERO_OWORD(mem_per);
5285e111ed8SAndrew Rybchenko 
5295e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_SRM_PERR_INT_KER) != 0 ||
5305e111ed8SAndrew Rybchenko 	    EFX_OWORD_FIELD(fatal, FRF_AZ_MEM_PERR_INT_KER) != 0)
5315e111ed8SAndrew Rybchenko 		EFX_BAR_READO(enp, FR_AZ_MEM_STAT_REG, &mem_per);
5325e111ed8SAndrew Rybchenko 
5335e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_SRAM_OOB_INT_KER) != 0)
5345e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_SRAM_OOB, 0, 0);
5355e111ed8SAndrew Rybchenko 
5365e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_BUFID_DC_OOB_INT_KER) != 0)
5375e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_BUFID_DC_OOB, 0, 0);
5385e111ed8SAndrew Rybchenko 
5395e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_MEM_PERR_INT_KER) != 0)
5405e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_MEM_PERR,
5415e111ed8SAndrew Rybchenko 		    EFX_OWORD_FIELD(mem_per, EFX_DWORD_0),
5425e111ed8SAndrew Rybchenko 		    EFX_OWORD_FIELD(mem_per, EFX_DWORD_1));
5435e111ed8SAndrew Rybchenko 
5445e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_RBUF_OWN_INT_KER) != 0)
5455e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_RBUF_OWN, 0, 0);
5465e111ed8SAndrew Rybchenko 
5475e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_TBUF_OWN_INT_KER) != 0)
5485e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_TBUF_OWN, 0, 0);
5495e111ed8SAndrew Rybchenko 
5505e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_RDESCQ_OWN_INT_KER) != 0)
5515e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_RDESQ_OWN, 0, 0);
5525e111ed8SAndrew Rybchenko 
5535e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_TDESCQ_OWN_INT_KER) != 0)
5545e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_TDESQ_OWN, 0, 0);
5555e111ed8SAndrew Rybchenko 
5565e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_EVQ_OWN_INT_KER) != 0)
5575e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_EVQ_OWN, 0, 0);
5585e111ed8SAndrew Rybchenko 
5595e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_EVF_OFLO_INT_KER) != 0)
5605e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_EVFF_OFLO, 0, 0);
5615e111ed8SAndrew Rybchenko 
5625e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_ILL_ADR_INT_KER) != 0)
5635e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_ILL_ADDR, 0, 0);
5645e111ed8SAndrew Rybchenko 
5655e111ed8SAndrew Rybchenko 	if (EFX_OWORD_FIELD(fatal, FRF_AZ_SRM_PERR_INT_KER) != 0)
5665e111ed8SAndrew Rybchenko 		EFSYS_ERR(enp->en_esip, EFX_ERR_SRAM_PERR,
5675e111ed8SAndrew Rybchenko 		    EFX_OWORD_FIELD(mem_per, EFX_DWORD_0),
5685e111ed8SAndrew Rybchenko 		    EFX_OWORD_FIELD(mem_per, EFX_DWORD_1));
5695e111ed8SAndrew Rybchenko #else
5705e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(0);
5715e111ed8SAndrew Rybchenko #endif
5725e111ed8SAndrew Rybchenko }
5735e111ed8SAndrew Rybchenko 
5745e111ed8SAndrew Rybchenko static		void
siena_intr_fini(__in efx_nic_t * enp)5755e111ed8SAndrew Rybchenko siena_intr_fini(
5765e111ed8SAndrew Rybchenko 	__in	efx_nic_t *enp)
5775e111ed8SAndrew Rybchenko {
5785e111ed8SAndrew Rybchenko 	efx_oword_t oword;
5795e111ed8SAndrew Rybchenko 
5805e111ed8SAndrew Rybchenko 	/* Clear the interrupt address register */
5815e111ed8SAndrew Rybchenko 	EFX_ZERO_OWORD(oword);
5825e111ed8SAndrew Rybchenko 	EFX_BAR_WRITEO(enp, FR_AZ_INT_ADR_REG_KER, &oword);
5835e111ed8SAndrew Rybchenko }
5845e111ed8SAndrew Rybchenko 
5855e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */
586