kernel: Sync ACPICA with Intel's version 20140424.
[dragonfly.git] / sys / netproto / atm / uni / q2110_subr.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/q2110_subr.c,v 1.4 2000/01/17 20:49:49 mks Exp $
27  *      @(#) $DragonFly: src/sys/netproto/atm/uni/q2110_subr.c,v 1.5 2006/01/14 13:36:39 swildner Exp $
28  */
29
30 /*
31  * ATM Forum UNI Support
32  * ---------------------
33  *
34  * ITU-T Q.2110 - Subroutines
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  * Conditionally Clear Transmission Queues
46  * 
47  * Arguments:
48  *      sop     pointer to sscop connection block
49  *
50  * Returns:
51  *      none
52  *
53  */
54 void
55 q2110_clear_xmit(struct sscop *sop)
56 {
57         /*
58          * Only clear queues if 'Clear Buffers' == No
59          */
60         if (sop->so_flags & SOF_NOCLRBUF)
61                 sscop_xmit_drain(sop);
62 }
63
64
65 /*
66  * Initialize Data Transfer State Variables
67  * 
68  * Arguments:
69  *      sop     pointer to sscop connection block
70  *
71  * Returns:
72  *      none
73  *
74  */
75 void
76 q2110_init_state(struct sscop *sop)
77 {
78         /*
79          * Initialize for entry into Data Transfer Ready state
80          */
81         sop->so_send = 0;
82         sop->so_pollsend = 0;
83         sop->so_ack = 0;
84         sop->so_pollack = 1;
85         sop->so_polldata = 0;
86         sop->so_rcvhigh = 0;
87         sop->so_rcvnext = 0;
88 }
89
90
91 /*
92  * Prepare Queues for Data Retrieval
93  * 
94  * Arguments:
95  *      sop     pointer to sscop connection block
96  *
97  * Returns:
98  *      none
99  *
100  */
101 void
102 q2110_prep_retrieve(struct sscop *sop)
103 {
104         /*
105          * If 'Clear Buffers' == No, just clear retransmit queue,
106          * else clear all transmission queues
107          */
108         if (sop->so_flags & SOF_NOCLRBUF) {
109                 sop->so_rexmit_hd = NULL;
110                 sop->so_rexmit_tl = NULL;
111         } else
112                 sscop_xmit_drain(sop);
113
114         /*
115          * Clear receiver queue
116          */
117         sscop_rcvr_drain(sop);
118 }
119
120
121 /*
122  * Prepare Queues for Error Recovery
123  * 
124  * Arguments:
125  *      sop     pointer to sscop connection block
126  *
127  * Returns:
128  *      none
129  *
130  */
131 void
132 q2110_prep_recovery(struct sscop *sop)
133 {
134         /*
135          * If 'Clear Buffers' == No, just clear retransmit queue,
136          * else clear all transmission queues
137          */
138         if (sop->so_flags & SOF_NOCLRBUF) {
139                 sop->so_rexmit_hd = NULL;
140                 sop->so_rexmit_tl = NULL;
141         } else
142                 sscop_xmit_drain(sop);
143 }
144
145
146 /*
147  * Conditionally Deliver Received Data to User
148  * 
149  * Arguments:
150  *      sop     pointer to sscop connection block
151  *
152  * Returns:
153  *      none
154  *
155  */
156 void
157 q2110_deliver_data(struct sscop *sop)
158 {
159         /*
160          * If 'Clear Buffers' == No, give data to user
161          */
162         if (sop->so_flags & SOF_NOCLRBUF) {
163                 /*
164                  * We don't support 'Clear Buffers' == No, so don't bother
165                  */
166         }
167
168         /*
169          * Clear receiver queue
170          */
171         sscop_rcvr_drain(sop);
172 }
173
174
175 /*
176  * Enter Connection Recovery Mode
177  * 
178  * Arguments:
179  *      sop     pointer to sscop connection block
180  *
181  * Returns:
182  *      none
183  *
184  */
185 void
186 q2110_error_recovery(struct sscop *sop)
187 {
188
189         /*
190          * Stop data transfer timers
191          */
192         sop->so_timer[SSCOP_T_POLL] = 0;
193         sop->so_timer[SSCOP_T_NORESP] = 0;
194         sop->so_timer[SSCOP_T_IDLE] = 0;
195         sop->so_flags &= ~SOF_KEEPALIVE;
196
197         /* 
198          * Initialize receiver window
199          */
200         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
201
202         /*
203          * Send first ER PDU
204          */
205         sop->so_connctl = 1;
206         SEQ_INCR(sop->so_sendconn, 1);
207         sscop_send_er(sop);
208
209         /*
210          * Set retransmit timer
211          */
212         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
213
214         /*
215          * Clear out appropriate queues
216          */
217         q2110_prep_recovery(sop);
218
219         /*
220          * Wait for ERAK
221          */
222         sop->so_state = SOS_OUTRECOV;
223
224         return;
225 }
226