comparison src/g23m-aci/dti/dti_int.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
comparison
equal deleted inserted replaced
0:b6a5e36de839 1:d393cd9bb723
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : DTILIB
4 | Modul : DTI
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 : Definitions for the Protocol Stack Library
18 | DTI
19 +-----------------------------------------------------------------------------
20
21 MODULE : DTI
22
23 PURPOSE : Internal functions of the Protocol Stack Library DTI
24 */
25
26 #ifndef DTI_INT_C
27 #define DTI_INT_C
28 #endif
29
30 /*==== CONST =======================================================*/
31
32 #include <string.h>
33 #include "typedefs.h"
34 #include "pconst.cdg"
35 #include "vsi.h"
36 #include "custom.h"
37 #include "gsm.h"
38 #include "prim.h"
39 #include "dti.h"
40 #include "dti_int_def.h"
41 #include "dti_int_prot.h"
42
43
44 #ifdef FF_TCP_IP
45 #include "atp/atp_api.h"
46 #endif /* FF_TCP_IP */
47
48 /*
49 +---------------------------------------------------------------------+
50 | PROJECT : DTILIB MODULE : DTI_KERF |
51 | STATE : code ROUTINE : set_default_para_data_base|
52 +---------------------------------------------------------------------+
53
54 *
55 * Set the default parameter for the DTI data base
56 *
57 */
58
59 GLOBAL void set_default_para_data_base(DTI_HANDLE hDTI)
60 {
61 hDTI->first_link = D_LINK;
62 hDTI->handle = D_LINK_HANDLE;
63 hDTI->max_links = D_MAX_LINKS;
64
65 #ifdef FF_TCP_IP
66 hDTI->entity_id_p = D_ATP_SW_ENTITY_ID;
67 #endif /* FF_TCP_IP */
68 }
69
70 /*
71 +--------------------------------------------------------------------+
72 | PROJECT : DTILIB MODULE : DTI_KERF |
73 | STATE : code ROUTINE : free_dti_packets_queue |
74 +--------------------------------------------------------------------+
75
76 *
77 * Free dti packets in the queue
78 *
79 */
80
81 LOCAL void free_dti_data_ind_packets_queue(DTI_HANDLE hDTI, T_DTI2_DATA_IND * p_data_ind)
82 {
83 T_DTI2_DATA_IND *p_ind;
84
85 BOOL go = TRUE;
86
87 trace_function( hDTI->handle,
88 "free_dti_data_ind_packets_queue()",
89 hDTI->entity_options);
90
91 /*
92 * Are there any packets in the queue ?
93 */
94
95 if (p_data_ind EQ NO_DATA_PACKET )
96 return;
97
98 p_ind = p_data_ind;
99
100 /*
101 * Check if DTILIB is supported
102 */
103
104 /*
105 * Free the packets
106 */
107
108 do {
109 T_DTI2_DATA_IND *p_last_ind;
110 p_last_ind = p_ind;
111
112 if(p_ind->link_id NEQ 0)
113 p_ind = (T_DTI2_DATA_IND *) p_ind->link_id;
114 else
115 go = FALSE;
116
117 /*
118 * Free the descs at first
119 */
120 mfree_desc(hDTI, &p_last_ind->desc_list2);
121
122 /*
123 * Free the primitive
124 */
125 PFREE (p_last_ind);
126
127 } while( go );
128 } /* free_dti_data_ind_packets_queue() */
129
130
131
132 /*
133 +-----------------------------------------------------------------------+
134 | PROJECT : DTILIB MODULE : DTI_KERF |
135 | STATE : code ROUTINE : set_default_para_link_table |
136 +-----------------------------------------------------------------------+
137 *
138 * Set the default parameter for DTI_LINK
139 *
140 */
141
142 GLOBAL void set_default_para_link_table (DTI_HANDLE hDTI,
143 DTI_LINK *link,
144 U32 link_id,
145 U8 direction)
146 {
147 /*
148 * Free primitives and descs if there are any in the queue
149 */
150 free_dti_data_ind_packets_queue(hDTI, link->dti_data_ind);
151 link->dti_data_ind = NULL;
152 /*
153 * Set the other parameter to default
154 */
155 link->link_id = link_id;
156 link->direction = direction;
157 link->version = D_VERSION;
158 link->link_options = D_LINK_OPTIONS;
159 link->instance = D_INSTANCE;
160 link->interfac = D_INTERFACE;
161 link->channel = D_CHANNEL;
162 link->link_handle = D_LINK_HANDLE;
163 link->queue_size = D_QUEUE_SIZE;
164 link->queue_len = 0;
165 link->connect_state = D_CONNECT_STATE;
166 link->rx_state = DTI_RX_IDLE;
167 link->tx_state = DTI_TX_IDLE;
168 } /* set_default_para_link_table() */
169
170
171
172 /*
173 +-----------------------------------------------------------------------+
174 | PROJECT : DTILIB MODULE : DTI_int |
175 | STATE : code ROUTINE : init_link_table |
176 +-----------------------------------------------------------------------+
177 *
178 * Set the init parameter for DTI_LINK
179 *
180 */
181
182 GLOBAL void init_link_table (DTI_LINK *link)
183 {
184 link->link_id = D_FREE_LINK_ID;
185 link->direction = D_DIRECTION;
186 link->version = D_VERSION;
187 link->link_options = D_LINK_OPTIONS;
188 link->instance = D_INSTANCE;
189 link->interfac = D_INTERFACE;
190 link->link_handle = D_LINK_HANDLE;
191 link->queue_size = D_QUEUE_SIZE;
192 link->queue_len = 0;
193 link->channel = D_CHANNEL;
194 link->dti_data_ind = NULL;
195 link->connect_state = D_CONNECT_STATE;
196 link->rx_state = DTI_RX_IDLE;
197 link->tx_state = DTI_TX_IDLE;
198 link->next_link = D_LINK;
199 #ifdef FF_TCP_IP
200 link->ul_next_atp_data = 0;
201 link->atp_tx_state = ATP_TX_FLOW_ON;
202 link->dti_id = 0;
203 link->entity_db = (U32) NULL;
204 link->port_nb = 0;
205 #endif /* FF_TCP_IP */
206 } /* init_link_table() */
207
208
209
210 /*
211 +--------------------------------------------------------------------+
212 | PROJECT : DTILIB MODULE : DTI_KERF |
213 | STATE : code ROUTINE : free_dti_link_structure |
214 +--------------------------------------------------------------------+
215
216 *
217 * Free DTI link structures, DTI_LINK.
218 *
219 */
220
221 GLOBAL void free_dti_link_structure(DTI_HANDLE hDTI)
222 {
223 DTI_LINK *link_last, *link;
224 BOOL go = TRUE;
225
226 trace_function(hDTI->handle,
227 "free_dti_link_structure()", /*lint !e605 Increase in pointer capability */
228 hDTI->entity_options);
229
230 /*
231 * Check if there are any packets to free
232 */
233 if(hDTI->first_link EQ D_LINK)
234 return;
235
236 link = (DTI_LINK *) hDTI->first_link;
237
238 do {
239 link_last = link;
240
241 if(link->next_link NEQ D_LINK)
242 link = (DTI_LINK *) link->next_link;
243 else
244 go = FALSE;
245
246 /*
247 * Free the dti_queue
248 */
249 free_dti_data_ind_packets_queue(hDTI, link_last->dti_data_ind);
250
251 /*
252 * Free a link structure
253 */
254 MFREE (link_last);
255
256 } while( go );
257
258 } /* free_dti_link_structure() */
259
260 /*
261 +--------------------------------------------------------------------+
262 | PROJECT : DTILIB MODULE : DTI_KERF |
263 | STATE : code ROUTINE : trace_message |
264 +--------------------------------------------------------------------+
265
266 *
267 * Create a string
268 *
269 */
270
271 GLOBAL void trace_message (T_HANDLE handle,
272 char *str,
273 U32 entity_options)
274 {
275 if(! (entity_options & DTI_NO_TRACE) )
276 {
277 TRACE_EVENT(str);
278 }
279 } /*lint !e715 handle not referenced trace_message() */
280
281
282
283 /*
284 +--------------------------------------------------------------------+
285 | PROJECT : DTILIB MODULE : DTI_KERF |
286 | STATE : code ROUTINE : trace_message_link_id |
287 +--------------------------------------------------------------------+
288
289 *
290 * Create a string and a number
291 *
292 */
293
294 GLOBAL void trace_message_link_id (T_HANDLE handle,
295 char *str,
296 U32 link_id,
297 U32 entity_options)
298 {
299 if(! (entity_options & DTI_NO_TRACE) )
300 {
301 TRACE_EVENT_P2("%s - link_id=%d", str, link_id);
302 }
303 } /*lint !e715 handle not referenced trace_message_link_id() */
304
305
306
307 /*
308 +--------------------------------------------------------------------+
309 | PROJECT : DTILIB MODULE : DTI_KERF |
310 | STATE : code ROUTINE : trace_message_l_dl |
311 +--------------------------------------------------------------------+
312
313 *
314 * Create a string with link_id and data length
315 *
316 */
317
318 GLOBAL void trace_message_l_dl (T_HANDLE handle,
319 char *str,
320 U32 link_id,
321 U16 length,
322 U32 entity_options)
323 {
324 if(! (entity_options & DTI_NO_TRACE) )
325 {
326 TRACE_EVENT_P3("%s - link_id=%d length=%d", str, link_id, length);
327 }
328 } /* trace_message_l_dl() */
329
330
331
332 /*
333 +--------------------------------------------------------------------+
334 | PROJECT : DTILIB MODULE : DTI_KERF |
335 | STATE : code ROUTINE : trace_message_iic |
336 +--------------------------------------------------------------------+
337
338 *
339 * Create a string and a number
340 *
341 */
342
343 GLOBAL void trace_message_iic (T_HANDLE handle,
344 char *str,
345 U8 instance,
346 U8 interfac,
347 U8 channel,
348 U32 entity_options)
349 {
350 if(!(entity_options & DTI_NO_TRACE))
351 {
352 TRACE_EVENT_P4("%s - instance=%d interface=%d channel=%d",
353 str,
354 instance,
355 interfac,
356 channel);
357 }
358 } /*lint !e715 handle not referenced trace_message_iic() */
359
360
361
362 /*
363 +--------------------------------------------------------------------+
364 | PROJECT : DTILIB MODULE : DTI_KERF |
365 | STATE : code ROUTINE : trace_message_l_e |
366 +--------------------------------------------------------------------+
367
368 *
369 * Create a string and a number
370 *
371 */
372
373 GLOBAL void trace_message_l_e (T_HANDLE handle,
374 char *str,
375 U32 link_id,
376 char* entity,
377 U32 entity_options)
378 {
379 if(!(entity_options & DTI_NO_TRACE))
380 {
381 TRACE_EVENT_P3("%s - link_id=%d neighbor_entity=%s",
382 str,
383 link_id,
384 entity);
385 }
386 } /*lint !e715 handle not referenced trace_message_l_e() */
387
388 /*
389 +--------------------------------------------------------------------+
390 | PROJECT : DTILIB MODULE : DTI_KERF |
391 | STATE : code ROUTINE : trace_function |
392 +--------------------------------------------------------------------+
393
394 *
395 * Call macro TRACE_FUNKTION if traces are enabled
396 *
397 */
398
399 GLOBAL void trace_function( T_HANDLE handle, char *str, U32 entity_options)
400 {
401 if(! (entity_options & DTI_NO_TRACE) )
402 {
403 TRACE_FUNCTION (str);
404 }
405 } /*lint !e715 handle not referenced trace_function() */
406
407
408
409 /*
410 +--------------------------------------------------------------------+
411 | PROJECT : DTILIB MODULE : DTI_KERF |
412 | STATE : code ROUTINE : get_pointer_link_table_channel |
413 +--------------------------------------------------------------------+
414
415 *
416 * The function searchs an instance and a channel in the database link list
417 * and returns a pointer to the link list. If there is no link with the same channel and
418 * the same interface it returns NULL.
419 */
420
421 GLOBAL DTI_LINK * get_pointer_link_table_channel (DTI_HANDLE hDTI,
422 U8 instance,
423 U8 interfac,
424 U8 channel)
425 {
426 DTI_LINK *link_last, *link;
427 BOOL go = TRUE;
428
429 trace_function(hDTI->handle,
430 "get_pointer_link_table_channel()", /*lint !e605 Increase in pointer capability */
431 hDTI->entity_options);
432
433 link = (DTI_LINK *) hDTI->first_link;
434
435 /*
436 * Check if the link is not set
437 */
438
439 if(link EQ NULL)
440 return NULL;
441
442 do {
443 link_last = link;
444
445 /*
446 * Search on instance, interface and channal
447 */
448
449 if((link_last->instance EQ instance) AND (link_last->channel EQ channel) AND
450 (link_last->interfac EQ interfac) AND
451 (link_last->link_id NEQ D_FREE_LINK_ID))
452
453 return link_last;
454
455 if(link->next_link NEQ D_LINK)
456 link = (DTI_LINK *) link->next_link;
457 else
458 go = FALSE;
459
460 } while( go );
461
462 return NULL;
463 }
464
465
466 /*
467 +--------------------------------------------------------------------+
468 | PROJECT : DTILIB MODULE : DTI_KERF |
469 | STATE : code ROUTINE : get_pointer_link_table |
470 +--------------------------------------------------------------------+
471
472 *
473 * The function searchs a link id in the databank link list and returns a
474 * pointer to the link list. If there is no link_id with the selected direction it
475 * returns NULL. Note: the direction is used to select between to equal
476 * links in a link list because it could be 2 channels are connected on one
477 * instance.
478 */
479
480 GLOBAL DTI_LINK * get_pointer_link_table (DTI_HANDLE hDTI,
481 U32 select_link_id,
482 U8 select_direction)
483 {
484 DTI_LINK* link;
485
486 trace_function(hDTI->handle,
487 "get_pointer_link_table()",
488 hDTI->entity_options);
489
490 link = (DTI_LINK *) hDTI->first_link;
491
492 /*
493 * Find the link and return it
494 */
495 while(link NEQ NULL)
496 {
497 if(link->link_id EQ select_link_id)
498 return link;
499
500 link = (DTI_LINK *) link->next_link;
501 }
502
503 return NULL;
504 } /* get_pointer_link_table() */
505
506
507
508 /*
509 +--------------------------------------------------------------------+
510 | PROJECT : DTILIB MODULE : DTI_KERF |
511 | STATE : code ROUTINE : get_pointer_free_link |
512 +--------------------------------------------------------------------+
513
514 PURPOSE : The function searches a free link in the database link list
515 and returns a pointer to the link structure. If there is no
516 linkin the database then it returns NULL.
517 */
518
519 GLOBAL DTI_LINK * get_pointer_free_link (DTI_HANDLE hDTI)
520 {
521 DTI_LINK* link;
522
523 trace_function( hDTI->handle,
524 "get_pointer_free_link()",
525 hDTI->entity_options);
526
527 /*
528 * Search for unused link
529 */
530 link = (DTI_LINK *) hDTI->first_link;
531 while(link)
532 {
533 if(link->connect_state EQ DTI_CLOSED)
534 return link;
535 link = (DTI_LINK*)link->next_link;
536 }
537
538 /*
539 * Search for a link where only DTI_CONNECT_REQ has been received.
540 * This solves the situation when dti_open() is called for a new link
541 * and all links are used by existing links
542 * which are going to be closed and reopened with an other link_id
543 */
544 link = (DTI_LINK *) hDTI->first_link;
545 while(link)
546 {
547 if(link->connect_state EQ DTI_CONNECTING)
548 return link;
549 link = (DTI_LINK*)link->next_link;
550 }
551
552 return NULL;
553 } /* get_pointer_free_link() */
554
555
556
557 /*
558 +--------------------------------------------------------------------+
559 | PROJECT : DTILIB MODULE : DTI_KERF |
560 | STATE : code ROUTINE : open_comm_channel |
561 +--------------------------------------------------------------------+
562
563 *
564 * This function opens a VSI communication channel. If it's open it will be closed
565 * and opened new again. The opened handle is returned in the parameter com_handle.
566 */
567
568 GLOBAL void open_comm_channel(T_HANDLE entity_handle,
569 T_HANDLE *com_handle,
570 char *name,
571 U32 entity_options)
572 {
573
574 trace_function( entity_handle,
575 "open_comm_channel()",
576 entity_options);
577
578 /* Be sure the channel is closed if it was opened before */
579 vsi_c_close (entity_handle, *com_handle);
580
581 /* Open */
582 *com_handle = vsi_c_open(entity_handle, name);
583 }
584
585 /*
586 +--------------------------------------------------------------------+
587 | PROJECT : DTILIB MODULE : DTI_KERF |
588 | STATE : code ROUTINE : check_dti_version |
589 +--------------------------------------------------------------------+
590
591 *
592 * This function checks the version in a link table.
593 * and returns TRUE if the same version is found as in the request_version.
594 */
595
596 GLOBAL BOOL check_dti_version (DTI_HANDLE hDTI, U32 request_version)
597 {
598 trace_function(hDTI->handle,
599 "check_dti_version()", /*lint !e605 Increase in pointer capability */
600 hDTI->entity_options);
601
602 /*
603 * DTILIB has to be able to use older versions too.
604 * NOTE: this has been D_VERSION <= request_version until Aug-2002
605 * just an error or some sort of intricate reasoning??
606 */
607 if(D_VERSION >= request_version)
608 return TRUE;
609 else
610 return FALSE;
611 }
612
613 /*
614 +--------------------------------------------------------------------+
615 | PROJECT : DTILIB MODULE : DTI_KERF |
616 | STATE : code ROUTINE : validate_open_parameters |
617 +--------------------------------------------------------------------+
618
619 *
620 * This function validates the open-parameters
621 */
622 GLOBAL DTI_RESULT validate_open_parameters(DTI_HANDLE hDTI,
623 U32 link_id,
624 U8 *queue_size,
625 U8 *direction,
626 U32 *link_options,
627 U32 version,
628 U8 *neighbor_entity)
629 {
630 trace_function(hDTI->handle,
631 "validate_open_parameters()", /*lint !e605 Increase in pointer capability */
632 hDTI->entity_options);
633
634 /*
635 * Check version of peer dtilib
636 */
637 if (
638 check_dti_version
639 (
640 hDTI,
641 version
642 ) EQ FALSE
643 )
644 {
645 trace_message_link_id(hDTI->handle,
646 "DTI ERROR: Wrong DTI version", /*lint !e605 Increase in pointer capability */
647 link_id,
648 hDTI->entity_options);
649 return DTI_E_FAIL;
650 }
651
652 /*
653 * Legacy
654 */
655
656 /*
657 * Check if open with the NULL device.
658 */
659 if (strcmp ((CHAR*)neighbor_entity, NULL_NAME) EQ 0)
660 {
661 *direction = DTI_NULL_LINK;
662 }
663 if (*link_options EQ FLOW_CNTRL_ENABLED)
664 {
665 if (*queue_size EQ DTI_QUEUE_DISABLED)
666 {
667 *link_options = DTI_QUEUE_UNUSED;
668 }
669 else if (*queue_size EQ DTI_QUEUE_UNLIMITED)
670 {
671 *link_options = DTI_QUEUE_UNBOUNDED;
672 }
673 else
674 {
675 /*
676 * Set default behaviour
677 */
678 *link_options = DTI_QUEUE_RM_LIFO;
679 }
680 }
681
682 /*
683 * Ensure consistency
684 */
685 if((*link_options EQ DTI_QUEUE_UNUSED) OR
686 (*link_options EQ DTI_FLOW_CNTRL_DISABLED) OR
687 (*link_options EQ DTI_QUEUE_UNBOUNDED))
688 {
689 *queue_size = 0;
690 }
691 else if(*queue_size EQ 0)
692 {
693 *link_options = DTI_QUEUE_UNUSED;
694 }
695
696 return DTI_S_OK;
697 }
698
699
700 /*
701 +-----------------------------------------------------------------------+
702 | PROJECT : DTILIB MODULE : DTI_KERF |
703 | STATE : code ROUTINE : set_link_parameter |
704 +-----------------------------------------------------------------------+
705
706 *
707 * Set parameter in a link desc.
708 */
709
710 GLOBAL void set_open_para_link_table (DTI_HANDLE hDTI,
711 DTI_LINK *link,
712 U32 version,
713 U32 link_options,
714 U8 instance,
715 U8 interfac,
716 U8 channel,
717 U8 queue_size,
718 U8 connect_state)
719 {
720 trace_function(hDTI->handle,
721 "set_open_para_link_table()",
722 hDTI->entity_options);
723
724 /*
725 * Free primitives and descs if there are any in the queue.
726 */
727 free_dti_data_ind_packets_queue(hDTI, link->dti_data_ind);
728 link->dti_data_ind = NULL;
729 /*
730 * set parameters as requested
731 */
732 link->version = version;
733 link->instance = instance;
734 link->interfac = interfac;
735 link->channel = channel;
736 link->link_handle = D_LINK_HANDLE;
737 link->queue_len = 0;
738 link->rx_state = DTI_RX_IDLE;
739 link->tx_state = DTI_TX_BUFFER_FULL;
740 link->connect_state = connect_state;
741 link->queue_size = queue_size;
742 link->link_options = link_options;
743 /*
744 * the following structure is needed for ATP links
745 */
746 #ifdef FF_TCP_IP
747 link->entity_db = D_HANDLE;
748 link->port_nb = 0;
749 #endif /* FF_TCP_IP */
750 } /* set_open_para_link_table() */
751
752
753
754 /*
755 +--------------------------------------------------------------------+
756 | PROJECT : DTILIB MODULE : DTI_KERF |
757 | STATE : code ROUTINE : dti_resolve_link_id |
758 +--------------------------------------------------------------------+
759
760 *
761 * This function returns the link_id for the given
762 * instance/interface/channel.
763 *
764 * This is to be used to identify primitives sent from the entity to ACI
765 *
766 * return value: TRUE if associated link_id is found
767 * FALSE, otherwise
768 */
769
770 GLOBAL BOOL dti_resolve_link_id (DTI_HANDLE hDTI,
771 U8 instance,
772 U8 interfac,
773 U8 channel,
774 U32 *link_id)
775 {
776 DTI_LINK *link;
777
778 trace_function(hDTI->handle,
779 "dti_resolve_link_id()", /*lint !e605 Increase in pointer capability */
780 hDTI->entity_options);
781
782 if((link = get_pointer_link_table_channel(hDTI,
783 instance,
784 interfac,
785 channel)) EQ NULL)
786 {
787 return FALSE;
788 }
789
790 *link_id = link->link_id;
791 return TRUE;
792 } /* dti_resolve_link_id() */
793
794 /*
795 +--------------------------------------------------------------------+
796 | PROJECT : DTILIB MODULE : DTI_KERF |
797 | STATE : code ROUTINE : put_dti_data_ind_in_queue|
798 +--------------------------------------------------------------------+
799
800 *
801 * This function puts a dti_data_req primitive in queue.
802 */
803
804 GLOBAL void put_dti_data_ind_in_queue( DTI_HANDLE hDTI, DTI_LINK *link,
805 T_DTI2_DATA_IND *dti_data_ind)
806 {
807
808 if (hDTI->handle NEQ 0)
809 {
810 trace_function( hDTI->handle,
811 "put_dti_data_ind_in_queue()",
812 hDTI->entity_options);
813 }
814
815 dti_data_ind->link_id = 0;
816
817 /*
818 * Put in the first data packet.
819 * When using the old SAP the link->queue len can be 0 or 1
820 */
821 {
822 T_DTI2_DATA_IND *p_ind;
823 U8 chk = 1;
824
825 if(link->queue_len EQ 0)
826 {
827 link->dti_data_ind = dti_data_ind;
828 link->queue_len++;
829 return;
830 }
831
832
833 /* Now put more packets in the queue and put the new one on the last position */
834 p_ind = link->dti_data_ind;
835
836 /*
837 * Search the last packet in queue.
838 */
839 while(p_ind->link_id NEQ 0)
840 {
841 p_ind = (T_DTI2_DATA_IND *) p_ind->link_id;
842 chk++;
843 }
844
845 p_ind->link_id = (U32) dti_data_ind;
846
847 /*
848 * Check the queue length.
849 */
850 if(chk != link->queue_len)
851 {
852 trace_message_link_id(hDTI->handle,
853 "DTI ERROR: Write to queue error", /*lint !e605 Increase in pointer capability */
854 link->link_id,
855 hDTI->entity_options);
856 return;
857 }
858 link->queue_len++;
859 }
860 }
861
862
863
864 /*
865 +--------------------------------------------------------------------+
866 | PROJECT : DTILIB MODULE : DTI_KERF |
867 | STATE : code ROUTINE : get_dti_data_ind_from_queue |
868 +--------------------------------------------------------------------+
869
870 *
871 * This function gets a dti_data_ind primitive from queue. If there is
872 * no packet in the queue it returns NULL.
873 */
874
875 GLOBAL T_DTI2_DATA_IND * get_dti_data_ind_from_queue(DTI_HANDLE hDTI,
876 DTI_LINK *link)
877 {
878 T_DTI2_DATA_IND *ret_dti_data_ind;
879
880 trace_function( hDTI->handle,
881 "get_dti_data_ind_from_queue()",
882 hDTI->entity_options);
883
884 /*
885 * Is there any packet in the queue ?
886 */
887 if(link->queue_len EQ 0)
888 {
889 return NULL;
890 }
891 /*
892 * Set the second data packet on the first position.
893 */
894 ret_dti_data_ind = link->dti_data_ind;
895 /*
896 * Set the queue length
897 */
898 link->queue_len--;
899 /*
900 * Put the next data packet in position.
901 */
902 link->dti_data_ind = (T_DTI2_DATA_IND *)link->dti_data_ind->link_id;
903
904 return (ret_dti_data_ind);
905 } /* get_dti_data_ind_from_queue() */
906
907
908
909 /*
910 +--------------------------------------------------------------------+
911 | PROJECT : DTILIB MODULE : DTI_KERF |
912 | STATE : code ROUTINE : get_last_dti_data_ind_from_queue |
913 +--------------------------------------------------------------------+
914
915 *
916 * This function gets a dti_data_ind primitive from queue. If there is
917 * no packet in the queue it returns NULL.
918 */
919
920 LOCAL T_DTI2_DATA_IND * get_last_dti_data_ind_from_queue(DTI_HANDLE hDTI,
921 DTI_LINK *link)
922 {
923 T_DTI2_DATA_IND **last_dti_data_ind;
924 T_DTI2_DATA_IND *ret_dti_data_ind;
925
926 trace_function(hDTI->handle,
927 "get_last_dti_data_ind_from_queue()",
928 hDTI->entity_options);
929
930 /*
931 * Is there any packet in the queue?
932 */
933 if(link->queue_len EQ 0)
934 {
935 return NULL;
936 }
937 /*
938 * Get the last data packet
939 */
940 last_dti_data_ind = &(link->dti_data_ind);
941 while((*last_dti_data_ind)->link_id NEQ 0)
942 {
943 last_dti_data_ind = (T_DTI2_DATA_IND **) &((*last_dti_data_ind)->link_id);
944 }
945 ret_dti_data_ind = *last_dti_data_ind;
946 /*
947 * Set the queue length
948 */
949 link->queue_len--;
950 /*
951 * remove the data packet from queue.
952 */
953 *last_dti_data_ind = 0;
954
955 return (ret_dti_data_ind);
956 } /* get_last_dti_data_ind_from_queue() */
957
958
959
960 /*
961 +--------------------------------------------------------------------+
962 | PROJECT : DTILIB MODULE : DTI_KERF |
963 | STATE : code ROUTINE : put_dti_data_ind_in_queue_managed|
964 +--------------------------------------------------------------------+
965
966 *
967 * This function puts a dti_data_req primitive in queue.
968 * If the queue is full, it acts accordingly
969 */
970
971 GLOBAL void put_dti_data_ind_in_queue_managed (DTI_HANDLE hDTI,
972 DTI_LINK *link,
973 T_DTI2_DATA_IND *dti_data_ind)
974 {
975 trace_function(hDTI->handle,
976 "put_dti_data_ind_in_queue_managed()", /*lint !e605 Increase in pointer capability */
977 hDTI->entity_options);
978
979 /*
980 * Put new data packet into the queue.
981 */
982 if(link->link_options NEQ DTI_QUEUE_UNUSED)
983 {
984 put_dti_data_ind_in_queue(hDTI, link, dti_data_ind);
985 }
986
987 /*
988 * If queue full - send signal to entity.
989 */
990 switch (link->link_options)
991 {
992 case DTI_QUEUE_UNBOUNDED:
993 case DTI_QUEUE_WATERMARK:
994 break;
995
996 case DTI_QUEUE_UNUSED:
997 /* free data primitive since we cannot handle it */
998
999 trace_message_link_id(hDTI->handle,
1000 "DTI ERROR: No send queue available, discarding data packet", /*lint !e605 Increase in pointer capability */
1001 link->link_id,
1002 hDTI->entity_options);
1003
1004 mfree_desc (hDTI, &dti_data_ind->desc_list2);
1005 PFREE (dti_data_ind);
1006 break;
1007
1008 case DTI_QUEUE_RM_FIFO:
1009 if (link->queue_len > link->queue_size)
1010 {
1011 T_DTI2_DATA_IND *free_dti_data_ind
1012 = get_dti_data_ind_from_queue(hDTI, link);
1013
1014 trace_message_link_id(hDTI->handle,
1015 "Send queue full, discarding oldest data packet", /*lint !e605 Increase in pointer capability */
1016 link->link_id,
1017 hDTI->entity_options);
1018
1019 mfree_desc (hDTI, &free_dti_data_ind->desc_list2);
1020 PFREE (free_dti_data_ind);
1021 }
1022 break;
1023
1024 case DTI_QUEUE_RM_LIFO:
1025 if (link->queue_len > link->queue_size)
1026 {
1027 T_DTI2_DATA_IND *free_dti_data_ind
1028 = get_last_dti_data_ind_from_queue(hDTI, link);
1029
1030 trace_message_link_id(hDTI->handle,
1031 "Send queue full, discarding newest data packet", /*lint !e605 Increase in pointer capability */
1032 link->link_id,
1033 hDTI->entity_options);
1034
1035 mfree_desc (hDTI, &free_dti_data_ind->desc_list2);
1036 PFREE (free_dti_data_ind);
1037 }
1038 break;
1039
1040 default:
1041 trace_message_link_id(hDTI->handle,
1042 "DTI ERROR: Unknown state for link_options", /*lint !e605 Increase in pointer capability */
1043 link->link_id,
1044 hDTI->entity_options);
1045 break;
1046 }
1047 } /* put_dti_data_ind_in_queue_managed() */
1048
1049
1050
1051 /*
1052 +--------------------------------------------------------------------+
1053 | PROJECT : DTILIB MODULE : DTI_KERF |
1054 | STATE : code ROUTINE : dti_make_new_desc |
1055 +--------------------------------------------------------------------+
1056
1057 *
1058 * Malloc a knew desc. Init a buffer 0 if buff_init_0 is TRUE.
1059 *
1060 */
1061
1062 BOOL dti_make_new_desc( DTI_HANDLE hDTI, T_desc2 **p_desc_new,
1063 U16 malloc_len, BOOL buff_init_0)
1064 {
1065 #define VSI_CALLER hDTI->handle,
1066
1067 trace_function( hDTI->handle,
1068 "dti_make_new_desc()",
1069 hDTI->entity_options);
1070
1071 MALLOC ((*p_desc_new), ((U16)(sizeof(T_desc2)-1 + malloc_len)));
1072
1073 if(*p_desc_new EQ 0)
1074 return(FALSE);
1075
1076 if(buff_init_0)
1077 {
1078 U16 i;
1079 for(i=0; i<malloc_len; i++)
1080 (*p_desc_new)->buffer[i] = 0;
1081 }
1082 (*p_desc_new)->len = malloc_len;
1083 (*p_desc_new)->next = 0;
1084 (*p_desc_new)->offset = 0;
1085 (*p_desc_new)->size = (*p_desc_new)->len + (*p_desc_new)->offset;
1086 return(TRUE);
1087
1088 #undef VSI_CALLER
1089 }
1090
1091
1092 /*
1093 +--------------------------------------------------------------------+
1094 | PROJECT : DTILIB MODULE : DTI_KERF |
1095 | STATE : code ROUTINE : mfree_desc |
1096 +--------------------------------------------------------------------+
1097
1098 *
1099 * Free the descs in a desc list.
1100 *
1101 */
1102
1103
1104 GLOBAL void mfree_desc(DTI_HANDLE hDTI, T_desc_list2 * desc_list2)
1105 {
1106 BOOL go = TRUE;
1107 T_desc2 *p_desc_last, *p_desc;
1108
1109 trace_function( hDTI->handle,
1110 "mfree_desc()",
1111 hDTI->entity_options);
1112
1113 if (desc_list2 EQ NULL)
1114 return;
1115
1116 if (desc_list2->first EQ 0)
1117 return;
1118
1119 p_desc = (T_desc2 *) desc_list2->first;
1120
1121 do {
1122 p_desc_last = p_desc;
1123
1124 if(p_desc->next >0)
1125 p_desc = (T_desc2 *) p_desc->next;
1126 else
1127 go = FALSE;
1128
1129 MFREE (p_desc_last);
1130
1131 } while( go );
1132 }
1133
1134
1135 /*
1136 +-----------------------------------------------------------------------+
1137 | PROJECT : DTILIB MODULE : DTI_KERF |
1138 | STATE : code ROUTINE : close_link_with_signal |
1139 +-----------------------------------------------------------------------+
1140
1141 *
1142 * Close a link.
1143 */
1144
1145 GLOBAL void close_link_with_signal(DTI_HANDLE hDTI, DTI_LINK *link)
1146 {
1147 U8 hlp_instance, hlp_interface;
1148 U8 hlp_channel;
1149
1150 trace_function( hDTI->handle,
1151 "close_link_with_signal()",
1152 hDTI->entity_options);
1153
1154 /*
1155 * Close communication channel
1156 */
1157 vsi_c_close (hDTI->handle, link->link_handle);
1158
1159 hlp_instance = link->instance;
1160 hlp_interface = link->interfac;
1161 hlp_channel = link->channel;
1162
1163 /*
1164 * Set the default parameter and call the callback function.
1165 */
1166
1167 set_default_para_link_table(hDTI,link, D_FREE_LINK_ID, D_DIRECTION);
1168
1169 /*
1170 * Call the callback function.
1171 */
1172
1173 hDTI->sig_callback(hlp_instance, hlp_interface, hlp_channel,
1174 DTI_REASON_CONNECTION_CLOSED, NULL);
1175
1176 /*
1177 * Note: Any flow control and any data primitive are now silently discarded.
1178 */
1179 }
1180
1181
1182
1183 /*
1184 +-------------------------------------------------------------------------+
1185 | PROJECT : DTILIB MODULE : DTI_KERF |
1186 | STATE : code ROUTINE : set_reset_req_para_link_table |
1187 +-------------------------------------------------------------------------+
1188 *
1189 * Set parameter by reset.
1190 *
1191 */
1192
1193 GLOBAL void set_reset_req_para_link_table(DTI_HANDLE hDTI, DTI_LINK *link)
1194 {
1195 /*
1196 * Free primitives and descs if there are any in the queue.
1197 */
1198 free_dti_data_ind_packets_queue(hDTI, link->dti_data_ind);
1199 link->dti_data_ind = NULL;
1200 /*
1201 * Set the other parameters
1202 */
1203 link->queue_len = 0;
1204 link->connect_state = DTI_IDLE;
1205 } /* set_reset_req_para_link_table() */