The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/sfxge/common/efx_intr.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.