view src/g23m-fad/l2r/l2r.h @ 78:c632896652ba

mfw/ti1_key.c: properly initialize notified_keys array The code in this ti1_key.c layer needs to call kpd_subscribe() and kpd_define_key_notification() functions in order to register with the KPD driver. The original code passed KPD_NB_PHYSICAL_KEYS in nb_notified_keys - this constant is defined to 24 in kpd_cfg.h on all platforms of interest to us - but it only filled the first 23 slots in the notified_keys array, resulting in stack garbage being passed to KPD API functions. The fix consists of initializing the last missed array slot to KPD_KEY_RECORD, the key ID for the right side button on the D-Sample handset. On our current hw targets this "Record" button exists as the EXTRA button on our Luna keypad board and as the camera button on the Pirelli DP-L10. There is no support whatsoever for this button in current BMI+MFW, we have no plans of doing anything with Pirelli's camera button even if we do get our UI fw running on that phone, and the Mother's dream of building our own FreeCalypso handset with the same button arrangement as D-Sample (including the right side button) is currently very nebulous - but let us nonetheless handle the full set of buttons on the KPD to MFW interface, and let upper layers weed out unsupported buttons.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 25 Oct 2020 23:41:01 +0000
parents fa8dc04885d8
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  CSD (8411)
|  Modul   :  l2r.h
+----------------------------------------------------------------------------- 
|  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 :  Definitions for the Protocol Stack Entity
|             L2R
+----------------------------------------------------------------------------- 
*/ 

#ifndef L2R_H
#define L2R_H

/*
 * Conditional Compiling
 */

#define L2R_TRACE_FLOW
 
/*
 * instance management
 */
#define GET_INSTANCE(p) &l2r_data_base[0]
#define L2R_INSTANCES   1

/*
 * Types
 */

typedef enum
{
  NONTRANSP = 0,
  TRANSP    = 1
} T_MODE;

/*
 * Constants
 */

/*
 * information for dti library
 */
#define L2R_DTI_UP_INTERFACE      0
#define L2R_DTI_UP_CHANNEL        0
#define L2R_DTI_UP_DEF_INSTANCE   0
#define L2R_DTI_UPLINK_QUEUE_SIZE 0
#define L2R_BREAK_LEN             2

#define TIMER_TUP_SND    1

/*
 * global unchangeable constants
 */

#define DATA_SIZE_SHORT        25     /* num of data bytes in l2r frame (short format) */
#define DATA_SIZE_LONG         67     /* num of data bytes in l2r frame (long format)*/

#define LL_TO   TUP_SND_VALUE /* default value for timer UP_SND (lower layer waiting for data) */

 /*
 * derived constants
 */
#define HEADER_LEN    (RLP_HEADER_LEN/8) /* 16 / 8 = 2 */
#define TRAILER_LEN   0 /* No CRC -> no trailer */
#define HT_LEN        (HEADER_LEN + TRAILER_LEN)

#define RLP_FRAME_SIZE_SHORT  (DATA_SIZE_SHORT + HT_LEN)
#define RLP_FRAME_SIZE_LONG   (DATA_SIZE_LONG  + HT_LEN)

#define L2R_FRAMES_PER_PRIM_MAX  ((L2R_BYTES_PER_PRIM_MAX + RLP_FRAME_SIZE_SHORT - 1) / RLP_FRAME_SIZE_SHORT)

#define L2R_ENCODING_OFFSET (HEADER_LEN)        /* Offset L2R frame in RLP frame in bytes */

#define MAX_UP_REMAP_QUEUE_SIZE (MAX_UP_PRIMS + L2R_K_MS_IWF_MAX + 1)
#define UP_REMAP_BUFFER_SIZE  20

/* global user specific constants */

#define MAX_UP_PRIMS        17  /* Maximum number of primitives, which L2R holds for sending, */
#define MAX_DL_PRIMS        17  /* Maximum number of primitives, which L2R holds for receiving */
                                /* 17 prims * 10 Frames * 25 Bytes * 8 Bit = 34000 Bit (>32kBit)*/
                                /* if there are less than 10 frames per primitive, then the maximum */
                                /* buffer size will be smaller. */

#define UP_RIBU_PREALLOC    2   /* Number of primitives to be preallocated (minimum: 2) */
#define MIN_RIBU_SIZE       3   /* Minimum ring buffer size (send and receive) */
                                /* minimum: UP_RIBU_PREALLOC+1 */

/* constants for L2RCOP status octets */

#define SO_ADR_MASK           0x1F  /* 0b00011111 */
#define SO_ADR_MASK_TWO_OCT   0x7F  /* 0b01111111 */

#define SO_TWO_OCTET 27 /* 0b11011 */
#define SO_BREAK_ACK 28 /* 0b11100 */
#define SO_BREAK_REQ 29 /* 0b11101 */
#define SO_END_FULL  30 /* 0b11110 */
#define SO_END_EMPTY 31 /* 0b11111 */

#define SO_SA_BIT 7
#define SO_SB_BIT 6
#define SO_X_BIT  5

#define SO_SA_BIT_MASK 0x80
#define SO_SB_BIT_MASK 0x40
#define SO_X_BIT_MASK  0x20

