comparison src/cs/services/atp/atp_port.c @ 0:b6a5e36de839

src/cs: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:39:26 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:b6a5e36de839
1 /*******************************************************************************
2 *
3 * File Name : atp_port.c
4 *
5 * Functions used by atp_services.c file to handle port structure
6 *
7 * (C) Texas Instruments, all rights reserved
8 *
9 * Version number : 0.1 Date : 10-May-2000 from atp_port.c
10 *
11 * History : 0.1 - Created by E. Baissus . Gathers functions used only
12 * as internal services
13 *
14 * Author : Eric Baissus : e-baissus@ti.com
15 *
16 * (C) Copyright 2000 by Texas Instruments Incorporated, All Rights Reserved
17 ******************************************************************************/
18 #include "rv/rv_general.h"
19 #include "rvf/rvf_api.h"
20 #include "atp/atp_api.h"
21 #include "atp/atp_i.h"
22 #include "atp/atp_messages.h"
23 #include "rvm/rvm_use_id_list.h"
24
25
26
27 T_ATP_PORT_STRUCT * atp_first_port_p; /* Pointer on the first port structure */
28
29 T_ATP_RET atp_init_port(T_ATP_PORT_STRUCT *new_port_p);
30
31
32
33
34
35
36
37
38
39 /******************************************************************************
40 * Function name: atp_init_port
41 *
42 * Description : Initialise a new port
43 *
44 * Parameters : pointer on the new port
45 *
46 * Return : Always return RV_OK
47 *
48 * History : 0.1 (1-Marsh-2000) - Created
49 * 0.9:(22-May-2000) - Added redirection
50 *
51 ******************************************************************************/
52
53 T_ATP_RET atp_init_port(T_ATP_PORT_STRUCT *new_port_p)
54 {
55 new_port_p->next_p = NULL;
56 new_port_p->port_state = ATP_OPEN_PENDING;
57
58 (new_port_p->port_info[0]).port_nb = INVALID_PORT_NB;
59 (new_port_p->port_info[0]).sw_id = ATP_INVALID_SWE_ID;
60 (new_port_p->port_info[0]).tx_mb = RVF_INVALID_MB_ID;
61 (new_port_p->port_info[0]).rx_mb = RVF_INVALID_MB_ID;
62 (new_port_p->port_info[0]).rx_data_left = 0;
63 ((new_port_p->port_info[0]).no_copy_info).packet_mode = NORMAL_PACKET;
64 ((new_port_p->port_info[0]).no_copy_info).rx_head_size = 0;
65 ((new_port_p->port_info[0]).no_copy_info).rx_trail_size = 0;
66 ((new_port_p->port_info[0]).no_copy_info).tx_head_size = 0;
67 ((new_port_p->port_info[0]).no_copy_info).tx_trail_size = 0;
68 (new_port_p->port_info[0]).signal = (ATP_RX_FLOW_ON | ATP_TX_FLOW_ON);
69
70 (new_port_p->port_info[1]).port_nb = INVALID_PORT_NB;
71 (new_port_p->port_info[1]).sw_id = ATP_INVALID_SWE_ID;
72 (new_port_p->port_info[1]).tx_mb = RVF_INVALID_MB_ID;
73 (new_port_p->port_info[1]).rx_mb = RVF_INVALID_MB_ID;
74 (new_port_p->port_info[1]).rx_data_left = 0;
75 ((new_port_p->port_info[1]).no_copy_info).packet_mode = NORMAL_PACKET;
76 ((new_port_p->port_info[1]).no_copy_info).rx_head_size = 0;
77 ((new_port_p->port_info[1]).no_copy_info).rx_trail_size = 0;
78 ((new_port_p->port_info[1]).no_copy_info).tx_head_size = 0;
79 ((new_port_p->port_info[1]).no_copy_info).tx_trail_size = 0;
80 (new_port_p->port_info[1]).signal = (ATP_RX_FLOW_ON | ATP_TX_FLOW_ON);
81
82 /* Redirection information */
83 new_port_p->redirect_mode = ATP_REDIRECT_OFF;
84 new_port_p->redirect_port_end_nb = 0;
85 new_port_p->redirect_port_p = NULL;
86
87 /* Data queue information */
88 (new_port_p->port_info[0]).rx_queue.p_first = NULL;
89 (new_port_p->port_info[0]).rx_queue.p_last = NULL;
90 (new_port_p->port_info[0]).rx_queue.count = 0;
91
92 (new_port_p->port_info[1]).rx_queue.p_first = NULL;
93 (new_port_p->port_info[1]).rx_queue.p_last = NULL;
94 (new_port_p->port_info[1]).rx_queue.count = 0;
95
96 /* Pointer on DCE information */
97 new_port_p->dce_info_p = NULL;
98
99 new_port_p->port_config = NOT_DEFINED_CONFIG;
100
101 /* Flow control */
102 new_port_p->port_waiting_for_mb_callback = ATP_MAX_SW_NB;
103
104 /* Command info */
105 new_port_p->cmd_info.cmd_txt_p = NULL;
106
107 return (atp_init_cmd_info_struct (new_port_p));
108 }
109
110
111
112
113
114
115
116 /******************************************************************************
117 * Function name: atp_create_port
118 *
119 * Description : Create a new port instance in the port chained list
120 *
121 * Parameters : Output = pointeur on the new port structure
122 *
123 * Return : Error flag :
124 * Possible values are RV_OK or RV_MEMORY_ERR
125 *
126 * History : 0.1 (1-Marsh-2000) - Created / E.Baissus
127 *
128 ******************************************************************************/
129
130 T_ATP_RET atp_create_port(T_ATP_PORT_STRUCT **port_pp)
131 {
132
133 T_ATP_PORT_STRUCT *new_port_p,*p;
134
135 /* get new buffer */
136 switch(rvf_get_buf(atp_mb_prim,sizeof(T_ATP_PORT_STRUCT),(void **) &new_port_p))
137 {
138 case RVF_GREEN:
139 {
140 break;
141 }
142 case RVF_YELLOW:
143 {
144 rvf_free_buf ((T_RVF_BUFFER *) new_port_p);
145 }
146 default:
147 {
148 return RV_MEMORY_ERR;
149 }
150 }
151
152 /* initialisation of the new instance */
153 atp_init_port(new_port_p);
154
155
156 // START : THIS SECTION MUST BE PROTECTED BY A SEMAPHORE !!!!!!
157
158 /* get latest port instance */
159 if (atp_first_port_p==NULL)
160 { /* this new instance is the first one */
161 atp_first_port_p=new_port_p;
162 }
163 else
164 {
165 p=atp_first_port_p;
166 while(p->next_p!=NULL)
167 {
168 p=p->next_p;
169 }
170 /* p points on the last port instance */
171 p->next_p=new_port_p;
172 }
173 // END : THIS SECTION MUST BE PROTECTTED BY A SEMAPHORE !!!!!!
174
175 *port_pp=new_port_p;
176
177 return RV_OK;
178 }
179
180
181
182
183
184
185
186 /******************************************************************************
187 * Function name: atp_delete_port
188 *
189 * Description : delete port instance
190 *
191 * Parameters : - port_p points on the port structure to remove
192 *
193 * Return : Standard error flag
194 * If OK, returns RV_OK
195 *
196 * History : 0.1 (1-Marsh-2000) - Created / E.Baissus
197 *
198 ******************************************************************************/
199
200 T_ATP_RET atp_delete_port(T_ATP_PORT_STRUCT *port_p)
201 {
202 T_ATP_PORT_STRUCT *p;
203
204 p=atp_first_port_p;
205
206
207 // START : THIS SECTION MUST BE PROTECTED BY A SEMAPHORE !!!!!!
208 /* Delete buffer pointer by the port structure */
209 if (port_p->dce_info_p != NULL)
210 {
211 // Reset fields used by the escape sequence algorithm
212 atp_reset_escape_sequence(port_p);
213 rvf_free_buf(port_p->dce_info_p);
214 }
215 if (port_p->cmd_info.cmd_txt_p != NULL)
216 {
217 rvf_free_buf(port_p->cmd_info.cmd_txt_p);
218 }
219 if (p==port_p)
220 {
221 /* The instance to delete is the first one */
222 atp_first_port_p=port_p->next_p;
223 rvf_free_buf(port_p);
224 return RV_OK;
225 }
226 else
227 {
228
229 while(p!=NULL)
230 {
231 if (p->next_p==port_p)
232 {
233 /* The instance to deleted has been found */
234 if (port_p->next_p==NULL)
235 {
236 /* The instance to delete is the last instance of the chain */
237 p->next_p=NULL;
238 }
239 else
240 {
241 p->next_p=port_p->next_p;
242 }
243
244 rvf_free_buf(port_p);
245 return RV_OK;
246
247 }
248 p=p->next_p;
249
250 } /* end of the while loop */
251 // END : THIS SECTION MUST BE PROTECTTED BY A SEMAPHORE !!!!!!
252
253 /* The device has not been found */
254 return RV_INTERNAL_ERR;
255
256 }/* end of the if/else */
257 }
258
259
260
261
262
263 /******************************************************************************
264 * Function name: atp_get_port
265 *
266 * Description : provides the pointer pointing on the proper port structure
267 * value
268 *
269 * Parameters : - sw_id : SW entity ID related to the port
270 * - port_nb : associated port number
271 * - &port_p : output : pointer on the found port structure
272 * - &sw_nd : output : indicate which of the 2 sw entity of the port has been found
273 *
274 * Return : Standard error flag from BT
275 * If OK, returns RV_OK. If port not found, return RV_INTERNAL_ERR.
276 *
277 * History : 0.1 (1-Marsh-2000) - Created / E.Baissus
278 *
279 ******************************************************************************/
280
281 T_ATP_RET atp_get_port(T_ATP_SW_ENTITY_ID sw_id, T_ATP_PORT_NB port_nb, T_ATP_PORT_STRUCT **port_found_pp, T_ATP_SW_NB *sw_nb_p)
282 {
283 for (*port_found_pp = atp_first_port_p;
284 *port_found_pp != NULL;
285 *port_found_pp = (*port_found_pp)->next_p)
286 {
287 if ((((*port_found_pp)->port_info[0]).sw_id == sw_id) && \
288 (((*port_found_pp)->port_info[0]).port_nb == port_nb))
289 {
290 /* The port instance has been found : sw_nb = 0 (initiator) */
291 *sw_nb_p = 0;
292 return (RV_OK);
293 }
294 if ((((*port_found_pp)->port_info[1]).sw_id == sw_id) && \
295 (((*port_found_pp)->port_info[1]).port_nb == port_nb))
296 {
297 /* The port instance has been found : sw_nb = 1 (target) */
298 *sw_nb_p = 1;
299 return (RV_OK);
300 }
301 }
302 return (RV_INVALID_PARAMETER);
303 }
304
305
306 /******************************************************************************
307 * Function name: atp_delete_all_port
308 *
309 * Description : delete all the ports
310 *
311 * Parameters :
312 *
313 * Return : Standard error flag
314 * If OK, returns RV_OK
315 *
316 * History : 0.1 (1-Marsh-2000) - Created / E.Baissus
317 *
318 ******************************************************************************/
319 T_ATP_RET atp_delete_all_port(void)
320 {
321 T_ATP_PORT_STRUCT *p,*next_p;
322 T_ATP_RET return_status = RV_OK;
323
324 p=atp_first_port_p;
325 while((p != NULL) && (return_status == RV_OK))
326 {
327 next_p = p->next_p;
328 return_status = atp_delete_port(p);
329 p=next_p;
330 }
331 return return_status;
332 }
333
334
335
336
337 /******************************************************************************
338 * Function name: atp_send_message
339 *
340 * Description : Generic function to send message
341 *
342 * Parameters :
343 *
344 * Return : RV_OK
345 *
346 * History : 0.1 (1-Marsh-2000) - Created
347 * 0.15 (15-Marsh-2000) - Added possibility to send to a mail box
348 *
349 ******************************************************************************/
350 T_ATP_RET atp_send_message(T_ATP_CALLBACK path,T_ATP_MESSAGE * message_p)
351 {
352
353 if (path.callback_func!= NULL)
354 {
355 path.callback_func((void *) message_p);
356 /* It is up to the target id to free the message buffer later on !!!!*/
357 return RV_OK;
358 }
359 else
360 {
361 return rvf_send_msg(path.addr_id,(void *) message_p);
362 }
363
364 }
365
366
367