1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 | Project : CSD (8411)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 | Modul : L2r_upf.c
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 | Copyright 2002 Texas Instruments Berlin, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 | All rights reserved.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 | This file is confidential and a trade secret of Texas
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 | Instruments Berlin, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 | The receipt of or possession of this file does not convey
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 | any rights to reproduce or disclose its contents or to
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 | manufacture, use, or sell anything it may describe, in
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 | whole, or in part, without the specific written consent of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 | Texas Instruments Berlin, AG.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 | Purpose : This Modul defines the procedures and functions for
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 | the component L2R of the base station
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #ifndef L2R_UPF_C
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 #define L2R_UPF_C
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 #define ENTITY_L2R
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 /*==== INCLUDES ===================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 #include <string.h>
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 #include "typedefs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 #include "pconst.cdg"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 #include "vsi.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 #include "macdef.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 #include "custom.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 #include "gsm.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 #include "cus_l2r.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 #include "cnf_l2r.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 #include "mon_l2r.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 #include "prim.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 #include "pei.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 #include "tok.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 #include "dti.h" /* functionality of the dti library */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 #include "cl_ribu.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 #include "l2r.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 /*==== CONST =======================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 /*==== TYPES =======================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 /*==== VAR EXPORT ==================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 /*==== VAR LOCAL ===================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 /*==== FUNCTIONS ===================================================*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 | Function : up_init
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 | Description : initialise the l2r data for the uplink process
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 GLOBAL void up_init(T_UP *dup)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 register ULONG i;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 TRACE_FUNCTION ("up_init()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 dup->FlowCtrlUsed = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 dup->DnFlow = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 dup->UpFlow = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 dup->ULFlow = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 dup->LLFlow = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 dup->MrgFlow = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 dup->FlowThreshLo = MAX_UPRIM_RIBU_SIZE/2;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 dup->FlowThreshHi = 3*MAX_UPRIM_RIBU_SIZE/4;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 dup->DataSize = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 dup->FrameSize = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 dup->OldFrameSize = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 dup->FramesPerPrim = L2R_FRAMES_PER_PRIM_MAX;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 dup->LastRcvdSa = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 dup->LastRcvdSb = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 dup->LastSentSa = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 dup->LastSentSb = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 dup->LastSentFlow = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 dup->StoreDataActive = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 dup->UrgentMsg = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 dup->DiscardRemapData = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 dup->QRemapRead = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 dup->QRemapWrite = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 dup->BRemapAdr = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 dup->BRemapLen = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 dup->BRemapSa = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 dup->BRemapSb = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 dup->BRemapLastState = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 dup->QRemapPrimDesc.prim = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 for (i = 0; i < MAX_UP_REMAP_QUEUE_SIZE; i++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 dup->QRemap[i] = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 for (i = 0; i < UP_REMAP_BUFFER_SIZE; i++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 dup->BRemap[i] = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 dup->RiBu.idx.depth = MAX_UPRIM_RIBU_SIZE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 INIT_STATE (UP_UL, IW_IDLE);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 INIT_STATE (UP_LL, ISW_IDLE);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 INIT_STATE (UP, UP_DISCONNECTED);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 | Function : up_alloc_prim
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 LOCAL void up_alloc_prim(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 T_PRIM_INDEX m;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 T_P_UPRIM_DESCRIPTOR primDesc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 USHORT sduSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 TRACE_FUNCTION ("up_alloc_prim()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 sduSize = dup->FramesPerPrim * dup->FrameSize * 8;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 primDesc = dup->RiBu.primDesc[dup->RiBu.alloc];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 PALLOC_SDU(data_req, RLP_DATA_REQ, sduSize);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 primDesc->prim = data_req;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 /* Clear SDU for test environment */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 UBYTE *p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 UBYTE *pend;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 p = &primDesc->prim->sdu.buf[0];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 pend = p + (sduSize >> 3);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 while (p < pend)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 *p++ = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 primDesc->prim->sdu.o_buf = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 primDesc->prim->sdu.l_buf = sduSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 primDesc->nFr = dup->FramesPerPrim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 primDesc->index = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 primDesc->offset = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 primDesc->off_status = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 primDesc->full = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 primDesc->sa = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 primDesc->sb = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 /*lint -e416 (Warning -- Likely creation of out-of-bounds) */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 for (m = 0; m != dup->FramesPerPrim; m++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 (*primDesc->adr)[m] = (T_P_L2R_FRAME)(primDesc->prim->sdu.buf +L2R_ENCODING_OFFSET + m * dup->FrameSize);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 /*lint +e416 (Warning -- Likely creation of out-of-bounds) */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 dup->RiBu.alloc++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 if (dup->RiBu.alloc EQ dup->RiBu.idx.depth)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 dup->RiBu.alloc = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 | Function : up_send_prim_timeout
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 GLOBAL void up_send_prim_timeout(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 TRACE_FUNCTION ("up_send_prim_timeout()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 if (!dup->RiBu.idx.filled)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 if (dup->RiBu.alloc EQ dup->RiBu.idx.wi)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 /* No primitive is there, so we allocate one */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 up_alloc_prim();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 No primitive is ready, so we take one away from the relay entity
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 cl_ribu_write_index(&dup->RiBu.idx); /* point to next primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 up_send_current_prim();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 | Function : up_next_remap_frame
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 | Description : Local function, which is used by up_copy_data_from_l2r
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 | to advance to the next frame in the primitive.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 | The variable primDesc of the calling function is updated.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 | Parameters : primDesc -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 | Return : 1 -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 | 0 -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 LOCAL UBYTE up_next_remap_frame(T_RPRIM_DESCRIPTOR *primDesc)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 U8 i;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 T_P_RLP_REMAP_DATA_IND prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 /* next frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 primDesc->index++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 if (primDesc->index >= primDesc->nFr)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 /* primitive is completely read out */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 PFREE(dup->QRemap [dup->QRemapRead]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 /* next primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 (dup->QRemapRead)++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 if (dup->QRemapRead >= MAX_UP_REMAP_QUEUE_SIZE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 dup->QRemapRead = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 if (dup->QRemapRead EQ dup->QRemapWrite)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 /* no primitive is ready */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 primDesc->prim = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 return (1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 /* point to next primitive descriptor */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 prim = dup->QRemap[dup->QRemapRead];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 primDesc->prim = prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 primDesc->nFr = prim->sdu.l_buf / (8 * prim->data_size + HT_LEN);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 primDesc->index = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 for (i = 0; i < primDesc->nFr; i++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 primDesc->adr[i] = (T_P_L2R_FRAME)(prim->sdu.buf + (prim->sdu.o_buf>>3)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 + HEADER_LEN + i * (prim->data_size + HT_LEN));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 primDesc->offset = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 primDesc->off_status = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 return (0);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 | Function : up_copy_data_from_rq
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 | Parameters : buf -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 | len -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 | sa -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 | sb -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 | bytesCopied -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 LOCAL void up_copy_data_from_rq(U8 *buf, U16 len, U8 *sa, U8 *sb, U16 *bytesCopied)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 register ULONG i;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 register T_P_UBYTE pFrame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 register T_P_UBYTE pBuf;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 register T_P_UBYTE pStat;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 T_P_RLP_REMAP_DATA_IND prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 T_P_L2R_FRAME frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 T_P_UBYTE pEnd;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 USHORT bytesToCopy;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 USHORT blocklen;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 UBYTE statOct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 UBYTE lastState;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 T_RPRIM_DESCRIPTOR *primDesc = &dup->QRemapPrimDesc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 TRACE_FUNCTION ("up_copy_data_from_rq()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 bytesToCopy = len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 if (primDesc->prim EQ NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 prim = dup->QRemap[dup->QRemapRead];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 primDesc->prim = prim;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 primDesc->nFr = prim->sdu.l_buf / ((prim->data_size<<3) + HT_LEN);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 primDesc->index = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 primDesc->offset = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 primDesc->off_status = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 for (i = 0; i < primDesc->nFr; i++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 primDesc->adr[i] = (T_P_L2R_FRAME)(prim->sdu.buf + (prim->sdu.o_buf>>3)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 + HEADER_LEN + i * (prim->data_size + HT_LEN));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 /* skip empty primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 if (primDesc->nFr EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 *bytesCopied = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 frame = primDesc->adr[primDesc->index]; /* point to current l2r frame in primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 pBuf = buf; /* point to destination buffer */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 pFrame = &((*frame)[primDesc->offset]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 pStat = &((*frame)[primDesc->off_status]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 if (pFrame EQ pStat)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 /* current byte is status octet */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358 dup->BRemapLastState = *pFrame & SO_STATUS_BITS_MASK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 lastState = dup->BRemapLastState;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 *sa = GET_SO_SA_BIT(lastState);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 *sb = GET_SO_SB_BIT(lastState);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 /************************************************************************************
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366 * loop until either
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 * - no more data are available or
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 * - status in L2R frame changes or
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369 * - buffer for data is full
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 ************************************************************************************/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
371
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372 for (;;)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
373 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375 TRACE_FUNCTION ("loop");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 blocklen = pStat - pFrame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 if (blocklen EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 * current byte is status octet
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383 * (only in the first pass of the loop, there may be no status octet)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
386 /*****************************
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387 * evaluate status bits
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 *****************************/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389 statOct = *pFrame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
390 if (lastState NEQ (statOct & SO_STATUS_BITS_MASK))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
391 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
393 * status has changed. We have to stop,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 * since only one state can be transmitted to the upper layer
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
395 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 primDesc->offset = primDesc->off_status = pFrame - (T_P_UBYTE)frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
397
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 *bytesCopied = len - bytesToCopy;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 pFrame++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
404 /************************************
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 * evaluate addrss bits
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 ************************************/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 statOct &= SO_ADR_MASK;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 switch (statOct)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411 case SO_BREAK_ACK:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 case SO_BREAK_REQ:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
413 case SO_END_EMPTY:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 /* no more data in this frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 if (up_next_remap_frame(primDesc) EQ 1)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417 /* no more data available */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
418 *bytesCopied = len - bytesToCopy; /* this much data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
419 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 frame = primDesc->adr[primDesc->index];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
423 pFrame = (T_P_UBYTE)frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
424 pStat = (T_P_UBYTE)frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
425 continue; /* continue with next frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427 case SO_END_FULL:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 pStat = &((*frame)[primDesc->prim->data_size]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
429 blocklen = pStat - pFrame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432 case SO_TWO_OCTET:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
433 blocklen = *pFrame++ & SO_ADR_MASK_TWO_OCT;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434 pStat = pFrame + blocklen;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
437 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 blocklen = statOct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
439 pStat = pFrame + blocklen;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
440 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
444 if (bytesToCopy < blocklen)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
445 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
446 /***************************************
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
447 * There is not enough space in the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
448 * buffer to copy the complete block
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
449 ***************************************/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
450
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
451 pEnd = pFrame + bytesToCopy;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
452
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
453 while (pFrame < pEnd)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
454 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
455 *pBuf++ = *pFrame++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
456 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
457
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
458 if (pFrame EQ &((*frame)[primDesc->prim->data_size]))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
459 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
460 /* end of frame reached */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
461 up_next_remap_frame(primDesc);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
462 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
463 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
464 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
465 primDesc->offset = pFrame - (T_P_UBYTE)frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
466 primDesc->off_status = pStat - (T_P_UBYTE)frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
467 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
468 *bytesCopied = len; /* this much data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
469 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
470 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
471 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
472 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
473 /***************************************
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
474 * Copy the complete block
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
475 ***************************************/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
476 bytesToCopy -= blocklen;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
477
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
478 while (pFrame < pStat)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
479 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
480 *pBuf++ = *pFrame++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
481 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
482
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
483 if (pFrame EQ &((*frame)[primDesc->prim->data_size]))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
484 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
485 /* end of frame reached */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
486 if (up_next_remap_frame(primDesc) EQ 1)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
487 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
488 /* no more data available */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
489 *bytesCopied = len - bytesToCopy; /* this much data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
490 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
491 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
492 frame = primDesc->adr[primDesc->index];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
493 pFrame = (T_P_UBYTE)frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
494 pStat = (T_P_UBYTE)frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
495 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
496 if (bytesToCopy EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
497 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
498 primDesc->offset = pFrame - (T_P_UBYTE)frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
499 primDesc->off_status = pStat - (T_P_UBYTE)frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
500 *bytesCopied = len; /* this much data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
501 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
502 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
503 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
504 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
505 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
506
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
507 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
508 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
509 | Function : up_fill_in_status_octet
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
510 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
511 | Description : local function, which is used patch a status octet into a
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
512 | l2r frame. This function takes into acount the two octet
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
513 | format for 14400.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
514 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
515 | Parameters : pFrame - points to begin of l2r frame
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
516 | offstat1 - offset of status octet to be patched
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
517 | offstat2 - offset of next status octet
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
518 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
519 | Return :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
520 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
521 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
522
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
523 LOCAL BOOL up_fill_in_status_octet(T_P_UBYTE pFrame, UBYTE offstat1, UBYTE offstat2)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
524 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
525 register T_P_UBYTE pStat, pSrc, pDes, pEnd;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
526 register UBYTE dataLen;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
527
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
528 dataLen = offstat2 - offstat1 - 1; /* number of data bytes between status octets */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
529 pStat = pFrame + offstat1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
530
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
531 if (dataLen <= DATA_SIZE_SHORT-2)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
532 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
533 *pStat |= dataLen;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
534 return (FALSE);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
535 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
536 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
537 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
538 /* this is only possible with 14400 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
539 if (offstat2 < DATA_SIZE_LONG - 1)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
540 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
541 /* a two octet status must be inserted */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
542 pSrc = pFrame + offstat2;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
543 pDes = pSrc + 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
544 pEnd = pFrame + offstat1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
545 while (pSrc > pEnd)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
546 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
547 *--pDes = *--pSrc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
548 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
549 *pStat |= SO_TWO_OCTET;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
550 pStat++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
551 *pStat = dataLen;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
552 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
553 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
554 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
555 /* a additional status octet (FULL) must be inserted somewhere in the frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
556 pSrc = pFrame + offstat2;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
557 pDes = pSrc + 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
558 pEnd = pFrame + offstat1 + DATA_SIZE_SHORT - 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
559 while (pSrc > pEnd)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
560 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
561 *--pDes = *--pSrc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
562 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
563 *pStat |= DATA_SIZE_SHORT - 2;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
564 *pEnd = *pStat & SO_STATUS_BITS_MASK | SO_END_FULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
565 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
566 return (TRUE);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
567 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
568 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
569
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
570 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
571 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
572 | Function : up_next_frame
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
573 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
574 | Description : local function, which is used by up_copy_data_into_l2r to
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
575 | advance to the next frame in the primitive
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
576 | The variables primDesc, frame and pFrame of the calling function
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
577 | are updated. Moreover the return values of the calling function
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
578 | primToSend and bytesCopied are set.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
579 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
580 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
581 | Parameters : primDesc -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
582 | primToSend -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
583 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
584 | Return :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
585 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
586 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
587
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
588 LOCAL UBYTE up_next_frame(T_P_UPRIM_DESCRIPTOR *primDesc, BOOL *primToSend)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
589 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
590 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
591
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
592 TRACE_FUNCTION("up_next_frame()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
593
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
594 (*primDesc)->index++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
595 (*primDesc)->offset = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
596
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
597 if ((*primDesc)->index >= dup->FramesPerPrim) /* primitive is filled */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
598 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
599 (*primDesc)->full = TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
600 *primToSend = TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
601
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
602 cl_ribu_write_index(&dup->RiBu.idx); /* point to next primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
603
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
604 if (dup->RiBu.alloc EQ dup->RiBu.idx.wi)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
605 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
606 /* no primitive is ready */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
607 return (1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
608 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
609
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
610 /* point to next primitive descriptor */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
611 *primDesc = dup->RiBu.primDesc[dup->RiBu.idx.wi];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
612 (*primDesc)->index = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
613 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
614 return (0);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
615 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
616
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
617 LOCAL void up_copy_data_into_l2r(U8 *buf, U16 len, U8 sa, U8 sb, U8 x, BOOL *primToSend, U16 *bytesCopied)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
618 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
619 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
620
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
621 T_P_UPRIM_DESCRIPTOR primDesc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
622 T_P_L2R_FRAME frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
623 register T_P_UBYTE pFrame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
624 register T_P_UBYTE pEnd;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
625 register T_P_UBYTE pBuf;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
626 USHORT bytesToCopy;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
627 UBYTE frameCount;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
628 T_FLOW flow = FL_INVALID;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
629
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
630 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
631 TRACE_FUNCTION ("up_copy_data_into_l2r()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
632 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
633
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
634 switch (x)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
635 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
636 case DTI_FLOW_ON:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
637 flow = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
638 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
639 case DTI_FLOW_OFF:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
640 flow = FL_ACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
641 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
642 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
643
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
644 #ifdef _TARGET_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
645 if (dup->DataSize > DATA_SIZE_SHORT)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
646 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
647 frameCount = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
648 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
649 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
650 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
651 frameCount = 2;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
652 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
653 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
654 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
655 frameCount = 100;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
656 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
657 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
658
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
659 up_store_status(sa, sb, flow);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
660
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
661 if (dup->LastSentFlow EQ dup->MrgFlow)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
662 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
663 *primToSend = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
664 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
665 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
666 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
667 *primToSend = TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
668 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
669
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
670 /* don't copy into primitive if no primitive is ready */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
671 if (dup->RiBu.alloc EQ dup->RiBu.idx.wi)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
672 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
673 *bytesCopied = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
674 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
675 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
676
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
677 bytesToCopy = len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
678
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
679 primDesc = dup->RiBu.primDesc[dup->RiBu.idx.wi]; /* point to current primitive descriptor */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
680 frame = (*primDesc->adr)[primDesc->index]; /* point to current l2r frame in primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
681 pFrame = &(*frame)[primDesc->offset]; /* point to current byte in frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
682 pBuf = buf; /* point to source buffer */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
683
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
684 /************************************************************************************
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
685 *
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
686 * Handle a partly filled frame, which has been written in the primitive previously
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
687 *
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
688 ************************************************************************************/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
689
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
690 if (primDesc->offset NEQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
691 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
692 /* partly filled frame is there */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
693
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
694 if (bytesToCopy EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
695 /* no data to copy -> quit without writing status octet */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
696 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
697 *bytesCopied = len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
698 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
699 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
700
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
701 if (sa NEQ primDesc->sa OR sb NEQ primDesc->sb)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
702 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
703 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
704 * status has changed since last time
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
705 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
706
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
707 /* finish previous status octet */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
708 if (
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
709 up_fill_in_status_octet(
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
710 (T_P_UBYTE)frame,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
711 primDesc->off_status,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
712 primDesc->offset
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
713 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
714 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
715 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
716 /* frame data has been moved to make space for two octet status */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
717 pFrame++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
718 (primDesc->offset)++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
719
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
720 if (primDesc->offset >= (dup->DataSize))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
721 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
722 /* frame is just filled by patching the previous status frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
723
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
724 if (up_next_frame(&primDesc, primToSend) EQ 1)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
725 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
726 /* no more space for data */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
727 *bytesCopied = 0; /* no data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
728 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
729 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
730 frameCount--;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
731 #ifdef _TARGET_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
732 if (frameCount EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
733 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
734 *bytesCopied = 0; /* no data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
735 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
736 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
737 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
738 frame = (*primDesc->adr)[primDesc->index]; /* point to current l2r frame in primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
739 pFrame = &(*frame)[primDesc->offset]; /* point to current byte in frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
740 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
741 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
742
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
743 if (primDesc->offset NEQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
744 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
745 /* write status octet */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
746 *pFrame++ = (U8)(sa << SO_SA_BIT | sb << SO_SB_BIT | 0 << SO_X_BIT); /* x is set to 0 (inactive) by default */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
747
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
748 /* store current status for next call */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
749 primDesc->sa = sa;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
750 primDesc->sb = sb;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
751
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
752 primDesc->off_status = primDesc->offset;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
753 (primDesc->offset)++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
754 if (primDesc->offset >= (dup->DataSize))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
755 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
756 /* frame is just filled by the status octet */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
757
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
758 /* finish previous status octet */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
759 (*frame)[primDesc->off_status] |= SO_END_EMPTY;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
760
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
761 if (up_next_frame(&primDesc, primToSend) EQ 1)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
762 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
763 /* no more space for data */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
764 *bytesCopied = 0; /* no data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
765 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
766 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
767 frameCount--;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
768 if (frameCount EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
769 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
770 *bytesCopied = 0; /* no data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
771 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
772 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
773 frame = (*primDesc->adr)[primDesc->index]; /* point to current l2r frame in primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
774 pFrame = &(*frame)[primDesc->offset]; /* point to current byte in frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
775 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
776 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
777 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
778
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
779 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
780 * write data into partly filled frame
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
781 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
782 if (primDesc->offset NEQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
783 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
784 if (bytesToCopy >= dup->DataSize - primDesc->offset)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
785 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
786 /* enough data to fill frame completly */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
787
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
788 for (pEnd = pFrame + dup->DataSize - primDesc->offset; pFrame < pEnd; )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
789 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
790 *pFrame++ = *pBuf++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
791 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
792
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
793 /* finish previous status octet */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
794 (*frame)[primDesc->off_status] |= SO_END_FULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
795
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
796 bytesToCopy -= dup->DataSize - primDesc->offset;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
797
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
798 if (up_next_frame(&primDesc, primToSend) EQ 1)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
799 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
800 /* no more space for data */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
801 *bytesCopied = len - bytesToCopy; /* this much data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
802 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
803 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
804 frameCount--;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
805 if (frameCount EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
806 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
807 *bytesCopied = len - bytesToCopy; /* this much data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
808 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
809 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
810 frame = (*primDesc->adr)[primDesc->index]; /* point to current l2r frame in primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
811 pFrame = &(*frame)[primDesc->offset]; /* point to current byte in frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
812
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
813 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
814 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
815 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
816 /* not enough data to fill frame completly */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
817
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
818 for (pEnd = pFrame + bytesToCopy; pFrame < pEnd; )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
819 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
820 *pFrame++ = *pBuf++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
821 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
822 primDesc->offset += bytesToCopy;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
823 *bytesCopied = len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
824 return; /* Nothing else to do */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
825 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
826 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
827 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
828
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
829 /************************************************************************************
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
830 *
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
831 * Handle consecutive frames, which are filled starting with byte 0
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
832 *
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
833 ************************************************************************************/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
834
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
835 while (bytesToCopy > 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
836 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
837 if (bytesToCopy >= dup->DataSize - 1)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
838 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
839 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
840 * There are enough data to fill a frame completely
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
841 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
842 *pFrame++ = sa << SO_SA_BIT | sb << SO_SB_BIT | 0 << SO_X_BIT | SO_END_FULL; /* x is set to 0 (inactive) by default */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
843
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
844 /* store current status for next call */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
845 primDesc->sa = sa;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
846 primDesc->sb = sb;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
847
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
848 for (pEnd = pFrame + dup->DataSize - 1; pFrame < pEnd; )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
849 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
850 *pFrame++ = *pBuf++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
851 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
852 bytesToCopy -= dup->DataSize - 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
853
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
854 /* advance to next frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
855 if (up_next_frame(&primDesc, primToSend) EQ 1)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
856 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
857 /* running out of primitives */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
858 *bytesCopied = len - bytesToCopy; /* this much data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
859 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
860 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
861 frameCount--;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
862 if (frameCount EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
863 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
864 *bytesCopied = len - bytesToCopy; /* this much data could be copied */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
865 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
866 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
867 frame = (*primDesc->adr)[primDesc->index]; /* point to current l2r frame in primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
868 pFrame = &(*frame)[primDesc->offset]; /* point to current byte in frame */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
869 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
870 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
871 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
872 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
873 * There are some data, but not enough to fill a frame completely
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
874 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
875 *pFrame++ = (U8)(sa << SO_SA_BIT | sb << SO_SB_BIT | 0 << SO_X_BIT); /* x is set to 0 (inactive) by default */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
876
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
877 /* store current status for next call */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
878 primDesc->sa = sa;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
879 primDesc->sb = sb;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
880
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
881 for (pEnd = pFrame + bytesToCopy; pFrame < pEnd; )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
882 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
883 *pFrame++ = *pBuf++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
884 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
885 primDesc->off_status = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
886 primDesc->offset = bytesToCopy + 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
887 bytesToCopy = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
888 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
889 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
890 *bytesCopied = len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
891 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
892
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
893 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
894 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
895 | Function : up_copy_remap_data
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
896 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
897 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
898 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
899 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
900 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
901 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
902 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
903 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
904 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
905
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
906 LOCAL void up_copy_remap_data(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
907 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
908 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
909
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
910 USHORT bytesCopied;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
911 BOOL dummy;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
912
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
913 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
914 TRACE_FUNCTION ("up_copy_remap_data()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
915 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
916
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
917 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
918 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
919 if (dup->BRemapLen EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
920 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
921 dup->BRemapAdr = dup->BRemap;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
922 up_copy_data_from_rq
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
923 (
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
924 dup->BRemapAdr,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
925 UP_REMAP_BUFFER_SIZE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
926 &dup->BRemapSa,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
927 &dup->BRemapSb,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
928 &dup->BRemapLen
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
929 );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
930 if (dup->BRemapLen EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
931 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
932 up_check_flow();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
933 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
934 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
935 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
936 up_copy_data_into_l2r
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
937 (
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
938 dup->BRemapAdr,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
939 dup->BRemapLen,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
940 dup->BRemapSa,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
941 dup->BRemapSb,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
942 DTI_FLOW_OFF,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
943 &dummy,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
944 &bytesCopied
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
945 );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
946 dup->BRemapAdr += bytesCopied;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
947 dup->BRemapLen -= bytesCopied;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
948
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
949 } while (bytesCopied NEQ 0);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
950 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
951
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
952 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
953 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
954 | Function : up_check_alloc
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
955 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
956 | Description : This procedure allocates new primitives until there are
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
957 | UP_RIBU_PREALLOC primitives ready.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
958 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
959 | I.e.: alloc = write + UP_RIBU_PREALLOC
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
960 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
961 | It may be less than this, if otherwise the alloc pointer
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
962 | would reach the read pointer.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
963 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
964 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
965 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
966 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
967 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
968 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
969 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
970 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
971
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
972 GLOBAL void up_check_alloc(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
973 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
974 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
975
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
976 S8 i_from, i_to;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
977
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
978 TRACE_FUNCTION ("up_check_alloc()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
979
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
980 i_to = dup->RiBu.idx.ri - dup->RiBu.idx.wi - 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
981
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
982 if (i_to < 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
983 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
984 i_to = i_to + dup->RiBu.idx.depth;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
985 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
986
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
987 if (i_to > UP_RIBU_PREALLOC)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
988 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
989 i_to = UP_RIBU_PREALLOC;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
990 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
991
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
992 i_from = dup->RiBu.alloc - dup->RiBu.idx.wi;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
993
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
994 if (i_from < 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
995 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
996 i_from = i_from + dup->RiBu.idx.depth;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
997 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
998
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
999 if (i_from >= i_to)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1000 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1001 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1002 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1003
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1004 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1005 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1006 up_alloc_prim();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1007 i_from++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1008 } while (i_from < i_to);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1009
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1010 if (dup->QRemapRead NEQ dup->QRemapWrite)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1011 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1012 up_copy_remap_data();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1013 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1014 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1015
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1016 switch (GET_STATE (UP_UL))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1017 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1018 case IW_WAIT:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1019 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1020
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1021 case IW_IDLE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1022 if (dup->StoreDataActive EQ FALSE AND dup->Prim NEQ NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1023 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1024 up_store_data();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1025 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1026 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1027 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1028 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1029
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1030 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1031 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1032 | Function : up_check_flow
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1033 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1034 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1035 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1036 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1037 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1038 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1039 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1040 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1041 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1042
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1043 GLOBAL void up_check_flow(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1044 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1045 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1046
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1047 U8 primCount;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1048
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1049 TRACE_FUNCTION ("up_check_flow()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1050
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1051 if (!dup->FlowCtrlUsed)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1052 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1053 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1054 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1055
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1056 primCount = dup->RiBu.idx.filled;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1057
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1058 switch (dup->UpFlow)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1059 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1060 case FL_ACTIVE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1061 if (primCount < dup->FlowThreshLo)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1062 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1063 dup->UpFlow = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1064 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1065 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1066 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1067 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1068 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1069 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1070
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1071 case FL_INACTIVE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1072 if (primCount >= dup->FlowThreshHi)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1073 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1074 dup->UpFlow = FL_ACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1075 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1076 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1077 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1078 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1079 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1080 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1081 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1082 sig_up_dn_flow(dup->UpFlow);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1083 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1084
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1085 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1086 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1087 | Function : up_store_data
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1088 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1089 | Description : This procedure copies data from a dti_data_req primitive
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1090 | into the uplink ring buffer.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1091 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1092 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1093 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1094 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1095 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1096 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1097 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1098 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1099
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1100 GLOBAL void up_store_data(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1101 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1102 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1103
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1104 T_P_UBYTE adr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1105 USHORT len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1106 BOOL primToSend;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1107 USHORT bytesCopied;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1108 USHORT i, j;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1109 T_desc2 *desc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1110
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1111 TRACE_FUNCTION ("up_store_data()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1112
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1113 dup->StoreDataActive = TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1114
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1115 do
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1116 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1117 desc = (T_desc2*)dup->Prim->desc_list2.first;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1118 if (desc)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1119 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1120 len = desc->len;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1121 adr = desc->buffer;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1122 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1123 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1124 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1125 len = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1126 adr = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1127 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1128
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1129 up_copy_data_into_l2r (adr,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1130 len,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1131 dup->Prim->parameters.st_lines.st_line_sa,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1132 dup->Prim->parameters.st_lines.st_line_sb,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1133 dup->Prim->parameters.st_lines.st_flow,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1134 &primToSend,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1135 &bytesCopied);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1136
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1137 dup->Prim->desc_list2.list_len -= bytesCopied;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1138
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1139 if (desc)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1140 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1141 if ((bytesCopied EQ len))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1142 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1143 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1144 * Block has been copied successfully
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1145 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1146 dup->Prim->desc_list2.first = desc->next;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1147 MFREE (desc);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1148 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1149 else if (bytesCopied > 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1150 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1151 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1152 * remaining data must be copied to begin of block
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1153 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1154 /*lint -e{661} (Warning -- Likely creation of out-of-bounds) */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1155 for (i=0, j = bytesCopied; j < len; i++, j++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1156 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1157 desc->buffer[i] = desc->buffer[j];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1158 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1159 desc->len -= bytesCopied;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1160 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1161 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1162 up_check_alloc();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1163
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1164 } while (dup->Prim->desc_list2.first NEQ 0 AND dup->RiBu.alloc NEQ dup->RiBu.idx.wi);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1165
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1166 if (dup->Prim->desc_list2.first EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1167 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1168 PFREE (dup->Prim);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1169 dup->Prim = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1170 up_send_ready();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1171 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1172 dup->StoreDataActive = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1173 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1174
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1175 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1176 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1177 | Function : up_send_ready
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1178 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1179 | Description : only used in test environment
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1180 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1181 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1182 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1183 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1184 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1185 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1186 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1187
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1188 GLOBAL void up_send_ready(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1189 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1190 TRACE_FUNCTION ("up_send_ready()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1191
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1192 if (GET_STATE (UP_UL) EQ IW_IDLE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1193 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1194 if (l2r_data->up.DtiConnected EQ FALSE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1195 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1196 TRACE_EVENT("DTI not connected, but up_send_ready() called -> break");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1197 return; /* jk: DTI_READY_IND primitive cannot be sent when DTI disconnected (!) */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1198 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1199
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1200 dti_start (
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1201 l2r_hDTI,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1202 L2R_DTI_UP_DEF_INSTANCE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1203 L2R_DTI_UP_INTERFACE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1204 L2R_DTI_UP_CHANNEL
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1205 );
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1206 SET_STATE (UP_UL, IW_WAIT);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1207 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1208 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1209
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1210 LOCAL void clear_primDesc(T_P_UPRIM_DESCRIPTOR primDesc)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1211 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1212 primDesc->prim = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1213
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1214 primDesc->nFr = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1215 primDesc->index = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1216 primDesc->offset = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1217 primDesc->off_status = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1218 primDesc->full = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1219 primDesc->sa = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1220 primDesc->sb = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1221 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1222
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1223 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1224 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1225 | Function : up_free_prim
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1226 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1227 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1228 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1229 | Parameters : primDesc
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1230 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1231 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1232 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1233 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1234 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1235
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1236 LOCAL void up_free_prim(T_P_UPRIM_DESCRIPTOR primDesc)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1237 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1238 TRACE_FUNCTION ("up_free_prim()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1239
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1240 if (primDesc->prim NEQ NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1241 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1242 PFREE (primDesc->prim);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1243 clear_primDesc(primDesc);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1244 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1245 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1246
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1247 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1248 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1249 | Function : up_deinit_ribu
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1250 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1251 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1252 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1253 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1254 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1255 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1256 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1257 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1258 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1259
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1260 GLOBAL void up_deinit_ribu(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1261 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1262 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1263
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1264 T_PRIM_DESC_RIBU_INDEX n;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1265
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1266 T_P_UPRIM_DESCRIPTOR primDesc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1267
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1268 TRACE_FUNCTION ("up_deinit_ribu()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1269
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1270 for (n = 0; n < dup->RiBu.idx.depth; n++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1271 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1272 primDesc = dup->RiBu.primDesc[n];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1273 if (primDesc->prim NEQ NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1274 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1275 up_free_prim(primDesc);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1276 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1277 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1278 if (GET_STATE (UP_LL) EQ ISW_SEND)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1279 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1280 SET_STATE (UP_LL, ISW_IDLE);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1281 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1282 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1283
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1284 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1285 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1286 | Function : up_send_status
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1287 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1288 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1289 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1290 | Parameters : sa -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1291 | sb -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1292 | flow -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1293 | adr -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1294 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1295 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1296 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1297 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1298
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1299
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1300
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1301 GLOBAL void up_send_status
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1302 (
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1303 T_BIT sa,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1304 T_BIT sb,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1305 T_FLOW flow,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1306 UBYTE adr
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1307 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1308 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1309 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1310
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1311 T_P_UPRIM_DESCRIPTOR primDesc;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1312 T_P_L2R_FRAME frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1313 T_BIT x = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1314
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1315 TRACE_FUNCTION ("up_send_status()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1316
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1317 primDesc = dup->RiBu.primDesc[dup->RiBu.idx.wi];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1318 frame = (*primDesc->adr)[0];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1319
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1320 switch (flow)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1321 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1322 case FL_ACTIVE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1323 x = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1324 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1325 case FL_INACTIVE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1326 x = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1327 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1328 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1329 (*frame)[0] = sa << SO_SA_BIT | sb << SO_SB_BIT | x << SO_X_BIT | adr;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1330
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1331 /* jk:030501 - TEST CASE 251 -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1332 new funktion parameter 'adr' was introduced
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1333 in order to cancel the older function 'up_send_break(...)'
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1334 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1335 primDesc->sa = sa; /* the status has to be saved in order to be correctly stored later */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1336 primDesc->sb = sb; /* on into "dup->LastSentSa/Sb" [up_send current_prim()] */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1337
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1338 primDesc->index = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1339 primDesc->offset = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1340
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1341 cl_ribu_write_index(&dup->RiBu.idx); /* point to next primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1342 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1343
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1344 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1345 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1346 | Function : up_set_flow_in_prim
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1347 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1348 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1349 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1350 | Parameters : prim -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1351 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1352 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1353 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1354 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1355 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1356
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1357 LOCAL void up_set_flow_in_prim(T_P_RLP_DATA_REQ prim)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1358 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1359 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1360
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1361 if (dup->MrgFlow EQ FL_INACTIVE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1362 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1363 TRACE_FUNCTION ("up_set_flow_in_prim(INACTIVE)");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1364 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1365 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1366 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1367 T_PRIM_INDEX frames;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1368 T_PRIM_INDEX ind;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1369 UBYTE off;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1370 register UBYTE statOct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1371 T_P_L2R_FRAME frame;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1372
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1373 TRACE_FUNCTION ("up_set_flow_in_prim(ACTIVE)");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1374
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1375 frames = prim->sdu.l_buf / (8 * dup->FrameSize);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1376 frame = (T_P_L2R_FRAME) (prim->sdu.buf + (prim->sdu.o_buf / 8) + HEADER_LEN);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1377 off = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1378 ind = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1379
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1380 while (ind < frames)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1381 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1382 statOct = (*frame)[off];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1383 SET_BIT(statOct, SO_X_BIT);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1384 (*frame)[off] = statOct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1385
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1386 switch (statOct & SO_ADR_MASK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1387 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1388 case SO_BREAK_REQ:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1389 case SO_BREAK_ACK:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1390 case SO_END_EMPTY:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1391 case SO_END_FULL:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1392 ind++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1393 frame = (T_P_L2R_FRAME)((UBYTE*)frame + dup->FrameSize);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1394 off = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1395 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1396
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1397 case SO_TWO_OCTET:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1398 off++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1399 off += ((*frame)[off] & SO_ADR_MASK_TWO_OCT) + 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1400 if (off >= dup->DataSize)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1401 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1402 ind++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1403 frame = (T_P_L2R_FRAME)((UBYTE*)frame + dup->FrameSize);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1404 off = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1405 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1406 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1407
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1408 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1409 off += (statOct & SO_ADR_MASK) + 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1410 if (off >= dup->DataSize)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1411 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1412 ind++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1413 frame = (T_P_L2R_FRAME)((UBYTE*)frame + dup->FrameSize);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1414 off = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1415 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1416 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1417 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1418 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1419 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1420 dup->LastSentFlow = dup->MrgFlow;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1421 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1422
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1423 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1424 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1425 | Function : up_send_current_prim
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1426 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1427 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1428 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1429 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1430 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1431 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1432 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1433 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1434 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1435
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1436 GLOBAL void up_send_current_prim(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1437 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1438 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1439 T_P_UPRIM_DESCRIPTOR primDesc = dup->RiBu.primDesc[dup->RiBu.idx.ri];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1440
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1441 TRACE_FUNCTION ("up_send_current_prim()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1442
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1443 if (!primDesc->full AND primDesc->index < primDesc->nFr)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1444 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1445 TRACE_FUNCTION ("prim is not full");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1446 if (primDesc->offset > 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1447 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1448 if (up_fill_in_status_octet((T_P_UBYTE)(*primDesc->adr)[primDesc->index], primDesc->off_status, primDesc->offset))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1449 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1450 primDesc->offset++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1451 if (primDesc->offset >= dup->DataSize)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1452 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1453 primDesc->offset = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1454 primDesc->index++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1455 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1456 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1457 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1458
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1459 if (primDesc->offset > 0 OR primDesc->index EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1460 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1461 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1462 * Add status octet, if there is a partly filled frame
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1463 * or if status has changed since last write
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1464 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1465 (*(*primDesc->adr)[primDesc->index])[primDesc->offset] =
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1466 dup->LastRcvdSa << SO_SA_BIT |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1467 dup->LastRcvdSb << SO_SB_BIT |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1468 0 << SO_X_BIT |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1469 SO_END_EMPTY;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1470 primDesc->sa = dup->LastRcvdSa;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1471 primDesc->sb = dup->LastRcvdSb;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1472 primDesc->index++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1473 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1474 primDesc->prim->sdu.l_buf = primDesc->index * dup->FrameSize * 8;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1475 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1476
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1477 dup->LastSentSa = primDesc->sa;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1478 dup->LastSentSb = primDesc->sb;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1479 up_set_flow_in_prim(primDesc->prim);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1480
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1481 PSENDX (RLP, primDesc->prim);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1482
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1483 clear_primDesc(primDesc); /* this primitive doesn't belong to us any longer */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1484
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1485 cl_ribu_read_index(&dup->RiBu.idx); /* point to next primitive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1486
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1487 dup->UrgentMsg = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1488 up_check_alloc();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1489 up_check_flow();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1490 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1491
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1492
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1493 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1494 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1495 | Function : up_send_prim_cond
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1496 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1497 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1498 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1499 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1500 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1501 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1502 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1503 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1504 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1505
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1506 GLOBAL void up_send_prim_cond(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1507 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1508 TRACE_FUNCTION ("up_send_prim_cond()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1509
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1510 switch (GET_STATE (UP_LL))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1511 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1512 case ISW_WAIT:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1513 TIMERSTOP (TIMER_TUP_SND);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1514 up_send_current_prim();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1515 SET_STATE (UP_LL, ISW_IDLE);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1516 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1517
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1518 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1519 l2r_data->up.UrgentMsg = TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1520 up_check_flow();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1521 up_check_alloc();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1522 SET_STATE (UP_LL, ISW_SEND);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1523 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1524 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1525 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1526
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1527 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1528 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1529 | Function : up_init_ribu
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1530 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1531 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1532 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1533 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1534 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1535 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1536 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1537 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1538 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1539
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1540
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1541 GLOBAL void up_init_ribu(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1542 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1543 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1544
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1545 T_PRIM_DESC_RIBU_INDEX n;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1546 T_PRIM_INDEX m;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1547
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1548 TRACE_FUNCTION ("up_init_ribu()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1549
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1550 dup->RiBu.alloc = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1551
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1552 cl_ribu_init(&dup->RiBu.idx, dup->RiBu.idx.depth);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1553
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1554 for (n = 0; n < dup->RiBu.idx.depth; n++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1555 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1556 dup->RiBu.primDesc[n] = &(dup->PrimDesc[n]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1557
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1558 dup->PrimDesc[n].nFr = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1559 dup->PrimDesc[n].adr = (T_P_ADR_VECTOR)&(dup->AdrVec[n]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1560 dup->PrimDesc[n].index = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1561 dup->PrimDesc[n].offset = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1562 dup->PrimDesc[n].off_status = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1563 dup->PrimDesc[n].full = FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1564 dup->PrimDesc[n].sa = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1565 dup->PrimDesc[n].sb = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1566 dup->PrimDesc[n].prim = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1567
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1568 for(m = 0;m < L2R_FRAMES_PER_PRIM_MAX; m++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1569 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1570 dup->AdrVec[n][m] = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1571 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1572
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1573 if (dup->RiBu.alloc < UP_RIBU_PREALLOC)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1574 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1575 up_alloc_prim();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1576 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1577 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1578 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1579
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1580 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1581 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1582 | Function : up_store_status
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1583 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1584 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1585 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1586 | Parameters : sa
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1587 | sb
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1588 | flow
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1589 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1590 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1591 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1592 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1593
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1594
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1595 GLOBAL void up_store_status
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1596 (
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1597 T_BIT sa,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1598 T_BIT sb,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1599 T_FLOW flow
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1600 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1601 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1602 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1603
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1604 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1605 TRACE_FUNCTION ("up_store_status()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1606 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1607
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1608 dup->LastRcvdSa = sa;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1609 dup->LastRcvdSb = sb;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1610
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1611 if (dup->FlowCtrlUsed EQ FALSE OR flow EQ dup->ULFlow)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1612 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1613 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1614 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1615
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1616 dup->ULFlow = flow;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1617
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1618 up_merge_flow();
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1619 sig_up_dn_ul_flow(dup->ULFlow);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1620 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1621
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1622 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1623 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1624 | Function : up_send_empty_frame
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1625 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1626 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1627 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1628 | Parameters : sa -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1629 | sb -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1630 | flow -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1631 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1632 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1633 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1634 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1635
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1636
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1637 GLOBAL void up_send_empty_frame(T_BIT sa, T_BIT sb, T_FLOW flow)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1638 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1639 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1640
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1641 T_BIT x = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1642 USHORT sduSize = dup->FrameSize << 3;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1643
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1644 PALLOC_SDU(data_req, RLP_DATA_REQ, sduSize);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1645
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1646 TRACE_FUNCTION ("up_send_empty_frame()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1647
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1648 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1649 /* Clear SDU for test environment */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1650 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1651 UBYTE *p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1652 UBYTE *pend;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1653 p = &data_req->sdu.buf[0];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1654 pend = p + dup->FrameSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1655 while (p < pend)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1656 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1657 *p++ = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1658 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1659 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1660 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1661
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1662 data_req->sdu.o_buf = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1663 data_req->sdu.l_buf = sduSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1664
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1665 switch (flow)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1666 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1667 case FL_ACTIVE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1668 x = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1669 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1670 case FL_INACTIVE:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1671 x = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1672 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1673 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1674 /*lint -e416 (Warning -- Likely creation of out-of-bounds pointer) */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1675 /*lint -e415 (Warning -- Likely access of out-of-bounds pointer) */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1676 data_req->sdu.buf[L2R_ENCODING_OFFSET] = sa << SO_SA_BIT | sb << SO_SB_BIT | x << SO_X_BIT | SO_END_EMPTY;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1677 /*lint +e416 (Warning -- Likely creation of out-of-bounds pointer) */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1678 /*lint +e415 (Warning -- Likely access of out-of-bounds pointer) */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1679
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1680 dup->LastSentFlow = flow;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1681 dup->LastSentSa = sa;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1682 dup->LastSentSb = sb;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1683
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1684 PSENDX (RLP, data_req);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1685 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1686
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1687 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1688 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1689 | Function : up_merge_flow
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1690 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1691 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1692 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1693 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1694 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1695 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1696 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1697 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1698 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1699
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1700
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1701 GLOBAL void up_merge_flow(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1702 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1703 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1704
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1705 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1706 TRACE_FUNCTION ("up_merge_flow()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1707 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1708
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1709 if (dup->FlowCtrlUsed AND (dup->DnFlow EQ FL_ACTIVE OR dup->ULFlow EQ FL_ACTIVE))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1710 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1711 /* flow control active */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1712 dup->MrgFlow = FL_ACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1713 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1714 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1715 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1716 /* flow control inactive */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1717 dup->MrgFlow = FL_INACTIVE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1718 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1719
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1720 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1721
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1722 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1723 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1724 | Function : up_rq_init
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1725 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1726 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1727 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1728 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1729 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1730 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1731 | Return : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1732 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1733 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1734
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1735 GLOBAL void up_rq_init(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1736 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1737 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1738 TRACE_FUNCTION ("up_rq_init()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1739 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1740
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1741 l2r_data->up.QRemapWrite = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1742 l2r_data->up.QRemapRead = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1743 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1744
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1745 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1746 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1747 | Function : up_some_data_to_send
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1748 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1749 | Description :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1750 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1751 | Parameters : -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1752 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1753 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1754 | Return : TRUE -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1755 | FALSE -
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1756 +------------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1757 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1758
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1759 GLOBAL BOOL up_some_data_to_send(void)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1760 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1761 T_UP *dup = &l2r_data->up;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1762
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1763 #ifdef _SIMULATION_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1764 TRACE_EVENT ("check if any data to send");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1765 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1766
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1767 if (
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1768 dup->RiBu.idx.filled OR
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1769 (dup->RiBu.primDesc[dup->RiBu.idx.ri]->index > 0) OR
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1770 (dup->RiBu.primDesc[dup->RiBu.idx.ri]->offset > 0) OR
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1771 (dup->LastRcvdSa NEQ dup->LastSentSa) OR
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1772 (dup->LastRcvdSb NEQ dup->LastSentSb)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1773 )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1774 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1775 return (TRUE);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1776 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1777 return (FALSE);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1778 }
|