#define SO_STATUS_BITS_MASK   (SO_SA_BIT_MASK + SO_SB_BIT_MASK)

#define GET_SO_SA_BIT(oct)    (((oct) & SO_SA_BIT_MASK) >> SO_SA_BIT)
#define GET_SO_SB_BIT(oct)    (((oct) & SO_SB_BIT_MASK) >> SO_SB_BIT)
#define GET_SO_X_BIT(oct)     (((oct) & SO_X_BIT_MASK)  >> SO_X_BIT)

/*
#define CLR_BIT(oct, bit)     (oct &= ~(1<<bit))
*/
#define SET_BIT(oct, bit)     (oct |=  (1<<bit))

/*
 * Bitoffset for encoding/decoding
 */
#define ENCODE_OFFSET        0

#ifndef NTRACE

/* for trace purposes */

#define SERVICE_NAME_DTI    "DTI"
#define SERVICE_NAME_MGT    "MGT"
#define SERVICE_NAME_CONIND "CONIND"
#define SERVICE_NAME_BREAK  "BREAK"
#define SERVICE_NAME_UP     "UP"
#define SERVICE_NAME_UP_UL  "UP_UL"
#define SERVICE_NAME_UP_LL  "UP_LL"
#define SERVICE_NAME_DN     "DN"
#define SERVICE_NAME_DN_UL  "DN_UL"
#define SERVICE_NAME_DN_LL  "DN_LL"

#endif

#define DTI     dti.

#define MGT     mgt.
#define CONIND  mgt.ConIndState.
#define BREAK   mgt.BreakState.

#define UP      up.
#define UP_UL   up.UL_State.
#define UP_LL   up.LL_State.

#define DN      dn.
#define DN_UL   dn.UL_State.
#define DN_LL   dn.LL_State.

/*
 * States of the entity process MGT
 */
#define MGT_DETACHED                0
#define MGT_PENDING_ATTACH          1
#define MGT_ATTACHED                2
#define MGT_PENDING_CONNECT         3
#define MGT_CONNECTED               4
#define MGT_DISCONNECT_INITIATED    5
#define MGT_PENDING_DETACH          6
#define MGT_PERMANENT_ERROR         7

/*
 * States of the entity process DN
 */
#define DN_DISCONNECTED             0
#define DN_CONNECTED                1
#define DN_WAIT_FIRST_DATA          2

/*
 * States of the entity process UP
 */
#define UP_DISCONNECTED             0
#define UP_CONNECTED                1
#define UP_REMAP                    2

/*==== TYPES ======================================================*/

/**********************************************************************************/
/*
 * L2R global typedefs
 */

#define IW_IDLE 0
#define IW_WAIT 1

#define ISW_IDLE 0
#define ISW_SEND 1
#define ISW_WAIT 2

#define FL_INACTIVE  0
#define FL_ACTIVE    1
#define FL_INVALID   2

typedef UBYTE  T_FLOW;
typedef UBYTE  T_BIT;
typedef UBYTE  T_PRIM_INDEX;
typedef UBYTE  T_UP_REMAP_PRIM_INDEX;
typedef UBYTE* T_P_UBYTE;
/*
typedef UBYTE  T_L2R_FRAME_SHORT[DATA_SIZE_SHORT];
*/
typedef UBYTE T_L2R_FRAME_LONG[DATA_SIZE_LONG];

typedef T_L2R_FRAME_LONG*     T_P_L2R_FRAME;
typedef T_P_L2R_FRAME         T_ADR_VECTOR[L2R_FRAMES_PER_PRIM_MAX];
typedef T_ADR_VECTOR*         T_P_ADR_VECTOR;
typedef T_RLP_REMAP_DATA_IND* T_P_RLP_REMAP_DATA_IND;

typedef struct
{
  T_PRIM_INDEX            nFr;        /* number of entries in vectors */
  T_ADR_VECTOR            adr;        /* array of adress vectors */
  T_PRIM_INDEX            index;      /* vector index of current frame */
  UBYTE                   offset;     /* offset in current frame */
  UBYTE                   off_status; /* offset of status octet in current frame */
  T_P_RLP_REMAP_DATA_IND  prim;       /* pointer to primitive (for FREE etc.) */
} T_RPRIM_DESCRIPTOR;                 /* remap primitive descriptor */

/**********************************************************************************/
/*
 * Process downlink specific types
 */

typedef T_RLP_DATA_IND*    T_P_RLP_DATA_IND;

typedef struct
{
  T_PRIM_INDEX      nFr;        /* number of entries in vectors */
  T_P_ADR_VECTOR    dadr;       /* pointer to adress vector */
  T_PRIM_INDEX      index;      /* vector index of current frame */
  UBYTE             offset;     /* offset in current frame */
  UBYTE             off_status; /* offset of status octet in current frame */
  T_P_RLP_DATA_IND  prim;       /* pointer to primitive (for FREE etc.) */
} T_DPRIM_DESCRIPTOR;

typedef T_DPRIM_DESCRIPTOR*  T_P_DPRIM_DESCRIPTOR;

typedef UBYTE T_PRIM_DESC_RIBU_INDEX;
typedef UBYTE T_PRIM_DESC_RIBU_SIZE;

