kernel: Sync ACPICA with Intel's version 20140424.
[dragonfly.git] / sys / netproto / atm / uni / sscop_sigaa.c
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/netatm/uni/sscop_sigaa.c,v 1.4 2000/01/17 20:49:52 mks Exp $
27  *      @(#) $DragonFly: src/sys/netproto/atm/uni/sscop_sigaa.c,v 1.5 2006/01/14 13:36:39 swildner Exp $
28  */
29
30 /*
31  * ATM Forum UNI Support
32  * ---------------------
33  *
34  * SSCOP Common - Process AA-signals (SAP_SSCOP)
35  *
36  */
37
38 #include <netproto/atm/kern_include.h>
39
40 #include "sscop.h"
41 #include "sscop_misc.h"
42 #include "sscop_var.h"
43
44 /*
45  * SSCOP_ESTABLISH_REQ / SOS_IDLE Command Processor
46  * 
47  * Arguments:
48  *      sop     pointer to sscop connection block
49  *      arg1    pointer to buffer containing SSCOP-UU data
50  *      arg2    buffer release parameter
51  *
52  * Returns:
53  *      none
54  *
55  */
56 void
57 sscop_estreq_idle(struct sscop *sop, int arg1, int arg2)
58 {
59
60         /*
61          * We don't support SSCOP-UU data
62          */
63         if (arg1 != SSCOP_UU_NULL)
64                 KB_FREEALL((KBuffer *)arg1);
65
66         /*
67          * We currently only support BR=YES
68          */
69         if (arg2 != SSCOP_BR_YES) {
70                 sscop_abort(sop, "sscop: BR != YES\n");
71                 return;
72         }
73
74         /*
75          * Initialize receiver window
76          */
77         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
78
79         /*
80          * Send first BGN PDU
81          */
82         sop->so_connctl = 1;
83         SEQ_INCR(sop->so_sendconn, 1);
84         sscop_send_bgn(sop, SSCOP_SOURCE_USER);
85
86         /*
87          * Reset transmitter state
88          */
89         if (sop->so_vers == SSCOP_VERS_Q2110)
90                 q2110_clear_xmit(sop);
91         else
92                 qsaal1_reset_xmit(sop);
93
94         /*
95          * Set retransmit timer
96          */
97         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
98
99         /*
100          * Wait for BGAK
101          */
102         sop->so_state = SOS_OUTCONN;
103
104         return;
105 }
106
107
108 /*
109  * SSCOP_ESTABLISH_RSP / SOS_INCONN Command Processor
110  * 
111  * Arguments:
112  *      sop     pointer to sscop connection block
113  *      arg1    pointer to buffer containing SSCOP-UU data
114  *      arg2    buffer release parameter
115  *
116  * Returns:
117  *      none
118  *
119  */
120 void
121 sscop_estrsp_inconn(struct sscop *sop, int arg1, int arg2)
122 {
123
124         /*
125          * We don't support SSCOP-UU data
126          */
127         if (arg1 != SSCOP_UU_NULL)
128                 KB_FREEALL((KBuffer *)arg1);
129
130         /*
131          * We currently only support BR=YES
132          */
133         if (arg2 != SSCOP_BR_YES) {
134                 sscop_abort(sop, "sscop: BR != YES\n");
135                 return;
136         }
137
138         if (sop->so_vers == SSCOP_VERS_Q2110) {
139                 /*
140                  * Clear transmitter buffers
141                  */
142                 q2110_clear_xmit(sop);
143
144                 /*
145                  * Initialize state variables
146                  */
147                 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
148                 q2110_init_state(sop);
149         } else {
150                 /*
151                  * Reset transmitter state
152                  */
153                 qsaal1_reset_xmit(sop);
154         }
155
156         /*
157          * Send BGAK PDU
158          */
159         sscop_send_bgak(sop);
160
161         /*
162          * Start polling timer
163          */
164         sop->so_timer[SSCOP_T_POLL] = sop->so_parm.sp_timepoll;
165
166         /*
167          * Start lost poll/stat timer
168          */
169         sop->so_timer[SSCOP_T_NORESP] = sop->so_parm.sp_timeresp;
170
171         /*
172          * OK, we're ready for data
173          */
174         sop->so_state = SOS_READY;
175
176         /*
177          * See if transmit queues need servicing
178          */
179         if (sop->so_flags & SOF_XMITSRVC)
180                 sscop_service_xmit(sop);
181
182         return;
183 }
184
185
186 /*
187  * SSCOP_RELEASE_REQ / SOS_OUTCONN Command Processor
188  * 
189  * Arguments:
190  *      sop     pointer to sscop connection block
191  *      arg1    pointer to buffer containing SSCOP-UU data
192  *      arg2    unused
193  *
194  * Returns:
195  *      none
196  *
197  */
198 void
199 sscop_relreq_outconn(struct sscop *sop, int arg1, int arg2)
200 {
201
202         /*
203          * We don't support SSCOP-UU data
204          */
205         if (arg1 != SSCOP_UU_NULL)
206                 KB_FREEALL((KBuffer *)arg1);
207
208         /*
209          * Stop retransmit timer
210          */
211         sop->so_timer[SSCOP_T_CC] = 0;
212
213         /*
214          * Clear reestablishment flag
215          */
216         sop->so_flags &= ~SOF_REESTAB;
217
218         /*
219          * Send first END PDU
220          */
221         sop->so_connctl = 1;
222         sscop_send_end(sop, SSCOP_SOURCE_USER);
223
224         if (sop->so_vers == SSCOP_VERS_QSAAL)
225                 /*
226                  * Clear connection data
227                  */
228                 qsaal1_clear_connection(sop);
229
230         /*
231          * Set retransmit timer
232          */
233         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
234
235         /*
236          * Wait for ENDAK
237          */
238         sop->so_state = SOS_OUTDISC;
239
240         return;
241 }
242
243
244 /*
245  * SSCOP_RELEASE_REQ / SOS_INCONN Command Processor
246  * 
247  * Arguments:
248  *      sop     pointer to sscop connection block
249  *      arg1    pointer to buffer containing SSCOP-UU data
250  *      arg2    unused
251  *
252  * Returns:
253  *      none
254  *
255  */
256 void
257 sscop_relreq_inconn(struct sscop *sop, int arg1, int arg2)
258 {
259
260         /*
261          * We don't support SSCOP-UU data
262          */
263         if (arg1 != SSCOP_UU_NULL)
264                 KB_FREEALL((KBuffer *)arg1);
265
266         /*
267          * Return a BGREJ PDU
268          */
269         sscop_send_bgrej(sop);
270
271         /*
272          * Back to IDLE state
273          */
274         sop->so_state = SOS_IDLE;
275
276         return;
277 }
278
279
280 /*
281  * SSCOP_RELEASE_REQ / SOS_READY Command Processor
282  * 
283  * Arguments:
284  *      sop     pointer to sscop connection block
285  *      arg1    pointer to buffer containing SSCOP-UU data
286  *      arg2    unused
287  *
288  * Returns:
289  *      none
290  *
291  */
292 void
293 sscop_relreq_ready(struct sscop *sop, int arg1, int arg2)
294 {
295
296         /*
297          * We don't support SSCOP-UU data
298          */
299         if (arg1 != SSCOP_UU_NULL)
300                 KB_FREEALL((KBuffer *)arg1);
301
302         /*
303          * Stop data transfer timers
304          */
305         sop->so_timer[SSCOP_T_POLL] = 0;
306         sop->so_timer[SSCOP_T_NORESP] = 0;
307         sop->so_timer[SSCOP_T_IDLE] = 0;
308         sop->so_flags &= ~SOF_KEEPALIVE;
309
310         /*
311          * Send first END PDU
312          */
313         sop->so_connctl = 1;
314         sscop_send_end(sop, SSCOP_SOURCE_USER);
315
316         if (sop->so_vers == SSCOP_VERS_Q2110) {
317                 /*
318                  * Clear out appropriate queues
319                  */
320                 if (sop->so_state == SOS_READY)
321                         q2110_prep_retrieve(sop);
322                 else
323                         sscop_rcvr_drain(sop);
324         } else {
325                 /*
326                  * Clear connection data
327                  */
328                 qsaal1_clear_connection(sop);
329         }
330
331         /*
332          * Set retransmit timer
333          */
334         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
335
336         /*
337          * Wait for ENDAK
338          */
339         sop->so_state = SOS_OUTDISC;
340
341         return;
342 }
343
344
345 /*
346  * SSCOP_DATA_REQ / SOS_READY Command Processor
347  * 
348  * Arguments:
349  *      sop     pointer to sscop connection block
350  *      arg1    pointer to buffer containing assured user data
351  *      arg2    unused
352  *
353  * Returns:
354  *      none
355  *
356  */
357 void
358 sscop_datreq_ready(struct sscop *sop, int arg1, int arg2)
359 {
360         KBuffer         *m = (KBuffer *)arg1;
361
362         /*
363          * We must have a buffer (even if it contains no data)
364          */
365         if (m == NULL) {
366                 sscop_abort(sop, "sscop_datreq_ready: no buffer\n");
367                 return;
368         }
369
370         /*
371          * Place data at end of transmission queue
372          */
373         KB_QNEXT(m) = NULL;
374         if (sop->so_xmit_hd == NULL)
375                 sop->so_xmit_hd = m;
376         else
377                 KB_QNEXT(sop->so_xmit_tl) = m;
378         sop->so_xmit_tl = m;
379
380         /*
381          * Service the transmit queues
382          */
383         sscop_service_xmit(sop);
384
385         return;
386 }
387
388
389 /*
390  * SSCOP_UNITDATA_REQ / SOS_* Command Processor
391  * 
392  * Arguments:
393  *      sop     pointer to sscop connection block
394  *      arg1    pointer to buffer containing unassured user data
395  *      arg2    unused
396  *
397  * Returns:
398  *      none
399  *
400  */
401 void
402 sscop_udtreq_all(struct sscop *sop, int arg1, int arg2)
403 {
404         KBuffer         *m = (KBuffer *)arg1;
405
406         /*
407          * We must have a buffer (even if it contains no data)
408          */
409         if (m == NULL) {
410                 sscop_abort(sop, "sscop_udtreq_all: no buffer\n");
411                 return;
412         }
413
414         /*
415          * Send the data in a UD PDU
416          */
417         sscop_send_ud(sop, m);
418         
419         return;
420 }
421