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/atm/hea/eni_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  *
    3  * ===================================
    4  * HARP  |  Host ATM Research Platform
    5  * ===================================
    6  *
    7  *
    8  * This Host ATM Research Platform ("HARP") file (the "Software") is
    9  * made available by Network Computing Services, Inc. ("NetworkCS")
   10  * "AS IS".  NetworkCS does not provide maintenance, improvements or
   11  * support of any kind.
   12  *
   13  * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
   14  * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
   15  * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
   16  * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
   17  * In no event shall NetworkCS be responsible for any damages, including
   18  * but not limited to consequential damages, arising from or relating to
   19  * any use of the Software or related support.
   20  *
   21  * Copyright 1994-1998 Network Computing Services, Inc.
   22  *
   23  * Copies of this Software may be made, however, the above copyright
   24  * notice must be reproduced on all copies.
   25  *
   26  *      @(#) $FreeBSD: src/sys/dev/hea/eni_intr.c,v 1.4 1999/08/28 00:41:44 peter Exp $
   27  *      @(#) $DragonFly: src/sys/dev/atm/hea/eni_intr.c,v 1.7 2008/03/01 22:03:13 swildner Exp $
   28  */
   29 
   30 /*
   31  * Efficient ENI Adapter Support
   32  * -----------------------------
   33  *
   34  * Interrupt processing
   35  *
   36  */
   37 
   38 #include <netproto/atm/kern_include.h>
   39 
   40 #include "eni_stats.h"
   41 #include "eni.h"
   42 #include "eni_suni.h"
   43 #include "eni_var.h"
   44 
   45 static void     eni_suni_intr (Eni_unit *);
   46 
   47 /*
   48  * SUNI Interrupt processing
   49  *
   50  * Currently, we don't do anything more then clear the interrupt
   51  * for the SUNI chip.
   52  *
   53  * Arguments:
   54  *      eup             pointer to device unit structure
   55  *
   56  * Returns:
   57  *      none
   58  *
   59  */
   60 static void
   61 eni_suni_intr(Eni_unit *eup)
   62 {
   63         int     SuniInt;
   64         int     val;
   65 
   66         SuniInt = eup->eu_suni[SUNI_IS_REG];
   67         
   68         /* RSOPI */
   69         if ( SuniInt & SUNI_RSOPI )
   70                 val = eup->eu_suni[SUNI_RSOP_REG];
   71 
   72         /* RLOPI */
   73         if ( SuniInt & SUNI_RLOPI )
   74                 val = eup->eu_suni[SUNI_RLOP_REG];
   75 
   76         /* RPOPI */
   77         if ( SuniInt & SUNI_RPOPI )
   78                 val = eup->eu_suni[SUNI_RPOP_IS_REG];
   79 
   80         /* RACPI */
   81         if ( SuniInt & SUNI_RACPI )
   82                 val = eup->eu_suni[SUNI_RACP_REG];
   83 
   84         /* TACPI */
   85         if ( SuniInt & SUNI_TACPI )
   86                 val = eup->eu_suni[SUNI_TACP_REG];
   87 
   88         /* TROOLI */
   89         if ( SuniInt & SUNI_TROOLI )
   90                 val = eup->eu_suni[SUNI_CLOCK_REG];
   91 
   92         /* LCDI */
   93                 /* Cleared when reading Master Interrupt Status Reg */
   94 
   95         /* RDOOLI */
   96         if ( SuniInt & SUNI_RDOOLI )
   97                 val = eup->eu_suni[SUNI_CLOCK_REG];
   98 
   99         return;
  100 }
  101 
  102 /*
  103  * Device interrupt routine
  104  *
  105  * Service an interrupt from this device
  106  *
  107  * Arguments:
  108  *      eup             pointer to device unit structure
  109  *
  110  * Returns:
  111  *      none
  112  *
  113  */
  114 void
  115 eni_intr(void *arg)
  116 {
  117         Eni_unit        *eup = (Eni_unit *)arg;
  118 
  119         /*
  120          * Read and acknowledge any interrupts
  121          */
  122         u_long  mask = eup->eu_midway[MIDWAY_ISA];
  123         /*
  124          * Read the error statistics counter
  125          */
  126         u_long  sval = eup->eu_midway[MIDWAY_STAT];
  127 
  128         /*
  129          * Update statistics from adapter
  130          */
  131         eup->eu_trash += ( sval >> 16 );
  132         eup->eu_ovfl += ( sval & 0xffff );
  133 
  134         /*
  135          * We handle any DMA completes first so
  136          * that we can free resources for use
  137          * during transmit and especially receive
  138          */
  139         /*
  140          * Handle RX DMA Complete
  141          */
  142         if ( mask & ENI_INT_RX_DMA ) {
  143                 eni_recv_drain ( eup );
  144         }
  145 
  146         /*
  147          * Handle TX DMA Complete
  148          */
  149         if ( mask & ENI_INT_TX_DMA ) {
  150                 eni_xmit_drain ( eup );
  151         }
  152 
  153         /*
  154          * Look for any PDUs in service list
  155          */
  156         if ( mask & ENI_INT_SERVICE ) {
  157                 eni_do_service ( eup );
  158         }
  159 
  160         /*
  161          * Handle miscelaneous interrupts
  162          */
  163         if ( mask & ENI_INT_STAT ) {                    /* STAT_OVFL */
  164                 log ( LOG_INFO, "eni_intr: stat_ovfl: 0x%lx\n", sval );
  165         }
  166         if ( mask & ENI_INT_SUNI ) {                    /* SUNI_INTR */
  167                 eni_suni_intr ( eup );
  168         }
  169         if ( mask & ENI_INT_DMA_ERR ) {                 /* DMA Error */
  170                 log ( LOG_ERR,
  171                         "eni_intr: DMA Error\n" );
  172                 /*
  173                  * We don't know how to recover from DMA errors
  174                  * yet. The adapter has disabled any further
  175                  * processing and we're going to leave it like
  176                  * that.
  177                  */
  178                 return;                                 /* Leave now */
  179         }
  180         if ( mask & ENI_INT_IDEN ) {
  181                 log ( LOG_ERR,
  182                         "eni_intr: TX DMA Ident mismatch\n" );
  183                 /*
  184                  * Something in the TX buffer has really gotten messed
  185                  * up. Since this is most likely a driver bug, and
  186                  * the adapter has shut everything down, leave it
  187                  * like that.
  188                  */
  189                 return;                                 /* Leave now */
  190         }
  191         if ( mask & ENI_INT_DMA_OVFL )
  192                 eup->eu_stats.eni_st_drv.drv_xm_dmaovfl++;
  193         if ( mask & ENI_INT_DMA_LERR ) {
  194                 log ( LOG_ERR,
  195                         "eni_intr: DMA LERR\n" );
  196                 return;
  197         }
  198 }
  199 

Cache object: 4ee6c177916662830728a30d7b35c133


[ 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.