comparison g23m/condat/ms/src/aci/aci_bat.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:509db1a7b7b8
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-F&D (8411)
4 | Modul : ACI_BAT
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This Modul is the main entry point of BAT at ACI.
18 |
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef ACI_BAT_C
23 #define ACI_BAT_C
24
25 /*==== INCLUDES ===================================================*/
26 #include "aci_all.h"
27 #include "aci_mem.h"
28 #include "aci_cmh.h"
29 #include "ati_cmd.h"
30 #include "dti.h" /* functionality of the dti library */
31
32 #include "aci.h"
33 #include "aci_lst.h"
34
35 #include "psa_psi.h"
36 #include "cmh_psi.h"
37 #include "ati_src_psi.h"
38 #include "sap_dti.h"
39 #include "psa.h"
40 #include "cmh.h"
41
42 #include "aci_bat_cmh.h"
43 #include "aci_bat.h"
44 #include "aci_bat_err.h"
45 #include "aci_bat_cb.h" /* for rBAT_OK */
46 #include "aci_bat_ext.h"
47
48 #include "l2p_types.h"
49 #include "l2p.h"
50 #include "bat_ctrl.h"
51 #include "aci_cmd.h"
52
53 #include "ati_ext_mech.h"
54
55 #ifdef _SIMULATION_
56 #include "gdd_aci.h"
57 #endif
58
59 /*==== CONSTANTS ==================================================*/
60
61 #define BAT_BIT_12 0x1000
62 #define BAT_BIT_15 0x8000
63 #define BAT_CTRL_CHANNEL 0xFE
64
65 #define MAX_NORMAL_BUFFER_LEN (100-4) /* Since Malloc uses 4 additional internal bytes of the Blocks */
66 #ifdef GPRS
67 #define MAX_LARGE_BUFFER_LEN (600-4)
68 #else
69 #define MAX_LARGE_BUFFER_LEN (400-4)
70 #endif
71
72 #define BAT_MTU_SIZE 300
73
74 /*==== TYPES ======================================================*/
75 typedef struct
76 {
77 T_ACI_BAT_RSLT (*fptr)(T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd); /* BAT wrapper func */
78 } BATCommand;
79
80 typedef struct
81 {
82 T_ACI_DTI_PRC_PSI *psi_src; /* remember which PSI source currently active */
83 BOOL l2p_configured;
84 U32 l2p_mem[(L2P_CONTROL_BLOCK_HDR_SIZE+3)/4];
85 U8 l2p_id; /* L2P calls this bat_id, for us it is a unique l2p_id */
86 } T_ACI_BAT_GLOBALS;
87
88 /*==== EXPORT =====================================================*/
89
90 /*==== VARIABLES ==================================================*/
91
92 LOCAL T_ACI_BAT_GLOBALS aci_bat_globs[CMD_SRC_MAX];
93 LOCAL BOOL aci_bat_first_time = TRUE;
94
95
96 /* basic BAT commands, which are always supported */
97 #define BAT_BAS(batFoo) {BAT_##batFoo}
98
99 /* default extended BAT commands, which are always supported
100 * c = command type --> s=set, t=test, q=query
101 */
102 #define BAT_DEF(c,batFoo) {c##BAT_##batFoo}
103
104 #ifdef FAX_AND_DATA
105 #define BAT_FAD(c,batFoo) {c##BAT_##batFoo}
106 #else
107 #define BAT_FAD(c,batFoo) {0}
108 #endif
109
110 #ifdef SIM_TOOLKIT
111 #define BAT_STK(c,batFoo) {c##BAT_##batFoo}
112 #else
113 #define BAT_STK(c,batFoo) {0}
114 #endif
115
116 #ifdef GPRS
117 #define BAT_GPR(c,batFoo) {c##BAT_##batFoo}
118 #else
119 #define BAT_GPR(c,batFoo) {0}
120 #endif
121
122 #if defined(FF_WAP) || defined(FF_TCP_IP) || defined(FF_SAT_E)
123 #define BAT_PPP(c,batFoo) {c##BAT_##batFoo}
124 #else
125 #define BAT_PPP(c,batFoo) {0}
126 #endif
127
128 /*
129 * all the set commands are in range of 0x0000..0x0nnn
130 * T_BAT_ctrl_params types is used as index to the table
131 */
132 #pragma message( __TODO__"Currently No Support for Wide Chars !" )
133
134 /* expand the macro by hand: BAT_DEF(s,PercentALS) --> sBAT_PercentALS */
135 LOCAL const BATCommand bat_cmds [] =
136 {
137 BAT_DEF(s,PercentALS), /* BAT_CMD_SET_PERCENT_ALS = 0x0 */
138 BAT_DEF(s,PercentBAND), /* BAT_CMD_SET_PERCENT_BAND = 0x1 */
139 BAT_BAS(ANDC), /* BAT_CMD_ANDC = 0x2 */
140 BAT_DEF(s,PlusCACM), /* BAT_CMD_SET_PLUS_CACM = 0x3 */
141 BAT_DEF(s,PlusCAMM), /* BAT_CMD_SET_PLUS_CAMM = 0x4 */
142 BAT_DEF(s,PlusCAOC), /* BAT_CMD_SET_PLUS_CAOC = 0x5 */
143 BAT_DEF(s,PercentCBHZ), /* BAT_CMD_SET_PERCENT_CBHZ = 0x6 */
144 BAT_DEF(s,PlusCBST), /* BAT_CMD_SET_PLUS_CBST = 0x7 */
145 BAT_DEF(s,PercentCCBS), /* BAT_CMD_SET_PERCENT_CCBS = 0x8 */
146 BAT_DEF(s,PlusCCFC), /* BAT_CMD_SET_PLUS_CCFC = 0x9 */
147 BAT_DEF(s,PlusCCLK), /* BAT_CMD_SET_PLUS_CCLK = 0xa */
148 BAT_DEF(s,PlusCCUG), /* BAT_CMD_SET_PLUS_CCUG = 0xb */
149 BAT_DEF(s,PlusCCWA), /* BAT_CMD_SET_PLUS_CCWA = 0xc */
150 BAT_DEF(s,PlusCCWA), /* BAT_CMD_SET_PLUS_CCWA_W = 0xd */
151 BAT_DEF(s,PlusCFUN), /* BAT_CMD_SET_PLUS_CFUN = 0xe */
152 BAT_GPR(s,PercentCGAATT), /* BAT_CMD_SET_PERCENT_CGAATT = 0xf */
153 BAT_GPR(s,PlusCGACT), /* BAT_CMD_SET_PLUS_CGACT = 0x10 */
154 BAT_GPR(s,PlusCGANS), /* BAT_CMD_SET_PLUS_CGANS = 0x11 */
155 BAT_GPR(s,PlusCGATT), /* BAT_CMD_SET_PLUS_CGATT = 0x12 */
156 BAT_GPR(s,PercentCGCLASS), /* BAT_CMD_SET_PERCENT_CGCLASS = 0x13 */
157 BAT_GPR(s,PlusCGCLASS), /* BAT_CMD_SET_PLUS_CGCLASS = 0x14 */
158 BAT_GPR(s,PlusCGDATA), /* BAT_CMD_SET_PLUS_CGDATA = 0x15 */
159 BAT_GPR(s,PlusCGDCONT), /* BAT_CMD_SET_PLUS_CGDCONT = 0x16 */
160 BAT_GPR(s,PercentCGMM), /* BAT_CMD_SET_PERCENT_CGMM = 0x17 */
161 BAT_GPR(s,PlusCGPADDR), /* BAT_CMD_SET_PLUS_CGPADDR = 0x18 */
162 BAT_GPR(s,PercentCGPCO), /* BAT_CMD_SET_PERCENT_CGPCO = 0x19 */
163 BAT_GPR(s,PercentCGPPP), /* BAT_CMD_SET_PERCENT_CGPPP = 0x1a */
164 BAT_GPR(s,PlusCGQMIN), /* BAT_CMD_SET_PLUS_CGQMIN = 0x1b */
165 BAT_GPR(s,PlusCGQREQ), /* BAT_CMD_SET_PLUS_CGQREQ = 0x1c */
166 BAT_GPR(s,PlusCGSMS), /* BAT_CMD_SET_PLUS_CGSMS = 0x1d */
167 BAT_DEF(s,PercentCHLD), /* BAT_CMD_SET_PERCENT_CHLD = 0x1e */
168 BAT_DEF(s,PercentCHPL), /* BAT_CMD_SET_PERCENT_CHPL = 0x1f */
169 BAT_DEF(s,PercentCHPL), /* BAT_CMD_SET_PERCENT_CHPL_W = 0x20 */
170 BAT_DEF(s,PlusCIND), /* BAT_CMD_SET_PLUS_CIND = 0x21 */
171 BAT_DEF(s,PlusCLAN), /* BAT_CMD_SET_PLUS_CLAN = 0x22 */
172 BAT_DEF(s,PlusCLCK), /* BAT_CMD_SET_PLUS_CLCK = 0x23 */
173 BAT_DEF(s,PlusCLIR), /* BAT_CMD_SET_PLUS_CLIR = 0x24 */
174 BAT_DEF(s,PlusCLVL), /* BAT_CMD_SET_PLUS_CLVL = 0x25 */
175 BAT_DEF(s,PlusCMER), /* BAT_CMD_SET_PLUS_CMER = 0x26 */
176 BAT_DEF(s,PlusCMGC), /* BAT_CMD_SET_PLUS_CMGC = 0x27 */
177 BAT_DEF(s,PlusCMGD), /* BAT_CMD_SET_PLUS_CMGD = 0x28 */
178 BAT_DEF(s,PlusCMGL), /* BAT_CMD_SET_PLUS_CMGL = 0x29 */
179 BAT_DEF(s,PlusCMGL), /* BAT_CMD_SET_PLUS_CMGL_W = 0x2a */
180 BAT_DEF(s,PlusCMGR), /* BAT_CMD_SET_PLUS_CMGR = 0x2b */
181 BAT_DEF(s,PlusCMGR), /* BAT_CMD_SET_PLUS_CMGR_W = 0x2c */
182 BAT_DEF(s,PlusCMGS), /* BAT_CMD_SET_PLUS_CMGS = 0x2d */
183 BAT_DEF(s,PlusCMGW), /* BAT_CMD_SET_PLUS_CMGW = 0x2e */
184 BAT_DEF(s,PlusCMOD), /* BAT_CMD_SET_PLUS_CMOD = 0x2f */
185 BAT_DEF(s,PlusCMSS), /* BAT_CMD_SET_PLUS_CMSS = 0x30 */
186 BAT_DEF(s,PlusCMUT), /* BAT_CMD_SET_PLUS_CMUT = 0x31 */
187 BAT_DEF(s,PlusCMUX), /* BAT_CMD_SET_PLUS_CMUX = 0x32 */
188 BAT_DEF(s,PlusCNMA), /* BAT_CMD_SET_PLUS_CNMA = 0x33 */
189 BAT_DEF(s,PlusCNMI), /* BAT_CMD_SET_PLUS_CNMI = 0x34 */
190 BAT_DEF(s,PercentCOPS), /* BAT_CMD_SET_PERCENT_COPS = 0x35 */
191 BAT_DEF(s,PlusCOPS), /* BAT_CMD_SET_PLUS_COPS = 0x36 */
192 BAT_DEF(s,PercentCOPS), /* BAT_CMD_SET_PERCENT_COPS_W = 0x37 */
193 BAT_DEF(s,PercentCPALS), /* BAT_CMD_SET_PERCENT_CPALS = 0x38 */
194 BAT_DEF(s,PercentCPALS), /* BAT_CMD_SET_PERCENT_CPALS_W = 0x39 */
195 BAT_DEF(s,PlusCPBF), /* BAT_CMD_SET_PLUS_CPBF = 0x3a */
196 BAT_DEF(s,PlusCPBF), /* BAT_CMD_SET_PLUS_CPBF_W = 0x3b */
197 BAT_DEF(s,PlusCPBR), /* BAT_CMD_SET_PLUS_CPBR = 0x3c */
198 BAT_DEF(s,PlusCPBR), /* BAT_CMD_SET_PLUS_CPBR_W = 0x3d */
199 BAT_DEF(s,PlusCPBS), /* BAT_CMD_SET_PLUS_CPBS = 0x3e */
200 BAT_DEF(s,PlusCPBW), /* BAT_CMD_SET_PLUS_CPBW = 0x3f */
201 BAT_DEF(s,PlusCPBW), /* BAT_CMD_SET_PLUS_CPBW_W = 0x40 */
202 BAT_DEF(s,PercentCPCFU), /* BAT_CMD_SET_PERCENT_CPCFU = 0x41 */
203 BAT_DEF(s,PercentCPHS), /* BAT_CMD_SET_PERCENT_CPHS = 0x42 */
204 BAT_DEF(s,PlusCPIN), /* BAT_CMD_SET_PLUS_CPIN = 0x43 */
205 BAT_DEF(s,PercentCPMB), /* BAT_CMD_SET_PERCENT_CPMB = 0x44 */
206 BAT_DEF(s,PercentCPMBW), /* BAT_CMD_SET_PERCENT_CPMBW = 0x45 */
207 BAT_DEF(s,PercentCPMBW), /* BAT_CMD_SET_PERCENT_CPMBW_W = 0x46 */
208 BAT_DEF(s,PercentCPMB), /* BAT_CMD_SET_PERCENT_CPMB_W = 0x47 */
209 BAT_DEF(s,PlusCPMS), /* BAT_CMD_SET_PLUS_CPMS = 0x48 */
210 BAT_DEF(s,PercentCPNUMS), /* BAT_CMD_SET_PERCENT_CPNUMS = 0x49 */
211 BAT_DEF(s,PercentCPNUMS), /* BAT_CMD_SET_PERCENT_CPNUMS_W = 0x4a */
212 BAT_DEF(s,PlusCPOL), /* BAT_CMD_SET_PLUS_CPOL = 0x4b */
213 BAT_DEF(s,PlusCPOL), /* BAT_CMD_SET_PLUS_CPOL_W = 0x4c */
214 BAT_DEF(s,PercentCPRSM), /* BAT_CMD_SET_PERCENT_CPRSM = 0x4d */
215 BAT_DEF(s,PlusCPUC), /* BAT_CMD_SET_PLUS_CPUC = 0x4e */
216 BAT_DEF(s,PlusCPUC), /* BAT_CMD_SET_PLUS_CPUC_W = 0x4f */
217 BAT_DEF(s,PercentCPVWI), /* BAT_CMD_SET_PERCENT_CPVWI = 0x50 */
218 BAT_DEF(s,PlusCPWD), /* BAT_CMD_SET_PLUS_CPWD = 0x51 */
219 BAT_DEF(s,PlusCRES), /* BAT_CMD_SET_PLUS_CRES = 0x52 */
220 BAT_DEF(s,PlusCRLP), /* BAT_CMD_SET_PLUS_CRLP = 0x53 */
221 BAT_DEF(s,PlusCRSM), /* BAT_CMD_SET_PLUS_CRSM = 0x54 */
222 BAT_DEF(s,PlusCSAS), /* BAT_CMD_SET_PLUS_CSAS = 0x55 */
223 BAT_DEF(s,PlusCSCA), /* BAT_CMD_SET_PLUS_CSCA = 0x56 */
224 BAT_DEF(s,PlusCSCB), /* BAT_CMD_SET_PLUS_CSCB = 0x57 */
225 BAT_DEF(s,PlusCSCS), /* BAT_CMD_SET_PLUS_CSCS = 0x58 */
226 BAT_DEF(s,PlusCSIM), /* BAT_CMD_SET_PLUS_CSIM = 0x59 */
227 BAT_DEF(s,PlusCSMS), /* BAT_CMD_SET_PLUS_CSMS = 0x5a */
228 BAT_DEF(s,PlusCSNS), /* BAT_CMD_SET_PLUS_CSNS = 0x5b */
229 BAT_DEF(s,PlusCSTA), /* BAT_CMD_SET_PLUS_CSTA = 0x5c */
230 BAT_DEF(s,PlusCSVM), /* BAT_CMD_SET_PLUS_CSVM = 0x5d */
231 BAT_DEF(s,PlusCTFR), /* BAT_CMD_SET_PLUS_CTFR = 0x5e */
232 BAT_DEF(s,PercentCTTY), /* BAT_CMD_SET_PERCENT_CTTY = 0x5f */
233 BAT_DEF(s,PlusCTZU), /* BAT_CMD_SET_PLUS_CTZU = 0x60 */
234 BAT_DEF(s,PlusCUSD), /* BAT_CMD_SET_PLUS_CUSD = 0x61 */
235 BAT_DEF(s,PlusCUSD), /* BAT_CMD_SET_PLUS_CUSD_W = 0x62 */
236 BAT_DEF(s,PercentCUST), /* BAT_CMD_SET_PERCENT_CUST = 0x63 */
237 BAT_DEF(s,PercentCWUP), /* BAT_CMD_SET_PERCENT_CWUP = 0x64 */
238 BAT_BAS(D), /* BAT_CMD_AT_D = 0x65 */
239 BAT_DEF(s,PercentDATA), /* BAT_CMD_SET_PERCENT_DATA = 0x66 */
240 BAT_DEF(s,PercentDINF), /* BAT_CMD_SET_PERCENT_DINF = 0x67 */
241 BAT_DEF(s,PlusDS), /* BAT_CMD_SET_PLUS_DS = 0x68 */
242 BAT_BAS(D), /* BAT_CMD_AT_D_W = 0x69 */
243 BAT_DEF(s,PercentEFRSLT), /* BAT_CMD_SET_PERCENT_EFRSLT = 0x6a */
244 BAT_DEF(s,PercentEM), /* BAT_CMD_SET_PERCENT_EM = 0x6b */
245 BAT_FAD(s,PlusFAP), /* BAT_CMD_SET_PLUS_FAP = 0x6c */
246 BAT_FAD(s,PlusFBO), /* BAT_CMD_SET_PLUS_FBO = 0x6d */
247 BAT_FAD(s,PlusFBU), /* BAT_CMD_SET_PLUS_FBU = 0x6e */
248 BAT_FAD(s,PlusFCC), /* BAT_CMD_SET_PLUS_FCC = 0x6f */
249 BAT_FAD(s,PlusFCLASS), /* BAT_CMD_SET_PLUS_FCLASS = 0x70 */
250 BAT_FAD(s,PlusFCQ), /* BAT_CMD_SET_PLUS_FCQ = 0x71 */
251 BAT_FAD(s,PlusFCR), /* BAT_CMD_SET_PLUS_FCR = 0x72 */
252 BAT_FAD(s,PlusFCT), /* BAT_CMD_SET_PLUS_FCT = 0x73 */
253 BAT_FAD(s,PlusFEA), /* BAT_CMD_SET_PLUS_FEA = 0x74 */
254 BAT_FAD(s,PlusFFC), /* BAT_CMD_SET_PLUS_FFC = 0x75 */
255 BAT_FAD(s,PlusFIE), /* BAT_CMD_SET_PLUS_FIE = 0x76 */
256 BAT_FAD(s,PlusFIS), /* BAT_CMD_SET_PLUS_FIS = 0x77 */
257 BAT_FAD(s,PlusFIT), /* BAT_CMD_SET_PLUS_FIT = 0x78 */
258 BAT_FAD(s,PlusFLI), /* BAT_CMD_SET_PLUS_FLI = 0x79 */
259 BAT_FAD(s,PlusFLO), /* BAT_CMD_SET_PLUS_FLO = 0x7a */
260 BAT_FAD(s,PlusFLP), /* BAT_CMD_SET_PLUS_FLP = 0x7b */
261 BAT_FAD(s,PlusFMS), /* BAT_CMD_SET_PLUS_FMS = 0x7c */
262 BAT_FAD(s,PlusFNS), /* BAT_CMD_SET_PLUS_FNS = 0x7d */
263 BAT_FAD(s,PlusFPA), /* BAT_CMD_SET_PLUS_FPA = 0x7e */
264 BAT_FAD(s,PlusFPI), /* BAT_CMD_SET_PLUS_FPI = 0x7f */
265 BAT_FAD(s,PlusFPS), /* BAT_CMD_SET_PLUS_FPS = 0x80 */
266 BAT_FAD(s,PlusFPW), /* BAT_CMD_SET_PLUS_FPW = 0x81 */
267 BAT_FAD(s,PlusFRQ), /* BAT_CMD_SET_PLUS_FRQ = 0x82 */
268 BAT_FAD(s,PlusFSA), /* BAT_CMD_SET_PLUS_FSA = 0x83 */
269 BAT_FAD(s,PlusFSP), /* BAT_CMD_SET_PLUS_FSP = 0x84 */
270 BAT_DEF(s,PlusICF), /* BAT_CMD_SET_PLUS_ICF = 0x85 */
271 BAT_DEF(s,PlusIFC), /* BAT_CMD_SET_PLUS_IFC = 0x86 */
272 BAT_DEF(s,PlusIPR), /* BAT_CMD_SET_PLUS_IPR = 0x87 */
273 BAT_DEF(s,PercentPBCF), /* BAT_CMD_SET_PERCENT_PBCF = 0x88 */
274 BAT_PPP(s,PercentPPP), /* BAT_CMD_SET_PERCENT_PPP = 0x89 */
275 BAT_DEF(s,PercentPVRF), /* BAT_CMD_SET_PERCENT_PVRF = 0x8a */
276 BAT_DEF(s,PercentRDL), /* BAT_CMD_SET_PERCENT_RDL = 0x8b */
277 BAT_DEF(s,PercentRDLB), /* BAT_CMD_SET_PERCENT_RDLB = 0x8c */
278 BAT_STK(s,PercentSATC), /* BAT_CMD_SET_PERCENT_SATC = 0x8d */
279 BAT_STK(s,PercentSATCC), /* BAT_CMD_SET_PERCENT_SATCC = 0x8e */
280 BAT_STK(s,PercentSATE), /* BAT_CMD_SET_PERCENT_SATE = 0x8f */
281 BAT_STK(s,PercentSATR), /* BAT_CMD_SET_PERCENT_SATR = 0x80 */
282 BAT_STK(s,PercentSATT), /* BAT_CMD_SET_PERCENT_SATT = 0x91 */
283 BAT_GPR(s,PercentSNCNT), /* BAT_CMD_SET_PERCENT_SNCNT = 0x92 */
284 BAT_DEF(s,PercentVTS), /* BAT_CMD_SET_PERCENT_VTS = 0x93 */
285 BAT_DEF(s,PlusVTS), /* BAT_CMD_SET_PLUS_VTS = 0x94 */
286 BAT_DEF(s,PlusWS46), /* BAT_CMD_SET_PLUS_WS46 = 0x95 */
287 BAT_DEF(s,PercentCPINF), /* BAT_CMD_SET_PERCENT_CPINF = 0x96 */
288 BAT_DEF(s,PercentCMGR), /* BAT_CMD_SET_PERCENT_CMGR = 0x97 */
289 BAT_DEF(s,PercentCMGL), /* BAT_CMD_SET_PERCENT_CMGL = 0x98 */
290 BAT_DEF(s,PercentCTZV) /* BAT_CMD_SET_PERCENT_CTZV = 0x99 */
291 };
292
293 LOCAL const BATCommand bat_cmds_without_params [] =
294 {
295 BAT_BAS(A), /* BAT_CMD_AT_A = 0x1000 */
296 BAT_DEF(s,PlusCBC), /* BAT_CMD_SET_PLUS_CBC = 0x1001 */
297 BAT_DEF(s,PlusCEER), /* BAT_CMD_SET_PLUS_CEER = 0x1002 */
298 BAT_DEF(s,PlusCIMI), /* BAT_CMD_SET_PLUS_CIMI = 0x1003 */
299 BAT_DEF(s,PlusCNUM), /* BAT_CMD_SET_PLUS_CNUM = 0x1004 */
300 BAT_DEF(s,PlusCNUM), /* BAT_CMD_SET_PLUS_CNUM_W = 0x1005 */
301 BAT_DEF(s,PlusCPAS), /* BAT_CMD_SET_PLUS_CPAS = 0x1006 */
302 BAT_DEF(s,PlusCSQ), /* BAT_CMD_SET_PLUS_CSQ = 0x1007 */
303 BAT_BAS(ANDF), /* BAT_CMD_ANDF = 0x1008 */
304 BAT_BAS(H), /* BAT_CMD_AT_H = 0x1009 */
305 BAT_BAS(O), /* BAT_CMD_AT_O = 0x100a */
306 BAT_BAS(Z), /* BAT_CMD_AT_Z = 0x100b */
307 BAT_DEF(q,PercentALS), /* BAT_CMD_QUE_PERCENT_ALS = 0x100c */
308 BAT_DEF(t,PercentALS), /* BAT_CMD_TST_PERCENT_ALS = 0x100d */
309 BAT_DEF(q,PercentATR), /* BAT_CMD_QUE_PERCENT_ATR = 0x100e */
310 BAT_DEF(q,PercentBAND), /* BAT_CMD_QUE_PERCENT_BAND = 0x100f */
311 BAT_DEF(t,PercentBAND), /* BAT_CMD_TST_PERCENT_BAND = 0x1010 */
312 BAT_DEF(q,PlusCACM), /* BAT_CMD_QUE_PLUS_CACM = 0x1011 */
313 BAT_DEF(q,PlusCAMM), /* BAT_CMD_QUE_PLUS_CAMM = 0x1012 */
314 BAT_DEF(q,PercentCBHZ), /* BAT_CMD_QUE_PERCENT_CBHZ = 0x1013 */
315 BAT_DEF(t,PercentCBHZ), /* BAT_CMD_TST_PERCENT_CBHZ = 0x1014 */
316 BAT_DEF(q,PlusCBST), /* BAT_CMD_QUE_PLUS_CBST = 0x1015 */
317 BAT_DEF(q,PercentCCBS), /* BAT_CMD_QUE_PERCENT_CCBS = 0x1016 */
318 BAT_DEF(q,PlusCCLK), /* BAT_CMD_QUE_PLUS_CCLK = 0x1017 */
319 BAT_DEF(q,PlusCCUG), /* BAT_CMD_QUE_PLUS_CCUG = 0x1018 */
320 BAT_DEF(q,PlusCFUN), /* BAT_CMD_QUE_PLUS_CFUN = 0x1019 */
321 BAT_GPR(q,PercentCGAATT), /* BAT_CMD_QUE_PERCENT_CGAATT = 0x101a */
322 BAT_GPR(q,PlusCGACT), /* BAT_CMD_QUE_PLUS_CGACT = 0x101b */
323 BAT_GPR(q,PlusCGATT), /* BAT_CMD_QUE_PLUS_CGATT = 0x101c */
324 BAT_GPR(q,PercentCGCLASS), /* BAT_CMD_QUE_PERCENT_CGCLASS = 0x101d */
325 BAT_GPR(q,PlusCGCLASS), /* BAT_CMD_QUE_PLUS_CGCLASS = 0x101e */
326 BAT_GPR(q,PlusCGDCONT), /* BAT_CMD_QUE_PLUS_CGDCONT = 0x101f */
327 BAT_GPR(t,PlusCGPADDR), /* BAT_CMD_TST_PLUS_CGPADDR = 0x1020 */
328 BAT_GPR(q,PercentCGPPP), /* BAT_CMD_QUE_PERCENT_CGPPP = 0x1021 */
329 BAT_GPR(q,PlusCGQMIN), /* BAT_CMD_QUE_PLUS_CGQMIN = 0x1022 */
330 BAT_GPR(q,PlusCGQREQ), /* BAT_CMD_QUE_PLUS_CGQREQ = 0x1023 */
331 BAT_GPR(q,PercentCGREG), /* BAT_CMD_QUE_PERCENT_CGREG = 0x1024 */
332 BAT_GPR(q,PlusCGREG), /* BAT_CMD_QUE_PLUS_CGREG = 0x1025 */
333 BAT_GPR(q,PlusCGSMS), /* BAT_CMD_QUE_PLUS_CGSMS = 0x1026 */
334 BAT_DEF(q,PlusCIND), /* BAT_CMD_QUE_PLUS_CIND = 0x1027 */
335 BAT_DEF(q,PlusCLAN), /* BAT_CMD_QUE_PLUS_CLAN = 0x1028 */
336 BAT_DEF(t,PlusCLAN), /* BAT_CMD_TST_PLUS_CLAN = 0x1029 */
337 BAT_DEF(q,PlusCLCC), /* BAT_CMD_QUE_PLUS_CLCC = 0x102a */
338 BAT_DEF(q,PlusCLIP), /* BAT_CMD_QUE_PLUS_CLIP = 0x102b */
339 BAT_DEF(q,PlusCLIP), /* BAT_CMD_QUE_PLUS_CLIP_W = 0x102c */
340 BAT_DEF(q,PlusCLIR), /* BAT_CMD_QUE_PLUS_CLIR = 0x102d */
341 BAT_DEF(q,PlusCLVL), /* BAT_CMD_QUE_PLUS_CLVL = 0x102e */
342 BAT_DEF(q,PlusCMER), /* BAT_CMD_QUE_PLUS_CMER = 0x102f */
343 BAT_DEF(q,PlusCMOD), /* BAT_CMD_QUE_PLUS_CMOD = 0x1030 */
344 BAT_DEF(q,PlusCMUT), /* BAT_CMD_QUE_PLUS_CMUT = 0x1031 */
345 BAT_DEF(q,PlusCMUX), /* BAT_CMD_QUE_PLUS_CMUX = 0x1032 */
346 BAT_DEF(q,PercentCNAP), /* BAT_CMD_QUE_PERCENT_CNAP = 0x1033 */
347 BAT_DEF(q,PlusCNMI), /* BAT_CMD_QUE_PLUS_CNMI = 0x1034 */
348 BAT_DEF(q,PlusCOLP), /* BAT_CMD_QUE_PLUS_COLP = 0x1035 */
349 BAT_DEF(q,PlusCOLP), /* BAT_CMD_QUE_PLUS_COLP_W = 0x1036 */
350 BAT_DEF(q,PercentCOPS), /* BAT_CMD_QUE_PERCENT_COPS = 0x1037 */
351 BAT_DEF(t,PercentCOPS), /* BAT_CMD_TST_PERCENT_COPS = 0x1038 */
352 BAT_DEF(q,PlusCOPS), /* BAT_CMD_QUE_PLUS_COPS = 0x1039 */
353 BAT_DEF(t,PlusCOPS), /* BAT_CMD_TST_PLUS_COPS = 0x103a */
354 BAT_DEF(q,PercentCOPS), /* BAT_CMD_QUE_PERCENT_COPS_W = 0x103b */
355 BAT_DEF(t,PercentCOPS), /* BAT_CMD_TST_PERCENT_COPS_W = 0x103c */
356 BAT_DEF(q,PercentCPALS), /* BAT_CMD_QUE_PERCENT_CPALS = 0x103d */
357 BAT_DEF(q,PercentCPALS), /* BAT_CMD_QUE_PERCENT_CPALS_W = 0x103e */
358 BAT_DEF(t,PlusCPBF), /* BAT_CMD_TST_PLUS_CPBF = 0x103f */
359 BAT_DEF(t,PlusCPBF), /* BAT_CMD_TST_PLUS_CPBF_W = 0x1040 */
360 BAT_DEF(t,PlusCPBR), /* BAT_CMD_TST_PLUS_CPBR = 0x1041 */
361 BAT_DEF(t,PlusCPBR), /* BAT_CMD_TST_PLUS_CPBR_W = 0x1042 */
362 BAT_DEF(q,PercentCPBS), /* BAT_CMD_QUE_PERCENT_CPBS = 0x1043 */
363 BAT_DEF(q,PlusCPBS), /* BAT_CMD_QUE_PLUS_CPBS = 0x1044 */
364 BAT_DEF(t,PlusCPBW), /* BAT_CMD_TST_PLUS_CPBW = 0x1045 */
365 BAT_DEF(t,PlusCPBW), /* BAT_CMD_TST_PLUS_CPBW_W = 0x1046 */
366 BAT_DEF(q,PercentCPHS), /* BAT_CMD_QUE_PERCENT_CPHS = 0x1047 */
367 BAT_DEF(q,PlusCPIN), /* BAT_CMD_QUE_PLUS_CPIN = 0x1048 */
368 BAT_DEF(q,PercentCPINF), /* BAT_CMD_QUE_PERCENT_CPINF = 0x1049 */
369 BAT_DEF(q,PercentCPMB), /* BAT_CMD_QUE_PERCENT_CPMB = 0x104a */
370 BAT_DEF(t,PercentCPMBW), /* BAT_CMD_TST_PERCENT_CPMBW = 0x104b */
371 BAT_DEF(t,PercentCPMBW), /* BAT_CMD_TST_PERCENT_CPMBW_W = 0x104c */
372 BAT_DEF(q,PlusCPMS), /* BAT_CMD_QUE_PLUS_CPMS = 0x104d */
373 BAT_DEF(t,PercentCPNUMS), /* BAT_CMD_TST_PERCENT_CPNUMS = 0x104e */
374 BAT_DEF(t,PercentCPNUMS), /* BAT_CMD_TST_PERCENT_CPNUMS_W = 0x104f */
375 BAT_DEF(q,PlusCPOL), /* BAT_CMD_QUE_PLUS_CPOL = 0x1050 */
376 BAT_DEF(t,PlusCPOL), /* BAT_CMD_TST_PLUS_CPOL = 0x1051 */
377 BAT_DEF(q,PlusCPOL), /* BAT_CMD_QUE_PLUS_CPOL_W = 0x1052 */
378 BAT_DEF(t,PlusCPOL), /* BAT_CMD_TST_PLUS_CPOL_W = 0x1053 */
379 BAT_DEF(q,PercentCPOPN), /* BAT_CMD_QUE_PERCENT_CPOPN = 0x1054 */
380 BAT_DEF(q,PercentCPRSM), /* BAT_CMD_QUE_PERCENT_CPRSM = 0x1055 */
381 BAT_DEF(q,PlusCPUC), /* BAT_CMD_QUE_PLUS_CPUC = 0x1056 */
382 BAT_DEF(q,PlusCPUC), /* BAT_CMD_QUE_PLUS_CPUC_W = 0x1057 */
383 BAT_DEF(q,PercentCREG), /* BAT_CMD_QUE_PERCENT_CREG = 0x1058 */
384 BAT_DEF(t,PlusCRES), /* BAT_CMD_TST_PLUS_CRES = 0x1059 */
385 BAT_DEF(q,PlusCRLP), /* BAT_CMD_QUE_PLUS_CRLP = 0x105a */
386 BAT_DEF(t,PlusCSAS), /* BAT_CMD_TST_PLUS_CSAS = 0x105b */
387 BAT_DEF(q,PlusCSCA), /* BAT_CMD_QUE_PLUS_CSCA = 0x105c */
388 BAT_DEF(q,PlusCSCB), /* BAT_CMD_QUE_PLUS_CSCB = 0x105d */
389 BAT_DEF(q,PlusCSCS), /* BAT_CMD_QUE_PLUS_CSCS = 0x105e */
390 BAT_DEF(q,PlusCSMS), /* BAT_CMD_QUE_PLUS_CSMS = 0x105f */
391 BAT_DEF(q,PlusCSNS), /* BAT_CMD_QUE_PLUS_CSNS = 0x1060 */
392 BAT_DEF(q,PercentCSQ), /* BAT_CMD_QUE_PERCENT_CSQ = 0x1061 */
393 BAT_DEF(q,PlusCSTA), /* BAT_CMD_QUE_PLUS_CSTA = 0x1062 */
394 BAT_DEF(q,PlusCSVM), /* BAT_CMD_QUE_PLUS_CSVM = 0x1063 */
395 BAT_DEF(q,PercentCTTY), /* BAT_CMD_QUE_PERCENT_CTTY = 0x1064 */
396 BAT_DEF(q,PlusCTZU), /* BAT_CMD_QUE_PLUS_CTZU = 0x1065 */
397 BAT_DEF(q,PercentCUST), /* BAT_CMD_QUE_PERCENT_CUST = 0x1066 */
398 BAT_DEF(q,PercentDATA), /* BAT_CMD_QUE_PERCENT_DATA = 0x1067 */
399 BAT_DEF(q,PlusDS), /* BAT_CMD_QUE_PLUS_DS = 0x1068 */
400 BAT_FAD(q,PlusFAP), /* BAT_CMD_QUE_PLUS_FAP = 0x1069 */
401 BAT_FAD(q,PlusFBO), /* BAT_CMD_QUE_PLUS_FBO = 0x106a */
402 BAT_FAD(q,PlusFBS), /* BAT_CMD_QUE_PLUS_FBS = 0x106b */
403 BAT_FAD(q,PlusFBU), /* BAT_CMD_QUE_PLUS_FBU = 0x106c */
404 BAT_FAD(q,PlusFCC), /* BAT_CMD_QUE_PLUS_FCC = 0x106d */
405 BAT_FAD(q,PlusFCLASS), /* BAT_CMD_QUE_PLUS_FCLASS = 0x106e */
406 BAT_FAD(q,PlusFCQ), /* BAT_CMD_QUE_PLUS_FCQ = 0x106f */
407 BAT_FAD(q,PlusFCR), /* BAT_CMD_QUE_PLUS_FCR = 0x1070 */
408 BAT_FAD(q,PlusFCS), /* BAT_CMD_QUE_PLUS_FCS = 0x1071 */
409 BAT_FAD(q,PlusFCT), /* BAT_CMD_QUE_PLUS_FCT = 0x1072 */
410 NULL, /* BAT_CMD_QUE_PLUS_FEA = 0x1073 */
411 BAT_FAD(q,PlusFFC), /* BAT_CMD_QUE_PLUS_FFC = 0x1074 */
412 BAT_FAD(q,PlusFHS), /* BAT_CMD_QUE_PLUS_FHS = 0x1075 */
413 BAT_FAD(q,PlusFIE), /* BAT_CMD_QUE_PLUS_FIE = 0x1076 */
414 BAT_FAD(q,PlusFIS), /* BAT_CMD_QUE_PLUS_FIS = 0x1077 */
415 BAT_FAD(q,PlusFIT), /* BAT_CMD_QUE_PLUS_FIT = 0x1078 */
416 BAT_FAD(q,PlusFLI), /* BAT_CMD_QUE_PLUS_FLI = 0x1079 */
417 BAT_FAD(q,PlusFLO), /* BAT_CMD_QUE_PLUS_FLO = 0x107a */
418 BAT_FAD(q,PlusFLP), /* BAT_CMD_QUE_PLUS_FLP = 0x107b */
419 BAT_FAD(q,PlusFMS), /* BAT_CMD_QUE_PLUS_FMS = 0x107c */
420 BAT_FAD(q,PlusFNS), /* BAT_CMD_QUE_PLUS_FNS = 0x107d */
421 BAT_FAD(q,PlusFPA), /* BAT_CMD_QUE_PLUS_FPA = 0x107e */
422 BAT_FAD(q,PlusFPI), /* BAT_CMD_QUE_PLUS_FPI = 0x107f */
423 BAT_FAD(q,PlusFPS), /* BAT_CMD_QUE_PLUS_FPS = 0x1080 */
424 BAT_FAD(q,PlusFPW), /* BAT_CMD_QUE_PLUS_FPW = 0x1081 */
425 BAT_FAD(q,PlusFRQ), /* BAT_CMD_QUE_PLUS_FRQ = 0x1082 */
426 BAT_FAD(q,PlusFSA), /* BAT_CMD_QUE_PLUS_FSA = 0x1083 */
427 BAT_FAD(q,PlusFSP), /* BAT_CMD_QUE_PLUS_FSP = 0x1084 */
428 BAT_DEF(q,PlusICF), /* BAT_CMD_QUE_PLUS_ICF = 0x1085 */
429 BAT_DEF(q,PlusIFC), /* BAT_CMD_QUE_PLUS_IFC = 0x1086 */
430 NULL, /* BAT_CMD_QUE_PERCENT_IMEI = 0x1087 */
431 BAT_DEF(q,PlusIPR), /* BAT_CMD_QUE_PLUS_IPR = 0x1088 */
432 BAT_DEF(q,PercentPBCF), /* BAT_CMD_QUE_PERCENT_PBCF = 0x1089 */
433 BAT_PPP(q,PercentPPP), /* BAT_CMD_QUE_PERCENT_PPP = 0x108a */
434 BAT_DEF(q,PercentPVRF), /* BAT_CMD_QUE_PERCENT_PVRF = 0x108b */
435 BAT_DEF(q,PercentRDL), /* BAT_CMD_QUE_PERCENT_RDL = 0x108c */
436 BAT_DEF(q,PercentRDLB), /* BAT_CMD_QUE_PERCENT_RDLB = 0x108d */
437 BAT_STK(q,PercentSATC), /* BAT_CMD_QUE_PERCENT_SATC = 0x108e */
438 BAT_STK(q,PercentSATCC), /* BAT_CMD_QUE_PERCENT_SATCC = 0x108f */
439 BAT_GPR(q,PercentSNCNT), /* BAT_CMD_QUE_PERCENT_SNCNT = 0x1090 */
440 BAT_DEF(q,PlusWS46), /* BAT_CMD_QUE_PLUS_WS46 = 0x1091 */
441 BAT_DEF(q,PlusCDIP), /* BAT_CMD_QUE_PLUS_CDIP = 0x1092 */
442 BAT_DEF(s,PlusCGMI), /* BAT_CMD_SET_PLUS_CGMI = 0x1093 */
443 BAT_DEF(s,PlusCGMM), /* BAT_CMD_SET_PLUS_CGMM = 0x1094 */
444 BAT_DEF(s,PlusCGMR), /* BAT_CMD_SET_PLUS_CGMR = 0x1095 */
445 BAT_DEF(s,PlusCGSN) /* BAT_CMD_SET_PLUS_CGSN = 0x1096 */
446 };
447
448
449 typedef struct
450 {
451 size_t size;
452 } T_map_response_2_size;
453
454 static T_map_response_2_size response_2_size[] =
455 {
456 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_OK = 0x0 */
457 {sizeof(T_BAT_res_at_connect)}, /* BAT_RES_AT_CONNECT = 0x1 */
458 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_NO_CARRIER_FINAL = 0x2 */
459 {sizeof(T_BAT_res_plus_cme_error)}, /* BAT_RES_PLUS_CME_ERROR = 0x3 */
460 {sizeof(T_BAT_res_plus_cms_error)}, /* BAT_RES_PLUS_CMS_ERROR = 0x4 */
461 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_BUSY = 0x5 */
462 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_CHANNEL_BUSY = 0x6 */
463 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_NO_ANSWER = 0x7 */
464 {sizeof(T_BAT_res_plus_ext_error)}, /* BAT_RES_PLUS_EXT_ERROR = 0x8 */
465 {sizeof(T_BAT_res_que_percent_als)}, /* BAT_RES_QUE_PERCENT_ALS = 0x9 */
466 {sizeof(T_BAT_res_tst_percent_als)}, /* BAT_RES_TST_PERCENT_ALS = 0xa */
467 {sizeof(T_BAT_res_que_percent_atr)}, /* BAT_RES_QUE_PERCENT_ATR = 0xb */
468 {sizeof(T_BAT_res_que_percent_band)}, /* BAT_RES_QUE_PERCENT_BAND = 0xc */
469 {sizeof(T_BAT_res_tst_percent_band)}, /* BAT_RES_TST_PERCENT_BAND = 0xd */
470 {sizeof(T_BAT_res_que_plus_cacm)}, /* BAT_RES_QUE_PLUS_CACM = 0xe */
471 {sizeof(T_BAT_res_que_plus_camm)}, /* BAT_RES_QUE_PLUS_CAMM = 0xf */
472 {sizeof(T_BAT_res_set_plus_caoc)}, /* BAT_RES_SET_PLUS_CAOC = 0x10 */
473 {sizeof(T_BAT_res_set_plus_cbc)}, /* BAT_RES_SET_PLUS_CBC = 0x11 */
474 {sizeof(T_BAT_res_que_percent_cbhz)}, /* BAT_RES_QUE_PERCENT_CBHZ = 0x12 */
475 {sizeof(T_BAT_res_tst_percent_cbhz)}, /* BAT_RES_TST_PERCENT_CBHZ = 0x13 */
476 {sizeof(T_BAT_res_que_plus_cbst)}, /* BAT_RES_QUE_PLUS_CBST = 0x14 */
477 {sizeof(T_BAT_res_que_percent_ccbs)}, /* BAT_RES_QUE_PERCENT_CCBS = 0x15 */
478 {sizeof(T_BAT_res_set_plus_ccfc)}, /* BAT_RES_SET_PLUS_CCFC = 0x16 */
479 {sizeof(T_BAT_res_que_plus_cclk)}, /* BAT_RES_QUE_PLUS_CCLK = 0x17 */
480 {sizeof(T_BAT_res_que_plus_ccug)}, /* BAT_RES_QUE_PLUS_CCUG = 0x18 */
481 {sizeof(T_BAT_res_set_plus_ccwa)}, /* BAT_RES_SET_PLUS_CCWA = 0x19 */
482 {sizeof(T_BAT_res_set_plus_ccwa_w)}, /* BAT_RES_SET_PLUS_CCWA_W = 0x1a */
483 {sizeof(T_BAT_res_set_plus_ceer)}, /* BAT_RES_SET_PLUS_CEER = 0x1b */
484 {sizeof(T_BAT_res_que_plus_cfun)}, /* BAT_RES_QUE_PLUS_CFUN = 0x1c */
485 {sizeof(T_BAT_res_que_percent_cgaatt)}, /* BAT_RES_QUE_PERCENT_CGAATT = 0x1d */
486 {sizeof(T_BAT_res_que_plus_cgact)}, /* BAT_RES_QUE_PLUS_CGACT = 0x1e */
487 {sizeof(T_BAT_res_que_plus_cgatt)}, /* BAT_RES_QUE_PLUS_CGATT = 0x1f */
488 {sizeof(T_BAT_res_que_percent_cgclass)}, /* BAT_RES_QUE_PERCENT_CGCLASS = 0x20 */
489 {sizeof(T_BAT_res_que_plus_cgclass)}, /* BAT_RES_QUE_PLUS_CGCLASS = 0x21 */
490 {sizeof(T_BAT_res_que_plus_cgdcont)}, /* BAT_RES_QUE_PLUS_CGDCONT = 0x22 */
491 {sizeof(T_BAT_res_set_plus_cgpaddr)}, /* BAT_RES_SET_PLUS_CGPADDR = 0x23 */
492 {sizeof(T_BAT_res_tst_plus_cgpaddr)}, /* BAT_RES_TST_PLUS_CGPADDR = 0x24 */
493 {sizeof(T_BAT_res_set_percent_cgpco)}, /* BAT_RES_SET_PERCENT_CGPCO = 0x25 */
494 {sizeof(T_BAT_res_que_percent_cgppp)}, /* BAT_RES_QUE_PERCENT_CGPPP = 0x26 */
495 {sizeof(T_BAT_res_que_plus_cgqmin)}, /* BAT_RES_QUE_PLUS_CGQMIN = 0x27 */
496 {sizeof(T_BAT_res_que_plus_cgqreq)}, /* BAT_RES_QUE_PLUS_CGQREQ = 0x28 */
497 {sizeof(T_BAT_res_que_percent_cgreg)}, /* BAT_RES_QUE_PERCENT_CGREG = 0x29 */
498 {sizeof(T_BAT_res_que_plus_cgreg)}, /* BAT_RES_QUE_PLUS_CGREG = 0x2a */
499 {sizeof(T_BAT_res_que_plus_cgsms)}, /* BAT_RES_QUE_PLUS_CGSMS = 0x2b */
500 {sizeof(T_BAT_res_set_percent_chpl)}, /* BAT_RES_SET_PERCENT_CHPL = 0x2c */
501 {sizeof(T_BAT_res_set_percent_chpl_w)}, /* BAT_RES_SET_PERCENT_CHPL_W = 0x2d */
502 {sizeof(T_BAT_res_set_plus_cimi)}, /* BAT_RES_SET_PLUS_CIMI = 0x2e */
503 {sizeof(T_BAT_res_que_plus_cind)}, /* BAT_RES_QUE_PLUS_CIND = 0x2f */
504 {sizeof(T_BAT_res_que_plus_clan)}, /* BAT_RES_QUE_PLUS_CLAN = 0x30 */
505 {sizeof(T_BAT_res_tst_plus_clan)}, /* BAT_RES_TST_PLUS_CLAN = 0x31 */
506 {sizeof(T_BAT_res_que_plus_clcc)}, /* BAT_RES_QUE_PLUS_CLCC = 0x32 */
507 {sizeof(T_BAT_res_set_plus_clck)}, /* BAT_RES_SET_PLUS_CLCK = 0x33 */
508 {sizeof(T_BAT_res_que_plus_clip)}, /* BAT_RES_QUE_PLUS_CLIP = 0x34 */
509 {sizeof(T_BAT_res_que_plus_clip_w)}, /* BAT_RES_QUE_PLUS_CLIP_W = 0x35 */
510 {sizeof(T_BAT_res_que_plus_clir)}, /* BAT_RES_QUE_PLUS_CLIR = 0x36 */
511 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_SET_PLUS_CLVL = 0x37 */
512 {sizeof(T_BAT_res_que_plus_clvl)}, /* BAT_RES_QUE_PLUS_CLVL = 0x38 */
513 {sizeof(T_BAT_res_que_plus_cmer)}, /* BAT_RES_QUE_PLUS_CMER = 0x39 */
514 {sizeof(T_BAT_res_set_plus_cmgc)}, /* BAT_RES_SET_PLUS_CMGC = 0x3a */
515 {sizeof(T_BAT_res_set_plus_cmgl)}, /* BAT_RES_SET_PLUS_CMGL = 0x3b */
516 {sizeof(T_BAT_res_set_plus_cmgl_w)}, /* BAT_RES_SET_PLUS_CMGL_W = 0x3c */
517 {sizeof(T_BAT_res_set_plus_cmgr)}, /* BAT_RES_SET_PLUS_CMGR = 0x3d */
518 {sizeof(T_BAT_res_set_plus_cmgr_w)}, /* BAT_RES_SET_PLUS_CMGR_W = 0x3e */
519 {sizeof(T_BAT_res_set_plus_cmgs)}, /* BAT_RES_SET_PLUS_CMGS = 0x3f */
520 {sizeof(T_BAT_res_set_plus_cmgw)}, /* BAT_RES_SET_PLUS_CMGW = 0x40 */
521 {sizeof(T_BAT_res_que_plus_cmod)}, /* BAT_RES_QUE_PLUS_CMOD = 0x41 */
522 {sizeof(T_BAT_res_que_plus_cmut)}, /* BAT_RES_QUE_PLUS_CMUT = 0x42 */
523 {sizeof(T_BAT_res_que_plus_cmux)}, /* BAT_RES_QUE_PLUS_CMUX = 0x43 */
524 {sizeof(T_BAT_res_que_percent_cnap)}, /* BAT_RES_QUE_PERCENT_CNAP = 0x44 */
525 {sizeof(T_BAT_res_que_plus_cnmi)}, /* BAT_RES_QUE_PLUS_CNMI = 0x45 */
526 {sizeof(T_BAT_res_set_plus_cnum)}, /* BAT_RES_SET_PLUS_CNUM = 0x46 */
527 {sizeof(T_BAT_res_set_plus_cnum_w)}, /* BAT_RES_SET_PLUS_CNUM_W = 0x47 */
528 {sizeof(T_BAT_res_que_plus_colp)}, /* BAT_RES_QUE_PLUS_COLP = 0x48 */
529 {sizeof(T_BAT_res_que_plus_colp_w)}, /* BAT_RES_QUE_PLUS_COLP_W = 0x49 */
530 {sizeof(T_BAT_res_que_percent_cops)}, /* BAT_RES_QUE_PERCENT_COPS = 0x4a */
531 {sizeof(T_BAT_res_tst_percent_cops)}, /* BAT_RES_TST_PERCENT_COPS = 0x4b */
532 {sizeof(T_BAT_res_que_plus_cops)}, /* BAT_RES_QUE_PLUS_COPS = 0x4c */
533 {sizeof(T_BAT_res_tst_plus_cops)}, /* BAT_RES_TST_PLUS_COPS = 0x4d */
534 {sizeof(T_BAT_res_que_percent_cops_w)}, /* BAT_RES_QUE_PERCENT_COPS_W = 0x4e */
535 {sizeof(T_BAT_res_tst_percent_cops_w)}, /* BAT_RES_TST_PERCENT_COPS_W = 0x4f */
536 {sizeof(T_BAT_res_set_percent_cpals)}, /* BAT_RES_SET_PERCENT_CPALS = 0x50 */
537 {sizeof(T_BAT_res_que_percent_cpals)}, /* BAT_RES_QUE_PERCENT_CPALS = 0x51 */
538 {sizeof(T_BAT_res_set_percent_cpals_w)}, /* BAT_RES_SET_PERCENT_CPALS_W = 0x52 */
539 {sizeof(T_BAT_res_que_percent_cpals_w)}, /* BAT_RES_QUE_PERCENT_CPALS_W = 0x53 */
540 {sizeof(T_BAT_res_set_plus_cpas)}, /* BAT_RES_SET_PLUS_CPAS = 0x54 */
541 {sizeof(T_BAT_res_set_plus_cpbf)}, /* BAT_RES_SET_PLUS_CPBF = 0x55 */
542 {sizeof(T_BAT_res_tst_plus_cpbf)}, /* BAT_RES_TST_PLUS_CPBF = 0x56 */
543 {sizeof(T_BAT_res_set_plus_cpbf_w)}, /* BAT_RES_SET_PLUS_CPBF_W = 0x57 */
544 {sizeof(T_BAT_res_tst_plus_cpbf_w)}, /* BAT_RES_TST_PLUS_CPBF_W = 0x58 */
545 {sizeof(T_BAT_res_set_plus_cpbr)}, /* BAT_RES_SET_PLUS_CPBR = 0x59 */
546 {sizeof(T_BAT_res_tst_plus_cpbr)}, /* BAT_RES_TST_PLUS_CPBR = 0x5a */
547 {sizeof(T_BAT_res_set_plus_cpbr_w)}, /* BAT_RES_SET_PLUS_CPBR_W = 0x5b */
548 {sizeof(T_BAT_res_tst_plus_cpbr_w)}, /* BAT_RES_TST_PLUS_CPBR_W = 0x5c */
549 {sizeof(T_BAT_res_que_percent_cpbs)}, /* BAT_RES_QUE_PERCENT_CPBS = 0x5d */
550 {sizeof(T_BAT_res_que_plus_cpbs)}, /* BAT_RES_QUE_PLUS_CPBS = 0x5e */
551 {sizeof(T_BAT_res_tst_plus_cpbw)}, /* BAT_RES_TST_PLUS_CPBW = 0x5f */
552 {sizeof(T_BAT_res_tst_plus_cpbw_w)}, /* BAT_RES_TST_PLUS_CPBW_W = 0x60 */
553 {sizeof(T_BAT_res_set_percent_cpcfu)}, /* BAT_RES_SET_PERCENT_CPCFU = 0x61 */
554 {sizeof(T_BAT_res_que_percent_cphs)}, /* BAT_RES_QUE_PERCENT_CPHS = 0x62 */
555 {sizeof(T_BAT_res_que_plus_cpin)}, /* BAT_RES_QUE_PLUS_CPIN = 0x63 */
556 {sizeof(T_BAT_res_que_percent_cpinf)}, /* BAT_RES_QUE_PERCENT_CPINF = 0x64 */
557 {sizeof(T_BAT_res_set_percent_cpmb)}, /* BAT_RES_SET_PERCENT_CPMB = 0x65 */
558 {sizeof(T_BAT_res_que_percent_cpmb)}, /* BAT_RES_QUE_PERCENT_CPMB = 0x66 */
559 {sizeof(T_BAT_res_tst_percent_cpmbw)}, /* BAT_RES_TST_PERCENT_CPMBW = 0x67 */
560 {sizeof(T_BAT_res_tst_percent_cpmbw_w)}, /* BAT_RES_TST_PERCENT_CPMBW_W = 0x68 */
561 {sizeof(T_BAT_res_set_percent_cpmb_w)}, /* BAT_RES_SET_PERCENT_CPMB_W = 0x69 */
562 {sizeof(T_BAT_res_set_plus_cpms)}, /* BAT_RES_SET_PLUS_CPMS = 0x6a */
563 {sizeof(T_BAT_res_que_plus_cpms)}, /* BAT_RES_QUE_PLUS_CPMS = 0x6b */
564 {sizeof(T_BAT_res_set_percent_cpnums)}, /* BAT_RES_SET_PERCENT_CPNUMS = 0x6c */
565 {sizeof(T_BAT_res_tst_percent_cpnums)}, /* BAT_RES_TST_PERCENT_CPNUMS = 0x6d */
566 {sizeof(T_BAT_res_set_percent_cpnums_w)},/* BAT_RES_SET_PERCENT_CPNUMS_W = 0x6e */
567 {sizeof(T_BAT_res_tst_percent_cpnums_w)},/* BAT_RES_TST_PERCENT_CPNUMS_W = 0x6f */
568 {sizeof(T_BAT_res_que_plus_cpol)}, /* BAT_RES_QUE_PLUS_CPOL = 0x70 */
569 {sizeof(T_BAT_res_tst_plus_cpol)}, /* BAT_RES_TST_PLUS_CPOL = 0x71 */
570 {sizeof(T_BAT_res_que_plus_cpol_w)}, /* BAT_RES_QUE_PLUS_CPOL_W = 0x72 */
571 {sizeof(T_BAT_res_tst_plus_cpol_w)}, /* BAT_RES_TST_PLUS_CPOL_W = 0x73 */
572 {sizeof(T_BAT_res_que_percent_cpopn)}, /* BAT_RES_QUE_PERCENT_CPOPN = 0x74 */
573 {sizeof(T_BAT_res_que_percent_cprsm)}, /* BAT_RES_QUE_PERCENT_CPRSM = 0x75 */
574 {sizeof(T_BAT_res_que_plus_cpuc)}, /* BAT_RES_QUE_PLUS_CPUC = 0x76 */
575 {sizeof(T_BAT_res_que_plus_cpuc_w)}, /* BAT_RES_QUE_PLUS_CPUC_W = 0x77 */
576 {sizeof(T_BAT_res_set_percent_cpvwi)}, /* BAT_RES_SET_PERCENT_CPVWI = 0x78 */
577 {sizeof(T_BAT_res_que_percent_creg)}, /* BAT_RES_QUE_PERCENT_CREG = 0x79 */
578 {sizeof(T_BAT_res_tst_plus_cres)}, /* BAT_RES_TST_PLUS_CRES = 0x7a */
579 {sizeof(T_BAT_res_que_plus_crlp)}, /* BAT_RES_QUE_PLUS_CRLP = 0x7b */
580 {sizeof(T_BAT_res_set_plus_crsm)}, /* BAT_RES_SET_PLUS_CRSM = 0x7c */
581 {sizeof(T_BAT_res_tst_plus_csas)}, /* BAT_RES_TST_PLUS_CSAS = 0x7d */
582 {sizeof(T_BAT_res_que_plus_csca)}, /* BAT_RES_QUE_PLUS_CSCA = 0x7e */
583 {sizeof(T_BAT_res_que_plus_cscb)}, /* BAT_RES_QUE_PLUS_CSCB = 0x7f */
584 {sizeof(T_BAT_res_que_plus_cscs)}, /* BAT_RES_QUE_PLUS_CSCS = 0x80 */
585 {sizeof(T_BAT_res_set_plus_csim)}, /* BAT_RES_SET_PLUS_CSIM = 0x81 */
586 {sizeof(T_BAT_res_que_plus_csms)}, /* BAT_RES_QUE_PLUS_CSMS = 0x82 */
587 {sizeof(T_BAT_res_que_plus_csns)}, /* BAT_RES_QUE_PLUS_CSNS = 0x83 */
588 {sizeof(T_BAT_res_que_percent_csq)}, /* BAT_RES_QUE_PERCENT_CSQ = 0x84 */
589 {sizeof(T_BAT_res_set_plus_csq)}, /* BAT_RES_SET_PLUS_CSQ = 0x85 */
590 {sizeof(T_BAT_res_que_plus_csta)}, /* BAT_RES_QUE_PLUS_CSTA = 0x86 */
591 {sizeof(T_BAT_res_que_plus_csvm)}, /* BAT_RES_QUE_PLUS_CSVM = 0x87 */
592 {sizeof(T_BAT_res_que_percent_ctty)}, /* BAT_RES_QUE_PERCENT_CTTY = 0x88 */
593 {sizeof(T_BAT_res_que_plus_ctzu)}, /* BAT_RES_QUE_PLUS_CTZU = 0x89 */
594 {sizeof(T_BAT_res_que_percent_cust)}, /* BAT_RES_QUE_PERCENT_CUST = 0x8a */
595 {sizeof(T_BAT_res_que_percent_data)}, /* BAT_RES_QUE_PERCENT_DATA = 0x8b */
596 {sizeof(T_BAT_res_set_percent_dinf)}, /* BAT_RES_SET_PERCENT_DINF = 0x8c */
597 {sizeof(T_BAT_res_que_plus_ds)}, /* BAT_RES_QUE_PLUS_DS = 0x8d */
598 {sizeof(T_BAT_res_que_plus_fap)}, /* BAT_RES_QUE_PLUS_FAP = 0x8e */
599 {sizeof(T_BAT_res_que_plus_fbo)}, /* BAT_RES_QUE_PLUS_FBO = 0x8f */
600 {sizeof(T_BAT_res_que_plus_fbs)}, /* BAT_RES_QUE_PLUS_FBS = 0x90 */
601 {sizeof(T_BAT_res_que_plus_fbu)}, /* BAT_RES_QUE_PLUS_FBU = 0x91 */
602 {sizeof(T_BAT_res_que_plus_fcc)}, /* BAT_RES_QUE_PLUS_FCC = 0x92 */
603 {sizeof(T_BAT_res_que_plus_fclass)}, /* BAT_RES_QUE_PLUS_FCLASS = 0x93 */
604 {sizeof(T_BAT_res_que_plus_fcq)}, /* BAT_RES_QUE_PLUS_FCQ = 0x94 */
605 {sizeof(T_BAT_res_que_plus_fcr)}, /* BAT_RES_QUE_PLUS_FCR = 0x95 */
606 {sizeof(T_BAT_res_que_plus_fcs)}, /* BAT_RES_QUE_PLUS_FCS = 0x96 */
607 {sizeof(T_BAT_res_que_plus_fct)}, /* BAT_RES_QUE_PLUS_FCT = 0x97 */
608 {sizeof(T_BAT_res_que_plus_fea)}, /* BAT_RES_QUE_PLUS_FEA = 0x98 */
609 {sizeof(T_BAT_res_que_plus_ffc)}, /* BAT_RES_QUE_PLUS_FFC = 0x99 */
610 {sizeof(T_BAT_res_que_plus_fhs)}, /* BAT_RES_QUE_PLUS_FHS = 0x9a */
611 {sizeof(T_BAT_res_que_plus_fie)}, /* BAT_RES_QUE_PLUS_FIE = 0x9b */
612 {sizeof(T_BAT_res_que_plus_fis)}, /* BAT_RES_QUE_PLUS_FIS = 0x9c */
613 {sizeof(T_BAT_res_que_plus_fit)}, /* BAT_RES_QUE_PLUS_FIT = 0x9d */
614 {sizeof(T_BAT_res_que_plus_fli)}, /* BAT_RES_QUE_PLUS_FLI = 0x9e */
615 {sizeof(T_BAT_res_que_plus_flo)}, /* BAT_RES_QUE_PLUS_FLO = 0x9f */
616 {sizeof(T_BAT_res_que_plus_flp)}, /* BAT_RES_QUE_PLUS_FLP = 0xa0 */
617 {sizeof(T_BAT_res_que_plus_fms)}, /* BAT_RES_QUE_PLUS_FMS = 0xa1 */
618 {sizeof(T_BAT_res_que_plus_fns)}, /* BAT_RES_QUE_PLUS_FNS = 0xa2 */
619 {sizeof(T_BAT_res_que_plus_fpa)}, /* BAT_RES_QUE_PLUS_FPA = 0xa3 */
620 {sizeof(T_BAT_res_que_plus_fpi)}, /* BAT_RES_QUE_PLUS_FPI = 0xa4 */
621 {sizeof(T_BAT_res_que_plus_fps)}, /* BAT_RES_QUE_PLUS_FPS = 0xa5 */
622 {sizeof(T_BAT_res_que_plus_fpw)}, /* BAT_RES_QUE_PLUS_FPW = 0xa6 */
623 {sizeof(T_BAT_res_que_plus_frq)}, /* BAT_RES_QUE_PLUS_FRQ = 0xa7 */
624 {sizeof(T_BAT_res_que_plus_fsa)}, /* BAT_RES_QUE_PLUS_FSA = 0xa8 */
625 {sizeof(T_BAT_res_que_plus_fsp)}, /* BAT_RES_QUE_PLUS_FSP = 0xa9 */
626 {sizeof(T_BAT_res_que_plus_icf)}, /* BAT_RES_QUE_PLUS_ICF = 0xaa */
627 {sizeof(T_BAT_res_que_plus_ifc)}, /* BAT_RES_QUE_PLUS_IFC = 0xab */
628 {sizeof(T_BAT_res_que_percent_imei)}, /* BAT_RES_QUE_PERCENT_IMEI = 0xac */
629 {sizeof(T_BAT_res_que_plus_ipr)}, /* BAT_RES_QUE_PLUS_IPR = 0xad */
630 {sizeof(T_BAT_res_que_percent_pbcf)}, /* BAT_RES_QUE_PERCENT_PBCF = 0xae */
631 {sizeof(T_BAT_res_que_percent_ppp)}, /* BAT_RES_QUE_PERCENT_PPP = 0xaf */
632 {sizeof(T_BAT_res_que_percent_pvrf)}, /* BAT_RES_QUE_PERCENT_PVRF = 0xb0 */
633 {sizeof(T_BAT_res_que_percent_rdl)}, /* BAT_RES_QUE_PERCENT_RDL = 0xb1 */
634 {sizeof(T_BAT_res_que_percent_rdlb)}, /* BAT_RES_QUE_PERCENT_RDLB = 0xb2 */
635 {sizeof(T_BAT_res_que_percent_satc)}, /* BAT_RES_QUE_PERCENT_SATC = 0xb3 */
636 {sizeof(T_BAT_res_que_percent_satcc)}, /* BAT_RES_QUE_PERCENT_SATCC = 0xb4 */
637 {sizeof(T_BAT_res_set_percent_sate)}, /* BAT_RES_SET_PERCENT_SATE = 0xb5 */
638 {sizeof(T_BAT_res_que_plus_ws46)}, /* BAT_RES_QUE_PLUS_WS46 = 0xb6 */
639 {sizeof(T_BAT_res_que_plus_cdip)}, /* BAT_RES_QUE_PLUS_CDIP = 0xb7 */
640 {sizeof(T_BAT_res_set_percent_cmgr)}, /* BAT_RES_SET_PERCENT_CMGR = 0xb8 */
641 {sizeof(T_BAT_res_set_percent_cmgl)}, /* BAT_RES_SET_PERCENT_CMGL = 0xb9 */
642 {sizeof(T_BAT_res_set_plus_cmss)}, /* BAT_RES_SET_PLUS_CMSS = 0xba */
643 {sizeof(T_BAT_res_set_plus_cgmi)}, /* BAT_RES_SET_PLUS_CGMI = 0xbb */
644 {sizeof(T_BAT_res_set_plus_cgmm)}, /* BAT_RES_SET_PLUS_CGMM = 0xbc */
645 {sizeof(T_BAT_res_set_plus_cgmr)}, /* BAT_RES_SET_PLUS_CGMR = 0xbd */
646 {sizeof(T_BAT_res_set_plus_cgsn)} /* BAT_RES_SET_PLUS_CGSN = 0xbe */
647 };
648
649 static T_map_response_2_size unsolicited_2_size[] =
650 {
651 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_AT_BUSY = 0x1000 */
652 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_AT_NO_ANSWER = 0x1001 */
653 {sizeof(T_BAT_res_uns_plus_cbm)}, /* BAT_RES_UNS_PLUS_CBM = 0x1002 */
654 {sizeof(T_BAT_res_uns_plus_cbmi)}, /* BAT_RES_UNS_PLUS_CBMI = 0x1003 */
655 {sizeof(T_BAT_res_uns_percent_ccbs)}, /* BAT_RES_UNS_PERCENT_CCBS = 0x1004 */
656 {sizeof(T_BAT_res_uns_plus_cccm)}, /* BAT_RES_UNS_PLUS_CCCM = 0x1005 */
657 {sizeof(T_BAT_res_uns_percent_cccn)}, /* BAT_RES_UNS_PERCENT_CCCN = 0x1006 */
658 {sizeof(T_BAT_res_uns_plus_ccwa)}, /* BAT_RES_UNS_PLUS_CCWA = 0x1007 */
659 {sizeof(T_BAT_res_uns_plus_ccwa_w)}, /* BAT_RES_UNS_PLUS_CCWA_W = 0x1008 */
660 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_PLUS_CCWE = 0x1009 */
661 {sizeof(T_BAT_res_uns_plus_cdip)}, /* BAT_RES_UNS_PLUS_CDIP = 0x100a */
662 {sizeof(T_BAT_res_uns_plus_cds)}, /* BAT_RES_UNS_PLUS_CDS = 0x100b */
663 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_PLUS_CCWV = 0x100c */
664 {sizeof(T_BAT_res_uns_percent_cgev)}, /* BAT_RES_UNS_PERCENT_CGEV = 0x100d */
665 {sizeof(T_BAT_res_uns_plus_cgev)}, /* BAT_RES_UNS_PLUS_CGEV = 0x100e */
666 {sizeof(T_BAT_res_uns_percent_cgreg)}, /* BAT_RES_UNS_PERCENT_CGREG = 0x100f */
667 {sizeof(T_BAT_res_uns_plus_cgreg)}, /* BAT_RES_UNS_PLUS_CGREG = 0x1010 */
668 {sizeof(T_BAT_res_uns_plus_clae)}, /* BAT_RES_UNS_PLUS_CLAE = 0x1011 */
669 {sizeof(T_BAT_res_uns_plus_clav)}, /* BAT_RES_UNS_PLUS_CLAV = 0x1012 */
670 {sizeof(T_BAT_res_uns_plus_clip)}, /* BAT_RES_UNS_PLUS_CLIP = 0x1013 */
671 {sizeof(T_BAT_res_uns_plus_clip_w)}, /* BAT_RES_UNS_PLUS_CLIP_W = 0x1014 */
672 {sizeof(T_BAT_res_uns_plus_cmt)}, /* BAT_RES_UNS_PLUS_CMT = 0x1015 */
673 {sizeof(T_BAT_res_uns_plus_cmti)}, /* BAT_RES_UNS_PLUS_CMTI = 0x1016 */
674 {sizeof(T_BAT_res_uns_plus_cmt_w)}, /* BAT_RES_UNS_PLUS_CMT_W = 0x1017 */
675 {sizeof(T_BAT_res_uns_percent_cnap)}, /* BAT_RES_UNS_PERCENT_CNAP = 0x1018 */
676 {sizeof(T_BAT_res_uns_plus_colp)}, /* BAT_RES_UNS_PLUS_COLP = 0x1019 */
677 {sizeof(T_BAT_res_uns_plus_colp_w)}, /* BAT_RES_UNS_PLUS_COLP_W = 0x101a */
678 {sizeof(T_BAT_res_uns_percent_cpi)}, /* BAT_RES_UNS_PERCENT_CPI = 0x101b */
679 {sizeof(T_BAT_res_uns_percent_cpi_w)}, /* BAT_RES_UNS_PERCENT_CPI_W = 0x101c */
680 {sizeof(T_BAT_res_uns_percent_cpri)}, /* BAT_RES_UNS_PERCENT_CPRI = 0x101d */
681 {sizeof(T_BAT_res_uns_percent_cproam)}, /* BAT_RES_UNS_PERCENT_CPROAM = 0x101e */
682 {sizeof(T_BAT_res_uns_percent_cpvwi)}, /* BAT_RES_UNS_PERCENT_CPVWI = 0x101f */
683 {sizeof(T_BAT_res_uns_plus_cr)}, /* BAT_RES_UNS_PLUS_CR = 0x1020 */
684 {sizeof(T_BAT_res_uns_percent_creg)}, /* BAT_RES_UNS_PERCENT_CREG = 0x1021 */
685 {sizeof(T_BAT_res_uns_plus_cring)}, /* BAT_RES_UNS_PLUS_CRING = 0x1022 */
686 {sizeof(T_BAT_res_uns_percent_csq)}, /* BAT_RES_UNS_PERCENT_CSQ = 0x1023 */
687 {sizeof(T_BAT_res_uns_plus_cssi)}, /* BAT_RES_UNS_PLUS_CSSI = 0x1024 */
688 {sizeof(T_BAT_res_uns_percent_cssn)}, /* BAT_RES_UNS_PERCENT_CSSN = 0x1025 */
689 {sizeof(T_BAT_res_uns_plus_cssu)}, /* BAT_RES_UNS_PLUS_CSSU = 0x1026 */
690 {sizeof(T_BAT_res_uns_percent_cstat)}, /* BAT_RES_UNS_PERCENT_CSTAT = 0x1027 */
691 {sizeof(T_BAT_res_uns_percent_ctyi)}, /* BAT_RES_UNS_PERCENT_CTYI = 0x1028 */
692 {sizeof(T_BAT_res_uns_plus_ctzr)}, /* BAT_RES_UNS_PLUS_CTZR = 0x1029 */
693 {sizeof(T_BAT_res_uns_percent_ctzv)}, /* BAT_RES_UNS_PERCENT_CTZV = 0x102a */
694 {sizeof(T_BAT_res_uns_plus_ctzv)}, /* BAT_RES_UNS_PLUS_CTZV = 0x102b */
695 {sizeof(T_BAT_res_uns_percent_ctzv_w)}, /* BAT_RES_UNS_PERCENT_CTZV_W = 0x102c */
696 {sizeof(T_BAT_res_uns_plus_cusd)}, /* BAT_RES_UNS_PLUS_CUSD = 0x102d */
697 {sizeof(T_BAT_res_uns_plus_cusd_w)}, /* BAT_RES_UNS_PLUS_CUSD_W = 0x102e */
698 {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_AT_NO_CARRIER = 0x102f */
699 {sizeof(T_BAT_res_uns_plus_fhs)}, /* BAT_RES_UNS_PLUS_FHS = 0x1030 */
700 {sizeof(T_BAT_res_uns_plus_ilrr)}, /* BAT_RES_UNS_PLUS_ILRR = 0x1031 */
701 {sizeof(T_BAT_res_uns_percent_rdl)}, /* BAT_RES_UNS_PERCENT_RDL = 0x1032 */
702 {sizeof(T_BAT_res_uns_percent_rdlb)}, /* BAT_RES_UNS_PERCENT_RDLB = 0x1033 */
703 {sizeof(T_BAT_res_uns_percent_sata)}, /* BAT_RES_UNS_PERCENT_SATA = 0x1034 */
704 {sizeof(T_BAT_res_uns_percent_sati)}, /* BAT_RES_UNS_PERCENT_SATI = 0x1035 */
705 {sizeof(T_BAT_res_uns_percent_satn)}, /* BAT_RES_UNS_PERCENT_SATN = 0x1036 */
706 {sizeof(T_BAT_res_uns_percent_simef)}, /* BAT_RES_UNS_PERCENT_SIMEF = 0x1037 */
707 {sizeof(T_BAT_res_uns_percent_simins)}, /* BAT_RES_UNS_PERCENT_SIMINS = 0x1038 */
708 {sizeof(T_BAT_res_uns_percent_simrem)}, /* BAT_RES_UNS_PERCENT_SIMREM = 0x1039 */
709 {sizeof(T_BAT_res_uns_percent_sncnt)} /* BAT_RES_UNS_PERCENT_SNCNT = 0x103a */
710 };
711
712 typedef struct
713 {
714 T_BAT_ctrl_params bat;
715 T_ACI_AT_CMD aci;
716 } T_map_batcmd_to_acicmd;
717 /*
718 * only asynchronous commands are listed (interaction with PS)
719 */
720 #define CMD_MAP_NOT_PRESENT -1
721 T_map_batcmd_to_acicmd map_batcmd_to_acicmd [] =
722 {
723 {BAT_CMD_SET_PLUS_CFUN, AT_CMD_CFUN},
724 {BAT_CMD_SET_PERCENT_BAND, AT_CMD_BAND},
725 {BAT_CMD_SET_PLUS_CPIN, AT_CMD_CPIN},
726 {BAT_CMD_QUE_PLUS_CPIN, AT_CMD_CPIN},
727 {BAT_CMD_QUE_PERCENT_CPINF, AT_CMD_CPIN},
728 {BAT_CMD_SET_PLUS_CPBW, AT_CMD_CPBW},
729 {BAT_CMD_TST_PERCENT_COPS, AT_CMD_P_COPS},
730 {BAT_CMD_TST_PLUS_COPS, AT_CMD_COPS},
731 {BAT_CMD_SET_PERCENT_COPS, AT_CMD_P_COPS},
732 {BAT_CMD_SET_PLUS_COPS, AT_CMD_COPS},
733 {BAT_CMD_AT_D, AT_CMD_D},
734 {BAT_CMD_AT_A, AT_CMD_A},
735 {BAT_CMD_AT_Z, AT_CMD_Z},
736 {BAT_CMD_SET_PERCENT_CHLD, AT_CMD_CHLD},
737 {BAT_CMD_SET_PLUS_CTFR, AT_CMD_CTFR},
738 {BAT_CMD_SET_PERCENT_VTS, AT_CMD_VTS},
739 {BAT_CMD_SET_PLUS_VTS, AT_CMD_VTS},
740 {BAT_CMD_QUE_PLUS_CLIR, AT_CMD_CLIR},
741 {BAT_CMD_SET_PLUS_CLIR, AT_CMD_CLIR},
742 {BAT_CMD_QUE_PLUS_CLIP, AT_CMD_CLIP},
743 {BAT_CMD_QUE_PLUS_COLP, AT_CMD_COLP},
744 {BAT_CMD_SET_PLUS_CCFC, AT_CMD_CCFC},
745 {BAT_CMD_SET_PLUS_CLCK, AT_CMD_CLCK},
746 {BAT_CMD_SET_PLUS_CCWA, AT_CMD_CCWA},
747 {BAT_CMD_SET_PLUS_CPWD, AT_CMD_CPWD},
748 {BAT_CMD_SET_PLUS_CUSD, AT_CMD_CUSD},
749 {BAT_CMD_SET_PLUS_CMGD, AT_CMD_CMGD},
750 {BAT_CMD_SET_PLUS_CMGW, AT_CMD_CMGW},
751 {BAT_CMD_SET_PLUS_CMGS, AT_CMD_CMGS},
752 {BAT_CMD_SET_PLUS_CMSS, AT_CMD_CMSS},
753 {BAT_CMD_SET_PLUS_CSCA, AT_CMD_CSCA},
754 {BAT_CMD_QUE_PLUS_CSCA, AT_CMD_CSCA},
755 {BAT_CMD_SET_PLUS_CGATT, AT_CMD_CGATT},
756 {BAT_CMD_QUE_PLUS_CGATT, AT_CMD_CGATT},
757 {BAT_CMD_QUE_PERCENT_CGCLASS, AT_CMD_P_CGCLASS},
758 {BAT_CMD_QUE_PLUS_CGCLASS, AT_CMD_CGCLASS},
759 {BAT_CMD_SET_PERCENT_CGCLASS, AT_CMD_P_CGCLASS},
760 {BAT_CMD_SET_PLUS_CGCLASS, AT_CMD_CGCLASS},
761 {BAT_CMD_SET_PLUS_CGACT, AT_CMD_CGACT},
762 {BAT_CMD_QUE_PLUS_CGACT, AT_CMD_CGACT},
763 {BAT_CMD_SET_PLUS_CGDATA, AT_CMD_CGDATA},
764 {BAT_CMD_SET_PLUS_CGANS, AT_CMD_CGANS},
765 {BAT_CMD_SET_PLUS_CGSMS, AT_CMD_CGSMS},
766 {BAT_CMD_QUE_PLUS_CGSMS, AT_CMD_CGSMS},
767 {CMD_MAP_NOT_PRESENT, AT_CMD_NONE}
768 };
769
770
771
772 /*==== LOCAL FUNCTONS =============================================*/
773 LOCAL void aci_bat_init_globs(void);
774 LOCAL void aci_bat_queue_put (T_aci_bat_queue *que, T_BAT_cmd_send *cmd, U8 client_id, U16 dataSize);
775 LOCAL BOOL aci_bat_queue_get (T_aci_bat_queue *que, T_BAT_cmd_send *cmd, U8 *client_id);
776 LOCAL T_aci_bat_queue *aci_bat_queue_create (void);
777 LOCAL void aci_bat_queue_remove (T_aci_bat_queue *que);
778
779
780 LOCAL void *aci_bat_give_l2p_rx_buf_cb (U8 batId);
781 LOCAL void *aci_bat_give_l2p_tx_buf_cb (U8 batId, U16 dataSize, void **seg_hdr_ptr, U16 *totalSize, U16 *segSize);
782 LOCAL void aci_bat_free_data_buffer (T_ACI_DTI_DATA_BUF *data_buffer);
783 LOCAL T_desc2 *aci_bat_get_new_buffer (BOOL large_type, U16 *max_buffer_size);
784 LOCAL BOOL aci_bat_buffer_dti_data (T_ACI_DTI_PRC_PSI *src_infos_psi, T_desc2 *data);
785 LOCAL void aci_bat_send_dti_data (T_ACI_DTI_PRC_PSI *src_infos_psi, T_desc2 *data);
786 LOCAL void *aci_bat_l2p_next_seg_cb (U8 batId , void *last_seg_hdr, void **seg_hdr_ptr, U16 *segSize);
787 LOCAL int aci_bat_l2p_send_frame_cb (U8 batId);
788 LOCAL void aci_bat_l2p_msg_rxd_cb (U8 batId, U8 muxId, U32 dataTag, void *dataPtr, U16 dataSize);
789
790 LOCAL int aci_bat_get_size (T_BAT_ctrl_response ctrl_response);
791 LOCAL void aci_bat_init_max_client_maintenance (T_ACI_DTI_PRC_PSI *src_infos_psi, U8 num_clients);
792 LOCAL void aci_bat_clean_client_maintenance (T_ACI_DTI_PRC_PSI *src_infos_psi, U8 client);
793 LOCAL BOOL aci_bat_bootstrap_l2p (T_ACI_DTI_PRC_PSI *src_infos_psi, T_DTI2_DATA_IND *dti_data_ind);
794 LOCAL BOOL aci_bat_abort (T_ACI_DTI_PRC_PSI *src_infos_psi, U8 client_id);
795 LOCAL T_ACI_AT_CMD map_cmd_id (T_BAT_ctrl_params cmd);
796
797 /*------------------------------------------------------------------------------
798 * prepare unique identifiers for L2P_Configure, BATLib starts with 0, we start with 0x80
799 */
800 LOCAL void aci_bat_init_globs(void)
801 {
802 int i;
803 for (i=0; i<CMD_SRC_MAX; i++)
804 {
805 aci_bat_globs[i].l2p_configured = FALSE;
806 aci_bat_globs[i].l2p_id = 0x80+i;
807 aci_bat_globs[i].psi_src = NULL;
808 memset(aci_bat_globs[i].l2p_mem, 0x00, L2P_CONTROL_BLOCK_HDR_SIZE);
809 }
810 }
811
812
813 /*------------------------------------------------------------------------------
814 * received BAT commands cannot be processed, make it pending
815 */
816 LOCAL void aci_bat_queue_put (T_aci_bat_queue *que, T_BAT_cmd_send *cmd, U8 client_id, U16 dataSize)
817 {
818 T_aci_bat_queue_entry *qe;
819
820 ACI_MALLOC(qe, sizeof (T_aci_bat_queue_entry));
821
822 qe->next = 0;
823 qe->cmd.ctrl_params = cmd->ctrl_params;
824 qe->client_id = client_id;
825
826 /* due to union params, we can use any pointer. will be freed in aci_bat_run_cmd() */
827 ACI_MALLOC(qe->cmd.params.ptr_andc, dataSize);
828 memcpy (qe->cmd.params.ptr_andc, cmd->params.ptr_andc, dataSize);
829
830 if (que->first)
831 {
832 que->last->next = qe;
833 }
834 else
835 {
836 que->first = qe;
837 }
838 que->last = qe;
839 }
840
841 /*------------------------------------------------------------------------------
842 * get pending BAT command of a client queue
843 */
844 LOCAL BOOL aci_bat_queue_get (T_aci_bat_queue *que, T_BAT_cmd_send *cmd, U8 *client_id)
845 {
846 T_aci_bat_queue_entry *qe;
847
848 if (!que)
849 {
850 return (FALSE);
851 }
852
853 qe = que->first;
854 if (!qe)
855 {
856 return (FALSE);
857 }
858 cmd->ctrl_params = qe->cmd.ctrl_params;
859 cmd->params = qe->cmd.params;
860 *client_id = qe->client_id;
861
862 que->first = qe->next;
863
864 if (que->first EQ NULL)
865 {
866 que->last = NULL;
867 }
868
869 ACI_MFREE(qe);
870
871 return (TRUE);
872 }
873
874 /*------------------------------------------------------------------------------
875 * aci_bat_queue_create
876 */
877 LOCAL T_aci_bat_queue *aci_bat_queue_create (void)
878 {
879 T_aci_bat_queue *que;
880
881 ACI_MALLOC(que, sizeof (T_aci_bat_queue));
882
883 if (que EQ NULL)
884 {
885 return 0;
886 }
887 que->first = 0;
888 return que;
889 }
890
891 /*------------------------------------------------------------------------------
892 * aci_bat_queue_remove
893 */
894 LOCAL void aci_bat_queue_remove (T_aci_bat_queue *que)
895 {
896 T_BAT_cmd_send dummy1 = {0};
897 U8 dummy2 = 0;
898
899 while (aci_bat_queue_get (que, &dummy1, &dummy2))
900 {
901 ;
902 }
903 if (que)
904 {
905 ACI_MFREE (que);
906 }
907 }
908
909
910 /*------------------------------------------------------------------------------
911 * get the response size needed for L2P to know how many bytes to send
912 */
913 LOCAL int aci_bat_get_size (T_BAT_ctrl_response ctrl_response)
914 {
915 if (BITFIELD_CHECK(ctrl_response, BAT_BIT_12)) /* 0x1000 */
916 {
917 return (unsolicited_2_size[ctrl_response - BAT_BIT_12].size);
918 }
919 else
920 {
921 return (response_2_size[ctrl_response].size);
922 }
923 }
924
925 /*------------------------------------------------------------------------------
926 * init max BAT clients maintance for a PSI source
927 */
928 LOCAL void aci_bat_init_max_client_maintenance(T_ACI_DTI_PRC_PSI *src_infos_psi, U8 num_clients)
929 {
930 int i;
931 ACI_MALLOC(src_infos_psi->bat_client, num_clients * sizeof(T_bat_aci_client_maintain));
932 src_infos_psi->queue = aci_bat_queue_create();
933 src_infos_psi->max_clients = num_clients;
934 for (i=0; i< num_clients; i++)
935 {
936 src_infos_psi->bat_client[i].opened = FALSE;
937 src_infos_psi->bat_client[i].curCmd = (T_BAT_ctrl_params)-1;
938 src_infos_psi->bat_client[i].send_data = (T_desc2 *)NULL;
939 }
940 }
941
942 /*------------------------------------------------------------------------------
943 * clean up the whole clients maintenance for a PSI source
944 */
945 LOCAL void aci_bat_clean_client_maintenance(T_ACI_DTI_PRC_PSI *src_infos_psi, U8 client)
946 {
947 BOOL all_closed = TRUE;
948 int i = 0;
949
950 src_infos_psi->bat_client[client].curCmd = (T_BAT_ctrl_params)-1;
951 src_infos_psi->bat_client[client].opened = FALSE;
952
953 for (i=0; i< src_infos_psi->max_clients; i++)
954 {
955 if (src_infos_psi->bat_client[i].opened == TRUE)
956 {
957 all_closed = FALSE;
958 break;
959 }
960 }
961 if (all_closed)
962 {
963 aci_bat_queue_remove(src_infos_psi->queue);
964 L2P_Remove(aci_bat_globs[src_infos_psi->srcId].l2p_id);
965 ACI_MFREE(src_infos_psi->bat_client);
966 aci_bat_globs[src_infos_psi->srcId].l2p_configured = FALSE;
967 }
968
969 all_closed = TRUE;
970 for (i=0; i< CMD_SRC_MAX; i++)
971 {
972 if (aci_bat_globs[i].l2p_configured NEQ FALSE)
973 {
974 all_closed = FALSE;
975 break;
976 }
977 }
978 if (all_closed)
979 {
980 aci_bat_first_time = TRUE;
981 }
982 }
983
984
985 /*------------------------------------------------------------------------------
986 * pick out from the very first received DTI_DATA_IND the L2P protocol id.
987 * our client (BAT lib at Application or ATI) defined the L2P protocol
988 */
989
990 LOCAL BOOL aci_bat_bootstrap_l2p (T_ACI_DTI_PRC_PSI *src_infos_psi, T_DTI2_DATA_IND *dti_data_ind)
991 {
992 U16 tot_len;
993 U8 protocol_id = 0;
994 T_L2P_STATUS l2p_status = L2P_STAT_UNKNOWN_ERROR;
995 T_L2P_FRAME_CONTROL_BYTES *l2p_header = (T_L2P_FRAME_CONTROL_BYTES *)NULL;
996 T_desc2 *p_desc;
997
998 tot_len = dti_data_ind->desc_list2.list_len;
999 p_desc = (T_desc2 *)dti_data_ind->desc_list2.first;
1000
1001 if (p_desc NEQ NULL)
1002 {
1003 if( p_desc->len > tot_len)
1004 {
1005 TRACE_EVENT("aci_bat_bootstrap_l2p(): invalid dti_data_ind");
1006 return (FALSE);
1007 }
1008
1009 l2p_header = (T_L2P_FRAME_CONTROL_BYTES *)p_desc->buffer;
1010 protocol_id = l2p_header->protocol_id;
1011
1012
1013 TRACE_EVENT_P3("aci_bat_bootstrap_l2p(): protocol_id = %d, src_id = %d, l2p_id = 0x%02X",
1014 protocol_id, src_infos_psi->srcId, aci_bat_globs[src_infos_psi->srcId].l2p_id);
1015
1016
1017 l2p_status = L2P_Configure(aci_bat_globs[src_infos_psi->srcId].l2p_id, /* what L2P maintains as bat_id */
1018 (void *)(aci_bat_globs[src_infos_psi->srcId].l2p_mem), /* memory for the internal L2P maintenance */
1019 (T_L2P_SUPPORTED_PROTOCOLS)protocol_id,
1020 BAT_MTU_SIZE, /* replace replace GDD_DIO_MTU_SIZE */
1021 aci_bat_give_l2p_tx_buf_cb, /* L2P needs callbacks */
1022 aci_bat_give_l2p_rx_buf_cb,
1023 aci_bat_l2p_next_seg_cb,
1024 aci_bat_l2p_send_frame_cb,
1025 aci_bat_l2p_msg_rxd_cb);
1026
1027 switch (l2p_status)
1028 {
1029 case (L2P_STAT_SUCCESS):
1030 return (TRUE);
1031 default: /* any error */
1032 TRACE_EVENT_P1("aci_bat_bootstrap_l2p(): L2P error = %d", l2p_status);
1033 return (FALSE);
1034 }
1035 }
1036 return (FALSE);
1037 }
1038
1039 /*------------------------------------------------------------------------------
1040 * L2P wants always to have the BAT_MTU_SIZE memory for the received data
1041 * it rebuilds from L2P fragments and T_desc2 segements the complete BAT command
1042 * We will free the memory in aci_bat_l2p_msg_rxd_cb()
1043 * From the batId we derive the src_id by substract 0x80, see aci_bat_init_globs()
1044 */
1045 LOCAL void *aci_bat_give_l2p_rx_buf_cb (U8 batId)
1046 {
1047 U8 src_id = batId-0x80;
1048 TRACE_FUNCTION("aci_bat_give_l2p_rx_buf_cb()");
1049
1050 if (batId EQ aci_bat_globs[src_id].l2p_id)
1051 {
1052 T_ACI_DTI_PRC_PSI *src_infos_psi = aci_bat_globs[src_id].psi_src;
1053
1054 ACI_MALLOC(src_infos_psi->rcv_data, BAT_MTU_SIZE);
1055
1056 return (src_infos_psi->rcv_data);
1057 }
1058 else
1059 {
1060 TRACE_ERROR("aci_bat_give_l2p_rx_buf_cb(): L2P used wrong identifier");
1061 return (NULL);
1062 }
1063 }
1064
1065 /*------------------------------------------------------------------------------
1066 * L2P wants to have some memory to transmit data. It is called only for the first segment.
1067 * dataSize is what L2P requests from us
1068 * with totalSize we tell L2P what we got from the memory pool
1069 * segSize ist the size of the first segment
1070 * seg_hdr_ptr is the pointer to T_desc2, but casted to void
1071 * returned is T_desc2.buffer
1072 * PSI will free the memory
1073 * From the batId we derive the src_id by substract 0x80, see aci_bat_init_globs()
1074 */
1075 LOCAL void *aci_bat_give_l2p_tx_buf_cb (U8 batId, U16 dataSize, void **seg_hdr_ptr, U16 *totalSize, U16 *segSize)
1076 {
1077 U8 src_id = batId-0x80;
1078 TRACE_FUNCTION("aci_bat_give_l2p_tx_buf_cb()");
1079
1080 if (batId EQ aci_bat_globs[src_id].l2p_id)
1081 {
1082 T_desc2 *send_data;
1083 U16 send_len = (U16)(sizeof(T_desc2) - 1 + dataSize);
1084
1085 T_ACI_DTI_PRC_PSI *src_infos_psi = aci_bat_globs[src_id].psi_src;
1086
1087 ACI_MALLOC(send_data, send_len);
1088
1089 send_data->next = (U32)NULL;
1090 send_data->len = dataSize;
1091 send_data->size = dataSize;
1092 send_data->offset = 0;
1093
1094 *seg_hdr_ptr = (void *)send_data;
1095 *totalSize = send_len;
1096 *segSize = send_len;
1097 TRACE_EVENT_P2("aci_bat_give_l2p_tx_buf_cb(): L2P requested %i bytes and got %i bytes", dataSize, send_len);
1098
1099 /* for control and broadcast channel we must not maintain the first T_desc2
1100 * in the client array, because it were just too large, BAT_CTRL_CHANNEL = 0xFE)
1101 */
1102 if (src_infos_psi->active_client >= BAT_CTRL_CHANNEL)
1103 {
1104 src_infos_psi->send_data = send_data;
1105 }
1106 else
1107 {
1108 src_infos_psi->bat_client[src_infos_psi->active_client].send_data = send_data;
1109 }
1110
1111 return ((void *)send_data->buffer);
1112 }
1113 else
1114 {
1115 TRACE_ERROR("aci_bat_give_l2p_tx_buf_cb(): L2P used wrong identifier");
1116 return (NULL);
1117 }
1118 }
1119
1120 /*------------------------------------------------------------------------------
1121 *
1122 */
1123 LOCAL void *aci_bat_l2p_next_seg_cb (U8 batId, void *last_seg_hdr, void **seg_hdr_ptr, U16 *segSize)
1124 {
1125 T_desc2 *segment;
1126
1127 TRACE_FUNCTION("aci_bat_l2p_next_seg_cb()");
1128
1129 segment = (T_desc2 *)last_seg_hdr;
1130 segment = (T_desc2 *)segment->next;
1131 *seg_hdr_ptr = segment;
1132 *segSize = segment->size;
1133
1134 return ((void *)segment->buffer);
1135 }
1136
1137 /*------------------------------------------------------------------------------
1138 *
1139 */
1140 LOCAL T_desc2 *aci_bat_get_new_buffer (BOOL large_type, U16 *max_buffer_size)
1141 {
1142 T_desc2 *new_buffer;
1143
1144 if (large_type EQ TRUE)
1145 {
1146 *max_buffer_size = MAX_LARGE_BUFFER_LEN;
1147 }
1148 else
1149 {
1150 *max_buffer_size = MAX_NORMAL_BUFFER_LEN;
1151 }
1152 ACI_MALLOC (new_buffer, *max_buffer_size);
1153 *max_buffer_size -= (sizeof(T_desc2) - 1);
1154 new_buffer->next = (ULONG)NULL;
1155 new_buffer->len = 0;
1156 new_buffer->size = *max_buffer_size;
1157 new_buffer->offset = 0;
1158
1159 return (new_buffer);
1160 }
1161
1162 LOCAL void aci_bat_free_data_buffer (T_ACI_DTI_DATA_BUF *data_buffer)
1163 {
1164 T_desc2 *p_desc, *p_desc_next;
1165
1166 if (data_buffer->data_list EQ NULL)
1167 {
1168 return;
1169 }
1170
1171 p_desc = data_buffer->data_list;
1172 if (p_desc NEQ NULL)
1173 {
1174 p_desc_next = (T_desc2 *)p_desc->next;
1175 }
1176
1177 while (p_desc NEQ NULL)
1178 {
1179 ACI_MFREE (p_desc);
1180
1181 p_desc = p_desc_next;
1182 if (p_desc NEQ NULL)
1183 {
1184 p_desc_next = (T_desc2 *)p_desc->next;
1185 }
1186 }
1187
1188 data_buffer->data_list = NULL;
1189 data_buffer->max_buffer_size = 0;
1190 data_buffer->create_time = 0;
1191 }
1192
1193
1194 /*------------------------------------------------------------------------------
1195 *
1196 */
1197 LOCAL BOOL aci_bat_buffer_dti_data (T_ACI_DTI_PRC_PSI *src_infos_psi, T_desc2 *data)
1198 {
1199 T_desc2 *tmp;
1200 T_TIME current_time;
1201
1202 static i = 0;
1203
1204 TRACE_FUNCTION("aci_bat_buffer_dti_data()");
1205
1206 if (src_infos_psi->data_buffer.data_list EQ NULL)
1207 {
1208 src_infos_psi->data_buffer.data_list = data; /* the first buffered resp/ind */
1209 /* store the creation time for the data buffer */
1210 vsi_t_time (VSI_CALLER &src_infos_psi->data_buffer.create_time);
1211 }
1212 else
1213 {
1214 /*
1215 * check whether the buffered resp/ind are already too long buffered
1216 * this avoids eating up all the memory
1217 */
1218 vsi_t_time (VSI_CALLER &current_time);
1219 if ((current_time - src_infos_psi->data_buffer.create_time) > MAX_DATA_BUFFER_LIFE_TIME)
1220 {
1221 TRACE_EVENT_P1 ("[WRN] aci_bat_buffer_dti_data(): life time expired, buffer deleted (%d)",
1222 current_time - src_infos_psi->data_buffer.create_time);
1223 aci_bat_free_data_buffer (&src_infos_psi->data_buffer);
1224 /* send an error to BAT Lib */
1225 return (FALSE);
1226 }
1227
1228 /*
1229 * we still can buffer further resp/ind
1230 */
1231 tmp = src_infos_psi->data_buffer.data_list;
1232 while ((T_desc2*)tmp->next NEQ NULL)
1233 {
1234 tmp = (T_desc2*)tmp->next;
1235 }
1236 tmp->next = (U32)data; /* append the current resp/ind */
1237 i++;
1238 }
1239 return (TRUE);
1240 }
1241
1242
1243 /*------------------------------------------------------------------------------
1244 *
1245 */
1246 LOCAL void aci_bat_send_dti_data (T_ACI_DTI_PRC_PSI *src_infos_psi, T_desc2 *data)
1247 {
1248 U16 data_len = 0;
1249 T_desc2 *next_data;
1250 TRACE_FUNCTION("aci_bat_send_dti_data");
1251
1252 {
1253 PALLOC_DESC2(dti_data_ind, DTI2_DATA_IND);
1254
1255 next_data = data;
1256
1257 while (next_data NEQ NULL)
1258 {
1259 data_len += next_data->len;
1260 next_data = (T_desc2*)next_data->next;
1261 }
1262
1263 dti_data_ind->desc_list2.list_len = data_len;
1264 dti_data_ind->desc_list2.first = (U32)data;
1265 dti_data_ind->parameters.p_id = 0; /*dummy_ubyte; */
1266
1267 dti_data_ind->parameters.st_lines.st_flow = DTI_FLOW_OFF;
1268 dti_data_ind->parameters.st_lines.st_line_sb = DTI_SB_ON;
1269 dti_data_ind->parameters.st_lines.st_line_sa = DTI_SA_ON;
1270 dti_data_ind->parameters.st_lines.st_break_len = DTI_BREAK_OFF;
1271 #ifdef _SIMULATION_
1272 if (src_infos_psi->devId NEQ DIO_DATA_PKT)
1273 {
1274 gdd_aci_write_bat(src_infos_psi->srcId, &(dti_data_ind->desc_list2)); /* special GDD adapter between BATLib and BATModule */
1275 PFREE(dti_data_ind);
1276 }
1277 else
1278 { /* this is for the acibat_test suite, which does not use the ATI as application */
1279 dti_send_data (aci_hDTI,
1280 src_infos_psi->srcId,
1281 (U8)DTI_ENTITY_PSI,
1282 ACI_DTI_DN_CHANNEL,
1283 dti_data_ind);
1284 }
1285 #else
1286 dti_send_data (aci_hDTI,
1287 src_infos_psi->srcId,
1288 (U8)DTI_ENTITY_PSI,
1289 ACI_DTI_DN_CHANNEL,
1290 dti_data_ind);
1291 #endif
1292 }
1293 }
1294
1295
1296 /*------------------------------------------------------------------------------
1297 * L2P has a frame ready for sending.
1298 * We have to send a DTI2_DATA_IND primitive to PSI
1299 * the pointer of the first T_desc2 is maintained in src_infos_psi.
1300 * From the batId we derive the src_id by substract 0x80, see aci_bat_init_globs()
1301 */
1302 LOCAL int aci_bat_l2p_send_frame_cb (U8 batId)
1303 {
1304 U8 src_id = batId-0x80;
1305 T_desc2 *data;
1306 T_ACI_DTI_PRC_PSI *src_infos_psi = aci_bat_globs[src_id].psi_src;
1307
1308 TRACE_FUNCTION("aci_bat_l2p_send_frame_cb()");
1309
1310 if (src_infos_psi->active_client >= BAT_CTRL_CHANNEL)
1311 {
1312 data = src_infos_psi->send_data;
1313 }
1314 else
1315 {
1316 data = src_infos_psi->bat_client[src_infos_psi->active_client].send_data;
1317 }
1318
1319 if ((aci_src_dti_params[src_infos_psi->srcId].isDtiConnected) AND
1320 (aci_src_dti_params[src_infos_psi->srcId].dtxState EQ READY))
1321 {
1322 aci_bat_send_dti_data (src_infos_psi, data);
1323 }
1324 else
1325 {
1326 /* buffer data, will be send in sig_dti_tx_buffer_ready_ind() */
1327 if (aci_bat_buffer_dti_data (src_infos_psi, data) EQ FALSE)
1328 {
1329 return (1); /* any value larger than 0 tells L2P that there is a problem */
1330 }
1331 }
1332
1333 return (0); /* what L2P expects */
1334 }
1335
1336 /*------------------------------------------------------------------------------
1337 * L2P signals that our payload has been completely received (BAT command request or control signal)
1338 * control signal is immediately processed , commands are queued first
1339 * From the batId we derive the src_id by substract 0x80, see aci_bat_init_globs()
1340 */
1341 LOCAL void aci_bat_l2p_msg_rxd_cb (U8 batId , U8 muxId, U32 dataTag, void *dataPtr, U16 dataSize)
1342 {
1343 U8 src_id = batId-0x80;
1344 TRACE_FUNCTION("aci_bat_l2p_msg_rxd_cb()");
1345
1346 if (batId EQ aci_bat_globs[src_id].l2p_id)
1347 {
1348 T_ACI_DTI_PRC_PSI *src_infos_psi = aci_bat_globs[src_id].psi_src;
1349
1350 dataSize = dataSize; /* has no meaning for aci_bat */
1351
1352 if (BITFIELD_CHECK(dataTag, BAT_BIT_13)) /* 0x2000 - 0x3FFF = customer commands */
1353 {
1354 aci_bat_rcv_custom (src_id, muxId, dataTag, dataPtr, dataSize);
1355 /* free the requested L2P RX buffer, see aci_bat_give_l2p_rx_buf_cb */
1356 if (src_infos_psi->rcv_data)
1357 {
1358 ACI_MFREE(src_infos_psi->rcv_data);
1359 }
1360 }
1361 else if (BITFIELD_CHECK(dataTag, BAT_BIT_15)) /* 0x8000 = BAT Lib control cmd*/
1362 {
1363 T_BATC_signal signal;
1364 signal.ctrl_params = (T_BATC_ctrl_params)dataTag; /* this is the important thing */
1365 /* due to union of pointers, we can use any pointer, just to make the compiler happy */
1366 signal.params.ptr_max_clients = (T_BATC_max_clients *)dataPtr;
1367 aci_bat_ctrl_rcv(src_infos_psi, &signal);
1368 /* free the requested L2P RX buffer, see aci_bat_give_l2p_rx_buf_cb */
1369 if (src_infos_psi->rcv_data)
1370 {
1371 ACI_MFREE(src_infos_psi->rcv_data);
1372 }
1373 }
1374 else /* binary AT command */
1375 {
1376 U8 client_id = 0xFF;
1377 T_BAT_cmd_send cmd;
1378 cmd.ctrl_params = dataTag;
1379 cmd.params.ptr_at_a = (T_BAT_no_parameter *)dataPtr; /* we can use any pointer, don't worry */
1380 TRACE_EVENT_P1("command identifier: = 0x%04X", dataTag);
1381 TRACE_BINDUMP(aci_handle, TC_USER4, "BAT COMMAND PARAMETER 2", (U8 *)dataPtr, 4);
1382
1383 /* in case of no memory, ACI goes sleeping until there is enough */
1384 aci_bat_queue_put(src_infos_psi->queue, &cmd, muxId, dataSize);
1385
1386 /* free the requested L2P RX buffer, see aci_bat_give_l2p_rx_buf_cb */
1387 if (src_infos_psi->rcv_data)
1388 {
1389 ACI_MFREE(src_infos_psi->rcv_data);
1390 }
1391 if (src_infos_psi->run_cmd EQ FALSE)
1392 {
1393 aci_bat_run_cmd (src_infos_psi);
1394 }
1395 else
1396 {
1397 TRACE_EVENT_P1("aci_bat_l2p_msg_rxd_cb(): there is a cmd running, put 0x%04X in queue", cmd.ctrl_params);
1398 }
1399 }
1400 }
1401 else
1402 {
1403 TRACE_ERROR("aci_bat_l2p_msg_rxd_cb(): L2P used wrong identifier");
1404 }
1405 }
1406
1407
1408 /*------------------------------------------------------------------------------
1409 * AT command identifier is different in BAT and ACI. Need to map it.
1410 */
1411 LOCAL T_ACI_AT_CMD map_cmd_id (T_BAT_ctrl_params cmd)
1412 {
1413 int i = 0;
1414
1415 while (map_batcmd_to_acicmd[i].aci NEQ AT_CMD_NONE)
1416 {
1417 if (cmd EQ map_batcmd_to_acicmd[i].bat)
1418 {
1419 return (map_batcmd_to_acicmd[i].aci);
1420 }
1421 i++;
1422 }
1423 return (AT_CMD_NONE);
1424 }
1425
1426 /*------------------------------------------------------------------------------
1427 * BAT Lib sent command abort request for a particular client
1428 */
1429 LOCAL BOOL aci_bat_abort (T_ACI_DTI_PRC_PSI *src_infos_psi, U8 client_id)
1430 {
1431 T_ACI_RETURN ret = AT_FAIL;
1432 T_ACI_AT_CMD AciCurCmd = map_cmd_id ( src_infos_psi->bat_client[client_id].curCmd);
1433
1434 ret = sAT_Abort (src_infos_psi->srcId, AciCurCmd);
1435 switch (ret)
1436 {
1437 case (AT_EXCT):
1438 {
1439 /*
1440 * in aci_bat_ctrl_rcv() we check for BATC_ABORT_CMD to suppress any response.
1441 * only call control needs some time to abort (disconnet the call).
1442 * command handler of call control emits the OK via R_AT (rBAT_OK).
1443 * in rBAT_OK we have to check again for BATC_ABORT_COMMAND_CNF and send then
1444 * a
1445 */
1446 src_infos_psi->bat_client[client_id].curCmd = (T_BAT_ctrl_params)BATC_ABORT_CMD;
1447 return(TRUE);
1448 }
1449 case ( AT_CMPL ):
1450 {
1451 src_infos_psi->bat_client[client_id].curCmd = (T_BAT_ctrl_params)-1;
1452 return(TRUE);
1453 }
1454 default:
1455 {
1456 switch (src_infos_psi->bat_client[client_id].curCmd)
1457 {
1458 case ( BAT_CMD_SET_PLUS_CMGC ):
1459 case ( BAT_CMD_SET_PLUS_CNMI ):
1460 case ( BAT_CMD_SET_PLUS_CSMS ):
1461 case ( BAT_CMD_SET_PLUS_CMGD ):
1462 case ( BAT_CMD_SET_PLUS_CMGR ):
1463 case ( BAT_CMD_SET_PLUS_CMGR_W ):
1464 case ( BAT_CMD_SET_PLUS_CMGW ):
1465 case ( BAT_CMD_SET_PLUS_CMGS ):
1466 case ( BAT_CMD_SET_PLUS_CMSS ):
1467 case ( BAT_CMD_SET_PLUS_CPMS ):
1468 /* case ( AT_CMD_CSMP ): not supported by BAT ? */
1469 case ( BAT_CMD_SET_PLUS_CSCA ):
1470 case ( BAT_CMD_SET_PLUS_CRES ):
1471 case ( BAT_CMD_SET_PLUS_CSAS ):
1472 case ( BAT_CMD_SET_PLUS_CMGL ):
1473 case ( BAT_CMD_SET_PLUS_CMGL_W ):
1474 /* ACI_ERR_DESC( ACI_ERR_CLASS_Cms, CMS_ERR_FailedToAbort); */
1475 break;
1476 default:
1477 /* ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_FailedToAbort); */
1478 break;
1479 }
1480 /* aci_bat_err(src_infos_psi); */
1481 break;
1482 }
1483 }
1484 return(FALSE);
1485 }
1486
1487
1488 /*==== GLOBAL FUNCTONS ============================================*/
1489
1490
1491 /*
1492 +--------------------------------------------------------------------+
1493 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1494 | STATE : code ROUTINE : aci_bat_send_buffer_dti_data |
1495 +--------------------------------------------------------------------+
1496
1497 PURPOSE : Send buffered DTI data, because dtxState is ready now.
1498 This function is called by sig_dti_tx_buffer_ready_ind()
1499 */
1500
1501 GLOBAL U8 aci_bat_get_l2p_id(U8 src_id)
1502 {
1503 return (aci_bat_globs[src_id].l2p_id);
1504 }
1505
1506
1507 /*
1508 +--------------------------------------------------------------------+
1509 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1510 | STATE : code ROUTINE : aci_bat_send_buffer_dti_data |
1511 +--------------------------------------------------------------------+
1512
1513 PURPOSE : Send buffered DTI data, because dtxState is ready now.
1514 This function is called by sig_dti_tx_buffer_ready_ind()
1515 */
1516 GLOBAL void aci_bat_send_buffer_dti_data (UBYTE src_id)
1517 {
1518 T_ACI_DTI_PRC_PSI *src_infos_psi = NULL;
1519 int i = 0;
1520
1521 TRACE_FUNCTION("aci_bat_send_buffer_dti_data()");
1522
1523 /* dti_id should be supported by DTI_ENTITY_ID or something, here.. */
1524 src_infos_psi = find_element (psi_src_params, src_id, cmhPSItest_srcId);
1525
1526 if (aci_src_dti_params[src_id].isDtiConnected EQ FALSE)
1527 {
1528 TRACE_EVENT ("DTI_READY_IND: line not connected");
1529 return;
1530 }
1531 /*
1532 * send data which may have been stored ..
1533 */
1534 if (src_infos_psi->data_buffer.data_list NEQ NULL)
1535 {
1536 T_desc2 *data_list = src_infos_psi->data_buffer.data_list;
1537
1538 while (data_list NEQ NULL)
1539 {
1540 /* TRACE_BINDUMP(aci_handle, TC_USER4, "BUFFERED BAT DATA", (U8 *)data_list, data_list->len); */
1541 TRACE_EVENT_P1 ("aci_bat_send_buffer_dti_data(): buffered resp/ind has %i bytes", data_list->len);
1542 i++;
1543 data_list = (T_desc2*)data_list->next;
1544 }
1545
1546 TRACE_EVENT_P1 ("aci_bat_send_buffer_dti_data(): there are %i buffered resp/ind", i);
1547 aci_bat_send_dti_data (src_infos_psi, src_infos_psi->data_buffer.data_list);
1548 src_infos_psi->data_buffer.data_list = NULL;
1549 src_infos_psi->data_buffer.max_buffer_size = 0;
1550 src_infos_psi->data_buffer.create_time = 0;
1551 }
1552 }
1553
1554 /*
1555 +-------------------------------------------------------------------------------------+
1556 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1557 | STATE : code ROUTINE : aci_bat_check_for_multi_line_response_command |
1558 +-------------------------------------------------------------------------------------+
1559
1560 PURPOSE : Some BAT commands send several responses to the application (CPBR,COPN,...).
1561 To avoid eating up too much memory with aci_bat_buffer_dti_data(),
1562 these multi line response commands send only a limited number of responses
1563 at once. After that the command stores the current context (how many
1564 responses it already sent and how many it still has to sent) and gives up
1565 the CPU context. With it we return to pei_primitive and the frame is able
1566 to pass the next primtive from ACI's input queue to the next call of pei_primitive.
1567 In case of a DTI_REASON_TX_BUFFER_READY we will check in this function
1568 whether there is still a multi line BAT command active. If so, we call this
1569 BAT function once again with updated parameters to send the next responses.
1570 */
1571
1572 GLOBAL void aci_bat_check_for_multi_line_response_command(UBYTE src_id)
1573 {
1574 T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
1575 T_ACI_DTI_PRC_PSI *src_infos_psi = NULL;
1576 int i = 0;
1577
1578 TRACE_FUNCTION("aci_bat_check_for_multi_line_response_command()");
1579
1580 src_infos_psi = find_element (psi_src_params, src_id, cmhPSItest_srcId);
1581
1582 if(src_infos_psi->large_type) /* large type means multi line responses */
1583 {
1584 switch (src_infos_psi->bat_client[src_infos_psi->active_client].curCmd)
1585 {
1586 case (BAT_CMD_SET_PLUS_CPBR):
1587 {
1588 ret = sBAT_PlusCPBR_CB(src_infos_psi);
1589 /* vsi_t_sleep (aci_handle, 3000); for testing only */
1590 break;
1591 }
1592 case (BAT_CMD_SET_PLUS_CPBF):
1593 {
1594 ret = sBAT_PlusCPBF_CB(src_infos_psi);
1595 /* vsi_t_sleep (aci_handle, 3000); for testing only */
1596 break;
1597 }
1598 default:
1599 {
1600 TRACE_EVENT_P1("aci_bat_check_for_multi_line_response_command(): cmd %04X has no multi line responses",
1601 src_infos_psi->bat_client[src_infos_psi->active_client].curCmd);
1602 return;
1603 }
1604 }
1605
1606 switch (ret)
1607 {
1608 case (ACI_BAT_CMPL):
1609 {
1610 srcId_cb = src_infos_psi->srcId;
1611 rBAT_OK(src_infos_psi->bat_client[src_infos_psi->active_client].curCmd);
1612 break;
1613 }
1614 case (ACI_BAT_EXCT):
1615 {
1616 break;
1617 }
1618 default:
1619 {
1620 aci_bat_err(src_infos_psi);
1621 }
1622 }
1623 }
1624 }
1625
1626
1627 /*
1628 +--------------------------------------------------------------------+
1629 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1630 | STATE : code ROUTINE : aci_bat_cur_cmd_get |
1631 +--------------------------------------------------------------------+
1632
1633 PURPOSE : Get the current command of the specified source.
1634 */
1635 GLOBAL T_BAT_ctrl_params aci_bat_cur_cmd_get (T_ACI_DTI_PRC_PSI *src_infos_psi)
1636 {
1637 if (src_infos_psi==NULL)
1638 return((T_BAT_ctrl_params)-1);
1639
1640 if (src_infos_psi->bat_client==NULL)
1641 return((T_BAT_ctrl_params)-1);
1642
1643 return(src_infos_psi->bat_client[src_infos_psi->active_client].curCmd);
1644 }
1645
1646 /*
1647 +--------------------------------------------------------------------+
1648 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1649 | STATE : code ROUTINE : aci_bat_cs_get |
1650 +--------------------------------------------------------------------+
1651
1652 PURPOSE : Get the character set, potentially for BAT or even the
1653 individual client, though for now it just returns the
1654 value of the ATI global variable 'cscsChset'.
1655 */
1656 GLOBAL T_BAT_plus_cscs_cs aci_bat_cs_get (T_ACI_DTI_PRC_PSI *src_infos_psi)
1657 {
1658 /*
1659 * Necessary for target build?
1660 */
1661 src_infos_psi=src_infos_psi;
1662
1663 /*
1664 * This relies on T_BAT_plus_cscs_cs being equivalent to
1665 * T_ACI_CSCS_CHSET. It is, except that the ACI version has
1666 * a 'NotPresent' value, which we must deal with.
1667 */
1668 if (ati_user_output_cfg[src_infos_psi->srcId].cscsChset EQ CSCS_CHSET_NotPresent)
1669 return(BAT_CSCS_CS_IRA);
1670 else
1671 return((T_BAT_plus_cscs_cs)ati_user_output_cfg[src_infos_psi->srcId].cscsChset);
1672 }
1673
1674 /*
1675 +--------------------------------------------------------------------+
1676 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1677 | STATE : code ROUTINE : aci_bat_cs_set |
1678 +--------------------------------------------------------------------+
1679
1680 PURPOSE : Set the character set, potentially for BAT or even the
1681 individual client, though for now it just acts on the
1682 ATI global variable 'cscsChset'.
1683 */
1684 GLOBAL void aci_bat_cs_set (T_ACI_DTI_PRC_PSI *src_infos_psi,
1685 T_BAT_plus_cscs_cs cs)
1686 {
1687 /*
1688 * Necessary for target build?
1689 */
1690 src_infos_psi=src_infos_psi;
1691
1692 /*
1693 * This relies on T_BAT_plus_cscs_cs being equivalent to
1694 * T_ACI_CSCS_CHSET. It is, except that the ACI version has
1695 * a 'NotPresent' value. As the input to this function is in
1696 * BAT format, this will not be a problem.
1697 */
1698 if ((cs>=BAT_CSCS_CS_IRA) && (cs<=BAT_CSCS_CS_UCS2))
1699 {
1700 ati_user_output_cfg[src_infos_psi->srcId].cscsChset=(T_ACI_CSCS_CHSET)cs;
1701 TRACE_EVENT_P1 ("aci_bat_cs_set(): new charset is %i", cs);
1702 }
1703 }
1704
1705 /*
1706 +--------------------------------------------------------------------+
1707 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1708 | STATE : code ROUTINE : aci_bat_rcv |
1709 +--------------------------------------------------------------------+
1710
1711 PURPOSE : called by sig_dti_data_received_ind(), see sap_dti.c
1712 */
1713 GLOBAL void aci_bat_rcv (T_ACI_DTI_PRC_PSI *src_infos_psi, T_DTI2_DATA_IND *dti_data_ind)
1714 {
1715 U8 src_id = src_infos_psi->srcId;
1716 T_desc2 *p_desc = (T_desc2 *)NULL;
1717 T_L2P_STATUS l2p_status = L2P_STAT_UNKNOWN_ERROR;
1718
1719 TRACE_FUNCTION("aci_bat_rcv()");
1720
1721 if (aci_bat_first_time)
1722 {
1723 aci_bat_first_time = FALSE;
1724 aci_bat_init_globs();
1725 }
1726
1727 if (aci_bat_globs[src_id].l2p_configured EQ FALSE)
1728 {
1729 if (aci_bat_bootstrap_l2p(src_infos_psi, dti_data_ind) EQ TRUE)
1730 {
1731 aci_bat_globs[src_id].l2p_configured = TRUE;
1732 aci_bat_globs[src_id].psi_src = src_infos_psi;
1733 }
1734 else
1735 {
1736 return; /* trace message already in aci_bat_bootstrap_l2p */
1737 }
1738 }
1739
1740 p_desc = (T_desc2 *)dti_data_ind->desc_list2.first;
1741
1742 if (aci_bat_globs[src_id].psi_src NEQ src_infos_psi)
1743 {
1744 /* maintenance problem, just a reminder that there is still something to do */
1745 TRACE_ERROR("aci_bat_rcv(): race condition between two PSI sources");
1746 }
1747 aci_bat_globs[src_id].psi_src = src_infos_psi;
1748
1749 /*
1750 * L2P_Receive() calls aci_bat_l2p_msg_rxd_cb() and returns with
1751 * a senseful value, which could used by ourself to decide what to do.
1752 * callback functions make it hard to follow the function flow.
1753 */
1754 l2p_status = L2P_Receive(aci_bat_globs[src_id].l2p_id, /* unique identifier */
1755 (void *)p_desc->buffer, /* first segment buffer */
1756 (void *)p_desc, /* first segment descriptor */
1757 dti_data_ind->desc_list2.list_len, /* total size */
1758 p_desc->size); /* first segment size */
1759
1760 switch (l2p_status)
1761 {
1762 case (L2P_STAT_SUCCESS): /* BAT command has been processed */
1763 break;
1764 default: /* any error */
1765 TRACE_EVENT_P1("aci_bat_rcv(): L2P status = %d", l2p_status);
1766 break;
1767 }
1768 }
1769
1770 /*
1771 +--------------------------------------------------------------------+
1772 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1773 | STATE : code ROUTINE : aci_bat_ctrl_rcv |
1774 +--------------------------------------------------------------------+
1775
1776 PURPOSE : BAT Library sent a control signal to BAT Module
1777 */
1778 GLOBAL void aci_bat_ctrl_rcv (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BATC_signal *signal)
1779 {
1780 T_BATC_confirm confirm;
1781
1782 TRACE_FUNCTION("aci_bat_ctrl_rcv()");
1783
1784 switch (signal->ctrl_params)
1785 {
1786 case (BATC_MAX_CLIENTS):
1787 {
1788 T_BATC_max_clients max_clients;
1789 aci_bat_init_max_client_maintenance(src_infos_psi, (U8)signal->params.ptr_max_clients->num_clients);
1790 confirm.rsp_params = BATC_MAX_CLIENTS_CNF;
1791 /* acknowledge with the same data, because L2P does not accept NULL pointer */
1792 confirm.rsp.ptr_bat_open_client_cnf = (T_BATC_open_client *)&max_clients;
1793 max_clients.num_clients = signal->params.ptr_max_clients->num_clients;
1794 TRACE_EVENT_P2("aci_bat_ctrl_rcv(): BAT Lib instance with %d clients for src_id %d",
1795 (U8)signal->params.ptr_max_clients->num_clients, src_infos_psi->srcId);
1796 break;
1797 }
1798 case (BATC_OPEN_CLIENT):
1799 {
1800 T_BATC_open_client open_client;
1801 src_infos_psi->bat_client[signal->params.ptr_open_client->client_id].opened = TRUE;
1802 confirm.rsp_params = BATC_OPEN_CLIENT_CNF;
1803 confirm.rsp.ptr_bat_open_client_cnf = &open_client;
1804 confirm.rsp.ptr_bat_open_client_cnf->client_id = signal->params.ptr_open_client->client_id;
1805 TRACE_EVENT_P2("aci_bat_ctrl_rcv(): BAT Lib client %d for src_id %d opened",
1806 (U8)signal->params.ptr_open_client->client_id, src_infos_psi->srcId);
1807 break;
1808 }
1809 case (BATC_CLOSE_CLIENT):
1810 {
1811 aci_bat_clean_client_maintenance(src_infos_psi, (U8)signal->params.ptr_close_client->client_id);
1812 TRACE_EVENT_P2("aci_bat_ctrl_rcv(): BAT Lib client %d for src_id %d closed",
1813 (U8)signal->params.ptr_close_client->client_id, src_infos_psi->srcId);
1814 #ifndef _SIMULATION_
1815 /* make DTI happy with its flow control stuff */
1816 psa_psi_DTI_getdata ((UBYTE)(src_infos_psi->srcId), DTI_ENTITY_PSI);
1817 #endif
1818 return; /* return, because it is not confirmed to BAT library */
1819 }
1820 case (BATC_ABORT_CMD):
1821 {
1822 T_BATC_abort_cmd abort_cmd;
1823 U8 client_id = (U8)(signal->params.ptr_abort_cmd->client_id);
1824 T_BAT_ctrl_params curCmd = src_infos_psi->bat_client[client_id].curCmd;
1825
1826 if (src_infos_psi->run_cmd EQ FALSE)
1827 {
1828 /*
1829 * there is no command running at all, but return with confirmation
1830 * to make the state machine of BAT Lib happy
1831 */
1832 confirm.rsp_params = BATC_ABORT_COMMAND_CNF;
1833 TRACE_EVENT("aci_bat_ctrl_rcv(): no command to abort");
1834 }
1835 else if (aci_bat_abort(src_infos_psi, client_id))
1836 {
1837 confirm.rsp_params = BATC_ABORT_COMMAND_CNF;
1838 TRACE_EVENT_P1("aci_bat_ctrl_rcv(): aborted the command %d ", curCmd);
1839 src_infos_psi->run_cmd = FALSE;
1840 }
1841 else
1842 {
1843 TRACE_EVENT_P1("aci_bat_ctrl_rcv(): failed aborting command %d ", curCmd);
1844 confirm.rsp_params = BATC_ABORT_COMMAND_REJ;
1845 }
1846 if (src_infos_psi->bat_client[client_id].curCmd EQ (T_BAT_ctrl_params)BATC_ABORT_CMD)
1847 {
1848 TRACE_EVENT_P1("aci_bat_ctrl_rcv(): executing to abort command %d ", curCmd);
1849 return; /* do nothing, (call must be disconnected), takes some time, then send OK via rBAT_OK*/
1850 }
1851 abort_cmd.client_id = client_id;
1852 confirm.rsp.ptr_bat_abort_command_cnf = &abort_cmd;
1853 break;
1854 }
1855 default:
1856 TRACE_EVENT("aci_bat_ctrl_rcv(): unknown ctrl_params");
1857 return; /* control signal to BAT library */
1858 }
1859 src_infos_psi->active_client = BAT_CTRL_CHANNEL; /* control channel */
1860 /* command responses and signal confirmations are organized in exactly the same way,
1861 but signal confirmation must be casted to a command response */
1862 aci_bat_send(src_infos_psi, (T_BAT_cmd_response *)&confirm);
1863 }
1864
1865 /*
1866 +--------------------------------------------------------------------+
1867 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1868 | STATE : code ROUTINE : aci_bat_send |
1869 +--------------------------------------------------------------------+
1870
1871 PURPOSE :
1872 */
1873 GLOBAL void aci_bat_send (T_ACI_DTI_PRC_PSI *src_infos_psi,
1874 T_BAT_cmd_response *resp)
1875 {
1876 T_L2P_STATUS l2p_status = L2P_STAT_UNKNOWN_ERROR;
1877 int errVal = -1;
1878 U8 client_id = 0xFF; /*broadcast */
1879 U16 resp_len = 0;
1880
1881 TRACE_FUNCTION("aci_bat_send()");
1882
1883 if (BITFIELD_CHECK(resp->ctrl_response, BAT_BIT_12) || /* 0x1xxx = unsolicited --> broadcast */
1884 resp->ctrl_response EQ BAT_RES_UNS_PLUS_CRING ||
1885 resp->ctrl_response EQ BAT_RES_UNS_PLUS_CCWV)
1886 {
1887 client_id = 0xFF; /* broadcast */
1888 TRACE_EVENT_P1("aci_bat_send(): unsolicited response 0x%04X over broadcast channel", resp->ctrl_response);
1889 }
1890 else
1891 {
1892 client_id = src_infos_psi->active_client; /* not a broadcast message */
1893 TRACE_EVENT_P2("aci_bat_send(): response 0x%04X on client channel %d", resp->ctrl_response, client_id);
1894 }
1895
1896 if (BITFIELD_CHECK(resp->ctrl_response, BAT_BIT_15)) /* 0x8xxx = control response */
1897 {
1898 resp_len = 4; /* the resp->ctrl_response (for L2P = Cmd Tag) does not count to resp length */
1899 }
1900 else
1901 {
1902 resp_len = aci_bat_get_size(resp->ctrl_response);
1903 }
1904
1905 TRACE_EVENT_P2("aci_bat_send(): response = 0x%04X, size = %i", resp->ctrl_response, resp_len);
1906 TRACE_BINDUMP(aci_handle, TC_USER4, "BAT RESPONSE PARAMETER", (U8 *)resp->response.ptr_at_ok, resp_len);
1907
1908
1909 /*
1910 * The format of an L2 frame for BAT will be as follows :
1911 *
1912 * For the first frame
1913 * ----------------------------------------------------------------
1914 * | L2P Header | BAT Cmd TAG | BAT Command Data |
1915 * | (n Bytes) | 4 Bytes | (Remaining Bytes) |
1916 * ----------------------------------------------------------------
1917 *
1918 * For any subsequent frames
1919 * ----------------------------------------------------------------
1920 * | L2 Header | BAT Command Data |
1921 * | (n Bytes) | (Remaining Bytes) |
1922 * ----------------------------------------------------------------
1923 */
1924 srcId_cb = src_infos_psi->srcId;
1925
1926 l2p_status = L2P_Send(aci_bat_globs[src_infos_psi->srcId].l2p_id, /* unique identifier */
1927 client_id,
1928 resp->ctrl_response, /* this is the important thing */
1929 resp->response.ptr_at_ok, /* don't worry, it always points to the right thing */
1930 resp_len,
1931 &errVal);
1932 switch (l2p_status)
1933 {
1934 case (L2P_STAT_SUCCESS):
1935 if (resp->ctrl_response <= BAT_RES_PLUS_EXT_ERROR)
1936 {
1937 if (src_infos_psi->large_type EQ FALSE) /* not CPBR, COPN, ... */
1938 {
1939 src_infos_psi->run_cmd = FALSE;
1940 src_infos_psi->bat_client[src_infos_psi->active_client].curCmd = (T_BAT_ctrl_params)-1;
1941 }
1942 }
1943 break;
1944 default:
1945 TRACE_EVENT_P1("aci_bat_send(): l2p_status = %d", l2p_status);
1946 TRACE_EVENT_P1("aci_bat_send(): errVal = %d", errVal); /* what is so special ? */
1947 break;
1948 }
1949 #ifndef _SIMULATION_
1950 /* make DTI happy with its flow control stuff */
1951 psa_psi_DTI_getdata ((UBYTE)(src_infos_psi->srcId), DTI_ENTITY_PSI);
1952 #endif
1953 }
1954
1955
1956 GLOBAL void aci_bat_run_cmd (T_ACI_DTI_PRC_PSI *src_infos_psi)
1957 {
1958 U8 client_id;
1959 T_BAT_cmd_send cmd;
1960
1961 TRACE_FUNCTION("aci_bat_run_cmd()");
1962
1963 /* run all pending commands from the queue */
1964 while (aci_bat_queue_get(src_infos_psi->queue, &cmd, &client_id) EQ TRUE)
1965 {
1966 src_infos_psi->bat_client[client_id].curCmd = cmd.ctrl_params;
1967 src_infos_psi->active_client = client_id;
1968 src_infos_psi->run_cmd = TRUE;
1969
1970 TRACE_EVENT_P1("client_id = %d", client_id);
1971 TRACE_EVENT_P1("command identifier = 0x%04X", cmd.ctrl_params);
1972 TRACE_BINDUMP(aci_handle, TC_USER4, "BAT COMMAND PARAMETER 3", (U8 *)cmd.params.ptr_at_a, 4);
1973
1974 /* run the command, result code is send back also from wrapper */
1975 switch (aci_bat_wrapper(src_infos_psi, &cmd)) /* run the command */
1976 {
1977 case (ACI_BAT_EXCT):
1978 {
1979 ACI_MFREE(cmd.params.ptr_andc); /* was allocated in aci_bat_queue_put() */
1980 return; /* asynchronous command terminates with rBAT_OK ... rBAT_NO_ANSWER */
1981 }
1982 default:
1983 {
1984 src_infos_psi->bat_client[client_id].curCmd = (T_BAT_ctrl_params)-1;
1985 src_infos_psi->active_client = 0xFF;
1986 src_infos_psi->run_cmd = FALSE;
1987 ACI_MFREE(cmd.params.ptr_andc); /* was allocated in aci_bat_queue_put() */
1988 break; /* terminated, so start with the next command */
1989 }
1990 }
1991 }
1992 }
1993
1994
1995
1996 /*
1997 +--------------------------------------------------------------------+
1998 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
1999 | STATE : code ROUTINE : aci_bat_wrapper |
2000 +--------------------------------------------------------------------+
2001
2002 PURPOSE :
2003 */
2004 GLOBAL T_ACI_BAT_RSLT aci_bat_wrapper (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd)
2005 {
2006 U16 index = 0;
2007 T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
2008
2009 if (BITFIELD_CHECK(cmd->ctrl_params, BAT_BIT_12)) /* 0x1000 */
2010 {
2011 index = (U16)(cmd->ctrl_params - BAT_BIT_12);
2012 if (bat_cmds_without_params[index].fptr)
2013 {
2014 ret = bat_cmds_without_params[index].fptr(src_infos_psi, cmd);
2015 }
2016 else
2017 {
2018 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow);
2019 }
2020 }
2021 else
2022 {
2023 index = (U16)cmd->ctrl_params;
2024 if (bat_cmds[index].fptr)
2025 {
2026 ret = bat_cmds[index].fptr(src_infos_psi, cmd);
2027 }
2028 else
2029 {
2030 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow);
2031 }
2032 }
2033
2034 switch (ret)
2035 {
2036 case ACI_BAT_FAIL:
2037 /*
2038 * The reason for the failure will have been stored in aciErrDesc,
2039 * we first call aci_bat_err() to translate this into a BAT
2040 * response message (CME ERROR / CMS ERROR / CEER) and send it.
2041 */
2042 aci_bat_err(src_infos_psi);
2043 break;
2044
2045 case ACI_BAT_CMPL:
2046 /*
2047 * Send OK.
2048 */
2049 {
2050 T_BAT_cmd_response resp;
2051 T_BAT_no_parameter dummy;
2052
2053 resp.ctrl_response=BAT_RES_AT_OK;
2054 resp.response.ptr_at_ok=(T_BAT_no_parameter *)&dummy;
2055 dummy.bat_dummy = 0xFF;
2056 TRACE_EVENT("aci_bat_wrapper(): OK");
2057 aci_bat_send(src_infos_psi,&resp);
2058 }
2059 break;
2060
2061 case ACI_BAT_BUSY:
2062 /*
2063 * Send BUSY.
2064 */
2065 {
2066 T_BAT_cmd_response resp;
2067 T_BAT_no_parameter dummy;
2068
2069 resp.ctrl_response=BAT_RES_AT_BUSY;
2070 resp.response.ptr_at_busy=(T_BAT_no_parameter *)&dummy;
2071 dummy.bat_dummy = 0xFF;
2072 TRACE_EVENT("aci_bat_wrapper(): BUSY");
2073 aci_bat_send(src_infos_psi,&resp);
2074 }
2075 break;
2076
2077 case ACI_BAT_EXCT:
2078 /*
2079 * This return value implies interaction with the protocol stack,
2080 * and the response will be delivered via an rBAT_xxx(). No further
2081 * action needs to be taken at this point.
2082 */
2083 TRACE_EVENT("aci_bat_wrapper(): EXCT");
2084 #ifdef _SIMULATION_
2085 src_infos_psi->res.response = NULL;
2086 #endif
2087 break;
2088
2089 default:
2090 /*
2091 * Reaching this point, which should not happen, may indicate that
2092 * T_ACI_BAT_RSLT is no longer identical to T_ACI_RETURN - and it
2093 * needs to be.
2094 */
2095 break;
2096 }
2097 return (ret);
2098 }
2099
2100 #endif /* ACI_BAT_C */