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