49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/*
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Copyright (c) 2007-2015 Solarflare Communications Inc.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * All rights reserved.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Redistribution and use in source and binary forms, with or without
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * modification, are permitted provided that the following conditions are met:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 1. Redistributions of source code must retain the above copyright notice,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * this list of conditions and the following disclaimer.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 2. Redistributions in binary form must reproduce the above copyright notice,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * this list of conditions and the following disclaimer in the documentation
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * and/or other materials provided with the distribution.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * The views and conclusions contained in the software and documentation are
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * those of the authors and should not be interpreted as representing official
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * policies, either expressed or implied, of the FreeBSD Project.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include "efx.h"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include "efx_impl.h"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_SIENA
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic __checkReturn efx_rc_t
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_init(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_intr_type_t type,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efsys_mem_t *esmp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_enable(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_disable(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_disable_unlocked(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic __checkReturn efx_rc_t
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_trigger(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in unsigned int level);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_fini(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_status_line(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __out boolean_t *fatalp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __out uint32_t *qmaskp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_status_message(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in unsigned int message,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __out boolean_t *fatalp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_fatal(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic __checkReturn boolean_t
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_check_fatal(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_SIENA */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_SIENA
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic const efx_intr_ops_t __efx_intr_siena_ops = {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore siena_intr_init, /* eio_init */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore siena_intr_enable, /* eio_enable */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore siena_intr_disable, /* eio_disable */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore siena_intr_disable_unlocked, /* eio_disable_unlocked */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore siena_intr_trigger, /* eio_trigger */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore siena_intr_status_line, /* eio_status_line */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore siena_intr_status_message, /* eio_status_message */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore siena_intr_fatal, /* eio_fatal */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore siena_intr_fini, /* eio_fini */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_SIENA */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic const efx_intr_ops_t __efx_intr_ef10_ops = {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_intr_init, /* eio_init */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_intr_enable, /* eio_enable */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_intr_disable, /* eio_disable */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_intr_disable_unlocked, /* eio_disable_unlocked */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_intr_trigger, /* eio_trigger */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_intr_status_line, /* eio_status_line */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_intr_status_message, /* eio_status_message */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_intr_fatal, /* eio_fatal */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ef10_intr_fini, /* eio_fini */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __checkReturn efx_rc_t
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreefx_intr_init(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_intr_type_t type,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efsys_mem_t *esmp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const efx_intr_ops_t *eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_rc_t rc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (enp->en_mod_flags & EFX_MOD_INTR) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore rc = EINVAL;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto fail1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore }
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eip->ei_esmp = esmp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eip->ei_type = type;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eip->ei_level = 0;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore enp->en_mod_flags |= EFX_MOD_INTR;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore switch (enp->en_family) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_SIENA
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore case EFX_FAMILY_SIENA:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop = &__efx_intr_siena_ops;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore break;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_SIENA */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_HUNTINGTON
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore case EFX_FAMILY_HUNTINGTON:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop = &__efx_intr_ef10_ops;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore break;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_HUNTINGTON */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_MEDFORD
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore case EFX_FAMILY_MEDFORD:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop = &__efx_intr_ef10_ops;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore break;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_MEDFORD */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore default:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(B_FALSE);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore rc = ENOTSUP;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto fail2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore }
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if ((rc = eiop->eio_init(enp, type, esmp)) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto fail3;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eip->ei_eiop = eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorefail3:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_PROBE(fail3);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorefail2:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_PROBE(fail2);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorefail1:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_PROBE1(fail1, efx_rc_t, rc);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (rc);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreefx_intr_fini(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const efx_intr_ops_t *eiop = eip->ei_eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop->eio_fini(enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore enp->en_mod_flags &= ~EFX_MOD_INTR;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreefx_intr_enable(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const efx_intr_ops_t *eiop = eip->ei_eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop->eio_enable(enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreefx_intr_disable(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const efx_intr_ops_t *eiop = eip->ei_eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop->eio_disable(enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreefx_intr_disable_unlocked(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const efx_intr_ops_t *eiop = eip->ei_eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop->eio_disable_unlocked(enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __checkReturn efx_rc_t
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreefx_intr_trigger(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in unsigned int level)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const efx_intr_ops_t *eiop = eip->ei_eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (eiop->eio_trigger(enp, level));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreefx_intr_status_line(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __out boolean_t *fatalp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __out uint32_t *qmaskp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const efx_intr_ops_t *eiop = eip->ei_eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop->eio_status_line(enp, fatalp, qmaskp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreefx_intr_status_message(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in unsigned int message,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __out boolean_t *fatalp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const efx_intr_ops_t *eiop = eip->ei_eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop->eio_status_message(enp, message, fatalp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreefx_intr_fatal(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const efx_intr_ops_t *eiop = eip->ei_eiop;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eiop->eio_fatal(enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* ************************************************************************* */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* ************************************************************************* */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* ************************************************************************* */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_SIENA
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic __checkReturn efx_rc_t
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_init(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_intr_type_t type,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efsys_mem_t *esmp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_oword_t oword;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /*
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * bug17213 workaround.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Under legacy interrupts, don't share a level between fatal
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * interrupts and event queue interrupts. Under MSI-X, they
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * must share, or we won't get an interrupt.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (enp->en_family == EFX_FAMILY_SIENA &&
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eip->ei_type == EFX_INTR_LINE)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eip->ei_level = 0x1f;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore else
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore eip->ei_level = 0;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Enable all the genuinely fatal interrupts */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD(oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_ILL_ADR_INT_KER_EN, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_RBUF_OWN_INT_KER_EN, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_TBUF_OWN_INT_KER_EN, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (enp->en_family >= EFX_FAMILY_SIENA)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_CZ_SRAM_PERR_INT_P_KER_EN, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_WRITEO(enp, FR_AZ_FATAL_INTR_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Set up the interrupt address register */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_POPULATE_OWORD_3(oword,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore FRF_AZ_NORM_INT_VEC_DIS_KER, (type == EFX_INTR_MESSAGE) ? 1 : 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore FRF_AZ_INT_ADR_KER_DW0, EFSYS_MEM_ADDR(esmp) & 0xffffffff,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore FRF_AZ_INT_ADR_KER_DW1, EFSYS_MEM_ADDR(esmp) >> 32);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_WRITEO(enp, FR_AZ_INT_ADR_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_enable(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_oword_t oword;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_LEVE_SEL, eip->ei_level);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_DRV_INT_EN_KER, 1);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_disable(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_oword_t oword;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_DRV_INT_EN_KER, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_SPIN(10);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_disable_unlocked(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_oword_t oword;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_BAR_READO(enp->en_esbp, FR_AZ_INT_EN_REG_KER_OFST,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore &oword, B_FALSE);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_DRV_INT_EN_KER, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_BAR_WRITEO(enp->en_esbp, FR_AZ_INT_EN_REG_KER_OFST,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore &oword, B_FALSE);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic __checkReturn efx_rc_t
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_trigger(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in unsigned int level)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_oword_t oword;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t sel;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_rc_t rc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* bug16757: No event queues can be initialized */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EV));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (level >= EFX_NINTR_SIENA) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore rc = EINVAL;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore goto fail1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore }
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (level > EFX_MASK32(FRF_AZ_KER_INT_LEVE_SEL))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (ENOTSUP); /* avoid EFSYS_PROBE() */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sel = level;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Trigger a test interrupt */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_LEVE_SEL, sel);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_KER, 1);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /*
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Wait up to 100ms for the interrupt to be raised before restoring
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * KER_INT_LEVE_SEL. Ignore a failure to raise (the caller will
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * observe this soon enough anyway), but always reset KER_INT_LEVE_SEL
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore count = 0;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore do {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_SPIN(100); /* 100us */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_READO(enp, FR_AZ_INT_EN_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } while (EFX_OWORD_FIELD(oword, FRF_AZ_KER_INT_KER) && ++count < 1000);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FRF_AZ_KER_INT_LEVE_SEL, eip->ei_level);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_WRITEO(enp, FR_AZ_INT_EN_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorefail1:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_PROBE1(fail1, efx_rc_t, rc);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (rc);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic __checkReturn boolean_t
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_check_fatal(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t *esmp = eip->ei_esmp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_oword_t oword;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Read the syndrome */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_MEM_READO(esmp, 0, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(oword, FSF_AZ_NET_IVEC_FATAL_INT) != 0) {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_PROBE(fatal);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Clear the fatal interrupt condition */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_SET_OWORD_FIELD(oword, FSF_AZ_NET_IVEC_FATAL_INT, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_MEM_WRITEO(esmp, 0, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (B_TRUE);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore }
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore return (B_FALSE);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_status_line(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __out boolean_t *fatalp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __out uint32_t *qmaskp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_dword_t dword;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /*
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Read the queue mask and implicitly acknowledge the
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * interrupt.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_READD(enp, FR_BZ_INT_ISR0_REG, &dword, B_FALSE);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *qmaskp = EFX_DWORD_FIELD(dword, EFX_DWORD_0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_PROBE1(qmask, uint32_t, *qmaskp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (*qmaskp & (1U << eip->ei_level))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *fatalp = siena_intr_check_fatal(enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore else
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *fatalp = B_FALSE;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_status_message(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in unsigned int message,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __out boolean_t *fatalp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_intr_t *eip = &(enp->en_intr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_INTR);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (message == eip->ei_level)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *fatalp = siena_intr_check_fatal(enp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore else
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *fatalp = B_FALSE;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_fatal(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_DECODE_INTR_FATAL
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_oword_t fatal;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_oword_t mem_per;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_READO(enp, FR_AZ_FATAL_INTR_REG_KER, &fatal);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_ZERO_OWORD(mem_per);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_SRM_PERR_INT_KER) != 0 ||
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_OWORD_FIELD(fatal, FRF_AZ_MEM_PERR_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_READO(enp, FR_AZ_MEM_STAT_REG, &mem_per);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_SRAM_OOB_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_SRAM_OOB, 0, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_BUFID_DC_OOB_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_BUFID_DC_OOB, 0, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_MEM_PERR_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_MEM_PERR,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_OWORD_FIELD(mem_per, EFX_DWORD_0),
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_OWORD_FIELD(mem_per, EFX_DWORD_1));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_RBUF_OWN_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_RBUF_OWN, 0, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_TBUF_OWN_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_TBUF_OWN, 0, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_RDESCQ_OWN_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_RDESQ_OWN, 0, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_TDESCQ_OWN_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_TDESQ_OWN, 0, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_EVQ_OWN_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_EVQ_OWN, 0, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_EVF_OFLO_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_EVFF_OFLO, 0, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_ILL_ADR_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_ILL_ADDR, 0, 0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore if (EFX_OWORD_FIELD(fatal, FRF_AZ_SRM_PERR_INT_KER) != 0)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ERR(enp->en_esip, EFX_ERR_SRAM_PERR,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_OWORD_FIELD(mem_per, EFX_DWORD_0),
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_OWORD_FIELD(mem_per, EFX_DWORD_1));
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#else
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFSYS_ASSERT(0);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestatic void
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoresiena_intr_fini(
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore __in efx_nic_t *enp)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore{
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_oword_t oword;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Clear the interrupt address register */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_ZERO_OWORD(oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore EFX_BAR_WRITEO(enp, FR_AZ_INT_ADR_REG_KER, &oword);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* EFSYS_OPT_SIENA */