/*
 * D o w n l i n k   R i n g   B u f f e r
 *
 * The Downlink Ring Buffer is an ordinary ring buffer. The L2RCOP entity
 * writes received primitives into the buffer, the relay entity reads them
 * from the buffer, and then the L2RCOP entity frees the primitive.
 */


/*
 * Ring buffer is by one bigger than max. number of prims,
 * because it needs always one empty entry
 */
#define MAX_DPRIM_RIBU_SIZE     (MAX_DL_PRIMS + 1)

typedef struct
{
  /*
  The field read may be written only by the relay entity.
  The other fields may be written only by the L2RCOP entity.
  If the relay entity finds a NULL pointer at the read position,
  then it doesn't read any data.
  */
  T_PRIM_DESC_RIBU_INDEX  free; /* current free index in primDesc array */
  T_RIBU                  idx;
  T_P_DPRIM_DESCRIPTOR    _primDesc[MAX_DPRIM_RIBU_SIZE];
} T_DPRIM_DESC_RIBU;


/**********************************************************************************/
/*
 * Process uplink specific types
 */

typedef T_RLP_DATA_REQ*    T_P_RLP_DATA_REQ;

typedef struct
{
  /* The fields index, offset and full may be written only by the relay entity */
  /* The other fields may be written only by the L2RCOP entity */

  T_PRIM_INDEX      nFr;        /* number of entries in vectors */
  T_P_ADR_VECTOR    adr;        /* pointer to adress vector */
  T_PRIM_INDEX      index;      /* vector index of current frame */
  UBYTE             offset;     /* offset in current frame */
  UBYTE             off_status; /* offset of status octet in current frame */
  BOOL              full;       /* primitive is filled up and ready for sending */
  T_FLOW            sa;         /* last sa bit in this primitive */
  T_FLOW            sb;         /* last sb bit in this primitive */
  T_P_RLP_DATA_REQ  prim;       /* pointer to primitive (for FREE etc.) */
} T_UPRIM_DESCRIPTOR;

typedef T_UPRIM_DESCRIPTOR*  T_P_UPRIM_DESCRIPTOR;

/*
 * U p l i n k   R i n g   B u f f e r
 *
 *  The L2RCOP entity can take a primitive away from the relay entity. This
 *  happens, when there are not enough data to be sent and the timer expires.
 *  In this case the L2RCOP entity takes the half ready primitive and sends
 *  it to RLP
 *
 *  The handling of the ring buffer is as follows:
 *
 *  *   The L2RCOP entity allocates a number of primitives. The slot in which
 *      the next primitive has to be allocated is indicated by the alloc index.
 *      Besides the primitive, which is just beeing filled by the relay
 *      entity, there should be one complete empty primitive ready. This
 *      means that the alloc index is at least by two greater than the write
 *      index, unless the L2RCOP entity can not provide new primitives quick
 *      enough.
 *  *   The relay entity writes data into the primitive indicated by the write
 *      index.
 *  *   When a primitive is filled up, the relay advances the write pointer and
 *      sends a DTI2_DATA_REQ primitive to the L2RCOP entity.
 *  *   When the L2RCOP entity receives the DTI2_DATA_REQ primitive it takes the
 *      primitive at the read position (which usually is identical with the
 *      previous write position), and advances the read index.
 *      Then it sends the primitive to the lower layer,
 *      and checks, if a new primitive has to be allocated. 
 *  *   When a timeout occurs, the L2RCOP entity locks the complete buffer.
 *      If no primitive is in the ring buffer (i.e read = write = alloc), a
 *      new primitive is allocated and sent as an empty primitive to the lower
 *      layer. If a completely filled primitive is in the buffer (i.e write /=
 *      read), this primitive is sent in the regular way. Otherwise there is
 *      a partial filled or empty primitive in the buffer (write /= alloc).
 *      Then this primitive is sent and the write index is incremented. In the
 *      case of a partial filled primitive the last uncompleted L2R status
 *      octet has to be finished before sending the primitive. Finally it
 *      is checked, if a new primitive has to be allocated.
 *  *   When a break is requested from the upper layer, the data are discarded
 *      and a BREAK signal is put into a new primitive and sent to the lower layer.
 *      Then the buffer is new initialised.
 */

/*
 * Ring buffer is by one bigger than max. number of prims, because it
 * needs always one empty entry
 */
#define MAX_UPRIM_RIBU_SIZE (MAX_UP_PRIMS+1)

typedef struct
{
  /*
  The field write may be written only by the relay entity.
  The other fields may be written only by the L2RCOP entity.
  If the relay entity finds a NULL pointer at the write position,
  then it doesn't write any data.
  */
  T_PRIM_DESC_RIBU_INDEX    alloc;          /* current alloc index in primDesc array */
  T_RIBU                    idx;
  T_P_UPRIM_DESCRIPTOR      primDesc[MAX_UPRIM_RIBU_SIZE];
} T_UPRIM_DESC_RIBU;


/**********************************************************************************/
/*
 * Relay entity specific types
 */


/**********************************************************************************/
/*
 * process global data
 */

/**********************************************************************************/

typedef struct
{
  UBYTE state;
#ifndef NTRACE
  char *name;
  char *state_name;
#endif
} T_SUB_STATE;

/*
 * data for process management
 */

