comparison src/cs/services/etm/etm_tmcore.c @ 246:d25af5b7e773

etm_tmcore.c: rm trailing white space
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 09 May 2021 20:38:06 +0000
parents 7e225a4cd537
children 12b20090b46a
comparison
equal deleted inserted replaced
245:3eccca3ac219 246:d25af5b7e773
1 /******************************************************************************** 1 /********************************************************************************
2 * Enhanced TestMode (ETM) 2 * Enhanced TestMode (ETM)
3 * @file tmcore.c 3 * @file tmcore.c
4 * 4 *
5 * @author Kim T. Peteren (ktp@ti.com) 5 * @author Kim T. Peteren (ktp@ti.com)
6 * @version 0.1 6 * @version 0.1
7 * 7 *
8 8
38 38
39 // Version of the ETM CORE module 39 // Version of the ETM CORE module
40 // See the file etm_version.h 40 // See the file etm_version.h
41 41
42 /****************************************************************************** 42 /******************************************************************************
43 * DIE ID settings 43 * DIE ID settings
44 *****************************************************************************/ 44 *****************************************************************************/
45 45
46 #define BE_STREAM_TO_ARRAY(a, p, l) {register INT32 i; for (i = 0; i < l; i++) a[i] = *(UINT8*)(p)++;} 46 #define BE_STREAM_TO_ARRAY(a, p, l) {register INT32 i; for (i = 0; i < l; i++) a[i] = *(UINT8*)(p)++;}
47 47
48 /* DIE ID register */ 48 /* DIE ID register */
60 //Copied from rv_general.h: 60 //Copied from rv_general.h:
61 //#define BE_STREAM_TO_ARRAY(a, p, l) {register INT32 i; for (i = 0; i < l; i++) a[i] = *(UINT16*)(p)++;} 61 //#define BE_STREAM_TO_ARRAY(a, p, l) {register INT32 i; for (i = 0; i < l; i++) a[i] = *(UINT16*)(p)++;}
62 62
63 63
64 /****************************************************************************** 64 /******************************************************************************
65 * Internal prototypes 65 * Internal prototypes
66 *****************************************************************************/ 66 *****************************************************************************/
67 67
68 T_ETM_PKT *etm_core_setup(uint8 fid); 68 T_ETM_PKT *etm_core_setup(uint8 fid);
69 int etm_core(uint8 *buf, int size); 69 int etm_core(uint8 *buf, int size);
70 70
71 /****************************************************************************** 71 /******************************************************************************
72 * Register the Core Module to the ETM database 72 * Register the Core Module to the ETM database
73 *****************************************************************************/ 73 *****************************************************************************/
74 74
75 int etm_core_init(void) 75 int etm_core_init(void)
76 { 76 {
77 int result; 77 int result;
78 78
79 result = etm_register("CORE", ETM_CORE, 0, 0, etm_core); 79 result = etm_register("CORE", ETM_CORE, 0, 0, etm_core);
80 return result; 80 return result;
81 } 81 }
82 82
83 83
84 /****************************************************************************** 84 /******************************************************************************
85 * Memory read/write Functions 85 * Memory read/write Functions
113 113
114 // Put 'parameter' in return packet 114 // Put 'parameter' in return packet
115 if ((error = etm_pkt_put8(pkt, param)) < 0) { 115 if ((error = etm_pkt_put8(pkt, param)) < 0) {
116 return error; 116 return error;
117 } 117 }
118 118
119 switch (type) { 119 switch (type) {
120 case 0: // READ(0x00) 120 case 0: // READ(0x00)
121 switch (unitsize) { 121 switch (unitsize) {
122 case 1: 122 case 1:
123 mem8 = (uint8 *) addr; 123 mem8 = (uint8 *) addr;
138 while (num--) { 138 while (num--) {
139 if ((error = etm_pkt_put32(pkt, *mem32++)) < 0) 139 if ((error = etm_pkt_put32(pkt, *mem32++)) < 0)
140 break; 140 break;
141 } 141 }
142 break; 142 break;
143 } 143 }
144 break; 144 break;
145 145
146 case 16: // WRITE(0x10) 146 case 16: // WRITE(0x10)
147 switch (unitsize) { 147 switch (unitsize) {
148 case 1: 148 case 1:
149 mem8 = (uint8 *) addr; 149 mem8 = (uint8 *) addr;
150 while (num--) { 150 while (num--) {
151 *mem8++ = etm_get8(buf); 151 *mem8++ = etm_get8(buf);
153 } 153 }
154 break; 154 break;
155 case 2: 155 case 2:
156 mem16 = (uint16 *) addr; 156 mem16 = (uint16 *) addr;
157 while (num--) { 157 while (num--) {
158 *mem16++ = tmp = etm_get16(buf); 158 *mem16++ = tmp = etm_get16(buf);
159 buf += 2; 159 buf += 2;
160 } 160 }
161 break; 161 break;
162 case 4: 162 case 4:
163 mem32 = (uint32 *) addr; 163 mem32 = (uint32 *) addr;
164 while (num--) { 164 while (num--) {
165 *mem32++ = etm_get32(buf); 165 *mem32++ = etm_get32(buf);
166 buf += 4; 166 buf += 4;
167 } 167 }
168 break; 168 break;
169 } 169 }
170 break; 170 break;
171 default: 171 default:
172 return ETM_NOSYS; 172 return ETM_NOSYS;
173 } 173 }
174 174
175 if (error < 0) 175 if (error < 0)
176 return error; 176 return error;
177 177
178 return ETM_OK; 178 return ETM_OK;
179 } 179 }
180 180
181 181
182 /****************************************************************************** 182 /******************************************************************************
183 * CODEC Functions 183 * CODEC Functions
184 *****************************************************************************/ 184 *****************************************************************************/
185 185
186 // ETM sends both page value and register address in one byte. 186 // ETM sends both page value and register address in one byte.
187 // Bit field is: PPPR RRRR 187 // Bit field is: PPPR RRRR
188 // where P = page bit, R = register address bits and X = don't care bits. 188 // where P = page bit, R = register address bits and X = don't care bits.
189 189
190 int etm_codec_write(T_ETM_PKT *pkt, uint8 *buf) 190 int etm_codec_write(T_ETM_PKT *pkt, uint8 *buf)
191 { 191 {
192 extern void ABB_Write_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id, SYS_UWORD16 value); 192 extern void ABB_Write_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id, SYS_UWORD16 value);
193 uint16 page, reg, data; 193 uint16 page, reg, data;
198 return result; 198 return result;
199 199
200 page = (reg_data >> 5) & 0x3; 200 page = (reg_data >> 5) & 0x3;
201 reg = reg_data & 0x1F; 201 reg = reg_data & 0x1F;
202 data = etm_get16(buf); 202 data = etm_get16(buf);
203 203
204 tr_etm(TgTrCore, "ETM CORE: _codec_write: page(%d) reg(%d) data(0x%x)", 204 tr_etm(TgTrCore, "ETM CORE: _codec_write: page(%d) reg(%d) data(0x%x)",
205 page, reg, (data & 0x3ff)); 205 page, reg, (data & 0x3ff));
206 206
207 if (page > 7 && reg > 32) 207 if (page > 7 && reg > 32)
208 return ETM_INVAL; 208 return ETM_INVAL;
209 else { 209 else {
210 // The function below expects a 1 for page 0 and a 2 for page 1. 210 // The function below expects a 1 for page 0 and a 2 for page 1.
211 // The register address value is left-shifted by 1 since LSB is read/write command bit. 211 // The register address value is left-shifted by 1 since LSB is read/write command bit.
212 // The value is written in the 10 MSB's of register. 212 // The value is written in the 10 MSB's of register.
213 ABB_Write_Register_on_page(page + 1, reg << 1, (data & 0x3ff)); 213 ABB_Write_Register_on_page(page + 1, reg << 1, (data & 0x3ff));
214 } 214 }
215 215
216 return ETM_OK; 216 return ETM_OK;
217 } 217 }
218 218
219 219
221 { 221 {
222 extern SYS_UWORD16 ABB_Read_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id); 222 extern SYS_UWORD16 ABB_Read_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id);
223 volatile uint16 value; 223 volatile uint16 value;
224 uint16 page, reg; 224 uint16 page, reg;
225 int result, reg_data; 225 int result, reg_data;
226 226
227 reg_data = *buf; 227 reg_data = *buf;
228 if ((result = etm_pkt_put8(pkt, reg_data)) < 0) 228 if ((result = etm_pkt_put8(pkt, reg_data)) < 0)
229 return result; 229 return result;
230 230
231 page = (reg_data >> 5) & 0x3; 231 page = (reg_data >> 5) & 0x3;
232 reg = reg_data & 0x1F; 232 reg = reg_data & 0x1F;
233 233
234 if (page > 7 && reg > 32) 234 if (page > 7 && reg > 32)
235 return ETM_INVAL; 235 return ETM_INVAL;
236 236
237 // The function below expects a 1 for page 0 and a 2 for page 1. 237 // The function below expects a 1 for page 0 and a 2 for page 1.
238 // The register value is left-shifted by 1 since LSB is read/write command bit. 238 // The register value is left-shifted by 1 since LSB is read/write command bit.
239 value = ABB_Read_Register_on_page(page + 1, (reg << 1)); 239 value = ABB_Read_Register_on_page(page + 1, (reg << 1));
240 240
241 tr_etm(TgTrCore, "ETM CORE: _codec_read: page(%d) reg(%d) value(0x%x)", page, reg, value); 241 tr_etm(TgTrCore, "ETM CORE: _codec_read: page(%d) reg(%d) value(0x%x)", page, reg, value);
242 242
243 result = etm_pkt_put16(pkt, value); 243 result = etm_pkt_put16(pkt, value);
244 return result; 244 return result;
245 } 245 }
246 246
247 247
264 return ETM_INVAL; 264 return ETM_INVAL;
265 265
266 data += 2; 266 data += 2;
267 num = etm_get16(data); 267 num = etm_get16(data);
268 268
269 tr_etm(TgTrCore, "ETM CORE: _echo: delay(%d) sendsize(%d) num(%d)", 269 tr_etm(TgTrCore, "ETM CORE: _echo: delay(%d) sendsize(%d) num(%d)",
270 delay, sendsize, num); 270 delay, sendsize, num);
271 271
272 if (delay > 0) { 272 if (delay > 0) {
273 rvf_delay((delay + 32) * 14 / 64); 273 rvf_delay((delay + 32) * 14 / 64);
274 } 274 }
275 275
276 for (i = 0; i < sendsize; i++) { 276 for (i = 0; i < sendsize; i++) {
277 pkt->data[i+1] = i; // data[0] = fid 277 pkt->data[i+1] = i; // data[0] = fid
278 } 278 }
279 279
280 pkt->size = sendsize; 280 pkt->size = sendsize;
281 281
282 return ETM_OK; 282 return ETM_OK;
283 } 283 }
284 284
285 285
287 { 287 {
288 // The reset code is taken form Fluid->cmd.c 288 // The reset code is taken form Fluid->cmd.c
289 int i; 289 int i;
290 290
291 tr_etm(TgTrCore, "ETM CORE: _reset: Target is Reset"); 291 tr_etm(TgTrCore, "ETM CORE: _reset: Target is Reset");
292 292
293 // Setup watchdog timer and let it timeout to make a reset 293 // Setup watchdog timer and let it timeout to make a reset
294 *(volatile uint16*) 0xfffff804 = 0xFFFF; // Timer to watchdog 294 *(volatile uint16*) 0xfffff804 = 0xFFFF; // Timer to watchdog
295 *(volatile uint16*) 0xfffff800 = 0x0080; // Start timer 295 *(volatile uint16*) 0xfffff800 = 0x0080; // Start timer
296 // Apparently works it only if we read this register? 296 // Apparently works it only if we read this register?
297 i = *(volatile uint16*) 0xfffff802; 297 i = *(volatile uint16*) 0xfffff802;
298 *(volatile uint16*) 0xfffff802 = 0x0001; // Load timer 298 *(volatile uint16*) 0xfffff802 = 0x0001; // Load timer
299 299
300 return ETM_OK; 300 return ETM_OK;
301 } 301 }
302 302
303 303
304 /****************************************************************************** 304 /******************************************************************************
309 { 309 {
310 int type, error, data; 310 int type, error, data;
311 char *p; 311 char *p;
312 extern T_KPD_KEYPAD Kp; 312 extern T_KPD_KEYPAD Kp;
313 313
314 type = *buf & 0x0F; 314 type = *buf & 0x0F;
315 buf++; 315 buf++;
316 316
317 data = etm_get32(buf); 317 data = etm_get32(buf);
318 318
319 tr_etm(TgTrCore, "ETM CORE: _debug: type(%d) data(0x%x)", type, data); 319 tr_etm(TgTrCore, "ETM CORE: _debug: type(%d) data(0x%x)", type, data);
320 320
322 switch (type) { 322 switch (type) {
323 case 0: // (0x00) Allocate Test Buffer 323 case 0: // (0x00) Allocate Test Buffer
324 if ((p = etm_malloc(data)) == NULL) 324 if ((p = etm_malloc(data)) == NULL)
325 error = ETM_NOMEM; 325 error = ETM_NOMEM;
326 else 326 else
327 error = etm_pkt_put32(pkt, (int) p); 327 error = etm_pkt_put32(pkt, (int) p);
328 break; 328 break;
329 case 1: // (0x01) Free Test Buffer. 329 case 1: // (0x01) Free Test Buffer.
330 p = (char *) data; 330 p = (char *) data;
331 etm_free(p); 331 etm_free(p);
332 break; 332 break;
333 case 2: // (0x02) Set ETM Trace mask 333 case 2: // (0x02) Set ETM Trace mask
334 tr_etm_init(data); 334 tr_etm_init(data);
335 break; 335 break;
336 case 3: // (0x03) Set read all mem banks stat 336 case 3: // (0x03) Set read all mem banks stat
337 rvf_dump_mem(); 337 rvf_dump_mem();
338 rvf_dump_pool(); 338 rvf_dump_pool();
339 rvf_dump_tasks(); 339 rvf_dump_tasks();
349 break; 349 break;
350 case 6: 350 case 6:
351 (Kp.released)(); 351 (Kp.released)();
352 break; 352 break;
353 default: 353 default:
354 error = ETM_NOSYS; 354 error = ETM_NOSYS;
355 } 355 }
356 356
357 if (error < 0) 357 if (error < 0)
358 return error; 358 return error;
359 359
375 375
376 fid = etm_get32(buf); 376 fid = etm_get32(buf);
377 377
378 tr_etm(TgTrCore, "ETM CORE: _version: fid(0x%x)", fid); 378 tr_etm(TgTrCore, "ETM CORE: _version: fid(0x%x)", fid);
379 379
380 l1s_version = (T_VERSION*) l1s_get_version(); 380 l1s_version = (T_VERSION*) l1s_get_version();
381 381
382 switch (fid) { 382 switch (fid) {
383 // Code Versions related to ETM modules 383 // Code Versions related to ETM modules
384 case SW_REV_ETM_CORE: 384 case SW_REV_ETM_CORE:
385 error = etm_pkt_put32(pkt, ETM_CORE_VERSION); 385 error = etm_pkt_put32(pkt, ETM_CORE_VERSION);
386 break; 386 break;
387 case SW_REV_ETM_AUDIO: 387 case SW_REV_ETM_AUDIO:
388 error = etm_pkt_put32(pkt, ETM_AUDIO_VERSION); 388 error = etm_pkt_put32(pkt, ETM_AUDIO_VERSION);
402 break; 402 break;
403 case SW_REV_ETM_TASK: 403 case SW_REV_ETM_TASK:
404 error = etm_pkt_put32(pkt, ETM_VERSION); 404 error = etm_pkt_put32(pkt, ETM_VERSION);
405 break; 405 break;
406 case SW_REV_ETM_API: 406 case SW_REV_ETM_API:
407 error = etm_pkt_put32(pkt, ETM_API_VERSION); 407 error = etm_pkt_put32(pkt, ETM_API_VERSION);
408 break; 408 break;
409 // Code Versions related to L1, see in l1_defty.h 409 // Code Versions related to L1, see in l1_defty.h
410 // Get the version on this way "revision = l1s.version.dsp_code_version;" 410 // Get the version on this way "revision = l1s.version.dsp_code_version;"
411 // doesn't work because of struct aligment -> compile flag -mw !!!! 411 // doesn't work because of struct aligment -> compile flag -mw !!!!
412 case SW_DSP_CODE_VERSION: 412 case SW_DSP_CODE_VERSION:
413 revision = ((T_VERSION*) l1s_version)->dsp_code_version; 413 revision = ((T_VERSION*) l1s_version)->dsp_code_version;
414 error = etm_pkt_put32(pkt, revision); 414 error = etm_pkt_put32(pkt, revision);
415 break; 415 break;
419 break; 419 break;
420 case SW_MCU_TCS_PROGRAM_RELEASE: 420 case SW_MCU_TCS_PROGRAM_RELEASE:
421 revision = ((T_VERSION*) l1s_version)->mcu_tcs_program_release; 421 revision = ((T_VERSION*) l1s_version)->mcu_tcs_program_release;
422 error = etm_pkt_put32(pkt, revision); 422 error = etm_pkt_put32(pkt, revision);
423 break; 423 break;
424 case SW_MCU_TCS_OFFICIAL: // This version allso identify version of Layer1 424 case SW_MCU_TCS_OFFICIAL: // This version allso identify version of Layer1
425 revision = ((T_VERSION*) l1s_version)->mcu_tcs_official; 425 revision = ((T_VERSION*) l1s_version)->mcu_tcs_official;
426 error = etm_pkt_put32(pkt, revision); 426 error = etm_pkt_put32(pkt, revision);
427 break; 427 break;
428 case SW_MCU_TCS_INTERNAL: 428 case SW_MCU_TCS_INTERNAL:
429 revision = ((T_VERSION*) l1s_version)->mcu_tcs_internal; 429 revision = ((T_VERSION*) l1s_version)->mcu_tcs_internal;
434 error = etm_pkt_put32(pkt, revision); 434 error = etm_pkt_put32(pkt, revision);
435 break; 435 break;
436 default: 436 default:
437 error = ETM_NOSYS; 437 error = ETM_NOSYS;
438 } 438 }
439 439
440 tr_etm(TgTrCore, "ETM CORE: _version: version(%d)", revision); 440 tr_etm(TgTrCore, "ETM CORE: _version: version(%d)", revision);
441 441
442 if (error < 0) 442 if (error < 0)
443 return error; 443 return error;
444 444
445 return ETM_OK; 445 return ETM_OK;
446 } 446 }
447 447
448 448
449 /****************************************************************************** 449 /******************************************************************************
450 * Function for reading the Die-ID from base band processor. 450 * Function for reading the Die-ID from base band processor.
451 *****************************************************************************/ 451 *****************************************************************************/
452 452
453 int etm_dieID_read(T_ETM_PKT *pkt, uint8 *inbuf) 453 int etm_dieID_read(T_ETM_PKT *pkt, uint8 *inbuf)
454 { 454 {
455 T_RV_RET result; 455 T_RV_RET result;
456 int8 byteCount; 456 int8 byteCount;
457 UINT16 dieID[DIE_ID_SIZE]; 457 UINT16 dieID[DIE_ID_SIZE];
458 int16 index; 458 int16 index;
459 volatile UINT16 *reg_p = (UINT16 *) DIE_ID_REG; 459 volatile UINT16 *reg_p = (UINT16 *) DIE_ID_REG;
460 460
461 tr_etm(TgTrCore, "ETM CORE: _dieID_read: started - Die-ID address(0x%x)", DIE_ID_REG); 461 tr_etm(TgTrCore, "ETM CORE: _dieID_read: started - Die-ID address(0x%x)", DIE_ID_REG);
462 462
463 BE_STREAM_TO_ARRAY(dieID, reg_p, DIE_ID_SIZE); 463 BE_STREAM_TO_ARRAY(dieID, reg_p, DIE_ID_SIZE);
464 464
465 for (byteCount = 0; byteCount < DIE_ID_SIZE; byteCount++) { 465 for (byteCount = 0; byteCount < DIE_ID_SIZE; byteCount++) {
466 466
467 tr_etm(TgTrCore, "ETM CORE: Die-ID[%i] Byte Read(0x%x)", byteCount, (UINT16)dieID[byteCount]); 467 tr_etm(TgTrCore, "ETM CORE: Die-ID[%i] Byte Read(0x%x)", byteCount, (UINT16)dieID[byteCount]);
468 result = etm_pkt_put16(pkt, (UINT8)(((dieID[byteCount]) & 0xFFFF))); 468 result = etm_pkt_put16(pkt, (UINT8)(((dieID[byteCount]) & 0xFFFF)));
469 if (result < 0) 469 if (result < 0)
484 // Structur of protocol data dl-link: |fid|index|data| 484 // Structur of protocol data dl-link: |fid|index|data|
485 485
486 uint8 mid; 486 uint8 mid;
487 uint8 fid; 487 uint8 fid;
488 int error = 0; 488 int error = 0;
489 T_ETM_PKT *pkt = NULL; 489 T_ETM_PKT *pkt = NULL;
490 490
491 fid = *buf++; 491 fid = *buf++;
492 492
493 tr_etm(TgTrCore, "ETM CORE: _core: fid(%c):", fid); 493 tr_etm(TgTrCore, "ETM CORE: _core: fid(%c):", fid);
494 494
495 /* Create TestMode return Packet */ 495 /* Create TestMode return Packet */
496 if ((pkt = (T_ETM_PKT *) etm_malloc(sizeof(T_ETM_PKT))) == NULL) { 496 if ((pkt = (T_ETM_PKT *) etm_malloc(sizeof(T_ETM_PKT))) == NULL) {
497 return ETM_NOMEM; 497 return ETM_NOMEM;
498 } 498 }
499 499
500 // Init. of return packet 500 // Init. of return packet
501 pkt->mid = ETM_CORE; 501 pkt->mid = ETM_CORE;
502 pkt->status = ETM_OK; 502 pkt->status = ETM_OK;
503 pkt->size = 0; 503 pkt->size = 0;
504 pkt->index = 0; 504 pkt->index = 0;
505 etm_pkt_put8(pkt, fid); 505 etm_pkt_put8(pkt, fid);
506 506
507 switch (fid) { 507 switch (fid) {
508 #ifdef RVM_ATP_SWE 508 #ifdef RVM_ATP_SWE
509 case 0x60: // old 'G' 509 case 0x60: // old 'G'
510 error = etm_at(pkt, (char *) buf); 510 error = etm_at(pkt, (char *) buf);
511 break; 511 break;
517 error = etm_echo(pkt, buf); 517 error = etm_echo(pkt, buf);
518 break; 518 break;
519 case 0x63: // old 'R' 519 case 0x63: // old 'R'
520 error = etm_reset(); 520 error = etm_reset();
521 break; 521 break;
522 case 0x64: // old 'T' 522 case 0x64: // old 'T'
523 error = etm_debug(pkt, buf); 523 error = etm_debug(pkt, buf);
524 break; 524 break;
525 case 0x65: // old 'V' 525 case 0x65: // old 'V'
526 error = etm_version(pkt, buf); 526 error = etm_version(pkt, buf);
527 break; 527 break;
528 case 0x66: // old 'C' 528 case 0x66: // old 'C'
529 error = etm_codec_read(pkt, buf); 529 error = etm_codec_read(pkt, buf);
530 break; 530 break;
531 case 0x67: // old 'D' 531 case 0x67: // old 'D'
532 error = etm_codec_write(pkt, buf); 532 error = etm_codec_write(pkt, buf);
533 break; 533 break;
534 case 0x68: // old 'd' 534 case 0x68: // old 'd'
535 error = etm_dieID_read(pkt, buf); 535 error = etm_dieID_read(pkt, buf);
536 break; 536 break;
537 default: 537 default:
538 tr_etm(TgTrCore,"ETM CORE: _core: fid ERROR"); 538 tr_etm(TgTrCore,"ETM CORE: _core: fid ERROR");
539 error = ETM_NOSYS; 539 error = ETM_NOSYS;
540 break; 540 break;
541 } 541 }
542 542
543 if (error < 0) { 543 if (error < 0) {
544 tr_etm(TgTrCore,"ETM CORE: _core: FAILED"); 544 tr_etm(TgTrCore,"ETM CORE: _core: FAILED");
545 pkt->status = -error; 545 pkt->status = -error;
546 } 546 }
547 547
548 // etm_at(): send func. is controlled by primitive 548 // etm_at(): send func. is controlled by primitive
549 if (fid == 'G' && error >= RV_OK) {} 549 if (fid == 'G' && error >= RV_OK) {}
550 else 550 else
551 etm_pkt_send(pkt); 551 etm_pkt_send(pkt);
552 552
553 etm_free(pkt); 553 etm_free(pkt);
554 return ETM_OK; 554 return ETM_OK;
555 } 555 }