diff src/g23m-fad/ra/ra_fax.c @ 174:90eb61ecd093

src/g23m-fad: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 12 Oct 2016 05:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-fad/ra/ra_fax.c	Wed Oct 12 05:40:46 2016 +0000
@@ -0,0 +1,930 @@
+/*
++-----------------------------------------------------------------------------
+|  Project :  GSM-F&D (8411)
+|  Modul   :  RA_FAX
++-----------------------------------------------------------------------------
+|  Copyright 2002 Texas Instruments Berlin, AG
+|                 All rights reserved.
+|
+|                 This file is confidential and a trade secret of Texas
+|                 Instruments Berlin, AG
+|                 The receipt of or possession of this file does not convey
+|                 any rights to reproduce or disclose its contents or to
+|                 manufacture, use, or sell anything it may describe, in
+|                 whole, or in part, without the specific written consent of
+|                 Texas Instruments Berlin, AG.
++-----------------------------------------------------------------------------
+|  Purpose :  This Modul defines the functions for the faxnsparent
+|             data model for the component RA of the mobile station
++-----------------------------------------------------------------------------
+*/
+
+#ifndef RA_FAX_C
+#define RA_FAX_C
+#endif
+
+#define ENTITY_RA
+
+/*==== INCLUDES ===================================================*/
+
+#include <string.h>
+#include "typedefs.h"
+#include "vsi.h"
+#include "macdef.h"
+#include "pconst.cdg"
+#include "custom.h"
+#include "gsm.h"
+#include "cnf_ra.h"
+#include "prim.h"
+#include "pei.h"
+#include "tok.h"
+#include "ccdapi.h"
+#include "ra.h"
+
+/*==== CONST ======================================================*/
+
+LOCAL const T_SKIP skip_F14400 [4] =
+{
+  /* T4DATA same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* T4DATA other */  {0, 1, 0, 1, 0, 1, 0, 1}},
+  /* STATUS same  */ {{0, 0, 1, 0, 0, 0, 1, 0},
+  /* STATUS other */  {1, 1, 1, 0, 1, 1, 1, 0}},
+  /* SYNC   same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* SYNC   other */  {1, 0, 1, 0, 1, 0, 1, 0}},
+  /* TRAIN  same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* TRAIN  other */  {1, 1, 1, 0, 1, 1, 1, 0}}
+};
+
+LOCAL const UBYTE request_F14400 [4] =
+{
+  5,4,5,4
+};
+
+LOCAL const T_SKIP skip_F9600 [4] =
+{
+  /* T4DATA same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* T4DATA other */  {0, 0, 0, 0, 0, 0, 0, 0}},
+  /* STATUS same  */ {{0, 0, 0, 1, 0, 0, 0, 1},
+  /* STATUS other */  {0, 1, 1, 1, 0, 1, 1, 1}},
+  /* SYNC   same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* SYNC   other */  {0, 0, 0, 0, 0, 0, 0, 0}},
+  /* TRAIN  same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* TRAIN  other */  {0, 1, 0, 1, 0, 1, 0, 1}}
+};
+
+LOCAL const UBYTE request_F9600 [4] =
+{
+  3,3,3,3
+};
+
+LOCAL const T_SKIP skip_F4800 [4] =
+{
+  /* T4DATA same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* T4DATA other */  {0, 1, 0, 1, 0, 1, 0, 1}},
+  /* STATUS same  */ {{0, 0, 0, 1, 0, 0, 0, 1},
+  /* STATUS other */  {0, 1, 1, 1, 0, 1, 1, 1}},
+  /* SYNC   same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* SYNC   other */  {0, 1, 0, 1, 0, 1, 0, 1}},
+  /* TRAIN  same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* TRAIN  other */  {0, 1, 1, 1, 0, 1, 1, 1}}
+};
+
+LOCAL const UBYTE request_F4800 [4] =
+{
+  2,1,2,1
+};
+
+LOCAL const T_SKIP skip_F2400 [4] =
+{
+  /* T4DATA same  */ {{0, 0, 0, 1, 0, 0, 0, 1},
+  /* T4DATA other */  {0, 1, 1, 1, 0, 1, 1, 1}},
+  /* STATUS same  */ {{0, 0, 0, 1, 0, 0, 0, 1},
+  /* STATUS other */  {0, 1, 1, 1, 0, 1, 1, 1}},
+  /* SYNC   same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* SYNC   other */  {0, 1, 1, 1, 0, 1, 1, 1}},
+  /* TRAIN  same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* TRAIN  other */  {0, 1, 1, 1, 1, 1, 1, 1}}
+};
+
+LOCAL const UBYTE request_F2400 [4] =
+{
+  1,1,1,1
+};
+
+LOCAL const T_SKIP skip_H4800 [4] =
+{
+  /* T4DATA same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* T4DATA other */  {0, 1, 0, 1, 0, 1, 0, 1}},
+  /* STATUS same  */ {{0, 0, 0, 1, 0, 0, 0, 1},
+  /* STATUS other */  {0, 1, 1, 1, 0, 1, 1, 1}},
+  /* SYNC   same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* SYNC   other */  {0, 1, 0, 1, 0, 1, 0, 1}},
+  /* TRAIN  same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* TRAIN  other */  {0, 1, 1, 1, 0, 1, 1, 1}}
+};
+
+LOCAL const UBYTE request_H4800 [4] =
+{
+  2,1,2,1
+};
+
+LOCAL const T_SKIP skip_H2400 [4] =
+{
+  /* T4DATA same  */ {{0, 0, 0, 1, 0, 0, 0, 1},
+  /* T4DATA other */  {0, 1, 1, 1, 0, 1, 1, 1}},
+  /* STATUS same  */ {{0, 0, 0, 1, 0, 0, 0, 1},
+  /* STATUS other */  {0, 1, 1, 1, 0, 1, 1, 1}},
+  /* SYNC   same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* SYNC   other */  {0, 1, 1, 1, 0, 1, 1, 1}},
+  /* TRAIN  same  */ {{0, 0, 0, 0, 0, 0, 0, 0},
+  /* TRAIN  other */  {0, 1, 1, 1, 1, 1, 1, 1}}
+};
+
+LOCAL const UBYTE request_H2400 [4] =
+{
+  1,1,1,1
+};
+
+/*==== TYPES ======================================================*/
+/*==== VARIABLES ==================================================*/
+/*==== FUNCTIONS ==================================================*/
+
+#if defined TRACE_RA_FAX_UL_FRAME_TYPE || defined _SIMULATION_
+
+LOCAL void trace_ra_fax_ul_frame_type(USHORT cus_frame_type, UBYTE* buf1, USHORT bytes_to_write)
+{
+  const char type[5] = "DSYT";
+  char buf[15] = "TISx:0x00-0x00";
+
+  if (cus_frame_type < 4)
+    buf[3] = type[cus_frame_type];
+
+  if (buf1)
+    BYTE2HEXSTR(*(buf1+1), &buf[7]);
+
+  BYTE2HEXSTR((UBYTE)bytes_to_write, &buf[12]);
+  TRACE_EVENT (buf);
+}
+
+#endif
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+
+LOCAL void trace_ra_fax_dl_frame_type(U8 *last, U8 current, USHORT bytes_read)
+{
+  void t30_ker_debug(CHAR *header, UBYTE *buf, USHORT len);
+
+  const char type[5] = "DSYT";
+  char buf[15] = "TIRx:0x00-0x__";
+
+  if (*last NEQ current)
+  {
+    if (current < 4)
+      buf[3] = type[current];
+
+    TRACE_EVENT (buf);
+
+   *last = current;
+  }
+  else if (bytes_read)
+  {
+    if (current EQ 0)
+    {
+      t30_ker_debug("TIRD", ra_data->fax->dl_pFD->buf, bytes_read);
+    }
+    else
+    {
+      if (current < 4)
+        buf[3] = type[current];
+
+      BYTE2HEXSTR((UBYTE)bytes_read, &buf[7]);
+
+      if (current EQ 1)
+        BYTE2HEXSTR(ra_data->fax->dl_pFD->buf[1], &buf[12]);
+
+      TRACE_EVENT (buf);
+    }
+  }
+}
+
+#endif
+
+LOCAL void fax_init_data(BOOL CMM_flag)
+{
+  T_FAX *dfax = ra_data->fax;
+  /*
+   * initialize the fax mode data
+   */
+  ra_data->sync_timer               = 0L;
+  ra_data->cycle_time               = 0L;
+
+  dfax->CMM_flag            = CMM_flag;
+  dfax->ul_frame_type_last  = FR_SYNC;
+  dfax->ul_frame_type       = FR_SYNC;
+  dfax->ul_pFD = NULL;
+
+  cl_ribu_init(&dfax->ul_ribu->idx, RA_FIFO_DEPTH);
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+  dfax->dl_frame_type_last  = 0xFF;
+  dfax->dl_state_last = 0xFF;
+#endif
+
+  dfax->req_idx = 0;
+  dfax->seq_idx = 0;
+
+  dfax->ul_train_FD.buf = dfax->train_seq;
+  dfax->ul_train_FD.len = 2;
+
+  ra_data->ra_data_ind.fr_type        = FR_INVALID;
+  ra_data->ra_data_ind.sdu.o_buf      = 0;
+  ra_data->ra_data_ind.sdu.l_buf      = 0;
+  ra_data->ra_ready_ind[0].req_frames = 0;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_init                 |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void fax_init(void)
+{
+  TRACE_FUNCTION("fax_init");
+
+  fax_init_data(FALSE); /* no CMM */
+
+  hCommFAD = vsi_c_open ( VSI_CALLER FAD_NAME );
+  hCommMMI = vsi_c_open ( VSI_CALLER ACI_NAME );
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_ul_modify            |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void fax_ul_modify(void)
+{
+  TRACE_EVENT("fax_ul_modify()");
+
+  fax_init_data(TRUE); /* CMM */
+  fax_ul_null();
+  return;
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_idle                 |
++--------------------------------------------------------------------+
+
+  PURPOSE : IDLE processing for uplink and downlink fax mode
+*/
+
+GLOBAL void fax_idle(void)
+{
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_ul_null              |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void fax_ul_null(void)
+{
+  T_FAX *dfax = ra_data->fax;
+
+  TRACE_FUNCTION("fax_ul_null");
+
+  if (ra_data->activated)
+  {
+    /*
+     * setup the communication parameters
+     */
+    shm_set_dsp_value (conf_b_itc, V_ITC_FAX);
+
+    switch (ra_data->nsb)
+    {
+    case 1:
+      shm_set_dsp_value (conf_b_nsb, V_NSB_ONE_STOP);
+      break;
+    case 2:
+      shm_set_dsp_value (conf_b_nsb, V_NSB_TWO_STOP);
+      break;
+    default:
+      break;
+    }
+
+    switch (ra_data->ndb)
+    {
+    case 7:
+      shm_set_dsp_value (conf_b_ndb, V_NDMSK_B_7_DBITS);
+      break;
+    case 8:
+      shm_set_dsp_value (conf_b_ndb, V_NDMSK_B_8_DBITS);
+      break;
+    default:
+      break;
+    }
+
+    shm_set_dsp_value (conf_b_ce, V_CE_TRANSP);
+
+    switch (ra_data->tra_rate)
+    {
+    case TRA_FULLRATE_14400:
+      dfax->skip_seq = &skip_F14400[0];
+      dfax->req_seq  = &request_F14400[0];
+      shm_set_dsp_value (conf_b_ct, V_CT_FR);
+      shm_set_dsp_value (conf_b_ur, V_UR_14400);
+      ra_data->cycle_time = 20;
+      break;
+
+    case TRA_FULLRATE_9600:
+      dfax->skip_seq = &skip_F9600[0];
+      dfax->req_seq  = &request_F9600[0];
+      shm_set_dsp_value (conf_b_ur, V_UR_9600);
+      shm_set_dsp_value (conf_b_ct, V_CT_FR);
+      ra_data->cycle_time = 20;
+      break;
+
+    case TRA_FULLRATE_4800:
+      dfax->skip_seq = &skip_F4800[0];
+      dfax->req_seq  = &request_F4800[0];
+      shm_set_dsp_value (conf_b_ur, V_UR_4800);
+      shm_set_dsp_value (conf_b_ct, V_CT_FR);
+      ra_data->cycle_time = 20;
+      break;
+
+    case TRA_FULLRATE_2400:
+      dfax->skip_seq = &skip_F2400[0];
+      dfax->req_seq  = &request_F2400[0];
+      shm_set_dsp_value (conf_b_ur, V_UR_2400);
+      shm_set_dsp_value (conf_b_ct, V_CT_FR);
+      ra_data->cycle_time = 20;
+      break;
+
+    case TRA_HALFRATE_4800:
+      dfax->skip_seq = &skip_H4800[0];
+      dfax->req_seq  = &request_H4800[0];
+      shm_set_dsp_value (conf_b_ur, V_UR_4800);
+      shm_set_dsp_value (conf_b_ct, V_CT_HR);
+      ra_data->cycle_time = 40;
+      break;
+
+    case TRA_HALFRATE_2400:
+      dfax->skip_seq = &skip_H2400[0];
+      dfax->req_seq  = &request_H2400[0];
+      shm_set_dsp_value (conf_b_ur, V_UR_2400);
+      shm_set_dsp_value (conf_b_ct, V_CT_HR);
+      ra_data->cycle_time = 40;
+      break;
+
+    default:
+      TRACE_EVENT ("Unknown transmission rate");
+
+      ra_data->cycle_time = 20;
+      break;
+    }
+
+    shm_set_dsp_value (fax_b_data_receive, 1);
+
+    /*
+     * set uplink buffer to empty values
+     */
+    shm_set_dsp_value (faxd_byte_cnt, 0);
+    shm_set_dsp_value (faxu_byte_cnt, 0);
+    shm_set_dsp_value (faxu_control, V_CTRL_SYNC);
+
+    /*
+     * start initialisation process in F&D L1
+     */
+
+    /*
+     * enable status frame detection in L1
+     * and set the biterror thresholds for the status frame detection
+     */
+    shm_set_dsp_value (fax_b_status_stop,    0);
+    shm_set_dsp_value (fax_b_status_detect,  1);
+    shm_set_dsp_value (fax_b_ident_thres,    3);
+    shm_set_dsp_value (fax_b_info_thres,     3);
+    shm_set_dsp_value (fax_b_status_receive, 0);
+    shm_set_dsp_value (fax_b_byte_interface, 1);
+    shm_set_dsp_value (faxu_byte_cnt, 0);
+
+    shm_set_dsp_value (act_b_init,    1);
+    shm_set_dsp_value (act_b_syncul,  1);
+    shm_set_dsp_value (act_b_syncdl,  1);
+
+    INIT_STATE (KER, FAX_INIT_L1);
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+    if (dfax->dl_state_last NEQ ra_data->ker.state)
+    {
+      TRACE_EVENT_P2("KER:FAX_%d -> FAX_%d", dfax->dl_state_last, ra_data->ker.state);
+      dfax->dl_state_last = ra_data->ker.state;
+    }
+#endif
+
+#ifdef HO_WORKAROUND /* fax_ul_null */
+    _act_d_ra_conf = *ra_data->shm.shm_addr[d_ra_conf];
+    TRACE_EVENT_P1("d_ra_conf saved; rate=%d", ra_data->tra_rate);
+#endif
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_ul_init_l1           |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void fax_ul_init_l1(void)
+{
+  TRACE_FUNCTION("fax_ul_init_l1");
+
+  if (shm_get_dsp_value(act_b_init) EQ 0) /* Indicates initialization of IDS module */
+  {
+    /*
+     * L1 F&D initialized; start ul/dl synchronisation
+     */
+    SET_STATE (KER, FAX_SYNCH_TCH_START);
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+    if (ra_data->fax->dl_state_last NEQ ra_data->ker.state)
+    {
+      TRACE_EVENT_P2("KER:FAX_%d -> FAX_%d", ra_data->fax->dl_state_last, ra_data->ker.state);
+      ra_data->fax->dl_state_last = ra_data->ker.state;
+    }
+#endif
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_dl_sync_tch_start    |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void fax_dl_sync_tch_start(void)
+{
+  TRACE_FUNCTION("fax_dl_sync_tch_start");
+
+  if (shm_get_dsp_value (statd_b_syncdet) EQ 1)
+  {
+    /*
+     * Detection of sync frames, synchro. on M1 sequence.
+     * Start a pseudo timer with 500 ms.
+     * The value is decremented by cycle_time
+     * each time the L1 calls the dll_data_ul function
+     */
+    ra_data->sync_timer = 500L;
+
+    SET_STATE (KER, FAX_SYNCH_TCH_FOUND);
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+    if (ra_data->fax->dl_state_last NEQ ra_data->ker.state)
+    {
+      TRACE_EVENT_P2("KER:FAX_%d -> FAX_%d", ra_data->fax->dl_state_last, ra_data->ker.state);
+      ra_data->fax->dl_state_last = ra_data->ker.state;
+    }
+#endif
+
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_ul_sync_tch_found    |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void fax_ul_sync_tch_found(void)
+{
+  T_FAX *dfax = ra_data->fax;
+
+  TRACE_FUNCTION("fax_ul_sync_tch_found");
+
+  if (TimeOut(&ra_data->sync_timer) NEQ TRUE)
+    return;
+
+  /*
+   * timeout of the sync timer - reset the sync-detection flags
+   */
+  shm_set_dsp_value (act_b_syncul,  0);
+  shm_set_dsp_value (act_b_syncdl,  0);
+
+  if (ra_data->tra_rate NEQ TRA_FULLRATE_14400)
+  {
+    /*
+     * setup uplink buffer to send SYNC frames
+     */
+    shm_set_dsp_value (faxu_byte_cnt, 0);
+    shm_set_dsp_value (faxu_control, V_CTRL_SYNC);
+    dfax->seq_idx = 0;
+    SET_STATE (KER, FAX_WAIT_SYNC_LOST);
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+    if (dfax->dl_state_last NEQ ra_data->ker.state)
+    {
+      TRACE_EVENT_P2("KER:FAX_%d -> FAX_%d", dfax->dl_state_last, ra_data->ker.state);
+      dfax->dl_state_last = ra_data->ker.state;
+    }
+#endif
+
+  }
+  else /* ra_data->tra_rate EQ TRA_FULLRATE_14400 */
+  {
+    /*
+     * sync detection finished -> enter the data transmission (pre-) state
+     */
+    if (dfax->CMM_flag)
+    {
+      l1i_ra_modify_cnf();
+      SET_STATE (KER, FAX_DATA_TRANS);
+    }
+    else
+    {
+      l1i_ra_activate_cnf();
+      SET_STATE (KER, FAX_DATA_TRANS_PRE);
+    }
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+    if (dfax->dl_state_last NEQ ra_data->ker.state)
+    {
+      TRACE_EVENT_P2("KER:FAX_%d -> FAX_%d", dfax->dl_state_last, ra_data->ker.state);
+      dfax->dl_state_last = ra_data->ker.state;
+    }
+#endif
+
+#ifdef HO_WORKAROUND /* fax_ul_sync_tch_found */
+    if (*ra_data->shm.shm_addr[d_ra_conf] NEQ _act_d_ra_conf)
+    {
+      *ra_data->shm.shm_addr[d_ra_conf] = _act_d_ra_conf;
+      TRACE_EVENT("HO_REFRESH fax_ul_sync_tch_found");
+    }
+#endif
+
+  }
+}
+
+LOCAL void IncIndex(UBYTE *idx, UBYTE idxMax)
+{
+  if (++(*idx) EQ idxMax)
+    *idx = 0;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_dl_wait_sync_lost    |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void fax_dl_wait_sync_lost(void)
+{
+  T_FAX *dfax = ra_data->fax;
+
+  TRACE_FUNCTION("fax_dl_wait_sync_lost");
+
+  IncIndex(&dfax->seq_idx, 8);
+
+  if (shm_get_dsp_value (statd_b_syncdet) EQ 0)
+  {
+    /*
+     * sync detection finished -> enter the data transmission (pre-) state
+     */
+    if (dfax->CMM_flag)
+    {
+      l1i_ra_modify_cnf();
+      SET_STATE (KER, FAX_DATA_TRANS);
+    }
+    else
+    {
+      l1i_ra_activate_cnf();
+      SET_STATE (KER, FAX_DATA_TRANS_PRE);
+    }
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+    if (dfax->dl_state_last NEQ ra_data->ker.state)
+    {
+      TRACE_EVENT_P2("KER:FAX_%d -> FAX_%d", dfax->dl_state_last, ra_data->ker.state);
+      dfax->dl_state_last = ra_data->ker.state;
+    }
+#endif
+
+#ifdef HO_WORKAROUND /* fax_dl_wait_sync_lost */
+    if (*ra_data->shm.shm_addr[d_ra_conf] NEQ _act_d_ra_conf)
+    {
+      *ra_data->shm.shm_addr[d_ra_conf] = _act_d_ra_conf;
+      TRACE_EVENT("HO_REFRESH fax_dl_wait_sync_lost");
+    }
+#endif
+
+  }
+}
+
+#ifndef _SIMULATION_
+LOCAL void check_skip(USHORT fed_ul, BOOL *skip)
+{
+  if (*skip AND !fed_ul)
+  {
+    *skip = FALSE;
+#ifdef TRACE_RA_FAX_UL_SKIP
+    TRACE_EVENT_P1("fed_ul=%d -> skip -> FALSE", fed_ul);
+#endif
+  }
+  else if (!*skip AND fed_ul)
+  {
+    *skip = TRUE;
+#ifdef TRACE_RA_FAX_UL_SKIP
+    TRACE_EVENT_P1("fed_ul=%d-> skip -> TRUE", fed_ul);
+#endif
+  }
+}
+#endif
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_ul_data_trans        |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void fax_ul_data_trans(void)
+{
+  T_FAX *dfax = ra_data->fax;
+  USHORT bytes_used_after = 0;
+  BOOL skip;
+
+  USHORT fed_ul = shm_get_dsp_value(statu_b_fed_ul);
+
+  TRACE_FUNCTION ("fax_ul_data_trans");
+
+#if defined TRACE_RA_FAX_UL_FRAME_TYPE || defined _SIMULATION_
+  if (dfax->ul_ribu->idx.filled > 1)
+    TRACE_EVENT_P1("dfax->ul_ribu->idx.filled=%d", dfax->ul_ribu->idx.filled);
+#endif
+
+  if (dfax->ul_ribu->idx.filled)
+  {
+    dfax->ul_pFD = cl_ribu_get(dfax->ul_ribu);
+    dfax->ul_frame_type = dfax->ul_pFD->type;
+  }
+
+#if defined TRACE_RA_FAX_UL_FRAME_TYPE || defined _SIMULATION_
+  else
+  {
+    TRACE_EVENT_P1("dfax->ul_ribu->idx.filled=%d", dfax->ul_ribu->idx.filled);
+  }
+#endif
+
+  /*
+   * Check if we must skip this cycle.
+   * For status frames this is done every third status frame,
+   * because L1 sends more data (1,2,4,6) * 64 bit status frames.
+   * for T4DATA frames this also happens in 2400 bps mode
+   */
+  /*
+   * check if the frame type has changed
+   */
+  if (dfax->ul_frame_type_last NEQ dfax->ul_frame_type)
+  {
+    skip = (dfax->skip_seq[dfax->ul_frame_type_last].skip_seq_other[dfax->seq_idx] NEQ 0);
+
+#ifndef _SIMULATION_
+    check_skip(fed_ul, &skip);
+#endif
+
+    if ((dfax->ul_frame_type_last EQ FR_TRAIN) AND (dfax->train_len > 0))
+    {
+      /* Training is stopped only after a minimum length */
+      dfax->train_len--;
+      skip = TRUE;
+    }
+
+    if (!skip)
+    {
+      /*
+       * we are on a 64 bit boundary so we can write into the new frame. Reset all sequencers.
+       */
+      dfax->ul_frame_type_last = dfax->ul_frame_type;
+      dfax->seq_idx = 1;
+
+      /*
+       * start the request sequencer for T4DATA
+       */
+      if (dfax->ul_frame_type EQ FR_T4DATA)
+      {
+        dfax->req_idx = 1;
+      }
+      else
+      {
+        dfax->req_idx = 0;
+
+        /*
+         * Store training sequence. It will be used later, when changing
+         * to T4 data, in order to avoid insertion of sync frames.
+         */
+        if (dfax->ul_frame_type EQ FR_TRAIN)
+        {
+          dfax->train_seq[0] = dfax->ul_pFD->buf[0];
+          dfax->train_seq[1] = dfax->ul_pFD->buf[1];
+          dfax->train_len = MIN_FR_TRAIN_LEN - 1; /* Minimum length of training */
+        }
+      }
+    }
+    else /* skip */
+    {
+      IncIndex(&dfax->seq_idx, 8);
+
+      if (dfax->ul_frame_type_last EQ FR_T4DATA)
+      {
+        IncIndex(&dfax->req_idx, 4);
+      }
+    }
+  }
+  else /* frame type not changed */
+  {
+    skip = (dfax->skip_seq[dfax->ul_frame_type_last].skip_seq_same[dfax->seq_idx] NEQ 0);
+
+#ifndef _SIMULATION_
+    check_skip(fed_ul, &skip);
+#endif
+
+    IncIndex(&dfax->seq_idx, 8);
+
+    if (dfax->ul_frame_type EQ FR_T4DATA)
+    {
+      IncIndex(&dfax->req_idx, 4);
+    }
+    else if ((dfax->ul_frame_type_last EQ FR_TRAIN) AND (dfax->train_len > 0))
+    {
+      /* Training is stopped only after a minimum length */
+      dfax->train_len--;
+    }
+  }
+
+  if (!skip)
+  {
+    switch (dfax->ul_frame_type)
+    {
+      case FR_T4DATA:
+        shm_set_dsp_value (faxu_control, V_CTRL_DATA);
+        break;
+
+      case FR_STATUS:
+        shm_set_dsp_value (faxu_control, V_CTRL_STATUS);
+        break;
+
+      case FR_TRAIN:
+        shm_set_dsp_value (faxu_control, V_CTRL_TRAIN);
+        break;
+
+      case FR_SYNC:
+        shm_set_dsp_value (faxu_control, V_CTRL_SYNC);
+        shm_set_dsp_value (faxu_byte_cnt, 0);
+        break;
+    }
+    if (dfax->ul_frame_type NEQ FR_SYNC)
+    {
+      bytes_used_after = shm_set_dsp_buffer_new(dfax->ul_pFD, ra_data->shm.shm_addr[adr_faxu_data]+wof_faxu_data, 0, (USHORT)MAX_FAX_BUFFER_UL);
+      shm_set_dsp_value (faxu_byte_cnt, bytes_used_after);
+    }
+
+#if defined TRACE_RA_FAX_UL_FRAME_TYPE || defined _SIMULATION_
+    if (dfax->ul_pFD)
+      trace_ra_fax_ul_frame_type(dfax->ul_frame_type, dfax->ul_pFD->buf, bytes_used_after);
+#endif
+
+    ra_data->ra_ready_ind[0].req_frames = dfax->req_seq[dfax->req_idx];
+    l1i_ra_ready_ind(hCommFAD, 0);
+  }
+  else if (dfax->ul_frame_type_last EQ FR_TRAIN) /* skip AND train*/
+  {
+    shm_set_dsp_value (faxu_control, V_CTRL_TRAIN);
+    bytes_used_after = shm_set_dsp_buffer_new(&dfax->ul_train_FD, ra_data->shm.shm_addr[adr_faxu_data]+wof_faxu_data, 0, (USHORT)MAX_FAX_BUFFER_UL);
+    shm_set_dsp_value (faxu_byte_cnt, bytes_used_after);
+
+#if defined TRACE_RA_FAX_UL_FRAME_TYPE || defined _SIMULATION_
+    trace_ra_fax_ul_frame_type(V_CTRL_TRAIN, dfax->ul_train_FD.buf, bytes_used_after);
+#endif
+
+  }
+  else /* skip */
+  {
+    shm_set_dsp_value (faxu_byte_cnt, 0);
+
+#if defined TRACE_RA_FAX_UL_FRAME_TYPE || defined _SIMULATION_
+    trace_ra_fax_ul_frame_type(4, NULL, 0);
+#endif
+
+  }
+}
+
+LOCAL U8 get_frame_descriptor(U8 bytes_to_read)
+{
+  T_FAX *dfax = ra_data->fax;
+
+  U8 bytes_read;
+
+#ifdef _SIMULATION_
+  dfax->dl_pFD = cl_ribu_get_new_frame_desc(ra_data->dl_ribu);
+#else
+  dfax->dl_pFD = fad_rbm_get_next_FrameDesc();
+#endif
+
+  dfax->dl_pFD->len = FAD_DESCBUF_LEN;
+  bytes_read = shm_get_dsp_buffer_new(ra_data->shm.shm_addr[adr_faxd_data]+wof_faxd_data, bytes_to_read, dfax->dl_pFD);
+
+  return bytes_read;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)        MODULE  : RA_FAX                   |
+| STATE   : code                  ROUTINE : fax_dl_data_trans        |
++--------------------------------------------------------------------+
+
+  PURPOSE :
+*/
+
+GLOBAL void fax_dl_data_trans(void)
+{
+  UBYTE bytes_to_read, bytes_read = 0;
+  UBYTE dl_frame_type;
+
+  T_FAX *dfax = ra_data->fax;
+
+  TRACE_FUNCTION ("fax_dl_data_trans");
+
+#ifdef HO_WORKAROUND /* fax_dl_data_trans */
+  if (*ra_data->shm.shm_addr[d_ra_conf] NEQ _act_d_ra_conf)
+  {
+    *ra_data->shm.shm_addr[d_ra_conf] = _act_d_ra_conf;
+    TRACE_EVENT("HO_REFRESH fax_dl_data_trans");
+  }
+#endif
+
+  dl_frame_type = shm_get_dsp_value (faxd_control);
+
+  if (dl_frame_type EQ V_CTRL_SYNC)
+  {
+    bytes_read = get_frame_descriptor(0);
+    dfax->dl_pFD->len = bytes_read;
+    dfax->dl_pFD->type = dl_frame_type;
+    l1i_ra_data_ind(hCommFAD);
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+    trace_ra_fax_dl_frame_type(&dfax->dl_frame_type_last, dl_frame_type, bytes_read);
+#endif
+
+  }
+  else
+  {
+    bytes_to_read = shm_get_dsp_value (faxd_byte_cnt);
+
+    if (bytes_to_read > 0)
+    {
+      bytes_read = get_frame_descriptor(bytes_to_read);
+      shm_set_dsp_value (faxd_byte_cnt, 0);
+    }
+
+    if (bytes_read)
+    {
+      dfax->dl_pFD->len = bytes_read;
+      dfax->dl_pFD->type = dl_frame_type;
+      l1i_ra_data_ind(hCommFAD);
+
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+      trace_ra_fax_dl_frame_type(&dfax->dl_frame_type_last, dl_frame_type, bytes_read);
+#endif
+
+    }
+  }
+#if defined TRACE_RA_FAX_DL_FRAME_TYPE || defined _SIMULATION_
+  dfax->dl_frame_type_last = dl_frame_type;
+#endif
+}