typedef struct
{
  UBYTE state;
#ifndef NTRACE
  char *name;
  char *state_name;
#endif

  T_SUB_STATE BreakState;
  T_SUB_STATE ConIndState;    /* IW_WAIT: RLP_CONNECT_IND is pending during MGT_PENDING_ATTACH*/
  
  BOOL        Connected;      /* Indicates, that L2R is in the connected state */
  BOOL        FlowCtrlUsed;   /* Flow Control is used (no COPnoFlCt) */

  T_PRIM_DESC_RIBU_SIZE    RiBuSize;       /* Size of ring buffers (number of primitives) */
  
  ULONG       link_id;        /* Channel identifier             */
  UBYTE       InstID;         /* instance identifier */
  USHORT      FrameSize;      /* Size of frame, (RLP_FRAME_SIZE_LONG or RLP_FRAME_SIZE_SHORT) */
  UBYTE       FramesPerPrim;  /* Number of frames per primitive */
  ULONG       ConnectPrimType;/* {L2R_CONNECT_CNF, L2R_CONNECT_IND} */
} T_MGT;

/**********************************************************************************/
/*
 * data for process downlink
 */

typedef struct
{
  UBYTE state;
#ifndef NTRACE
  char *name;
  char *state_name;
#endif

  T_SUB_STATE               UL_State;     /* State of upper layer (only for test environment) */
                                          /* WAIT: Upper layer is waiting for data from L2R */

  T_SUB_STATE               LL_State;     /* State of lower layer */
                                          /* WAIT: L2R has requested data from LL and is still waiting for it */
  
  BOOL                      FlowCtrlUsed; /* Flow control is used */
  UBYTE                     InstID;       /* instance number */
  ULONG                     link_id;      /* Channel identifier             */
  BOOL                      DtiConnected; /* DTI is connected */
  T_FLOW                    DnFlow;       /* Flow control state for downlink data transfer */
  T_FLOW                    UpFlow;       /* Flow control state for uplink data transfer */
  T_FLOW                    ULFlow;       /* Flow control state of upper layer */
  T_FLOW                    LLFlow;       /* Flow control state of lower layer */
  T_FLOW                    MrgFlow;      /* Merged flow control state = LLFlow + UpFlow */
#ifdef L2R_TRACE_FLOW
  T_FLOW                    LastSentFlow; /* Last flow control state, sent to DTI */
#endif
  BOOL                      ReportMrgFlow;/* Merged flow has changed and must be reported to upper layer */
  T_PRIM_DESC_RIBU_INDEX    FlowThresh;   /* Threshold for flow control */
  UBYTE                     LastState;    /* Last received state (sa, sb, x as in status octet) */
  
  T_DTI2_DATA_IND           *Brk_dti_data_ind; /* data indication for relaying break indication */

  T_DPRIM_DESC_RIBU         RiBu;
  T_DPRIM_DESCRIPTOR        PrimDesc[MAX_DPRIM_RIBU_SIZE];
  T_ADR_VECTOR              AdrVec[MAX_DPRIM_RIBU_SIZE];

} T_DN;

/**********************************************************************************/
/*
 * data for process uplink
 */

typedef struct
{
  UBYTE state;
#ifndef NTRACE
  char *name;
  char *state_name;
#endif

  T_SUB_STATE             UL_State;        /* State of upper layer (only for test environment) */
                                           /* IW_'WAIT': L2R is waiting for data from upper layer*/

  T_SUB_STATE             LL_State;        /* State of lower layer */
                                           /* ISW_WAIT: LL has requested data and is still waiting for it */
                                           /* ISW_SEND: data are ready for sending, but no request from LL */

  BOOL                    FlowCtrlUsed;    /* Flow control is used */
  UBYTE                   InstID;          /* instance number */
  ULONG                   link_id;         /* Channel identifier */
  BOOL                    DtiConnected;    /* DTI is connected */
  T_FLOW                  DnFlow;          /* Flow control state for downlink data transfer */
  T_FLOW                  UpFlow;          /* Flow control state for uplink data transfer */
  T_FLOW                  ULFlow;          /* Flow control state of upper layer */
  T_FLOW                  LLFlow;          /* Flow control state of lower layer */
  T_FLOW                  MrgFlow;         /* Merged flow control state = UP_ULFlow + UP_DNFlow */
  T_PRIM_DESC_RIBU_INDEX  FlowThreshLo;    /* Low Threshold for flow control */
  T_PRIM_DESC_RIBU_INDEX  FlowThreshHi;    /* High Threshold for flow control */
  USHORT                  DataSize;	   	   /* Size of data, (calculated from FrameSize) */
  USHORT                  FrameSize;       /* Size of frame, (RLP_FRAME_SIZE_LONG or RLP_FRAME_SIZE_SHORT) */
  USHORT                  OldFrameSize;    /* Size of RLP frame (before REMAP command) */
  UBYTE                   FramesPerPrim;
  UBYTE                   LastRcvdSa;      /* Last received value of sa */
  UBYTE                   LastRcvdSb;      /* Last received value of sb */
  UBYTE                   LastSentSa;      /* Last sent value of sa */
  UBYTE                   LastSentSb;      /* Last sent value of sb */
  T_FLOW                  LastSentFlow;    /* Last sent value of flow control */

  T_DTI2_DATA_REQ        *Prim;            /* For DTI interface to hold last received primitive */

  T_UPRIM_DESC_RIBU       RiBu;
  T_UPRIM_DESCRIPTOR      PrimDesc[MAX_UPRIM_RIBU_SIZE];
  T_ADR_VECTOR            AdrVec[MAX_UPRIM_RIBU_SIZE];

  BOOL                    StoreDataActive; /* prevents recursive calls of up_store_data */
  BOOL                    UrgentMsg;       /* A BREAK primitive is waiting to be sent */
  BOOL                    DiscardRemapData;/* Data in RLP_REMAP_DATA_IND have to be discarded */
  T_RPRIM_DESCRIPTOR      QRemapPrimDesc;
  T_P_RLP_REMAP_DATA_IND  QRemap[MAX_UP_REMAP_QUEUE_SIZE]; /* Queue for primitives, which have to be remapped */
  T_UP_REMAP_PRIM_INDEX   QRemapRead;      /* Read index for REMAP Queue */
  T_UP_REMAP_PRIM_INDEX   QRemapWrite;     /* Write index for REMAP Queue */
  UBYTE                   BRemap[UP_REMAP_BUFFER_SIZE]; /* Char. buffer for copying data from REMAP Queue */
  T_P_UBYTE               BRemapAdr;       /* Start address in remap buffer */
  USHORT                  BRemapLen;       /* Number of bytes in remap buffer */
  UBYTE                   BRemapSa;        /* Value of SA in remap buffer */
  UBYTE                   BRemapSb;        /* Value of SB in remap buffer */
  UBYTE                   BRemapLastState; /* Last state in remap buffer (sa, sb, x as in status octet) */
} T_UP;

