comparison src/aci2/aci/psa_psis.c @ 3:93999a60b835

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children
comparison
equal deleted inserted replaced
2:c41a534f33c6 3:93999a60b835
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-PS (6147)
4 | Modul : PSA_PSIS
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 module defines the processing functions for the
18 | primitives sent to the protocol stack adapter by the DTI
19 | interface.
20 +-----------------------------------------------------------------------------
21 */
22
23 #ifdef FF_PSI
24 #define PSA_PSIS_C
25
26
27 #include "aci_all.h"
28
29 /*==== INCLUDES ===================================================*/
30 #include "aci_cmh.h"
31 #include "ati_cmd.h"
32 #include "aci_cmd.h"
33 #include "dti.h" /* functionality of the dti library */
34
35 #include "aci.h"
36 #include "aci_lst.h"
37 #include "dti_conn_mng.h"
38 #include "dti_cntrl_mng.h"
39 #include "psa_psi.h"
40 #include "cmh_psi.h"
41
42 #include "aci_mem.h"
43
44 #include "aci_io.h"
45
46 #include "sap_dti.h"
47
48
49
50 /*==== CONSTANTS ==================================================*/
51
52
53 /*==== TYPES ======================================================*/
54
55
56 /*==== EXPORT =====================================================*/
57
58 /*==== VARIABLES ==================================================*/
59
60
61 /*==== FUNCTIONS ==================================================*/
62
63 LOCAL USHORT psi_get_desc_size (T_desc2 *data)
64 {
65 USHORT size = 0;
66 T_desc2 *next_data;
67
68 next_data = data;
69 while (next_data NEQ NULL)
70 {
71 size += next_data->len;
72 next_data = (T_desc2*)next_data->next;
73 }
74
75 return (size);
76 }
77
78 #ifdef DTI
79
80 /*
81 +-------------------------------------------------------------------+
82 | PROJECT : GPRS (8441) MODULE : PSA_PSIS |
83 | STATE : finished ROUTINE : psaPSI_ConnectRej |
84 +-------------------------------------------------------------------+
85
86 PURPOSE : Indicates that ACI can not handle a DTI connection with PSI
87
88 */
89 GLOBAL void psaPSI_ConnRej ( U32 devId)
90 {
91 TRACE_FUNCTION ("psaPSI_ConnRej()");
92 {
93 PALLOC ( psi_conn_rej, PSI_CONN_REJ);
94 psi_conn_rej->devId = devId;
95 PSENDX (PSI, psi_conn_rej);
96 }
97 }
98
99 /*
100 +-------------------------------------------------------------------+
101 | PROJECT : GPRS (8441) MODULE : PSA_PSIS |
102 | STATE : finished ROUTINE : psaPSI_ConnectRes |
103 +-------------------------------------------------------------------+
104
105 PURPOSE : Response to PSI_CONN_IND sent by PSI with confirmed
106 DIO capabilities
107
108 */
109 GLOBAL void psaPSI_ConnRes ( U32 devId)
110 {
111 TRACE_FUNCTION ("psaPSI_ConnRes()");
112 {
113 PALLOC ( psi_conn_res, PSI_CONN_RES);
114 psi_conn_res->devId = devId;
115 PSENDX (PSI, psi_conn_res);
116 }
117 }
118
119 /*
120 +-------------------------------------------------------------------+
121 | PROJECT : GPRS (8441) MODULE : PSA_PSIS |
122 | STATE : finished ROUTINE : psaPSI_CloseReq |
123 +-------------------------------------------------------------------+
124
125 PURPOSE : Request closing of DTI connection with PSI
126
127 */
128 GLOBAL void psaPSI_CloseReq ( U32 devId)
129 {
130 TRACE_FUNCTION ("psaPSI_DTICloseReq()");
131 {
132 PALLOC ( psi_close_req, PSI_CLOSE_REQ);
133 psi_close_req->devId = devId;
134 PSENDX (PSI, psi_close_req);
135 }
136 }
137
138 /*
139 +-------------------------------------------------------------------+
140 | PROJECT : GPRS (8441) MODULE : PSA_PSIS |
141 | STATE : finished ROUTINE : psaPSI_DTICloseReq |
142 +-------------------------------------------------------------------+
143
144 PURPOSE : Request closing of DTI connection with PSI
145
146 */
147 GLOBAL void psaPSI_DTICloseReq ( U32 devId, U32 link_id)
148 {
149 TRACE_FUNCTION ("psaPSI_DTICloseReq()");
150 {
151 PALLOC ( psi_dti_close_req, PSI_DTI_CLOSE_REQ);
152 psi_dti_close_req->devId = devId;
153 psi_dti_close_req->link_id = link_id;
154 PSENDX (PSI, psi_dti_close_req);
155 }
156 }
157
158 /*
159 +-------------------------------------------------------------------+
160 | PROJECT : GPRS (8441) MODULE : PSA_PKTIOS |
161 | STATE : finished ROUTINE : psaPSI_DTIOpenReq |
162 +-------------------------------------------------------------------+
163
164 PURPOSE : Request opening of DTI connection with PSI
165
166 */
167 GLOBAL void psaPSI_DTIOpenReq ( U32 devId, char* peer_name,
168 ULONG link_id, UBYTE dti_direction)
169 {
170 TRACE_FUNCTION ("psaPSI_DTIOpenReq()");
171
172 /* if (dti_cntrl_set_conn_parms(link_id, DTI_ENTITY_PSI, (UBYTE)(devId&DIO_DEVICE_MASK),
173 UART_DLCI_NOT_MULTIPLEXED) EQ FALSE)
174 {
175 return;
176 }*/
177 {
178 PALLOC ( psi_dti_open_req, PSI_DTI_OPEN_REQ);
179 psi_dti_open_req->devId = devId;
180 memcpy( &(psi_dti_open_req->peer.name), peer_name, strlen(peer_name) + 1 );
181 psi_dti_open_req->link_id = link_id;
182 psi_dti_open_req->dti_direction = dti_direction;
183
184 PSENDX (PSI, psi_dti_open_req);
185 }
186 }
187
188 /*
189 +-------------------------------------------------------------------+
190 | PROJECT : GPRS (8441) MODULE : PSA_PSIS |
191 | STATE : finished ROUTINE : psaPSI_Dti_Req |
192 +-------------------------------------------------------------------+
193
194 PURPOSE : Request for DTI connection by DTI managment
195
196 */
197 GLOBAL void psaPSI_Dti_Req ( ULONG link_id, UBYTE peer,
198 T_DTI_MNG_PSI_MODE con_mode)
199 {
200 UBYTE device_no;
201 U32 devId;
202 char* peer_name;
203 T_DTI_CNTRL device_info;
204 U32 cpblty = DTI_CPBLTY_NO;
205
206 TRACE_FUNCTION ("psaPSI_Dti_Req()");
207
208 dti_cntrl_get_info_from_dti_id(EXTRACT_DTI_ID(link_id), &device_info);
209
210 device_no = device_info.dev_no;
211 switch (device_info.capability-DTI_CPBLTY_CMD )
212 {
213 case DTI_CPBLTY_CMD:
214 cpblty = DTI_CPBLTY_CMD;
215 break;
216 case DTI_CPBLTY_SER:
217 if (device_info.sub_no EQ 0)
218 {
219 cpblty = DIO_DATA_SER;
220 }
221 else
222 {
223 cpblty = DIO_DATA_SER_MUX;
224 }
225 break;
226 case DTI_CPBLTY_PKT:
227 cpblty = DIO_DATA_PKT;
228 break;
229 default:
230 break;
231 }
232 /*the mapping of capability between DTI and PSI should be done here, since devId relates
233 to the device type */
234 devId = ((device_info.driver_id & 0xff)<<24|
235 cpblty|
236 (device_info.dio_ctrl_id & 0xff)<<8|
237 device_no);
238 peer_name = dti_entity_name[peer].name;
239
240 if(con_mode EQ PSI_CONNECT_DTI)
241 {
242 dti_cntrl_set_conn_parms((T_DTI_CONN_LINK_ID)link_id, DTI_ENTITY_PSI,
243 device_info.dev_no, UART_DLCI_NOT_MULTIPLEXED);
244
245 psaPSI_DTIOpenReq (devId, peer_name, link_id, DTI_CHANNEL_TO_HIGHER_LAYER);
246 }
247 else
248 {
249 psaPSI_DTICloseReq(devId, link_id);
250 }
251 }
252 #endif /* DTI */
253
254 /*
255 +-------------------------------------------------------------------+
256 | PROJECT : GSM-PS (6147) MODULE : PSA_PSIS |
257 | ROUTINE : psa_psi_DTI_data_req |
258 +-------------------------------------------------------------------+
259
260 PURPOSE :
261
262 */
263
264 GLOBAL const void psa_psi_DTI_data_req (
265 T_desc2 *data,
266 T_ACI_DTI_PRC_PSI *src_infos,
267 T_DTI_ENTITY_ID peer_id
268 )
269 {
270 USHORT data_len = 0;
271 USHORT str_len = 0;
272
273 TRACE_FUNCTION("psa_psi_DTI_data_req()");
274
275 {
276 PALLOC_DESC2(dti_data_ind, DTI2_DATA_IND);
277
278 data_len = psi_get_desc_size (data);
279
280 dti_data_ind->desc_list2.list_len = data_len;
281 dti_data_ind->desc_list2.first = (ULONG)data;
282
283 dti_data_ind->parameters.p_id = 0; /*dummy_ubyte; */
284
285 if (BITFIELD_CHECK (src_infos->data_cntr, PSI_DTI_FLOW_OFF))
286 {
287 dti_data_ind->parameters.st_lines.st_flow = DTI_FLOW_OFF;
288 }
289 else
290 {
291 dti_data_ind->parameters.st_lines.st_flow = DTI_FLOW_ON;
292 }
293
294 if (BITFIELD_CHECK (src_infos->data_cntr, PSI_DTI_SB_BIT))
295 {
296 TRACE_EVENT("SB is ON");
297 dti_data_ind->parameters.st_lines.st_line_sb = DTI_SB_ON;
298 }
299 else
300 {
301 TRACE_EVENT("SB is OFF");
302 dti_data_ind->parameters.st_lines.st_line_sb = DTI_SB_OFF;
303 }
304
305 dti_data_ind->parameters.st_lines.st_line_sa = DTI_SA_ON;
306 dti_data_ind->parameters.st_lines.st_break_len = DTI_BREAK_OFF;
307
308 dti_send_data
309 (
310 aci_hDTI,
311 src_infos->srcId,
312 (UBYTE)peer_id,
313 ACI_DTI_DN_CHANNEL,
314 dti_data_ind
315 );
316 }
317 }
318
319 /*
320 +-------------------------------------------------------------------+
321 | PROJECT : GSM-PS (6147) MODULE : PSA_PSI |
322 | ROUTINE : psa_psi_DTI_getdata |
323 +-------------------------------------------------------------------+
324
325 PURPOSE :
326
327 */
328
329 GLOBAL const void psa_psi_DTI_getdata( UBYTE src_id, T_DTI_ENTITY_ID peer_id)
330 {
331 T_ACI_DTI_PRC_PSI *src_infos = NULL;
332
333 TRACE_FUNCTION("psaDTI_getdata");
334
335 src_infos = find_element (psi_src_params, src_id, cmhPSItest_srcId);
336 if (src_infos EQ NULL)
337 {
338 TRACE_EVENT_P1("[ERR] psaDTI_getdata: link_id=%d not found", src_id) ;
339 return ;
340 }
341
342 if( src_infos->RecState NEQ RECEIVING)
343 {
344 src_infos->RecState = READY_REC;
345 }
346
347 {
348 dti_start
349 (
350 aci_hDTI,
351 src_id,
352 (UBYTE)peer_id,
353 ACI_DTI_DN_CHANNEL
354 );
355 }
356 }
357
358 #ifdef DTI
359 /*
360 +-------------------------------------------------------------------+
361 | PROJECT : GSM-PS (6147) MODULE : PSA_PSI |
362 | ROUTINE : psaPSI_DCDreq |
363 +-------------------------------------------------------------------+
364
365 PURPOSE :
366
367 */
368
369 GLOBAL const void psaPSI_DCDreq( UBYTE c_Id, UBYTE line_state )
370 {
371 T_ACI_DTI_PRC_PSI *cmd = NULL;
372
373 TRACE_FUNCTION("psaPSI_DCDreq()");
374
375 cmd = find_element (psi_src_params, c_Id, cmhPSItest_srcId);
376 if (cmd EQ NULL)
377 {
378 TRACE_EVENT_P1("[ERR] psaPSI_DCDreq: c_Id=%d not found", c_Id) ;
379 return ;
380 }
381
382 {
383 PALLOC( psi_line_state_req, PSI_LINE_STATE_REQ);
384 psi_line_state_req -> devId = cmd->devId;
385 if( line_state EQ IO_DCD_ON )
386 {
387 psi_line_state_req -> line_state = LINE_STD_DCD_ON;
388 }
389 else if ( line_state EQ IO_DCD_OFF )
390 {
391 psi_line_state_req -> line_state = LINE_STD_DCD_OFF;
392 }
393
394 PSENDX( PSI, psi_line_state_req );
395 }
396 }
397
398 /*
399 +-------------------------------------------------------------------+
400 | PROJECT : GSM-PS (6147) MODULE : PSA_PSI |
401 | ROUTINE : psaPSI_ESCAPEreq |
402 +-------------------------------------------------------------------+
403
404 PURPOSE :
405
406 */
407
408 GLOBAL const BOOL psaPSI_ESCAPEreq( UBYTE c_Id, UBYTE detection )
409 {
410 T_ACI_DEVICE_DCB_ENTRY *device_entry = cmhPSI_GetDeviceParOverSrcID( c_Id );
411 U32 device_type;
412 if ( device_entry EQ NULL )
413 {
414 TRACE_EVENT_P1("[ERR] cmhPSI_SetDataRate: device for source ID = %d not found", c_Id);
415 return (FALSE);
416 }
417
418 TRACE_FUNCTION("psaPSI_ESCAPEreq()");
419
420 device_type = device_entry->devId & DIO_TYPE_DAT_MASK;
421 cmhPSI_SetDcbParToUnchanged( device_entry );
422 if (device_type EQ DIO_DATA_SER)
423 {
424 if( detection EQ ESC_DETECTION_ON)
425 {
426 device_entry->dcbPar.dio_dcb_ser.guard_period = DIO_GUARD_PER_DEFAULT;
427 }
428 else
429 {
430 device_entry->dcbPar.dio_dcb_ser.guard_period = 0;
431 }
432 }
433 else if (device_type EQ DIO_DATA_MUX)
434 {
435 if( detection EQ ESC_DETECTION_ON)
436 {
437 device_entry->dcbPar.dio_dcb_ser_mux.guard_period = DIO_GUARD_PER_DEFAULT;
438 }
439 else
440 {
441 device_entry->dcbPar.dio_dcb_ser_mux.guard_period = 0;
442 }
443 }
444
445 else /* if (device_type EQ DIO_DATA_PKT)*/
446 {
447 return (FALSE);
448 }
449
450 psaPSI_SetConfReq(device_entry);
451
452 return (TRUE);
453
454 }
455
456 /*
457 +-------------------------------------------------------------------+
458 | PROJECT : GSM-PS (6147) MODULE : PSA_PSI |
459 | ROUTINE : psaPSI_RINGreq |
460 +-------------------------------------------------------------------+
461
462 PURPOSE :
463
464 */
465
466 GLOBAL const void psaPSI_RINGreq( UBYTE c_Id, UBYTE line_state )
467 {
468 T_ACI_DTI_PRC_PSI *cmd = NULL;
469
470 TRACE_FUNCTION("psaPSI_RINGreq");
471
472 cmd = find_element (psi_src_params, c_Id, cmhPSItest_srcId);
473 if (cmd EQ NULL)
474 {
475 TRACE_EVENT_P1("[ERR] psaPSI_RINGreq: c_Id=%d not found", c_Id) ;
476 return ;
477 }
478
479 if (BITFIELD_CHECK (cmd->data_cntr, PSI_RING_RUNNING))
480 {
481 TRACE_EVENT_P2 ("[WRN] psaPSI_RINGreq(): no CNF for previous REQ (device: %d; dlci=%d)",
482 cmd->devId, cmd->dlci);
483 return;
484 }
485
486 /*
487 store that PSI_RING_REQ was send
488 this is important so that the primitive queue in the PSI entity not
489 overloaded if no PC is connected
490 */
491 BITFIELD_SET (cmd->data_cntr, PSI_RING_RUNNING);
492
493 {
494 PALLOC( psi_line_state_req, PSI_LINE_STATE_REQ);
495 psi_line_state_req -> devId = cmd->devId;
496
497 if( line_state EQ IO_RING_ON)
498 {
499 psi_line_state_req -> line_state = LINE_STD_RING_ON;
500 }
501 else if( line_state EQ IO_RING_OFF )
502 {
503 psi_line_state_req -> line_state = LINE_STD_RING_OFF;
504 }
505
506 PSENDX( PSI, psi_line_state_req);
507 }
508 }
509
510 /*
511 +------------------------------------------------------------------------+
512 | PROJECT : GSM-PS (6147) MODULE : PSA_PSI |
513 | ROUTINE : psaPSI_SetConfReq |
514 +------------------------------------------------------------------------+
515
516 PURPOSE :
517
518 */
519
520 GLOBAL const void psaPSI_SetConfReq( T_ACI_DEVICE_DCB_ENTRY *dcbPar )
521 {
522 U32 device_type;
523 #ifdef _SIMULATION_
524 PALLOC(psi_setconf_req_test, PSI_SETCONF_REQ_TEST);
525
526 device_type = dcbPar->devId & DIO_TYPE_DAT_MASK;
527 psi_setconf_req_test->devId = dcbPar->devId;
528 switch (device_type)
529 {
530 case DIO_DATA_SER:
531 memcpy(&psi_setconf_req_test->DIO_DCB_UN.DIO_DCB_SER,&dcbPar->dcbPar.dio_dcb_ser,sizeof(T_DIO_DCB_SER));
532 break;
533 case DIO_DATA_PKT:
534 memcpy(&psi_setconf_req_test->DIO_DCB_UN.DIO_DCB_PKT,&dcbPar->dcbPar.dio_dcb_pkt,sizeof(T_DIO_DCB_PKT));
535 break;
536 case DIO_DATA_SER_MUX:
537 memcpy(&psi_setconf_req_test->DIO_DCB_UN.DIO_DCB_SER_MUX,&dcbPar->dcbPar.dio_dcb_ser_mux,sizeof(T_DIO_DCB_SER_MUX));
538 break;
539 default:
540 break;
541 }
542 PSENDX( PSI, psi_setconf_req_test );
543 #else
544 PALLOC(psi_setconf_req, PSI_SETCONF_REQ);
545
546 device_type = dcbPar->devId & DIO_TYPE_DAT_MASK;
547 psi_setconf_req->devId = dcbPar->devId;
548 switch (device_type)
549 {
550 case DIO_DATA_SER:
551 psi_setconf_req->ptr_DIO_DCB = (T_DIO_DCB *) &dcbPar->dcbPar.dio_dcb_ser;
552 break;
553 case DIO_DATA_PKT:
554 psi_setconf_req->ptr_DIO_DCB =(T_DIO_DCB *) &dcbPar->dcbPar.dio_dcb_pkt;
555 break;
556 case DIO_DATA_SER_MUX:
557 psi_setconf_req->ptr_DIO_DCB =(T_DIO_DCB *) &dcbPar->dcbPar.dio_dcb_ser_mux;
558 break;
559 default:
560 break;
561 }
562 PSENDX( PSI, psi_setconf_req );
563 #endif /* _SIMULATION_ */
564 }
565 #endif /* DTI */
566 #endif /*FF_PSI*/
567 /*==== EOF =======================================================*/
568