Annotation of kernel/bsd/netat/adsp_reset.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: 
                     26: #include       <adsp_local.h>
                     27: 
                     28: /*
                     29:  * RXFReset
                     30:  *
                     31:  * We just got a Forward Reset Packet.
                     32:  *
                     33:  * Called with interrupts OFF
                     34:  *
                     35:  * INPUTS:
                     36:  *     stream pointer
                     37:  *     Pointer to ADSP header,
                     38:  * OUTPUTS:
                     39:  *     Returns 1 if packet was ignored
                     40:  */
                     41: int RXFReset(sp, f)            /* (CCBPtr sp, ADSP_FRAMEPtr f) */
                     42:     CCBPtr sp;
                     43:     ADSP_FRAMEPtr f;
                     44: {
                     45:     unsigned int pktFirstByteSeq;
                     46:     unsigned int hi;
                     47:     register gbuf_t *mp;
                     48:     register struct adspcmd *pb;
                     49:     int s;
                     50: 
                     51:     ATDISABLE(s, sp->lock);
                     52:     pktFirstByteSeq = netdw(UAL_VALUE(f->pktFirstByteSeq));
                     53:     
                     54:     hi = sp->recvSeq + CalcRecvWdw(sp);
                     55: 
                     56:     /*
                     57:      * Must do this with interrupts OFF
                     58:      */
                     59:     if (BETWEEN(sp->recvSeq, pktFirstByteSeq, hi)) /* Is this acceptable? */
                     60:     {
                     61:        struct adspcmd *qhead;
                     62: 
                     63:        sp->recvSeq = pktFirstByteSeq;
                     64:        while (mp = sp->rbuf_mb) { /* clear the receive queue */
                     65:            sp->rbuf_mb = gbuf_next(mp);
                     66:            gbuf_freem(mp);
                     67:        }
                     68:        if (sp->crbuf_mb) {
                     69:            gbuf_freem(sp->crbuf_mb);
                     70:            sp->crbuf_mb = 0;
                     71:        }
                     72:        sp->rData = 0;
                     73:        sp->rbufFull = 0;
                     74:        sp->userFlags |= eFwdReset; /* Set forward reset received Flag */
                     75: 
                     76:        mp = gbuf_alloc(sizeof(struct adspcmd), PRI_HI);
                     77:        pb = (struct adspcmd *)gbuf_rptr(mp);
                     78:        gbuf_winc(mp,sizeof(struct adspcmd));
                     79:        pb->ioc = 0;
                     80:        pb->mp = mp;
                     81: 
                     82:        pb->csCode = dspReset;
                     83:        pb->ioResult = 0;
                     84:        completepb(sp, pb);
                     85:        sp->userFlags &= ~eFwdReset;
                     86:     }
                     87: 
                     88:     if (LTE(pktFirstByteSeq, hi)) {
                     89:        sp->sendCtl |= B_CTL_FRESETACK; /* Ack it if it's OK, or a duplicate */
                     90:        sp->callSend = 1;
                     91:     }
                     92: 
                     93:     ATENABLE(s, sp->lock);
                     94:     return 0;
                     95: }
                     96: 
                     97: 
                     98: /*
                     99:  * RXFResetAck
                    100:  *
                    101:  * We just got a Forward Reset Acknowledgement packet
                    102:  *
                    103:  * Called with interrupts OFF
                    104:  *
                    105:  * INPUTS:
                    106:  *       stream pointer
                    107:  *    Pointer to ADSP header,
                    108:  * OUTPUTS:
                    109:  *    Returns 1 if packet was ignored
                    110:  */
                    111: int RXFResetAck(sp, f)         /* (CCBPtr sp, ADSP_FRAMEPtr f) */
                    112:     CCBPtr sp;
                    113:     ADSP_FRAMEPtr f;
                    114: {
                    115:     unsigned int  PktNextRecvSeq;
                    116:     int s;
                    117: 
                    118:     if (sp->frpb == 0)         /* Not expecting frwd reset Ack packet */
                    119:        return 1;
                    120: 
                    121:     ATDISABLE(s, sp->lock);
                    122:     PktNextRecvSeq = netdw(UAL_VALUE(f->pktNextRecvSeq));
                    123: 
                    124:     if (BETWEEN(sp->sendSeq, PktNextRecvSeq, sp->sendWdwSeq+1)) {
                    125:        struct adspcmd *pb;
                    126: 
                    127:        RemoveTimerElem(&adspGlobal.fastTimers, &sp->ResetTimer); 
                    128:                                /* Remove timer */
                    129: 
                    130:        /*
                    131:         * Interrupts are OFF here while we muck with the linked list
                    132:         */
                    133:        pb = sp->frpb;          /* Unlink copy of user's parameter block */
                    134:        sp->frpb = (struct adspcmd *)pb->qLink;
                    135: 
                    136:        pb->ioResult = 0;
                    137:        completepb(sp, pb);     /* complete(pb, 0); */
                    138:                
                    139:        if (sp->state == sClosing) /* this ack may allow us to close... */
                    140:            CheckOkToClose(sp);
                    141:                        
                    142:        if (sp->frpb)           /* Another to send? */
                    143:        {
                    144:            sp->callSend = 1;
                    145:            sp->sendCtl |= B_CTL_FRESET;
                    146:        }
                    147:     }
                    148: 
                    149:     ATENABLE(s, sp->lock);
                    150:     return 0;
                    151: }
                    152: 
                    153: 
                    154: /*
                    155:  * dspReset
                    156:  * 
                    157:  * INPUTS:
                    158:  *     --> ccbRefNum           refnum of connection end
                    159:  *
                    160:  * OUTPUTS:
                    161:  *     none
                    162:  *
                    163:  * ERRORS:
                    164:  *     errRefNum               bad connection refnum
                    165:  *     errState                connection is not open
                    166:  *     errAborted              request aborted by Remove or Close call
                    167:  */
                    168: int adspReset(sp, pb)          /* (DSPPBPtr pb) */
                    169:     CCBPtr sp;
                    170:     struct adspcmd *pb;
                    171: {
                    172:     int s;
                    173:     OSErr err;
                    174:     struct adspcmd *qhead;
                    175:     register gbuf_t *mp;
                    176:     register struct adspcmd *rpb;
                    177:        
                    178:     if (sp == 0) {
                    179:        pb->ioResult = errRefNum;
                    180:        return EINVAL;
                    181:     }
                    182: 
                    183:     if (sp->state != sOpen) {
                    184:        pb->ioResult = errState;
                    185:        return EINVAL;
                    186:     }
                    187:        
                    188:     ATDISABLE(s, sp->lock);
                    189: 
                    190:     while (mp = sp->sbuf_mb) { /* clear the send queue */
                    191:        sp->sbuf_mb = gbuf_next(mp);
                    192:        gbuf_freem(mp);
                    193:     }
                    194:     if (sp->csbuf_mb) {
                    195:        gbuf_freem(sp->csbuf_mb);
                    196:        sp->csbuf_mb = 0;
                    197:     }
                    198:     sp->sData = 0;
                    199:     sp->writeFlush = 0;
                    200:     sp->sendCtl |= B_CTL_FRESET;
                    201: 
                    202:     sp->firstRtmtSeq = sp->sendSeq; /* Reset sequence #'s */
                    203:     if (mp = gbuf_copym(pb->mp)) {     /* copy the parameter block */
                    204:            adspioc_ack(0, pb->ioc, pb->gref); /* release user */
                    205:            rpb = (struct adspcmd *)gbuf_rptr(mp);
                    206:            rpb->ioc = 0;               /* unlink copy */
                    207:            rpb->mp = mp;
                    208: 
                    209:            qAddToEnd(&sp->frpb, rpb); 
                    210:                                /* Hold on to pb (will be completed when */
                    211:                                /* forward reset ack is received). */
                    212:     } else {                   /* assume it will work... but keep no
                    213:                                 * bookkeeping for it.  yetch! */
                    214:            adspioc_ack(0, pb->ioc, pb->gref);
                    215:     }
                    216:     ATENABLE(s, sp->lock);
                    217: 
                    218:     CheckSend(sp);
                    219:     return STR_IGNORE;
                    220: 
                    221: }

unix.superglobalmegacorp.com

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