/**********************************************************************************/
/*
 * data for relay entity
 */

/*
 * entity data for each L2R instance
 */

typedef struct
{
  T_SUB_STATE dti; /* state variable for DTI library */
  T_MGT mgt;       /* process management */
  T_DN  dn;        /* process downlink */
  T_UP  up;        /* process uplink */
} T_L2R_DATA;


/*==== EXPORT =====================================================*/
/*
 * data base
 */

EXTERN T_L2R_DATA  l2r_data_base [];
EXTERN T_L2R_DATA *l2r_data;
EXTERN ULONG       l2r_data_magic_num;

#define L2R_DATA_MAGIC_NUM (('L'<<24) + ('2'<<16) + ('R'<<8))   /* "L2R",NUL */

#define ENTITY_DATA l2r_data

/*
 *  Prototypes
 *
 *  L2R MANAGEMENT
 *
 *  MANAGEMENT primitive processing
 */


#ifdef OPTION_MULTITHREAD
  #define mgt_l2r_connect_cnf         _ENTITY_PREFIXED(mgt_l2r_connect_cnf)
  #define mgt_l2r_activate_req        _ENTITY_PREFIXED(mgt_l2r_activate_req)
  #define mgt_l2r_deactivate_req      _ENTITY_PREFIXED(mgt_l2r_deactivate_req)
  #define mgt_l2r_connect_req         _ENTITY_PREFIXED(mgt_l2r_connect_req)
  #define mgt_l2r_disc_req            _ENTITY_PREFIXED(mgt_l2r_disc_req)
  #define mgt_l2r_dti_req             _ENTITY_PREFIXED(mgt_l2r_dti_req)
  
  #define mgt_rlp_detach_cnf          _ENTITY_PREFIXED(mgt_rlp_detach_cnf)
  #define mgt_rlp_connect_ind         _ENTITY_PREFIXED(mgt_rlp_connect_ind)
  #define mgt_rlp_connect_cnf         _ENTITY_PREFIXED(mgt_rlp_connect_cnf)
  #define mgt_rlp_disc_ind            _ENTITY_PREFIXED(mgt_rlp_disc_ind)
  #define mgt_rlp_disc_cnf            _ENTITY_PREFIXED(mgt_rlp_disc_cnf)
  #define mgt_rlp_reset_ind           _ENTITY_PREFIXED(mgt_rlp_reset_ind)
  #define mgt_rlp_reset_cnf           _ENTITY_PREFIXED(mgt_rlp_reset_cnf)
  #define mgt_rlp_ui_ind              _ENTITY_PREFIXED(mgt_rlp_ui_ind)
  #define mgt_rlp_xid_ind             _ENTITY_PREFIXED(mgt_rlp_xid_ind)
  #define mgt_rlp_error_ind           _ENTITY_PREFIXED(mgt_rlp_error_ind)
  #define mgt_rlp_statistic_ind       _ENTITY_PREFIXED(mgt_rlp_statistic_ind)
#endif

EXTERN void mgt_l2r_connect_cnf      (UBYTE                   nack);
EXTERN void mgt_l2r_activate_req     (T_L2R_ACTIVATE_REQ     *l2r_activate_req);
EXTERN void mgt_l2r_deactivate_req   (T_L2R_DEACTIVATE_REQ   *l2r_deactivate_req);
EXTERN void mgt_l2r_connect_req      (T_L2R_CONNECT_REQ      *l2r_connect_req);
EXTERN void mgt_l2r_disc_req         (T_L2R_DISC_REQ         *l2r_disc_req);
EXTERN void mgt_l2r_dti_req          (T_L2R_DTI_REQ          *l2r_dti_req);

