Annotation of coherent/b/STREAMS/i386/dmalock.c, revision 1.1.1.1

1.1       root        1: /* $Header: /src386/STREAMS/i386/RCS/dmalock.c,v 2.3 93/08/09 13:39:02 bin Exp Locker: bin $
                      2:  *
                      3:  *     The  information  contained herein  is a trade secret  of INETCO
                      4:  *     Systems, Ltd, and is  confidential information.   It is provided
                      5:  *     under a license agreement,  and may be copied or disclosed  only
                      6:  *     under  the  terms  of  that  agreement.    Any  reproduction  or
                      7:  *     disclosure  of  this   material   without  the  express  written
                      8:  *     authorization of INETCO Systems, Ltd. or persuant to the license
                      9:  *     agreement is unlawful.
                     10:  *
                     11:  *     Copyright (c) 1989
                     12:  *     An unpublished work by INETCO Systems, Ltd.
                     13:  *     All rights reserved.
                     14:  *
                     15:  * $Description: $
                     16:  *     Routines to lock/unlock the DMA controller chip.
                     17:  *
                     18:  * $Author: bin $
                     19:  *
                     20:  * $Creation: June 21, 1989 $
                     21:  *
                     22:  * $Log:       dmalock.c,v $
                     23:  * Revision 2.3  93/08/09  13:39:02  bin
                     24:  * Kernel 82 changes
                     25:  * 
                     26:  * Revision 2.2  93/07/26  13:55:59  nigel
                     27:  * Nigel's R80
                     28:  * 
                     29:  * Revision 1.1  93/04/14  10:26:34  root
                     30:  * r75
                     31:  * 
                     32:  * Revision 1.1        89/06/30  16:21:26      src
                     33:  * Initial revision
                     34:  * 
                     35:  */
                     36: 
                     37: #include <kernel/timeout.h>
                     38: 
                     39: typedef void (* vfp_t)();              /* Void function pointer type.       */
                     40: 
                     41: /*
                     42:  * If the following variable is non-zero, DMA controller locking is enabled,
                     43:  * allowing at access to only one DMA channel at a time.
                     44:  */
                     45: int DMALCK = 1;
                     46: 
                     47: static TIM * dmatail = (TIM *)0;       /* DMA deferred function queue tail. */
                     48: static TIM * dmahead = (TIM *)0;       /* DMA deferred function queue head. */
                     49: 
                     50: /*
                     51:  * int
                     52:  * dmalock( dfp, fun, arg )
                     53:  * TIM * dfp;
                     54:  * vfp_t fun;
                     55:  * int  arg;
                     56:  *
                     57:  *     Inputs: dfp  = Deferred function structure pointer.
                     58:  *             fun  = Function to call if request is deferred.
                     59:  *             arg  = Argument to pass to function.
                     60:  *
                     61:  *     Action: Either locks DMA controller immediately or defers function
                     62:  *             call until lock can be granted.
                     63:  *
                     64:  *     Return: 0 = Lock granted or -1 = Lock deferred.
                     65:  *
                     66:  *     Notes:  DMA controller locking was introduced to cure a bug on the
                     67:  *             NCR DMA controller, where overlapped DMA caused problems.
                     68:  *             No action is taken if DMA locking is disabled.
                     69:  */
                     70: 
                     71: int
                     72: dmalock( dfp, fun, arg )
                     73: register TIM  * dfp;
                     74: vfp_t          fun;
                     75: int            arg;
                     76: {
                     77:        register int s;         /* Interrupt mask state. */
                     78: 
                     79:        /*
                     80:         * If DMA locking is disabled, allow functions to proceed.
                     81:         */
                     82:        if ( DMALCK == 0 )
                     83:                return( 0 );
                     84: 
                     85:        /*
                     86:         * Record function and argument to be invoked upon dmaunlock.
                     87:         */
                     88:        dfp->t_func = fun;
                     89:        dfp->t_farg = arg;
                     90:        dfp->t_next = (TIM *)0;
                     91: 
                     92:        s = sphi();
                     93: 
                     94:        /*
                     95:         * If the queue is empty, put our structure at the head.
                     96:         */
                     97:        if ( dmahead == (TIM *)0 ) {
                     98:                dmahead = dfp;
                     99:                dmatail = dfp;
                    100:                spl( s );
                    101:                return( 0 );
                    102:        }
                    103: 
                    104:        /*
                    105:         * PARANOIA:    If our structure is already at the head of the queue,
                    106:         *              print a message and return.
                    107:         */
                    108:        if ( dmahead == dfp ) {
                    109:                spl( s );
                    110:                printf( "dmalock: driver attempting to doubly lock DMA controller.\n" );
                    111:                return( 0 );
                    112:        }
                    113: 
                    114:        /*
                    115:         * Append to tail of DMA deferred function queue.
                    116:         */
                    117:        dmatail->t_next = dfp;
                    118:        dmatail         = dfp;
                    119:        spl( s );
                    120:        return( -1 );
                    121: }
                    122: 
                    123: /*
                    124:  * void
                    125:  * dmaunlock( dfp )
                    126:  * TIM * dfp;
                    127:  *
                    128:  *     Inputs: dfp = Deferred function structure pointer.
                    129:  *
                    130:  *     Action: Unlocks the DMA controller and calls the next deferred
                    131:  *             function, if any.
                    132:  *
                    133:  *     Notes:  No action is taken if the deferred function structure pointer
                    134:  *             is not the same as the one used to lock the DMA controller.
                    135:  */
                    136: 
                    137: void
                    138: dmaunlock( dfp )
                    139: register TIM * dfp;
                    140: {
                    141:        register TIM *  qp;     /* Temporary function queue pointer.    */
                    142:        register int    s;      /* Interrupt mask state.                */
                    143: 
                    144:        s = sphi();
                    145: 
                    146:        /*
                    147:         * If the DMA controller is not locked, return.
                    148:         */
                    149:        if ( dmahead == (TIM *)0 ) {
                    150:                spl( s );
                    151:                return;
                    152:        }
                    153: 
                    154:        /*
                    155:         * If our lock is not the one holding the DMA controller:
                    156:         */
                    157:        if ( dmahead != dfp ) {
                    158: 
                    159:                /*
                    160:                 * Look for us in queue.
                    161:                 */
                    162:                for ( qp = dmahead; qp != dmatail; qp = qp->t_next )
                    163: 
                    164:                        /*
                    165:                         * If found, remove us.
                    166:                         */
                    167:                        if ( qp->t_next == dfp ) {
                    168:                                qp->t_next = dfp->t_next;
                    169: 
                    170:                                if ( dmatail == dfp )
                    171:                                        dmatail = qp;
                    172: 
                    173:                                break;
                    174:                        }
                    175: 
                    176:                spl( s );
                    177:                return;
                    178:        }
                    179: 
                    180:        /*
                    181:         * If there are no functions waiting for us, empty queue and return.
                    182:         */
                    183:        if ( dmahead == dmatail ) {
                    184:                dmahead = (TIM *)0;
                    185:                spl( s );
                    186:                return;
                    187:        }
                    188: 
                    189:        /*
                    190:         * Remove us and execute next deferred function.
                    191:         */
                    192:        dmahead = dmahead->t_next;
                    193:        spl( s );
                    194:        (*dmahead->t_func)( dmahead->t_farg, dmahead );
                    195: }
                    196: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.