FreeCalypso > hg > freecalypso-citrine
comparison g23m-aci/uart/uart_kerp.c @ 0:75a11d740a02
initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 09 Jun 2016 00:02:41 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:75a11d740a02 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : | |
4 | Modul : | |
5 +----------------------------------------------------------------------------- | |
6 | Copyright 2002 Texas Instruments Berlin, AG | |
7 | All rights reserved. | |
8 | | |
9 | This file is confidential and a trade secret of Texas | |
10 | Instruments Berlin, AG | |
11 | The receipt of or possession of this file does not convey | |
12 | any rights to reproduce or disclose its contents or to | |
13 | manufacture, use, or sell anything it may describe, in | |
14 | whole, or in part, without the specific written consent of | |
15 | Texas Instruments Berlin, AG. | |
16 +----------------------------------------------------------------------------- | |
17 | Purpose : This modul is part of the entity UART and implements all | |
18 | functions to handles the incoming primitives as described in | |
19 | the SDL-documentation (KER-statemachine) | |
20 +----------------------------------------------------------------------------- | |
21 */ | |
22 | |
23 #ifndef UART_KERP_C | |
24 #define UART_KERP_C | |
25 #endif /* !UART_KERP_C */ | |
26 | |
27 #include "config.h" | |
28 #include "fixedconf.h" | |
29 #include "condat-features.h" | |
30 | |
31 #define ENTITY_UART | |
32 | |
33 /*==== INCLUDES =============================================================*/ | |
34 | |
35 #ifdef WIN32 | |
36 #include "nucleus.h" | |
37 #endif /* WIN32 */ | |
38 #include "typedefs.h" /* to get Condat data types */ | |
39 #include "vsi.h" /* to get a lot of macros */ | |
40 #include "macdef.h" /* to get a lot of macros */ | |
41 #include "custom.h" | |
42 #include "gsm.h" /* to get a lot of macros */ | |
43 #include "cnf_uart.h" /* to get cnf-definitions */ | |
44 #include "mon_uart.h" /* to get mon-definitions */ | |
45 #include "prim.h" /* to get the definitions of used SAP and directions */ | |
46 #ifdef DTILIB | |
47 #include "dti.h" /* to get dti lib */ | |
48 #endif /* DTILIB */ | |
49 #include "pei.h" /* to get PEI interface */ | |
50 #ifdef FF_MULTI_PORT | |
51 #include "gsi.h" /* to get definitions of serial driver */ | |
52 #else /* FF_MULTI_PORT */ | |
53 #ifdef _TARGET_ | |
54 #include "../../serial/serialswitch.h" | |
55 #include "../../serial/traceswitch.h" | |
56 #else /* _TARGET_ */ | |
57 #include "serial_dat.h" /* to get definitions of serial driver */ | |
58 #endif /* _TARGET_ */ | |
59 #endif /* FF_MULTI_PORT */ | |
60 #include "uart.h" /* to get the global entity definitions */ | |
61 | |
62 #include "uart_kerf.h" /* to get ker functions */ | |
63 #include "uart_kers.h" /* to get ker signals */ | |
64 #include "uart_drxs.h" /* to get drx signals */ | |
65 #include "uart_dtxs.h" /* to get dtx signals */ | |
66 #include "uart_rts.h" /* to get rt signals */ | |
67 #ifdef FF_MULTI_PORT | |
68 #include "uart_prxs.h" /* to get rx signals */ | |
69 #include "uart_ptxs.h" /* to get tx signals */ | |
70 #else /* FF_MULTI_PORT */ | |
71 #include "uart_rxs.h" /* to get rx signals */ | |
72 #include "uart_txs.h" /* to get tx signals */ | |
73 #endif /* FF_MULTI_PORT */ | |
74 | |
75 /*==== CONST ================================================================*/ | |
76 | |
77 /*==== LOCAL VARS ===========================================================*/ | |
78 | |
79 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
80 | |
81 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
82 | |
83 | |
84 | |
85 /* | |
86 +------------------------------------------------------------------------------ | |
87 | Function : ker_uart_parameters_req | |
88 +------------------------------------------------------------------------------ | |
89 | Description : Handles the primitive UART_PARAMETERS_REQ | |
90 | | |
91 | Parameters : *uart_parameters_req - Ptr to primitive payload | |
92 | | |
93 +------------------------------------------------------------------------------ | |
94 */ | |
95 GLOBAL void ker_uart_parameters_req ( | |
96 T_UART_PARAMETERS_REQ *uart_parameters_req) | |
97 { | |
98 UBYTE i; | |
99 T_DLC* dlc; | |
100 | |
101 TRACE_FUNCTION( "ker_uart_parameters_req" ); | |
102 | |
103 #ifdef UART_RANGE_CHECK | |
104 if(uart_parameters_req EQ NULL) | |
105 { | |
106 TRACE_EVENT("ERROR: uart_parameters_req is NULL"); | |
107 } | |
108 else if((*((ULONG*)((UBYTE*)uart_parameters_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
109 { | |
110 TRACE_EVENT_P1("ERROR: uart_parameters_req=%08x is not allocated", | |
111 uart_parameters_req); | |
112 } | |
113 else if(uart_parameters_req->device >= UART_INSTANCES) | |
114 { | |
115 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
116 uart_parameters_req->device, | |
117 UART_INSTANCES); | |
118 } | |
119 #endif /* UART_RANGE_CHECK */ | |
120 | |
121 /* | |
122 * set UART instance | |
123 */ | |
124 uart_data = &uart_data_base[uart_parameters_req->device]; | |
125 | |
126 #ifdef FF_MULTI_PORT | |
127 /* | |
128 * set new baud rate | |
129 */ | |
130 switch (uart_parameters_req->comPar.speed) | |
131 { | |
132 case UART_IO_SPEED_AUTO: | |
133 uart_data->ker.act_dcb.Baud = GSI_BAUD_AUTO; | |
134 break; | |
135 case UART_IO_SPEED_75: | |
136 uart_data->ker.act_dcb.Baud = GSI_BAUD_75; | |
137 break; | |
138 case UART_IO_SPEED_150: | |
139 uart_data->ker.act_dcb.Baud = GSI_BAUD_150; | |
140 break; | |
141 case UART_IO_SPEED_300: | |
142 uart_data->ker.act_dcb.Baud = GSI_BAUD_300; | |
143 break; | |
144 case UART_IO_SPEED_600: | |
145 uart_data->ker.act_dcb.Baud = GSI_BAUD_600; | |
146 break; | |
147 case UART_IO_SPEED_1200: | |
148 uart_data->ker.act_dcb.Baud = GSI_BAUD_1200; | |
149 break; | |
150 case UART_IO_SPEED_2400: | |
151 uart_data->ker.act_dcb.Baud = GSI_BAUD_2400; | |
152 break; | |
153 case UART_IO_SPEED_4800: | |
154 uart_data->ker.act_dcb.Baud = GSI_BAUD_4800; | |
155 break; | |
156 case UART_IO_SPEED_7200: | |
157 uart_data->ker.act_dcb.Baud = GSI_BAUD_7200; | |
158 break; | |
159 case UART_IO_SPEED_9600: | |
160 uart_data->ker.act_dcb.Baud = GSI_BAUD_9600; | |
161 break; | |
162 case UART_IO_SPEED_14400: | |
163 uart_data->ker.act_dcb.Baud = GSI_BAUD_14400; | |
164 break; | |
165 case UART_IO_SPEED_19200: | |
166 uart_data->ker.act_dcb.Baud = GSI_BAUD_19200; | |
167 break; | |
168 case UART_IO_SPEED_28800: | |
169 uart_data->ker.act_dcb.Baud = GSI_BAUD_28800; | |
170 break; | |
171 case UART_IO_SPEED_33900: | |
172 uart_data->ker.act_dcb.Baud = GSI_BAUD_33900; | |
173 break; | |
174 case UART_IO_SPEED_38400: | |
175 uart_data->ker.act_dcb.Baud = GSI_BAUD_38400; | |
176 break; | |
177 case UART_IO_SPEED_57600: | |
178 uart_data->ker.act_dcb.Baud = GSI_BAUD_57600; | |
179 break; | |
180 case UART_IO_SPEED_115200: | |
181 uart_data->ker.act_dcb.Baud = GSI_BAUD_115200; | |
182 break; | |
183 case UART_IO_SPEED_203125: | |
184 uart_data->ker.act_dcb.Baud = GSI_BAUD_203125; | |
185 break; | |
186 case UART_IO_SPEED_406250: | |
187 uart_data->ker.act_dcb.Baud = GSI_BAUD_406250; | |
188 break; | |
189 case UART_IO_SPEED_812500: | |
190 uart_data->ker.act_dcb.Baud = GSI_BAUD_812500; | |
191 break; | |
192 case UART_IO_SPEED_UNDEF: /* unchanged */ | |
193 break; | |
194 default: | |
195 TRACE_ERROR( "UART_PARAMETERS_REQ: baudrate unexpected" ); | |
196 break; | |
197 } | |
198 | |
199 /* | |
200 * set new bits per character | |
201 */ | |
202 switch (uart_parameters_req->comPar.bpc) | |
203 { | |
204 case UART_IO_BPC_7: | |
205 uart_data->ker.act_dcb.DataBits = GSI_CHAR7; | |
206 break; | |
207 case UART_IO_BPC_8: | |
208 uart_data->ker.act_dcb.DataBits = GSI_CHAR8; | |
209 break; | |
210 case UART_IO_BPC_UNDEF: /* unchanged */ | |
211 break; | |
212 default: | |
213 TRACE_ERROR( "UART_PARAMETERS_REQ: bpc unexpected" ); | |
214 break; | |
215 } | |
216 | |
217 /* | |
218 * set new stop bit | |
219 */ | |
220 switch (uart_parameters_req->comPar.nsb) | |
221 { | |
222 case UART_IO_SB_1: | |
223 uart_data->ker.act_dcb.StopBits = GSI_STOP1; | |
224 break; | |
225 case UART_IO_SB_2: | |
226 uart_data->ker.act_dcb.StopBits = GSI_STOP2; | |
227 break; | |
228 case UART_IO_SB_UNDEF: /* unchanged */ | |
229 break; | |
230 default: | |
231 TRACE_ERROR( "UART_PARAMETERS_REQ: stop bits unexpected" ); | |
232 break; | |
233 } | |
234 | |
235 /* | |
236 * set new parity | |
237 */ | |
238 switch (uart_parameters_req->comPar.parity) | |
239 { | |
240 case UART_IO_PA_NONE: | |
241 uart_data->ker.act_dcb.Parity = GSI_PARITYNO; | |
242 break; | |
243 case UART_IO_PA_EVEN: | |
244 uart_data->ker.act_dcb.Parity = GSI_PARITYEVEN; | |
245 break; | |
246 case UART_IO_PA_ODD: | |
247 uart_data->ker.act_dcb.Parity = GSI_PARITYODD; | |
248 break; | |
249 case UART_IO_PA_SPACE: | |
250 uart_data->ker.act_dcb.Parity = GSI_PARITYSPACE; | |
251 break; | |
252 case UART_IO_PA_UNDEF: /* unchanged */ | |
253 break; | |
254 default: | |
255 TRACE_ERROR( "UART_PARAMETERS_REQ: parity unexpected" ); | |
256 break; | |
257 } | |
258 | |
259 /* | |
260 * set new RX flow control | |
261 */ | |
262 switch (uart_parameters_req->comPar.flow_rx) | |
263 { | |
264 case UART_IO_FC_RX_NONE: | |
265 uart_data->ker.act_dcb.RxFlowControl = GSI_FLOWNO; | |
266 break; | |
267 case UART_IO_FC_RX_RTS: | |
268 uart_data->ker.act_dcb.RxFlowControl = GSI_FLOWHW; | |
269 break; | |
270 case UART_IO_FC_RX_XOFF: | |
271 uart_data->ker.act_dcb.RxFlowControl = GSI_FLOWSW; | |
272 break; | |
273 case UART_IO_FC_RX_UNDEF: /* unchanged */ | |
274 break; | |
275 default: | |
276 TRACE_ERROR( "UART_PARAMETERS_REQ: RX flow control unexpected" ); | |
277 break; | |
278 } | |
279 | |
280 /* | |
281 * set new TX flow control | |
282 */ | |
283 switch (uart_parameters_req->comPar.flow_tx) | |
284 { | |
285 case UART_IO_FC_TX_NONE: | |
286 uart_data->ker.act_dcb.TxFlowControl = GSI_FLOWNO; | |
287 break; | |
288 case UART_IO_FC_TX_RTS: | |
289 uart_data->ker.act_dcb.TxFlowControl = GSI_FLOWHW; | |
290 break; | |
291 case UART_IO_FC_TX_XOFF: | |
292 uart_data->ker.act_dcb.TxFlowControl = GSI_FLOWSW; | |
293 break; | |
294 case UART_IO_FC_TX_UNDEF: /* unchanged */ | |
295 break; | |
296 default: | |
297 TRACE_ERROR( "UART_PARAMETERS_REQ: TX flow control unexpected" ); | |
298 break; | |
299 } | |
300 | |
301 /* | |
302 * set new XON / XOFF values | |
303 */ | |
304 if(uart_parameters_req->comPar.xon_valid EQ UART_IO_XON_VALID) | |
305 uart_data->ker.act_dcb.XON = uart_parameters_req->comPar.xon; | |
306 if(uart_parameters_req->comPar.xoff_valid EQ UART_IO_XOFF_VALID) | |
307 uart_data->ker.act_dcb.XOFF = uart_parameters_req->comPar.xoff; | |
308 #else /* FF_MULTI_PORT */ | |
309 /* | |
310 * set new baud rate | |
311 */ | |
312 switch (uart_parameters_req->comPar.speed) | |
313 { | |
314 case UART_IO_SPEED_AUTO: | |
315 uart_data->ker.act_br = UF_BAUD_AUTO; | |
316 break; | |
317 case UART_IO_SPEED_75: | |
318 uart_data->ker.act_br = UF_BAUD_75; | |
319 break; | |
320 case UART_IO_SPEED_150: | |
321 uart_data->ker.act_br = UF_BAUD_150; | |
322 break; | |
323 case UART_IO_SPEED_300: | |
324 uart_data->ker.act_br = UF_BAUD_300; | |
325 break; | |
326 case UART_IO_SPEED_600: | |
327 uart_data->ker.act_br = UF_BAUD_600; | |
328 break; | |
329 case UART_IO_SPEED_1200: | |
330 uart_data->ker.act_br = UF_BAUD_1200; | |
331 break; | |
332 case UART_IO_SPEED_2400: | |
333 uart_data->ker.act_br = UF_BAUD_2400; | |
334 break; | |
335 case UART_IO_SPEED_4800: | |
336 uart_data->ker.act_br = UF_BAUD_4800; | |
337 break; | |
338 case UART_IO_SPEED_7200: | |
339 uart_data->ker.act_br = UF_BAUD_7200; | |
340 break; | |
341 case UART_IO_SPEED_9600: | |
342 uart_data->ker.act_br = UF_BAUD_9600; | |
343 break; | |
344 case UART_IO_SPEED_14400: | |
345 uart_data->ker.act_br = UF_BAUD_14400; | |
346 break; | |
347 case UART_IO_SPEED_19200: | |
348 uart_data->ker.act_br = UF_BAUD_19200; | |
349 break; | |
350 case UART_IO_SPEED_28800: | |
351 uart_data->ker.act_br = UF_BAUD_28800; | |
352 break; | |
353 case UART_IO_SPEED_33900: | |
354 uart_data->ker.act_br = UF_BAUD_33900; | |
355 break; | |
356 case UART_IO_SPEED_38400: | |
357 uart_data->ker.act_br = UF_BAUD_38400; | |
358 break; | |
359 case UART_IO_SPEED_57600: | |
360 uart_data->ker.act_br = UF_BAUD_57600; | |
361 break; | |
362 case UART_IO_SPEED_115200: | |
363 uart_data->ker.act_br = UF_BAUD_115200; | |
364 break; | |
365 case UART_IO_SPEED_203125: | |
366 uart_data->ker.act_br = UF_BAUD_203125; | |
367 break; | |
368 case UART_IO_SPEED_406250: | |
369 uart_data->ker.act_br = UF_BAUD_406250; | |
370 break; | |
371 case UART_IO_SPEED_812500: | |
372 uart_data->ker.act_br = UF_BAUD_812500; | |
373 break; | |
374 case UART_IO_SPEED_UNDEF: /* unchanged */ | |
375 break; | |
376 default: | |
377 TRACE_ERROR( "UART_PARAMETERS_REQ: baudrate unexpected" ); | |
378 break; | |
379 } | |
380 | |
381 /* | |
382 * set new RX flow control | |
383 */ | |
384 switch (uart_parameters_req->comPar.flow_rx) | |
385 { | |
386 case UART_IO_FC_RX_NONE: | |
387 uart_data->ker.act_fc_rx = fc_none; | |
388 break; | |
389 case UART_IO_FC_RX_RTS: | |
390 uart_data->ker.act_fc_rx = fc_rts; | |
391 break; | |
392 case UART_IO_FC_RX_XOFF: | |
393 uart_data->ker.act_fc_rx = fc_xoff; | |
394 break; | |
395 case UART_IO_FC_RX_UNDEF: /* unchanged */ | |
396 break; | |
397 default: | |
398 TRACE_ERROR( "UART_PARAMETERS_REQ: RX flow control unexpected" ); | |
399 break; | |
400 } | |
401 | |
402 /* | |
403 * set new TX flow control | |
404 */ | |
405 switch (uart_parameters_req->comPar.flow_tx) | |
406 { | |
407 case UART_IO_FC_TX_NONE: | |
408 uart_data->ker.act_fc_tx = fc_none; | |
409 break; | |
410 case UART_IO_FC_TX_RTS: | |
411 uart_data->ker.act_fc_tx = fc_rts; | |
412 break; | |
413 case UART_IO_FC_TX_XOFF: | |
414 uart_data->ker.act_fc_tx = fc_xoff; | |
415 break; | |
416 case UART_IO_FC_TX_UNDEF: /* unchanged */ | |
417 break; | |
418 default: | |
419 TRACE_ERROR( "UART_PARAMETERS_REQ: TX flow control unexpected" ); | |
420 break; | |
421 } | |
422 | |
423 /* | |
424 * set new bits per character | |
425 */ | |
426 switch (uart_parameters_req->comPar.bpc) | |
427 { | |
428 case UART_IO_BPC_7: | |
429 uart_data->ker.act_bpc = bpc_7; | |
430 break; | |
431 case UART_IO_BPC_8: | |
432 uart_data->ker.act_bpc = bpc_8; | |
433 break; | |
434 case UART_IO_BPC_UNDEF: /* unchanged */ | |
435 break; | |
436 default: | |
437 TRACE_ERROR( "UART_PARAMETERS_REQ: bpc unexpected" ); | |
438 break; | |
439 } | |
440 | |
441 /* | |
442 * set new stop bit | |
443 */ | |
444 switch (uart_parameters_req->comPar.nsb) | |
445 { | |
446 case UART_IO_SB_1: | |
447 uart_data->ker.act_sb = sb_1; | |
448 break; | |
449 case UART_IO_SB_2: | |
450 uart_data->ker.act_sb = sb_2; | |
451 break; | |
452 case UART_IO_SB_UNDEF: /* unchanged */ | |
453 break; | |
454 default: | |
455 TRACE_ERROR( "UART_PARAMETERS_REQ: stop bits unexpected" ); | |
456 break; | |
457 } | |
458 | |
459 /* | |
460 * set new parity | |
461 */ | |
462 switch (uart_parameters_req->comPar.parity) | |
463 { | |
464 case UART_IO_PA_NONE: | |
465 uart_data->ker.act_par = pa_none; | |
466 break; | |
467 case UART_IO_PA_EVEN: | |
468 uart_data->ker.act_par = pa_even; | |
469 break; | |
470 case UART_IO_PA_ODD: | |
471 uart_data->ker.act_par = pa_odd; | |
472 break; | |
473 case UART_IO_PA_SPACE: | |
474 uart_data->ker.act_par = pa_space; | |
475 break; | |
476 case UART_IO_PA_UNDEF: /* unchanged */ | |
477 break; | |
478 default: | |
479 TRACE_ERROR( "UART_PARAMETERS_REQ: parity unexpected" ); | |
480 break; | |
481 } | |
482 | |
483 /* | |
484 * set new XON / XOFF values | |
485 */ | |
486 if(uart_parameters_req->comPar.xon_valid EQ UART_IO_XON_VALID) | |
487 uart_data->ker.act_xon = uart_parameters_req->comPar.xon; | |
488 if(uart_parameters_req->comPar.xoff_valid EQ UART_IO_XOFF_VALID) | |
489 uart_data->ker.act_xoff = uart_parameters_req->comPar.xoff; | |
490 #endif /* FF_MULTI_PORT */ | |
491 | |
492 /* | |
493 * set new escape detection values | |
494 */ | |
495 if(uart_parameters_req->comPar.esc_valid EQ UART_IO_ESC_VALID) | |
496 { | |
497 #ifdef FF_MULTI_PORT | |
498 uart_data->ker.act_dcb.EscChar = uart_parameters_req->comPar.esc_char; | |
499 uart_data->ker.act_dcb.GuardPeriod = uart_parameters_req->comPar.esc_gp; | |
500 #else /* FF_MULTI_PORT */ | |
501 uart_data->ker.act_ec = uart_parameters_req->comPar.esc_char; | |
502 uart_data->ker.act_gp = uart_parameters_req->comPar.esc_gp; | |
503 #endif /* FF_MULTI_PORT */ | |
504 } | |
505 | |
506 /* | |
507 * free the received primitive | |
508 */ | |
509 PFREE(uart_parameters_req); | |
510 | |
511 switch( GET_STATE( UART_SERVICE_KER ) ) | |
512 { | |
513 case KER_READY: | |
514 /* | |
515 * flush all still to send data | |
516 */ | |
517 uart_data->ker.received_prim|= UART_PARAMETERS_REQ_MASK; | |
518 uart_data->ker.flush_state = UART_KER_DRX_FLUSH; | |
519 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; | |
520 dlc->flushed = FALSE; | |
521 uart_data->drx = dlc->drx; | |
522 sig_ker_drx_flush_req(); | |
523 break; | |
524 | |
525 case KER_MUX: | |
526 case KER_MUX_ESTABLISH: | |
527 case KER_MUX_DLC_CLOSING: | |
528 case KER_MUX_CLOSING: | |
529 case KER_MUX_CLOSED: | |
530 /* | |
531 * flush all still to send data | |
532 */ | |
533 uart_data->ker.received_prim|= UART_PARAMETERS_REQ_MASK; | |
534 uart_data->ker.flush_state = UART_KER_DRX_FLUSH; | |
535 /* | |
536 * mark all to flush DLCs | |
537 */ | |
538 for(i = 0; i < UART_MAX_NUMBER_OF_CHANNELS; i++) | |
539 { | |
540 dlc = &uart_data->dlc_table[i]; | |
541 if((i EQ UART_CONTROL_INSTANCE) || | |
542 (dlc->connection_state EQ UART_CONNECTION_OPEN)) | |
543 { | |
544 dlc->flushed = FALSE; | |
545 } | |
546 } | |
547 /* | |
548 * initiate flush in all to flushed DLCs | |
549 */ | |
550 for(i = 0; i < UART_MAX_NUMBER_OF_CHANNELS; i++) | |
551 { | |
552 dlc = &uart_data->dlc_table[i]; | |
553 if(dlc->flushed NEQ TRUE) | |
554 { | |
555 if(i EQ UART_CONTROL_INSTANCE) | |
556 { | |
557 if(uart_data->ker.tx_data_desc EQ NULL) | |
558 sig_any_ker_flushed_ind(UART_CONTROL_INSTANCE); | |
559 } | |
560 else | |
561 { | |
562 uart_data->drx = dlc->drx; | |
563 sig_ker_drx_flush_req(); | |
564 } | |
565 } | |
566 } | |
567 break; | |
568 | |
569 case KER_DEAD: | |
570 /* | |
571 * set new UART parameters | |
572 */ | |
573 ker_setupUart(); | |
574 | |
575 #ifdef FF_MULTI_PORT | |
576 uart_data->ker.act_ec = uart_data->ker.act_dcb.EscChar; | |
577 uart_data->ker.act_gp = uart_data->ker.act_dcb.GuardPeriod; | |
578 #endif /* FF_MULTI_PORT */ | |
579 | |
580 /* | |
581 * send confirm primitive | |
582 */ | |
583 { | |
584 PALLOC (uart_parameters_cnf, UART_PARAMETERS_CNF); | |
585 uart_parameters_cnf->device = uart_data->device; | |
586 PSEND (hCommMMI, uart_parameters_cnf); | |
587 } | |
588 break; | |
589 | |
590 default: | |
591 TRACE_ERROR( "UART_PARAMETERS_REQ unexpected" ); | |
592 break; | |
593 } | |
594 } /* ker_uart_parameters_req() */ | |
595 | |
596 | |
597 | |
598 /* | |
599 +------------------------------------------------------------------------------ | |
600 | Function : ker_uart_dti_req | |
601 +------------------------------------------------------------------------------ | |
602 | Description : Handles the primitive UART_DTI_REQ | |
603 | | |
604 | Parameters : *uart_dti_req - Ptr to primitive payload | |
605 | | |
606 +------------------------------------------------------------------------------ | |
607 */ | |
608 GLOBAL void ker_uart_dti_req ( T_UART_DTI_REQ *uart_dti_req ) | |
609 { | |
610 T_DLC* dlc; | |
611 UBYTE dlc_instance; /* dlc_instance is used as the channel number for dtilib */ | |
612 #ifdef DTILIB | |
613 U8 isOK; | |
614 #else /* DTILIB */ | |
615 T_HANDLE hCommUPLINK; | |
616 #endif /* DTILIB */ | |
617 | |
618 TRACE_FUNCTION( "ker_uart_dti_req" ); | |
619 | |
620 #ifdef UART_RANGE_CHECK | |
621 if(uart_dti_req EQ NULL) | |
622 { | |
623 TRACE_EVENT("ERROR: uart_dti_req is NULL"); | |
624 } | |
625 else if((*((ULONG*)((UBYTE*)uart_dti_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
626 { | |
627 TRACE_EVENT_P1("ERROR: uart_dti_req=%08x is not allocated", | |
628 uart_dti_req); | |
629 } | |
630 else if(uart_dti_req->device >= UART_INSTANCES) | |
631 { | |
632 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
633 uart_dti_req->device, | |
634 UART_INSTANCES); | |
635 } | |
636 #endif /* UART_RANGE_CHECK */ | |
637 | |
638 /* | |
639 * set UART instance | |
640 */ | |
641 uart_data = &uart_data_base[uart_dti_req->device]; | |
642 | |
643 switch( GET_STATE( UART_SERVICE_KER ) ) | |
644 { | |
645 case KER_MUX: | |
646 case KER_MUX_DLC_CLOSING: | |
647 dlc_instance = uart_data->dlc_instance[uart_dti_req->dlci]; | |
648 break; | |
649 | |
650 default: | |
651 dlc_instance = UART_CONTROL_INSTANCE; | |
652 break; | |
653 } | |
654 | |
655 dlc = &uart_data->dlc_table[dlc_instance]; | |
656 /* | |
657 * close communication channel | |
658 * if it is already closed, silently discard primitive | |
659 */ | |
660 if(dlc->dti_state NEQ DTI_CLOSED) | |
661 { | |
662 dti_close( | |
663 uart_hDTI, | |
664 uart_data->device, | |
665 UART_DTI_UP_INTERFACE, | |
666 dlc_instance, | |
667 FALSE | |
668 ); | |
669 dlc->dti_state = DTI_CLOSED; | |
670 | |
671 /* | |
672 * no reopen | |
673 */ | |
674 if (uart_dti_req->dti_conn EQ UART_DISCONNECT_DTI) | |
675 { | |
676 PALLOC (uart_dti_cnf, UART_DTI_CNF); | |
677 uart_data->drx = dlc->drx; | |
678 uart_data->dtx = dlc->dtx; | |
679 sig_ker_drx_disconnected_mode_req(); | |
680 sig_ker_dtx_disconnected_mode_req(); | |
681 | |
682 /* | |
683 * send confirm primitive | |
684 */ | |
685 uart_dti_cnf->device = uart_data->device; | |
686 uart_dti_cnf->dlci = uart_data->dlc_table[dlc_instance].dlci; /* EQ dlci */ | |
687 uart_dti_cnf->dti_conn = UART_DISCONNECT_DTI; | |
688 PSEND (hCommMMI, uart_dti_cnf); | |
689 | |
690 return; | |
691 } | |
692 } | |
693 | |
694 #ifdef DTILIB | |
695 if( GET_STATE( UART_SERVICE_KER ) EQ KER_DEAD ) | |
696 { | |
697 /* | |
698 * set dlc values - this has to happen before | |
699 * the call of dti_open, because within that call | |
700 * a callback-function may be called which makes | |
701 * use of them.. | |
702 */ | |
703 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; | |
704 dlc->drx = &uart_data->drx_base[0]; | |
705 dlc->dtx = &uart_data->dtx_base[0]; | |
706 dlc->dlci = 0; | |
707 uart_data->dlc_instance[0] = UART_CONTROL_INSTANCE; | |
708 dlc->priority = 0; | |
709 dlc->lines = 0; | |
710 } | |
711 | |
712 /* | |
713 * set DTI connection | |
714 */ | |
715 dlc->dti_state = DTI_SETUP; | |
716 | |
717 uart_data->drx = dlc->drx; | |
718 uart_data->dtx = dlc->dtx; | |
719 #endif /* DTILIB */ | |
720 | |
721 #ifdef _SIMULATION_ | |
722 /* | |
723 * !!! Problem with entity_name which is a pointer in new SAP | |
724 * !!! therefore we set the peer entity simply to "MMI". | |
725 * !!! This should be corrected in order to allow test case simulations | |
726 * !!! with other peer entities. | |
727 */ | |
728 | |
729 #ifdef DTILIB | |
730 isOK = dti_open( | |
731 uart_hDTI, | |
732 uart_data->device, | |
733 UART_DTI_UP_INTERFACE, | |
734 dlc_instance, | |
735 UART_UPLINK_QUEUE_SIZE, | |
736 uart_dti_req->direction, | |
737 DTI_QUEUE_UNUSED, | |
738 DTI_VERSION_10, | |
739 "MMI", | |
740 uart_dti_req->link_id | |
741 ); | |
742 #else /* DTILIB */ | |
743 hCommUPLINK = vsi_c_open (VSI_CALLER "MMI"); | |
744 #endif /* DTILIB */ | |
745 #else /* _SIMULATION_ */ | |
746 /* | |
747 * open new communication channel | |
748 */ | |
749 #ifdef DTILIB | |
750 isOK = dti_open( | |
751 uart_hDTI, | |
752 uart_data->device, | |
753 UART_DTI_UP_INTERFACE, | |
754 dlc_instance, | |
755 UART_UPLINK_QUEUE_SIZE, | |
756 uart_dti_req->direction, | |
757 DTI_QUEUE_UNUSED, | |
758 DTI_VERSION_10, | |
759 (U8*)(uart_dti_req->entity_name), | |
760 uart_dti_req->link_id | |
761 ); | |
762 #else /* DTILIB */ | |
763 hCommUPLINK = vsi_c_open (VSI_CALLER | |
764 (char *)(uart_dti_req->entity_name)); | |
765 #endif /* DTILIB */ | |
766 #endif /* _SIMULATION_ */ | |
767 | |
768 | |
769 #ifdef DTILIB | |
770 if(!isOK) | |
771 /* error?! */ | |
772 /* | |
773 * NOTE: internal initialization of the new communication channel | |
774 * is done in sig_dti_ker_connection_opened() when using DTILIB | |
775 * | |
776 * when debugging the below code, please also have a look there!! | |
777 */ | |
778 #else /* DTILIB */ | |
779 uart_data->tui_uart = uart_dti_req->tui_uart; | |
780 if(hCommUPLINK >= VSI_OK) | |
781 { | |
782 PALLOC (uart_dti_cnf, UART_DTI_CNF); | |
783 /* | |
784 * send confirm primitive | |
785 */ | |
786 uart_dti_cnf->device = uart_data->device; | |
787 uart_dti_cnf->dlci = uart_dti_req->dlci; | |
788 uart_dti_cnf->dti_conn = UART_CONNECT_DTI; | |
789 PSEND (hCommMMI, uart_dti_cnf); | |
790 /* | |
791 * initialize new communication channel | |
792 */ | |
793 switch( GET_STATE( UART_SERVICE_KER ) ) | |
794 { | |
795 case KER_DEAD: | |
796 SET_STATE( UART_SERVICE_KER, KER_READY ); | |
797 /* | |
798 * enable UART | |
799 */ | |
800 #ifdef _SIMULATION_ | |
801 { | |
802 /* | |
803 * send DTI_GETDATA_REQ | |
804 */ | |
805 PALLOC (dti_getdata_req, DTI2_GETDATA_REQ); | |
806 dti_getdata_req->tui = 2; /* for enable */ | |
807 dti_getdata_req->c_id = 0; | |
808 dti_getdata_req->op_ack = 0; | |
809 PSEND (hCommMMI, dti_getdata_req); | |
810 } | |
811 #else /* _SIMULATION_ */ | |
812 #ifndef FF_MULTI_PORT | |
813 if((ret=UF_Enable (uart_data->device, TRUE)) NEQ UF_OK) | |
814 { | |
815 TRACE_ERROR_P2("UF Driver: Can't enable UART, [%d], uart_kerp.c(%d)", | |
816 ret,__LINE__); | |
817 } | |
818 #endif /* !FF_MULTI_PORT */ | |
819 #endif /* _SIMULATION */ | |
820 /* | |
821 * set dlc values | |
822 */ | |
823 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; | |
824 dlc->drx = &uart_data->drx_base[0]; | |
825 dlc->dtx = &uart_data->dtx_base[0]; | |
826 dlc->dlci = 0; | |
827 dlc->priority = 0; | |
828 dlc->lines = 0; | |
829 /* | |
830 * set RX and TX in ready mode | |
831 */ | |
832 sig_ker_rx_ready_mode_req(); | |
833 sig_ker_tx_ready_mode_req(); | |
834 /* | |
835 * set DTI connection | |
836 */ | |
837 dlc->hCommUPLINK = hCommUPLINK; | |
838 uart_data->drx = dlc->drx; | |
839 uart_data->dtx = dlc->dtx; | |
840 sig_ker_drx_ready_mode_req(UART_CONTROL_INSTANCE); | |
841 sig_ker_dtx_ready_mode_req(UART_CONTROL_INSTANCE); | |
842 sig_ker_drx_set_dti_peer_req(uart_dti_req->tui_peer, | |
843 hCommUPLINK, | |
844 uart_dti_req->c_id); | |
845 sig_ker_dtx_set_dti_peer_req(uart_dti_req->tui_peer, | |
846 hCommUPLINK, | |
847 uart_dti_req->c_id); | |
848 | |
849 break; | |
850 | |
851 case KER_READY: | |
852 case KER_MUX: | |
853 dlc->hCommUPLINK = hCommUPLINK; | |
854 uart_data->drx = dlc->drx; | |
855 uart_data->dtx = dlc->dtx; | |
856 sig_ker_drx_set_dti_peer_req(uart_dti_req->tui_peer, | |
857 hCommUPLINK, | |
858 uart_dti_req->c_id); | |
859 sig_ker_dtx_set_dti_peer_req(uart_dti_req->tui_peer, | |
860 hCommUPLINK, | |
861 uart_dti_req->c_id); | |
862 break; | |
863 | |
864 default: | |
865 TRACE_ERROR( "UART_DTI_REQ unexpected" ); | |
866 break; | |
867 } | |
868 } | |
869 else /* UPLINK OK */ | |
870 #endif /* DTILIB */ | |
871 { | |
872 /* | |
873 * send error primitive if communication channel is not opened | |
874 */ | |
875 PALLOC (uart_error_ind, UART_ERROR_IND); | |
876 uart_error_ind->device = uart_data->device; | |
877 uart_error_ind->dlci = uart_dti_req->dlci; | |
878 uart_error_ind->error = UART_ERROR_NO_CHANNEL; | |
879 PSEND (hCommMMI, uart_error_ind); | |
880 } | |
881 | |
882 /* | |
883 * free the received primitive | |
884 */ | |
885 PFREE(uart_dti_req); | |
886 } /* ker_uart_dti_req() */ | |
887 | |
888 | |
889 /* | |
890 +------------------------------------------------------------------------------ | |
891 | Function : ker_uart_disable_req | |
892 +------------------------------------------------------------------------------ | |
893 | Description : Handles the primitive UART_DISABLE_REQ | |
894 | | |
895 | Parameters : *uart_disable_req - Ptr to primitive payload | |
896 | | |
897 +------------------------------------------------------------------------------ | |
898 */ | |
899 GLOBAL void ker_uart_disable_req ( T_UART_DISABLE_REQ *uart_disable_req ) | |
900 { | |
901 UBYTE i; | |
902 T_DLC* dlc; | |
903 | |
904 TRACE_FUNCTION( "ker_uart_disable_req" ); | |
905 | |
906 #ifdef UART_RANGE_CHECK | |
907 if(uart_disable_req EQ NULL) | |
908 { | |
909 TRACE_EVENT("ERROR: uart_disable_req is NULL"); | |
910 } | |
911 else if((*((ULONG*)((UBYTE*)uart_disable_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
912 { | |
913 TRACE_EVENT_P1("ERROR: uart_disable_req=%08x is not allocated", | |
914 uart_disable_req); | |
915 } | |
916 else if(uart_disable_req->device >= UART_INSTANCES) | |
917 { | |
918 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
919 uart_disable_req->device, | |
920 UART_INSTANCES); | |
921 } | |
922 #endif /* UART_RANGE_CHECK */ | |
923 | |
924 /* | |
925 * set UART instance | |
926 */ | |
927 uart_data = &uart_data_base[uart_disable_req->device]; | |
928 | |
929 /* | |
930 * free the received primitive | |
931 */ | |
932 PFREE(uart_disable_req); | |
933 | |
934 switch( GET_STATE( UART_SERVICE_KER ) ) | |
935 { | |
936 case KER_READY: | |
937 /* | |
938 * flush all still to send data | |
939 */ | |
940 uart_data->ker.received_prim|= UART_DISABLE_REQ_MASK; | |
941 uart_data->ker.flush_state = UART_KER_DRX_FLUSH; | |
942 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; | |
943 dlc->flushed = FALSE; | |
944 uart_data->drx = dlc->drx; | |
945 sig_ker_drx_flush_req(); | |
946 break; | |
947 | |
948 case KER_MUX: | |
949 case KER_MUX_ESTABLISH: | |
950 case KER_MUX_DLC_CLOSING: | |
951 case KER_MUX_CLOSING: | |
952 case KER_MUX_CLOSED: | |
953 /* | |
954 * flush all still to send data | |
955 */ | |
956 uart_data->ker.received_prim|= UART_DISABLE_REQ_MASK; | |
957 uart_data->ker.flush_state = UART_KER_DRX_FLUSH; | |
958 /* | |
959 * mark all to flush DLCs | |
960 */ | |
961 for(i = 0; i < UART_MAX_NUMBER_OF_CHANNELS; i++) | |
962 { | |
963 dlc = &uart_data->dlc_table[i]; | |
964 if((i EQ UART_CONTROL_INSTANCE) || | |
965 (dlc->connection_state EQ UART_CONNECTION_OPEN)) | |
966 { | |
967 dlc->flushed = FALSE; | |
968 } | |
969 } | |
970 /* | |
971 * initiate flush in all to flushed DLCs | |
972 */ | |
973 for(i = 0; i < UART_MAX_NUMBER_OF_CHANNELS; i++) | |
974 { | |
975 dlc = &uart_data->dlc_table[i]; | |
976 if(dlc->flushed NEQ TRUE) | |
977 { | |
978 if(i EQ UART_CONTROL_INSTANCE) | |
979 { | |
980 if(uart_data->ker.tx_data_desc EQ NULL) | |
981 sig_any_ker_flushed_ind(UART_CONTROL_INSTANCE); | |
982 } | |
983 else | |
984 { | |
985 uart_data->drx = dlc->drx; | |
986 sig_ker_drx_flush_req(); | |
987 } | |
988 } | |
989 } | |
990 break; | |
991 | |
992 case KER_DEAD: | |
993 /* | |
994 * send confirm primitive | |
995 */ | |
996 { | |
997 PALLOC (uart_disable_cnf, UART_DISABLE_CNF); | |
998 uart_disable_cnf->device = uart_data->device; | |
999 PSEND (hCommMMI, uart_disable_cnf); | |
1000 } | |
1001 break; | |
1002 | |
1003 default: | |
1004 TRACE_ERROR( "UART_DISABLE_REQ unexpected" ); | |
1005 break; | |
1006 } | |
1007 } /* ker_uart_disable_req() */ | |
1008 | |
1009 | |
1010 | |
1011 /* | |
1012 +------------------------------------------------------------------------------ | |
1013 | Function : ker_uart_ring_req | |
1014 +------------------------------------------------------------------------------ | |
1015 | Description : Handles the primitive UART_RING_REQ | |
1016 | | |
1017 | Parameters : *uart_ring_req - Ptr to primitive payload | |
1018 | | |
1019 +------------------------------------------------------------------------------ | |
1020 */ | |
1021 GLOBAL void ker_uart_ring_req ( T_UART_RING_REQ *uart_ring_req ) | |
1022 { | |
1023 T_DLC* dlc; | |
1024 | |
1025 TRACE_FUNCTION( "ker_uart_ring_req" ); | |
1026 | |
1027 #ifdef UART_RANGE_CHECK | |
1028 if(uart_ring_req EQ NULL) | |
1029 { | |
1030 TRACE_EVENT("ERROR: uart_ring_req is NULL"); | |
1031 } | |
1032 else if((*((ULONG*)((UBYTE*)uart_ring_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
1033 { | |
1034 TRACE_EVENT_P1("ERROR: uart_ring_req=%08x is not allocated", | |
1035 uart_ring_req); | |
1036 } | |
1037 else if(uart_ring_req->device >= UART_INSTANCES) | |
1038 { | |
1039 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
1040 uart_ring_req->device, | |
1041 UART_INSTANCES); | |
1042 } | |
1043 #endif /* UART_RANGE_CHECK */ | |
1044 | |
1045 /* | |
1046 * set UART instance | |
1047 */ | |
1048 uart_data = &uart_data_base[uart_ring_req->device]; | |
1049 | |
1050 /* | |
1051 * set DLC instance | |
1052 */ | |
1053 if((GET_STATE( UART_SERVICE_KER )) EQ KER_READY) | |
1054 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; | |
1055 else | |
1056 dlc = &uart_data->dlc_table[uart_data-> | |
1057 dlc_instance[uart_ring_req->dlci]]; | |
1058 | |
1059 /* | |
1060 * store new line states | |
1061 */ | |
1062 if(uart_ring_req->line_state EQ UART_LINE_ON) | |
1063 { | |
1064 TRACE_EVENT_P1("RING: on - DLCI=%d", uart_ring_req->dlci); | |
1065 dlc->lines|= UART_RI_MASK; | |
1066 } | |
1067 else | |
1068 { | |
1069 TRACE_EVENT_P1("RING: off - DLCI=%d", uart_ring_req->dlci); | |
1070 dlc->lines&= ~(UART_RI_MASK); | |
1071 } | |
1072 | |
1073 /* | |
1074 * free the received primitive | |
1075 */ | |
1076 PFREE(uart_ring_req); | |
1077 | |
1078 switch( GET_STATE( UART_SERVICE_KER ) ) | |
1079 { | |
1080 case KER_READY: | |
1081 case KER_MUX: | |
1082 /* | |
1083 * flush all still to send data | |
1084 */ | |
1085 dlc->received_prim |= UART_RING_REQ_MASK; | |
1086 uart_data->ker.flush_state = UART_KER_DRX_FLUSH; | |
1087 dlc->flushed = FALSE; | |
1088 uart_data->drx = dlc->drx; | |
1089 sig_ker_drx_flush_req(); | |
1090 break; | |
1091 | |
1092 default: | |
1093 TRACE_ERROR( "UART_RING_REQ unexpected" ); | |
1094 break; | |
1095 } | |
1096 } /* ker_uart_ring_req() */ | |
1097 | |
1098 | |
1099 | |
1100 /* | |
1101 +------------------------------------------------------------------------------ | |
1102 | Function : ker_uart_dcd_req | |
1103 +------------------------------------------------------------------------------ | |
1104 | Description : Handles the primitive UART_DCD_REQ | |
1105 | | |
1106 | Parameters : *uart_dcd_req - Ptr to primitive payload | |
1107 | | |
1108 +------------------------------------------------------------------------------ | |
1109 */ | |
1110 GLOBAL void ker_uart_dcd_req ( T_UART_DCD_REQ *uart_dcd_req ) | |
1111 { | |
1112 T_DLC* dlc; | |
1113 | |
1114 TRACE_FUNCTION( "ker_uart_dcd_req" ); | |
1115 | |
1116 #ifdef UART_RANGE_CHECK | |
1117 if(uart_dcd_req EQ NULL) | |
1118 { | |
1119 TRACE_EVENT("ERROR: uart_dcd_req is NULL"); | |
1120 } | |
1121 else if((*((ULONG*)((UBYTE*)uart_dcd_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
1122 { | |
1123 TRACE_EVENT_P1("ERROR: uart_dcd_req=%08x is not allocated", | |
1124 uart_dcd_req); | |
1125 } | |
1126 else if(uart_dcd_req->device >= UART_INSTANCES) | |
1127 { | |
1128 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
1129 uart_dcd_req->device, | |
1130 UART_INSTANCES); | |
1131 } | |
1132 #endif /* UART_RANGE_CHECK */ | |
1133 | |
1134 /* | |
1135 * set UART instance | |
1136 */ | |
1137 uart_data = &uart_data_base[uart_dcd_req->device]; | |
1138 | |
1139 /* | |
1140 * set DLC instance | |
1141 */ | |
1142 if((GET_STATE( UART_SERVICE_KER )) EQ KER_READY) | |
1143 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; | |
1144 else | |
1145 dlc = &uart_data->dlc_table[uart_data-> | |
1146 dlc_instance[uart_dcd_req->dlci]]; | |
1147 | |
1148 /* | |
1149 * store new line states | |
1150 */ | |
1151 if(uart_dcd_req->line_state EQ UART_LINE_ON) | |
1152 { | |
1153 TRACE_EVENT_P1("DCD: on - DLCI=%d", uart_dcd_req->dlci); | |
1154 dlc->lines&= ~(UART_DCD_MASK); | |
1155 } | |
1156 else | |
1157 { | |
1158 TRACE_EVENT_P1("DCD: off - DLCI=%d", uart_dcd_req->dlci); | |
1159 dlc->lines|= UART_DCD_MASK; | |
1160 } | |
1161 | |
1162 /* | |
1163 * free the received primitive | |
1164 */ | |
1165 PFREE(uart_dcd_req); | |
1166 | |
1167 switch( GET_STATE( UART_SERVICE_KER ) ) | |
1168 { | |
1169 case KER_READY: | |
1170 case KER_MUX: | |
1171 /* | |
1172 * flush all still to send data | |
1173 */ | |
1174 dlc->received_prim |= UART_DCD_REQ_MASK; | |
1175 uart_data->ker.flush_state = UART_KER_DRX_FLUSH; | |
1176 dlc->flushed = FALSE; | |
1177 uart_data->drx = dlc->drx; | |
1178 sig_ker_drx_flush_req(); | |
1179 break; | |
1180 | |
1181 default: | |
1182 TRACE_ERROR( "UART_DCD_REQ unexpected" ); | |
1183 break; | |
1184 } | |
1185 } /* ker_uart_dcd_req() */ | |
1186 | |
1187 | |
1188 | |
1189 /* | |
1190 +------------------------------------------------------------------------------ | |
1191 | Function : ker_uart_escape_req | |
1192 +------------------------------------------------------------------------------ | |
1193 | Description : Handles the primitive UART_ESCAPE_REQ | |
1194 | | |
1195 | Parameters : *uart_escape_req - Ptr to primitive payload | |
1196 | | |
1197 +------------------------------------------------------------------------------ | |
1198 */ | |
1199 GLOBAL void ker_uart_escape_req ( T_UART_ESCAPE_REQ *uart_escape_req ) | |
1200 { | |
1201 | |
1202 TRACE_FUNCTION( "ker_uart_escape_req" ); | |
1203 | |
1204 #ifdef UART_RANGE_CHECK | |
1205 if(uart_escape_req EQ NULL) | |
1206 { | |
1207 TRACE_EVENT("ERROR: uart_escape_req is NULL"); | |
1208 } | |
1209 else if((*((ULONG*)((UBYTE*)uart_escape_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
1210 { | |
1211 TRACE_EVENT_P1("ERROR: uart_escape_req=%08x is not allocated", | |
1212 uart_escape_req); | |
1213 } | |
1214 else if(uart_escape_req->device >= UART_INSTANCES) | |
1215 { | |
1216 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
1217 uart_escape_req->device, | |
1218 UART_INSTANCES); | |
1219 } | |
1220 #endif /* UART_RANGE_CHECK */ | |
1221 | |
1222 /* | |
1223 * set UART instance | |
1224 */ | |
1225 uart_data = &uart_data_base[uart_escape_req->device]; | |
1226 | |
1227 /* | |
1228 * set DLC instance | |
1229 */ | |
1230 /* Following part of code is not required so put under comment ,but may be used | |
1231 * in future | |
1232 */ | |
1233 /* | |
1234 if((GET_STATE( UART_SERVICE_KER )) EQ KER_READY) | |
1235 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; | |
1236 else | |
1237 dlc = &uart_data->dlc_table[uart_data-> | |
1238 dlc_instance[uart_escape_req->dlci]]; | |
1239 */ | |
1240 /* | |
1241 * Send confirmation to ACI | |
1242 */ | |
1243 { | |
1244 PALLOC (uart_escape_cnf, UART_ESCAPE_CNF); | |
1245 | |
1246 uart_escape_cnf->device = uart_escape_req->device; | |
1247 uart_escape_cnf->dlci = uart_escape_req->dlci; | |
1248 | |
1249 PSEND (hCommMMI, uart_escape_cnf); | |
1250 } | |
1251 | |
1252 /* | |
1253 * TODO: Set escape on/off parameter in dtx, | |
1254 * Call UF_SetEscape and handle/stop ongoing | |
1255 * escape sequence detection if required | |
1256 */ | |
1257 | |
1258 /* | |
1259 * free the received primitive | |
1260 */ | |
1261 PFREE(uart_escape_req); | |
1262 | |
1263 switch( GET_STATE( UART_SERVICE_KER ) ) | |
1264 { | |
1265 case KER_READY: | |
1266 case KER_MUX: | |
1267 break; | |
1268 | |
1269 default: | |
1270 TRACE_ERROR( "UART_ESCAPE_REQ unexpected" ); | |
1271 break; | |
1272 } | |
1273 } /* ker_uart_escape_req() */ | |
1274 | |
1275 | |
1276 | |
1277 /* | |
1278 +------------------------------------------------------------------------------ | |
1279 | Function : ker_uart_mux_start_req | |
1280 +------------------------------------------------------------------------------ | |
1281 | Description : Handles the primitive UART_MUX_START_REQ | |
1282 | | |
1283 | Parameters : *uart_mux_start_req - Ptr to primitive payload | |
1284 | | |
1285 +------------------------------------------------------------------------------ | |
1286 */ | |
1287 GLOBAL void ker_uart_mux_start_req ( T_UART_MUX_START_REQ *uart_mux_start_req ) | |
1288 { | |
1289 T_DLC* dlc; | |
1290 #ifndef _SIMULATION_ | |
1291 USHORT ret; | |
1292 #endif | |
1293 TRACE_FUNCTION( "ker_uart_mux_start_req" ); | |
1294 | |
1295 #ifdef UART_RANGE_CHECK | |
1296 if(uart_mux_start_req EQ NULL) | |
1297 { | |
1298 TRACE_EVENT("ERROR: uart_mux_start_req is NULL"); | |
1299 } | |
1300 else if((*((ULONG*)((UBYTE*)uart_mux_start_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
1301 { | |
1302 TRACE_EVENT_P1("ERROR: uart_mux_start_req=%08x is not allocated", | |
1303 uart_mux_start_req); | |
1304 } | |
1305 else if(uart_mux_start_req->device >= UART_INSTANCES) | |
1306 { | |
1307 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
1308 uart_mux_start_req->device, | |
1309 UART_INSTANCES); | |
1310 } | |
1311 #endif /* UART_RANGE_CHECK */ | |
1312 | |
1313 /* | |
1314 * set UART instance | |
1315 */ | |
1316 uart_data = &uart_data_base[uart_mux_start_req->device]; | |
1317 | |
1318 /* | |
1319 * set parameters | |
1320 */ | |
1321 uart_data->n1 = uart_mux_start_req->n1; | |
1322 uart_data->ker.n2 = uart_mux_start_req->n2; | |
1323 sig_ker_rt_parameters_req(uart_mux_start_req->t1, | |
1324 uart_mux_start_req->t2, | |
1325 uart_mux_start_req->t3); | |
1326 | |
1327 /* | |
1328 * free the received primitive | |
1329 */ | |
1330 PFREE(uart_mux_start_req); | |
1331 | |
1332 switch( GET_STATE( UART_SERVICE_KER ) ) | |
1333 { | |
1334 case KER_READY: | |
1335 /* | |
1336 * flush all still to send data | |
1337 */ | |
1338 uart_data->ker.received_prim|= UART_MUX_START_REQ_MASK; | |
1339 uart_data->ker.flush_state = UART_KER_DRX_FLUSH; | |
1340 dlc = &uart_data->dlc_table[UART_CONTROL_INSTANCE]; | |
1341 dlc->flushed = FALSE; | |
1342 uart_data->drx = dlc->drx; | |
1343 sig_ker_drx_flush_req(); | |
1344 break; | |
1345 | |
1346 case KER_DEAD: | |
1347 SET_STATE( UART_SERVICE_KER, KER_MUX_ESTABLISH ); | |
1348 #ifdef _SIMULATION_ | |
1349 { | |
1350 /* | |
1351 * send DTI_GETDATA_REQ | |
1352 */ | |
1353 PALLOC (dti_getdata_req, DTI2_GETDATA_REQ); | |
1354 #ifdef DTI2 | |
1355 dti_getdata_req->link_id = LINK_ENABLE_PORT_1; /* for enable */ | |
1356 #else /* DTI2 */ | |
1357 dti_getdata_req->tui = 2; /* for enable */ | |
1358 dti_getdata_req->c_id = 0; | |
1359 dti_getdata_req->op_ack = 0; | |
1360 #endif /* DTI2 */ | |
1361 PSEND (hCommMMI, dti_getdata_req); | |
1362 } | |
1363 #else /* _SIMULATION_ */ | |
1364 #ifndef FF_MULTI_PORT | |
1365 if((ret = UF_Enable (uart_data->device, TRUE)) NEQ UF_OK) | |
1366 { | |
1367 TRACE_ERROR_P2("UF Driver: Can't enable UART, [%d], uart_kerp.c(%d)", | |
1368 ret,__LINE__); | |
1369 } | |
1370 #endif /* !FF_MULTI_PORT */ | |
1371 #endif /* _SIMULATION */ | |
1372 | |
1373 /* | |
1374 * set RX and TX service in mux mode | |
1375 */ | |
1376 sig_ker_rx_mux_mode_req(); | |
1377 sig_ker_tx_mux_mode_req(); | |
1378 /* | |
1379 * start reception | |
1380 */ | |
1381 MALLOC(uart_data->ker.rx_data_desc, (USHORT)(sizeof(T_desc2) - | |
1382 1 + | |
1383 uart_data->n1 + | |
1384 2)); | |
1385 uart_data->ker.rx_data_desc->next = (ULONG)NULL; | |
1386 uart_data->ker.rx_data_desc->len = 0; | |
1387 sig_ker_rx_ready_to_receive_req(uart_data->ker.rx_data_desc, | |
1388 0, | |
1389 (USHORT)(uart_data->n1 + 2)); | |
1390 /* | |
1391 * start timer | |
1392 */ | |
1393 sig_ker_rt_start_t3_req(); | |
1394 | |
1395 /* | |
1396 * send confirm primitive | |
1397 */ | |
1398 { | |
1399 PALLOC (uart_mux_start_cnf, UART_MUX_START_CNF); | |
1400 uart_mux_start_cnf->device = uart_data->device; | |
1401 PSEND (hCommMMI, uart_mux_start_cnf); | |
1402 } | |
1403 break; | |
1404 | |
1405 default: | |
1406 TRACE_ERROR( "UART_MUX_START_REQ unexpected" ); | |
1407 break; | |
1408 } | |
1409 } /* ker_uart_mux_start_req() */ | |
1410 | |
1411 | |
1412 | |
1413 /* | |
1414 +------------------------------------------------------------------------------ | |
1415 | Function : ker_uart_mux_dlc_establish_res | |
1416 +------------------------------------------------------------------------------ | |
1417 | Description : Handles the primitive UART_MUX_DLC_ESTABLISH_RES | |
1418 | | |
1419 | Parameters : *uart_mux_dlc_establish_res - Ptr to primitive payload | |
1420 | | |
1421 +------------------------------------------------------------------------------ | |
1422 */ | |
1423 GLOBAL void ker_uart_mux_dlc_establish_res ( | |
1424 T_UART_MUX_DLC_ESTABLISH_RES *uart_mux_dlc_establish_res ) | |
1425 { | |
1426 T_desc2* temp_desc; | |
1427 T_DLC* dlc; | |
1428 | |
1429 TRACE_FUNCTION( "uart_mux_dlc_establish_res" ); | |
1430 | |
1431 #ifdef UART_RANGE_CHECK | |
1432 if(uart_mux_dlc_establish_res EQ NULL) | |
1433 { | |
1434 TRACE_EVENT("ERROR: uart_mux_dlc_establish_res is NULL"); | |
1435 } | |
1436 else if((*((ULONG*)((UBYTE*)uart_mux_dlc_establish_res | |
1437 - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
1438 { | |
1439 TRACE_EVENT_P1("ERROR: uart_mux_dlc_establish_res=%08x is not allocated", | |
1440 uart_mux_dlc_establish_res); | |
1441 } | |
1442 else if(uart_mux_dlc_establish_res->device >= UART_INSTANCES) | |
1443 { | |
1444 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
1445 uart_mux_dlc_establish_res->device, | |
1446 UART_INSTANCES); | |
1447 } | |
1448 #endif /* UART_RANGE_CHECK */ | |
1449 | |
1450 /* | |
1451 * set UART instance | |
1452 */ | |
1453 uart_data = &uart_data_base[uart_mux_dlc_establish_res->device]; | |
1454 | |
1455 switch( GET_STATE( UART_SERVICE_KER ) ) | |
1456 { | |
1457 case KER_MUX: | |
1458 dlc = &uart_data->dlc_table[uart_data-> | |
1459 dlc_instance[uart_mux_dlc_establish_res->dlci]]; | |
1460 dlc->connection_state = UART_CONNECTION_OPEN; | |
1461 /* | |
1462 * send UA response | |
1463 */ | |
1464 temp_desc = dlc->next_command; | |
1465 dlc->next_command = NULL; | |
1466 ker_mux_send_frame(temp_desc); | |
1467 /* | |
1468 * start Data services | |
1469 */ | |
1470 uart_data->drx = dlc->drx; | |
1471 uart_data->dtx = dlc->dtx; | |
1472 sig_ker_drx_ready_mode_req(uart_data-> | |
1473 dlc_instance[uart_mux_dlc_establish_res->dlci]); | |
1474 sig_ker_dtx_ready_mode_req(uart_data-> | |
1475 dlc_instance[uart_mux_dlc_establish_res->dlci]); | |
1476 break; | |
1477 | |
1478 default: | |
1479 TRACE_ERROR( "UART_MUX_DLC_ESTABLISH_RES unexpected" ); | |
1480 break; | |
1481 } | |
1482 /* | |
1483 * free the received primitive | |
1484 */ | |
1485 PFREE(uart_mux_dlc_establish_res); | |
1486 } /* uart_mux_dlc_establish_res() */ | |
1487 | |
1488 | |
1489 | |
1490 /* | |
1491 +------------------------------------------------------------------------------ | |
1492 | Function : ker_uart_mux_dlc_release_req | |
1493 +------------------------------------------------------------------------------ | |
1494 | Description : Handles the primitive UART_MUX_DLC_RELEASE_REQ | |
1495 | | |
1496 | Parameters : *ker_uart_mux_dlc_release_req - Ptr to primitive payload | |
1497 | | |
1498 +------------------------------------------------------------------------------ | |
1499 */ | |
1500 GLOBAL void ker_uart_mux_dlc_release_req ( | |
1501 T_UART_MUX_DLC_RELEASE_REQ *uart_mux_dlc_release_req ) | |
1502 { | |
1503 T_desc2* temp_desc; | |
1504 T_DLC* dlc; | |
1505 UBYTE dlc_instance; /* channel */ | |
1506 | |
1507 TRACE_FUNCTION( "ker_uart_mux_dlc_release_req" ); | |
1508 | |
1509 #ifdef UART_RANGE_CHECK | |
1510 if(uart_mux_dlc_release_req EQ NULL) | |
1511 { | |
1512 TRACE_EVENT("ERROR: uart_mux_dlc_release_req is NULL"); | |
1513 } | |
1514 else if((*((ULONG*)((UBYTE*)uart_mux_dlc_release_req | |
1515 - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
1516 { | |
1517 TRACE_EVENT_P1("ERROR: uart_mux_dlc_release_req=%08x is not allocated", | |
1518 uart_mux_dlc_release_req); | |
1519 } | |
1520 else if(uart_mux_dlc_release_req->device >= UART_INSTANCES) | |
1521 { | |
1522 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
1523 uart_mux_dlc_release_req->device, | |
1524 UART_INSTANCES); | |
1525 } | |
1526 #endif /* UART_RANGE_CHECK */ | |
1527 | |
1528 /* | |
1529 * set UART instance | |
1530 */ | |
1531 uart_data = &uart_data_base[uart_mux_dlc_release_req->device]; | |
1532 | |
1533 switch( GET_STATE( UART_SERVICE_KER ) ) | |
1534 { | |
1535 case KER_MUX: | |
1536 dlc_instance = uart_data->dlc_instance[uart_mux_dlc_release_req->dlci]; | |
1537 dlc = &uart_data->dlc_table[dlc_instance]; | |
1538 /* | |
1539 * close DTI connection | |
1540 */ | |
1541 uart_data->drx = dlc->drx; | |
1542 uart_data->dtx = dlc->dtx; | |
1543 sig_ker_drx_dead_mode_req(); | |
1544 sig_ker_dtx_dead_mode_req(); | |
1545 #ifdef DTILIB | |
1546 if(dlc->dti_state NEQ DTI_CLOSED) | |
1547 { | |
1548 dti_close( | |
1549 uart_hDTI, | |
1550 uart_data->device, | |
1551 UART_DTI_UP_INTERFACE, | |
1552 dlc_instance, | |
1553 FALSE | |
1554 ); | |
1555 dlc->dti_state = DTI_CLOSED; | |
1556 } | |
1557 #else /* DTILIB */ | |
1558 if(dlc->hCommUPLINK NEQ VSI_ERROR) | |
1559 { | |
1560 vsi_c_close (VSI_CALLER dlc->hCommUPLINK); | |
1561 dlc->hCommUPLINK = VSI_ERROR; | |
1562 } | |
1563 #endif /* DTILIB */ | |
1564 switch(dlc->connection_state) | |
1565 { | |
1566 case UART_CONNECTION_SABM_RCVD: | |
1567 /* | |
1568 * negative response for an UART_MUX_DLC_ESTABLISH_IND | |
1569 * send DM response | |
1570 */ | |
1571 temp_desc = dlc->next_command; | |
1572 dlc->next_command = NULL; | |
1573 temp_desc->buffer[UART_OFFSET_CONTROL] = UART_DM_CONTROL_FRAME | |
1574 ;/*lint !e415 access of out-of-bounds pointer*/ | |
1575 ker_mux_send_frame(temp_desc); | |
1576 ker_mux_dlc_release(dlc_instance); | |
1577 break; | |
1578 | |
1579 case UART_CONNECTION_OPEN: | |
1580 dlc->connection_state = UART_CONNECTION_DISC_SENT; | |
1581 ker_send_disc_frame(uart_mux_dlc_release_req->dlci); | |
1582 break; | |
1583 case UART_CONNECTION_DEAD: | |
1584 break; | |
1585 | |
1586 default: | |
1587 TRACE_EVENT_P3("Warning: Unexpected DLC connection state: %d - \ | |
1588 %s(%d)", dlc->connection_state, __FILE__, __LINE__); | |
1589 break; | |
1590 } | |
1591 break; | |
1592 | |
1593 default: | |
1594 TRACE_ERROR( "UART_MUX_DLC_RELEASE_REQ unexpected" ); | |
1595 break; | |
1596 } | |
1597 /* | |
1598 * free the received primitive | |
1599 */ | |
1600 PFREE(uart_mux_dlc_release_req); | |
1601 } /* ker_uart_mux_dlc_release_req() */ | |
1602 | |
1603 | |
1604 | |
1605 /* | |
1606 +------------------------------------------------------------------------------ | |
1607 | Function : ker_uart_mux_sleep_req | |
1608 +------------------------------------------------------------------------------ | |
1609 | Description : Handles the primitive UART_MUX_SLEEP_REQ | |
1610 | | |
1611 | Parameters : *uart_mux_sleep_req - Ptr to primitive payload | |
1612 | | |
1613 +------------------------------------------------------------------------------ | |
1614 */ | |
1615 GLOBAL void ker_uart_mux_sleep_req ( | |
1616 T_UART_MUX_SLEEP_REQ *uart_mux_sleep_req ) | |
1617 { | |
1618 TRACE_FUNCTION( "uart_mux_sleep_req" ); | |
1619 | |
1620 #ifdef UART_RANGE_CHECK | |
1621 if(uart_mux_sleep_req EQ NULL) | |
1622 { | |
1623 TRACE_EVENT("ERROR: uart_mux_sleep_req is NULL"); | |
1624 } | |
1625 else if((*((ULONG*)((UBYTE*)uart_mux_sleep_req | |
1626 - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
1627 { | |
1628 TRACE_EVENT_P1("ERROR: uart_mux_sleep_req=%08x is not allocated", | |
1629 uart_mux_sleep_req); | |
1630 } | |
1631 else if(uart_mux_sleep_req->device >= UART_INSTANCES) | |
1632 { | |
1633 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
1634 uart_mux_sleep_req->device, | |
1635 UART_INSTANCES); | |
1636 } | |
1637 #endif /* UART_RANGE_CHECK */ | |
1638 | |
1639 /* | |
1640 * set UART instance | |
1641 */ | |
1642 uart_data = &uart_data_base[uart_mux_sleep_req->device]; | |
1643 | |
1644 /* | |
1645 * Primitive UART_MUX_SLEEP_REQ is not supported | |
1646 */ | |
1647 TRACE_ERROR( "UART_MUX_SLEEP_REQ unexpected" ); | |
1648 | |
1649 /* | |
1650 * free the received primitive | |
1651 */ | |
1652 PFREE(uart_mux_sleep_req); | |
1653 } /* ker_uart_mux_sleep_req() */ | |
1654 | |
1655 | |
1656 | |
1657 /* | |
1658 +------------------------------------------------------------------------------ | |
1659 | Function : ker_uart_mux_wakeup_req | |
1660 +------------------------------------------------------------------------------ | |
1661 | Description : Handles the primitive UART_MUX_WAKEUP_REQ | |
1662 | | |
1663 | Parameters : *uart_mux_wakeup_req - Ptr to primitive payload | |
1664 | | |
1665 +------------------------------------------------------------------------------ | |
1666 */ | |
1667 GLOBAL void ker_uart_mux_wakeup_req ( | |
1668 T_UART_MUX_WAKEUP_REQ *uart_mux_wakeup_req ) | |
1669 { | |
1670 TRACE_FUNCTION( "ker_uart_mux_wakeup_req" ); | |
1671 | |
1672 #ifdef UART_RANGE_CHECK | |
1673 if(uart_mux_wakeup_req EQ NULL) | |
1674 { | |
1675 TRACE_EVENT("ERROR: uart_mux_wakeup_req is NULL"); | |
1676 } | |
1677 else if((*((ULONG*)((UBYTE*)uart_mux_wakeup_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
1678 { | |
1679 TRACE_EVENT_P1("ERROR: uart_mux_wakeup_req=%08x is not allocated", | |
1680 uart_mux_wakeup_req); | |
1681 } | |
1682 else if(uart_mux_wakeup_req->device >= UART_INSTANCES) | |
1683 { | |
1684 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
1685 uart_mux_wakeup_req->device, | |
1686 UART_INSTANCES); | |
1687 } | |
1688 #endif /* UART_RANGE_CHECK */ | |
1689 | |
1690 /* | |
1691 * set UART instance | |
1692 */ | |
1693 uart_data = &uart_data_base[uart_mux_wakeup_req->device]; | |
1694 /* | |
1695 * Primitive UART_MUX_WAKEUP_REQ is not supported | |
1696 */ | |
1697 TRACE_ERROR( "UART_MUX_WAKEUP_REQ unexpected" ); | |
1698 /* | |
1699 * free the received primitive | |
1700 */ | |
1701 PFREE(uart_mux_wakeup_req); | |
1702 } /* ker_uart_mux_wakeup_req() */ | |
1703 | |
1704 | |
1705 | |
1706 /* | |
1707 +------------------------------------------------------------------------------ | |
1708 | Function : ker_uart_mux_close_req | |
1709 +------------------------------------------------------------------------------ | |
1710 | Description : Handles the primitive UART_MUX_CLOSE_REQ | |
1711 | | |
1712 | Parameters : *uart_mux_close_req - Ptr to primitive payload | |
1713 | | |
1714 +------------------------------------------------------------------------------ | |
1715 */ | |
1716 GLOBAL void ker_uart_mux_close_req ( | |
1717 T_UART_MUX_CLOSE_REQ *uart_mux_close_req ) | |
1718 { | |
1719 UBYTE i; | |
1720 T_DLC* dlc; | |
1721 T_desc2* temp_desc; | |
1722 BOOL continuous; | |
1723 | |
1724 | |
1725 TRACE_FUNCTION( "ker_uart_mux_close_req" ); | |
1726 | |
1727 #ifdef UART_RANGE_CHECK | |
1728 if(uart_mux_close_req EQ NULL) | |
1729 { | |
1730 TRACE_EVENT("ERROR: uart_mux_close_req is NULL"); | |
1731 } | |
1732 else if((*((ULONG*)((UBYTE*)uart_mux_close_req - sizeof(T_PRIM_HEADER) - 8))) NEQ 0) | |
1733 { | |
1734 TRACE_EVENT_P1("ERROR: uart_mux_close_req=%08x is not allocated", | |
1735 uart_mux_close_req); | |
1736 } | |
1737 else if(uart_mux_close_req->device >= UART_INSTANCES) | |
1738 { | |
1739 TRACE_EVENT_P2("ERROR: device=%d is greater than UART_INSTANCES=%d", | |
1740 uart_mux_close_req->device, | |
1741 UART_INSTANCES); | |
1742 } | |
1743 #endif /* UART_RANGE_CHECK */ | |
1744 | |
1745 /* | |
1746 * set UART instance | |
1747 */ | |
1748 uart_data = &uart_data_base[uart_mux_close_req->device]; | |
1749 | |
1750 switch( GET_STATE( UART_SERVICE_KER ) ) | |
1751 { | |
1752 case KER_MUX_ESTABLISH: | |
1753 SET_STATE( UART_SERVICE_KER, KER_MUX_CLOSED ); | |
1754 /* | |
1755 * stop timers and | |
1756 * remove all DLC instances | |
1757 */ | |
1758 ker_mux_close_down(); | |
1759 if(uart_data->ker.tx_data_desc EQ NULL) | |
1760 { | |
1761 uart_data->ker.received_prim|= UART_MUX_CLOSE_REQ_MASK; | |
1762 | |
1763 if(uart_data->ker.flush_state EQ UART_KER_NOT_FLUSHING) | |
1764 { | |
1765 uart_data->ker.flush_state = UART_KER_TX_FLUSH; | |
1766 sig_ker_tx_flush_req(); | |
1767 } | |
1768 } | |
1769 break; | |
1770 | |
1771 case KER_MUX: | |
1772 SET_STATE( UART_SERVICE_KER, KER_MUX_DLC_CLOSING ); | |
1773 /* | |
1774 * close all VSI channels and Data services | |
1775 */ | |
1776 continuous = TRUE; | |
1777 for(i = 0; i <= UART_MAX_NUMBER_OF_CHANNELS; i++) | |
1778 { | |
1779 dlc = &uart_data->dlc_table[i]; | |
1780 /* | |
1781 * close all DLC channels except Control channel | |
1782 */ | |
1783 if(i NEQ UART_CONTROL_INSTANCE) | |
1784 { | |
1785 switch(dlc->connection_state) | |
1786 { | |
1787 case UART_CONNECTION_SABM_RCVD: | |
1788 /* | |
1789 * send DM response | |
1790 */ | |
1791 temp_desc = dlc->next_command; | |
1792 dlc->next_command = NULL; | |
1793 temp_desc->buffer[UART_OFFSET_CONTROL] = UART_DM_CONTROL_FRAME | |
1794 ;/*lint !e415 access of out-of-bounds pointer*/ | |
1795 ker_mux_send_frame(temp_desc); | |
1796 ker_mux_dlc_release(i); | |
1797 break; | |
1798 | |
1799 case UART_CONNECTION_OPEN: | |
1800 dlc->connection_state = UART_CONNECTION_DISC_SENT; | |
1801 ker_send_disc_frame(dlc->dlci); | |
1802 continuous = FALSE; | |
1803 break; | |
1804 | |
1805 case UART_CONNECTION_DISC_SENT: | |
1806 continuous = FALSE; | |
1807 break; | |
1808 | |
1809 case UART_CONNECTION_DEAD: | |
1810 break; | |
1811 | |
1812 default: | |
1813 TRACE_EVENT_P3("Warning: Unexpected DLC connection state: %d - \ | |
1814 %s(%d)",dlc->connection_state,__FILE__, __LINE__); | |
1815 break; | |
1816 } | |
1817 } | |
1818 } | |
1819 if(continuous EQ TRUE) | |
1820 { | |
1821 SET_STATE( UART_SERVICE_KER, KER_MUX_CLOSING ); | |
1822 /* | |
1823 * build and send CLD command frame: | |
1824 */ | |
1825 ker_mux_send_close_down(); | |
1826 /* | |
1827 * start timer | |
1828 */ | |
1829 sig_ker_rt_start_t3_req(); | |
1830 } | |
1831 break; | |
1832 | |
1833 case KER_MUX_DLC_CLOSING: | |
1834 case KER_MUX_CLOSING: | |
1835 case KER_MUX_CLOSED: | |
1836 break; | |
1837 | |
1838 default: | |
1839 TRACE_ERROR( "UART_MUX_CLOSE_REQ unexpected" ); | |
1840 break; | |
1841 } | |
1842 | |
1843 /* | |
1844 * free the received primitive | |
1845 */ | |
1846 PFREE(uart_mux_close_req); | |
1847 | |
1848 } /* ker_uart_mux_close_req() */ | |
1849 | |
1850 | |
1851 | |
1852 #ifdef DTILIB | |
1853 /* | |
1854 +------------------------------------------------------------------------------ | |
1855 | Function : sig_dti_ker_connection_opened_ind | |
1856 +------------------------------------------------------------------------------ | |
1857 | Description : Handles the DTILIB callback call DTI_REASON_CONNECTION_OPENED | |
1858 | | |
1859 | This signal means that a dti connection has been successfully opened. | |
1860 | | |
1861 | Parameter : dlc_instance | |
1862 | | |
1863 +------------------------------------------------------------------------------ | |
1864 */ | |
1865 GLOBAL void sig_dti_ker_connection_opened_ind (UBYTE dlc_instance) | |
1866 { | |
1867 #ifndef _SIMULATION_ | |
1868 USHORT ret; | |
1869 #endif | |
1870 PALLOC (uart_dti_cnf, UART_DTI_CNF); | |
1871 | |
1872 TRACE_FUNCTION( "sig_dti_ker_connection_opened_ind" ); | |
1873 | |
1874 /* | |
1875 * send confirm primitive | |
1876 */ | |
1877 uart_dti_cnf->device = uart_data->device; | |
1878 uart_dti_cnf->dlci = uart_data->dlc_table[dlc_instance].dlci; /* EQ dlci */ | |
1879 uart_dti_cnf->dti_conn = UART_CONNECT_DTI; | |
1880 PSEND (hCommMMI, uart_dti_cnf); | |
1881 | |
1882 /* | |
1883 * initialize new communication channel | |
1884 */ | |
1885 switch( GET_STATE( UART_SERVICE_KER ) ) | |
1886 { | |
1887 case KER_DEAD: | |
1888 SET_STATE( UART_SERVICE_KER, KER_READY ); | |
1889 /* | |
1890 * enable UART | |
1891 */ | |
1892 #ifdef _SIMULATION_ | |
1893 { | |
1894 /* | |
1895 * send DTI_GETDATA_REQ | |
1896 */ | |
1897 PALLOC (dti_getdata_req, DTI2_GETDATA_REQ); | |
1898 #ifdef DTI2 | |
1899 dti_getdata_req->link_id = LINK_ENABLE_PORT_1; /* for enable */ | |
1900 #else /* DTI2 */ | |
1901 dti_getdata_req->tui = 2; /* for enable */ | |
1902 dti_getdata_req->c_id = 0; | |
1903 dti_getdata_req->op_ack = 0; | |
1904 #endif /* DTI2 */ | |
1905 PSEND (hCommMMI, dti_getdata_req); | |
1906 } | |
1907 #else /* _SIMULATION_ */ | |
1908 if((ret = UF_Enable (uart_data->device, TRUE)) NEQ UF_OK) | |
1909 { | |
1910 TRACE_ERROR_P2("UF Driver: Can't enable UART, [%d], uart_kerp.c(%d)", | |
1911 ret,__LINE__); | |
1912 } | |
1913 #endif /* _SIMULATION */ | |
1914 | |
1915 /* | |
1916 * set RX and TX in ready mode | |
1917 */ | |
1918 sig_ker_rx_ready_mode_req(); | |
1919 sig_ker_tx_ready_mode_req(); | |
1920 | |
1921 /* | |
1922 * set DTI connection | |
1923 */ | |
1924 sig_ker_drx_ready_mode_req(UART_CONTROL_INSTANCE); | |
1925 sig_ker_dtx_ready_mode_req(UART_CONTROL_INSTANCE); | |
1926 sig_ker_drx_set_dtilib_peer_req(); | |
1927 sig_ker_dtx_set_dtilib_peer_req(); | |
1928 break; | |
1929 | |
1930 case KER_READY: | |
1931 case KER_MUX: | |
1932 sig_ker_drx_set_dtilib_peer_req(); | |
1933 sig_ker_dtx_set_dtilib_peer_req(); | |
1934 break; | |
1935 | |
1936 default: | |
1937 TRACE_ERROR( "UART_DTI_REQ unexpected" ); | |
1938 break; | |
1939 } | |
1940 } /* sig_dti_ker_connection_opened_ind */ | |
1941 | |
1942 | |
1943 | |
1944 /* | |
1945 +------------------------------------------------------------------------------ | |
1946 | Function : sig_dti_ker_connection_closed_ind | |
1947 +------------------------------------------------------------------------------ | |
1948 | Description : Handles the DTILIB callback call DTI_REASON_CONNECTION_CLOSED | |
1949 | | |
1950 | This signal means that a dti connection has been closed by | |
1951 | the neighbour entity. | |
1952 | | |
1953 | Parameters : dlc_instance - affected dlc instance | |
1954 | | |
1955 +------------------------------------------------------------------------------ | |
1956 */ | |
1957 GLOBAL void sig_dti_ker_connection_closed_ind (U8 dlc_instance) | |
1958 { | |
1959 T_DLC *dlc; | |
1960 | |
1961 TRACE_FUNCTION( "sig_dti_ker_connection_closed_ind" ); | |
1962 | |
1963 /* | |
1964 * set DLC | |
1965 */ | |
1966 dlc = &uart_data->dlc_table[dlc_instance]; | |
1967 uart_data->drx = dlc->drx; | |
1968 uart_data->dtx = dlc->dtx; | |
1969 /* | |
1970 * set DTI connection to closed state | |
1971 * if it is already closed, do nothing | |
1972 */ | |
1973 if(dlc->dti_state NEQ DTI_CLOSED) | |
1974 { | |
1975 dlc->dti_state = DTI_CLOSED; | |
1976 sig_ker_drx_disconnected_mode_req(); | |
1977 sig_ker_dtx_disconnected_mode_req(); | |
1978 /* | |
1979 * inform MMI | |
1980 */ | |
1981 { | |
1982 PALLOC (uart_dti_ind, UART_DTI_IND); | |
1983 uart_dti_ind->device = uart_data->device; | |
1984 uart_dti_ind->dlci = dlc->dlci; | |
1985 uart_dti_ind->dti_conn = UART_DISCONNECT_DTI; | |
1986 PSEND (hCommMMI, uart_dti_ind); | |
1987 } | |
1988 } | |
1989 } /* sig_dti_ker_connection_closed_ind */ | |
1990 #endif /* DTILIB */ |