EXTERN void mgt_rlp_detach_cnf       (T_RLP_DETACH_CNF       *rlp_detach_cnf);
EXTERN void mgt_rlp_connect_ind      (T_RLP_CONNECT_IND      *rlp_connect_ind);
EXTERN void mgt_rlp_connect_cnf      (T_RLP_CONNECT_CNF      *rlp_connect_cnf);
EXTERN void mgt_rlp_disc_ind         (T_RLP_DISC_IND         *rlp_disc_ind);
EXTERN void mgt_rlp_disc_cnf         (T_RLP_DISC_CNF         *rlp_disc_cnf);
EXTERN void mgt_rlp_reset_ind        (T_RLP_RESET_IND        *rlp_reset_ind);
EXTERN void mgt_rlp_reset_cnf        (T_RLP_RESET_CNF        *rlp_reset_cnf);
EXTERN void mgt_rlp_ui_ind           (T_RLP_UI_IND           *rlp_ui_ind);
EXTERN void mgt_rlp_xid_ind          (T_RLP_XID_IND          *rlp_xid_ind);
EXTERN void mgt_rlp_error_ind        (T_RLP_ERROR_IND        *rlp_error_ind);
EXTERN void mgt_rlp_statistic_ind    (T_RLP_STATISTIC_IND    *rlp_statistic_ind);


/*
 *  MANAGEMENT signal processing
 */
#ifdef OPTION_MULTITHREAD
  #define sig_dn_mgt_break_ind      _ENTITY_PREFIXED(sig_dn_mgt_break_ind)
  #define sig_dn_mgt_first_data_ind _ENTITY_PREFIXED(sig_dn_mgt_first_data_ind)
  #define sig_up_mgt_break_ind      _ENTITY_PREFIXED(sig_up_mgt_break_ind)
#endif

EXTERN void sig_dn_mgt_break_ind(T_BIT sa, T_BIT sb, T_FLOW flow);
EXTERN void sig_dn_mgt_first_data_ind(void);
EXTERN void sig_up_mgt_break_ind(T_DTI2_DATA_REQ  *dti_data_req);

/*
 *  MANAGEMENT procedures
 */

#ifdef OPTION_MULTITHREAD
  #define mgt_init                      _ENTITY_PREFIXED(mgt_init              )
  #define mgt_checkpar                  _ENTITY_PREFIXED(mgt_checkpar          )
  #define mgt_deinit_connection         _ENTITY_PREFIXED(mgt_deinit_connection )
  #define mgt_init_connection           _ENTITY_PREFIXED(mgt_init_connection   )
  #define mgt_send_l2r_error_ind        _ENTITY_PREFIXED(mgt_send_l2r_error_ind)
#endif

EXTERN void mgt_init(T_MGT *dmgt);
EXTERN BOOL mgt_checkpar(T_L2R_ACTIVATE_REQ *ar);
EXTERN void mgt_deinit_connection(void);
EXTERN void mgt_init_connection(BOOL indication);
EXTERN void mgt_send_l2r_error_ind(USHORT cause);

/*
 *  L2R DN
 *
 *  DN primitive processing
 */

#ifdef OPTION_MULTITHREAD
  #define dn_rlp_data_ind        _ENTITY_PREFIXED(dn_rlp_data_ind)
#endif

EXTERN void dn_rlp_data_ind       (T_RLP_DATA_IND       *rlp_data_ind);

/*
 *  DN signal processing
 */

#ifdef OPTION_MULTITHREAD
  #define sig_mgt_dn_conn_req       _ENTITY_PREFIXED(sig_mgt_dn_conn_req)
  #define sig_mgt_dn_disc_req       _ENTITY_PREFIXED(sig_mgt_dn_disc_req)
  #define sig_mgt_dn_break_req      _ENTITY_PREFIXED(sig_mgt_dn_break_req)
  #define sig_mgt_dn_clear_req      _ENTITY_PREFIXED(sig_mgt_dn_clear_req)
  #define sig_mgt_dn_reconn_req     _ENTITY_PREFIXED(sig_mgt_dn_reconn_req)
  #define sig_mgt_dn_dti_conn_setup _ENTITY_PREFIXED(sig_mgt_dn_dti_conn_setup)
  #define sig_up_dn_flow            _ENTITY_PREFIXED(sig_up_dn_flow)
  #define sig_up_dn_ul_flow         _ENTITY_PREFIXED(sig_up_dn_ul_flow)
  #define sig_mgt_dn_send_break_req _ENTITY_PREFIXED(sig_mgt_dn_send_break_req)
#endif

EXTERN void sig_mgt_dn_conn_req(BOOL flowCtrlUsed, T_PRIM_DESC_RIBU_SIZE riBuSize, UBYTE inst_id);

EXTERN void sig_mgt_dn_disc_req   (void);
EXTERN void sig_mgt_dn_break_req  (void);
EXTERN void sig_mgt_dn_clear_req  (void);
EXTERN void sig_mgt_dn_reconn_req (void);
EXTERN void sig_mgt_dn_dti_conn_setup (ULONG link_id);
EXTERN void sig_up_dn_flow        (T_FLOW);     /* Flow Control Active */
EXTERN void sig_up_dn_ul_flow     (T_FLOW);     /* Flow Control Active */
EXTERN void sig_mgt_dn_send_break_req();

/*
 *  DN procedures
 */

#ifdef OPTION_MULTITHREAD
  #define dn_init               _ENTITY_PREFIXED(dn_init               )
  #define dn_check_flow         _ENTITY_PREFIXED(dn_check_flow         )
  #define dn_send_data_ind      _ENTITY_PREFIXED(dn_send_data_ind      )
  #define dn_scan_break_req     _ENTITY_PREFIXED(dn_scan_break_req     )
  #define dn_free_all_prims     _ENTITY_PREFIXED(dn_free_all_prims     )
  #define dn_cond_free_prims    _ENTITY_PREFIXED(dn_cond_free_prims    )
  #define dn_store_prim         _ENTITY_PREFIXED(dn_store_prim         )
  #define dn_cond_report_status _ENTITY_PREFIXED(dn_cond_report_status )
  #define dn_init_ribu          _ENTITY_PREFIXED(dn_init_ribu          )
  #define dn_cond_req_data      _ENTITY_PREFIXED(dn_cond_req_data      )
  #define dn_merge_flow         _ENTITY_PREFIXED(dn_merge_flow         )
  #define dn_store_status       _ENTITY_PREFIXED(dn_store_status       )
  #define dn_cond_report_status _ENTITY_PREFIXED(dn_cond_report_status )
#endif

EXTERN void dn_init(T_DN *ddn);
EXTERN void dn_check_flow(void);
EXTERN void dn_send_data_ind(void);

EXTERN void               dn_scan_break_req
                          (
                            T_P_RLP_DATA_IND  data_ind,
                            BOOL             *found,
                            T_PRIM_INDEX     *index,
                            T_PRIM_INDEX     *frames,
                            T_PRIM_INDEX     *emptyfr,
                            T_BIT            *sa,
                            T_BIT            *sb,
                            T_FLOW           *flow_brk,
                            T_FLOW           *flow_gen
                          );

EXTERN void               dn_store_prim
                          (
                            T_P_RLP_DATA_IND  data_ind,
                            T_PRIM_INDEX      index
                          );

EXTERN void               dn_free_all_prims
                          (
                            void
                          );

EXTERN void               dn_cond_free_prims
                          (
                            void
                          );

EXTERN void               dn_init_ribu
                          (
                            void
                          );

GLOBAL void               dn_cond_report_status
                          (
                            void
                          );

EXTERN void               dn_cond_req_data
                          (
                            void
                          );

EXTERN void               dn_store_status
                          (
                             T_FLOW  flow
                          );

EXTERN void               dn_merge_flow
                          (
                            void
                          );

EXTERN void               dn_cond_report_status
                          (
                            void
                          );

/*
 *  L2R UP
 *
 *  UP primitive processing
 */

#ifdef OPTION_MULTITHREAD
  #define up_rlp_ready_ind           _ENTITY_PREFIXED(up_rlp_ready_ind)
#endif

EXTERN void up_rlp_ready_ind       (T_RLP_READY_IND *rlp_ready_ind);

/*
 *  UP signal processing
 */
#ifdef OPTION_MULTITHREAD
  #define sig_mgt_up_conn_req         _ENTITY_PREFIXED(sig_mgt_up_conn_req)
  #define sig_mgt_up_disc_req         _ENTITY_PREFIXED(sig_mgt_up_disc_req)
  #define sig_mgt_up_break_req        _ENTITY_PREFIXED(sig_mgt_up_break_req)
  #define sig_mgt_up_clear_req        _ENTITY_PREFIXED(sig_mgt_up_clear_req)
  #define sig_mgt_up_dti_conn_setup   _ENTITY_PREFIXED(sig_mgt_up_dti_conn_setup)
  #define sig_mgt_up_dti_conn_open    _ENTITY_PREFIXED(sig_mgt_up_dti_conn_open)
  #define sig_dn_up_flow              _ENTITY_PREFIXED(sig_dn_up_flow)
  #define sig_dn_up_ll_flow           _ENTITY_PREFIXED(sig_dn_up_ll_flow)
#endif


EXTERN void sig_mgt_up_conn_req
            (
              UBYTE                  framesPerPrim,
              USHORT                 frameSize,
              BOOL                   flowCtrlUsed,
              T_PRIM_DESC_RIBU_SIZE  riBufferSize,
              UBYTE                  inst_id
            );

EXTERN void sig_mgt_up_disc_req
            (
              void
            );

EXTERN void sig_mgt_up_break_req
            (
              T_BIT sa,
              T_BIT sb,
              T_FLOW flow
            );

EXTERN void sig_mgt_up_clear_req
            (
              void
            );

EXTERN void sig_mgt_up_dti_conn_setup (ULONG link_id);

EXTERN void sig_mgt_up_dti_conn_open();

EXTERN void sig_dn_up_flow
            (
              T_FLOW  flow
            );

EXTERN void sig_dn_up_ll_flow
            (
              T_FLOW  flow
            );

/*
 *  UP procedures
 */

#ifdef OPTION_MULTITHREAD
  #define up_init                       _ENTITY_PREFIXED(up_init               )
  #define up_send_prim_timeout          _ENTITY_PREFIXED(up_send_prim_timeout  )
  #define up_check_alloc                _ENTITY_PREFIXED(up_check_alloc        )
  #define up_check_flow                 _ENTITY_PREFIXED(up_check_flow         )
  #define up_store_data                 _ENTITY_PREFIXED(up_store_data         )
  #define up_send_ready                 _ENTITY_PREFIXED(up_send_ready         )
  #define up_deinit_ribu                _ENTITY_PREFIXED(up_deinit_ribu        )
  #define up_send_current_prim          _ENTITY_PREFIXED(up_send_current_prim  )
  #define up_send_prim_cond             _ENTITY_PREFIXED(up_send_prim_cond     )
  #define up_init_ribu                  _ENTITY_PREFIXED(up_init_ribu          )
  #define up_store_status               _ENTITY_PREFIXED(up_store_status       )
  #define up_send_empty_frame           _ENTITY_PREFIXED(up_send_empty_frame   )
  #define up_send_status                _ENTITY_PREFIXED(up_send_status        )
  #define up_merge_flow                 _ENTITY_PREFIXED(up_merge_flow         )
  #define up_rq_init                    _ENTITY_PREFIXED(up_rq_init            )
  #define up_some_data_to_send          _ENTITY_PREFIXED(up_some_data_to_send  )
#endif

#define sig_dti_mgt_connection_opened_ind                   \
        _ENTITY_PREFIXED(sig_dti_mgt_connection_opened_ind)
#define sig_dti_mgt_connection_closed_ind                   \
        _ENTITY_PREFIXED(sig_dti_mgt_connection_closed_ind)
#define sig_dti_dn_tx_buffer_full_ind                       \
        _ENTITY_PREFIXED(sig_dti_dn_tx_buffer_full_ind    )
#define sig_dti_dn_tx_buffer_ready_ind                      \
        _ENTITY_PREFIXED(sig_dti_dn_tx_buffer_ready_ind   )
#define sig_dti_up_data_received_ind                        \
        _ENTITY_PREFIXED(sig_dti_up_data_received_ind     )


EXTERN void up_init(T_UP *dup);

EXTERN void               up_send_prim_timeout
                          (
                            void
                          );

EXTERN void               up_check_alloc
                          (
                            void
                          );

EXTERN void               up_check_flow
                          (
                            void
                          );

EXTERN void               up_store_data
                          (
                            void
                          );

EXTERN void               up_send_ready
                          (
                            void
                          );

EXTERN void               up_deinit_ribu
                          (
                            void
                          );

EXTERN void               up_send_current_prim
                          (
                            void
                          );

EXTERN void               up_send_prim_cond
                          (
                            void
                          );

EXTERN void               up_init_ribu
                          (
                            void
                          );

EXTERN void               up_store_status
                          (
                             T_BIT  sa,
                             T_BIT  sb,
                             T_FLOW flow
                          );

EXTERN void               up_send_empty_frame
                          (
                             T_BIT  sa,
                             T_BIT  sb,
                             T_FLOW flow
                          );

EXTERN void               up_send_status
                          (
                             T_BIT  sa,
                             T_BIT  sb,
                             T_FLOW flow,
                             UBYTE adr
                          );

EXTERN void               up_merge_flow
                          (
                            void
                          );

EXTERN void               up_rq_init
                          (
                            void
                          );

EXTERN BOOL               up_some_data_to_send
                          (
                            void
                          );

/*
 * these functions are called by pei_sig_callback
 */
EXTERN void         sig_dti_mgt_connection_opened_ind();
EXTERN void         sig_dti_mgt_connection_closed_ind();

EXTERN void         sig_dti_dn_tx_buffer_full_ind();
EXTERN void         sig_dti_dn_tx_buffer_ready_ind();

EXTERN void         sig_dti_up_data_received_ind
                          (
                            T_DTI2_DATA_REQ *dti_data_req
                          );

/*
 *  timer
 */
#define TIMERSTART(i,v) vsi_t_start (VSI_CALLER i, v)
#define TIMERSTOP(i)    vsi_t_stop  (VSI_CALLER i);

/*
 * Communication handles
 */

#ifdef OPTION_MULTITHREAD
  #define hCommCTRL     _ENTITY_PREFIXED(hCommCTRL)
  #define hCommRLP      _ENTITY_PREFIXED(hCommRLP)
#ifdef _SIMULATION_
  #define hCommRA       _ENTITY_PREFIXED(hCommRA)
#endif
#endif /* OPTION_MULTITHREAD */

EXTERN DTI_HANDLE l2r_hDTI;     /* DTI connection handle for DTI library      */

EXTERN T_HANDLE  l2r_handle;
EXTERN T_HANDLE  hCommCTRL;      /* Controller Communication                  */
EXTERN T_HANDLE  hCommRLP;       /* RLP  Communication                        */

#ifdef _SIMULATION_
EXTERN T_HANDLE  hCommRA;        /* RA  Communication                         */
#endif

EXTERN T_MODE    l2r_data_mode;

 /*
  * MALLOC / FREE for old frame
  */

#endif