
/*
 *
  Copyright (c) Eicon Networks, 2002.
 *
  This source file is supplied for the use with
  Eicon Networks range of DIVA Server Adapters.
 *
  Eicon File Revision :    2.1
 *
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2, or (at your option)
  any later version.
 *
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the GNU General Public License for more details.
 *
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */
#ifndef _DI_DEFS_  
#define _DI_DEFS_
        /* typedefs for our data structures                         */
typedef struct get_name_s GET_NAME;
/*  The entity_s structure is used to pass all
    parameters between application and IDI   */
typedef struct entity_s ENTITY;
typedef struct buffers_s BUFFERS;
typedef struct postcall_s POSTCALL;
typedef struct get_para_s GET_PARA;
#define BOARD_NAME_LENGTH 9
#define IDI_CALL_LINK_T
#define IDI_CALL_ENTITY_T
/* typedef void ( * IDI_CALL)(ENTITY *); */
/* --------------------------------------------------------
    IDI_CALL
   -------------------------------------------------------- */
typedef void (IDI_CALL_LINK_T * IDI_CALL)(ENTITY IDI_CALL_ENTITY_T *);
typedef struct {
  word length;          /* length of data/parameter field           */
  byte P[270];          /* data/parameter field                     */
} DBUFFER;
struct get_name_s {
  word command;         /* command = 0x0100 */
  byte name[BOARD_NAME_LENGTH];
};
struct postcall_s {
  word      command;                           /* command = 0x0300 */
  word      dummy;                             /* not used */
  void      (  * callback)(void   *);      /* call back */
  void    *context;                          /* context pointer */
};
#define REQ_PARA            0x0600   /* request command line parameters */
#define REQ_PARA_LEN             1   /* number of data bytes */
#define L1_STARTUP_DOWN_POS      0   /* '-y' command line parameter in......*/
#define L1_STARTUP_DOWN_MSK   0x01   /* first byte position (index 0) with value 0x01 */
struct get_para_s {
  word  command;            /* command = 0x0600 */
  byte  len;                /* max length of para field in bytes */
  byte  para[REQ_PARA_LEN]; /* parameter field */
};
struct buffers_s {
  word PLength;
  byte   * P;
};
struct entity_s {
  byte                  Req;            /* pending request          */
  byte                  Rc;             /* return code received     */
  byte                  Ind;            /* indication received      */
  byte                  ReqCh;          /* channel of current Req   */
  byte                  RcCh;           /* channel of current Rc    */
  byte                  IndCh;          /* channel of current Ind   */
  byte                  Id;             /* ID used by this entity   */
  byte                  GlobalId;       /* reserved field           */
  byte                  XNum;           /* number of X-buffers      */
  byte                  RNum;           /* number of R-buffers      */
  BUFFERS                 * X;        /* pointer to X-buffer list */
  BUFFERS                 * R;        /* pointer to R-buffer list */
  word                  RLength;        /* length of current R-data */
  DBUFFER   *         RBuffer;        /* buffer of current R-data */
  byte                  RNR;            /* receive not ready flag   */
  byte                  complete;       /* receive complete status  */
  IDI_CALL              callback;
  word                  user[2];
        /* fields used by the driver internally                     */
  byte                  No;             /* entity number            */
  byte                  reserved2;      /* reserved field           */
  byte                  More;           /* R/X More flags           */
  byte                  MInd;           /* MDATA coding for this ID */
  byte                  XCurrent;       /* current transmit buffer  */
  byte                  RCurrent;       /* current receive buffer   */
  word                  XOffset;        /* offset in x-buffer       */
  word                  ROffset;        /* offset in r-buffer       */
};
typedef struct {
  byte                  type;
  byte                  channels;
  word                  features;
  IDI_CALL              request;
} DESCRIPTOR;
        /* descriptor type field coding */
#define IDI_ADAPTER_S           1
#define IDI_ADAPTER_PR          2
#define IDI_ADAPTER_DIVA        3
#define IDI_ADAPTER_MAESTRA     4
#define IDI_VADAPTER            0x40
#define IDI_DRIVER              0x80
#define IDI_DADAPTER            0xfd
#define IDI_DIDDPNP             0xfe
#define IDI_DIMAINT             0xff
        /* Hardware IDs ISA PNP */
#define HW_ID_DIVA_PRO     3    /* same as IDI_ADAPTER_DIVA    */
#define HW_ID_MAESTRA      4    /* same as IDI_ADAPTER_MAESTRA */
#define HW_ID_PICCOLA      5
#define HW_ID_DIVA_PRO20   6
#define HW_ID_DIVA20       7
#define HW_ID_DIVA_PRO20_U 8
#define HW_ID_DIVA20_U     9
#define HW_ID_DIVA30       10
#define HW_ID_DIVA30_U     11
        /* Hardware IDs PCI */
#define HW_ID_EICON_PCI              0x1133
#define HW_ID_SIEMENS_PCI            0x8001 /* unused SubVendor ID for Siemens Cornet-N cards */
#define HW_ID_PROTTYPE_CORNETN       0x0014 /* SubDevice ID for Siemens Cornet-N cards */
#define HW_ID_FUJITSU_SIEMENS_PCI    0x110A /* SubVendor ID for Fujitsu Siemens */
#define HW_ID_GS03_PCI               0x0021 /* SubDevice ID for Fujitsu Siemens ISDN S0 card */
#define HW_ID_DIVA_PRO20_PCI         0xe001
#define HW_ID_DIVA20_PCI             0xe002
#define HW_ID_DIVA_PRO20_PCI_U       0xe003
#define HW_ID_DIVA20_PCI_U           0xe004
#define HW_ID_DIVA201_PCI            0xe005
#define HW_ID_DIVA_CT_ST             0xe006
#define HW_ID_DIVA_CT_U              0xe007
#define HW_ID_DIVA_CTL_ST            0xe008
#define HW_ID_DIVA_CTL_U             0xe009
#define HW_ID_DIVA_ISDN_V90_PCI      0xe00a
#define HW_ID_DIVA202_PCI_ST         0xe00b
#define HW_ID_DIVA202_PCI_U          0xe00c
#define HW_ID_DIVA_PRO30_PCI         0xe00d
#define HW_ID_MAESTRA_PCI            0xe010
#define HW_ID_MAESTRAQ_PCI           0xe012
#define HW_ID_DSRV_Q8M_V2_PCI        0xe013
#define HW_ID_MAESTRAP_PCI           0xe014
#define HW_ID_DSRV_P30M_V2_PCI       0xe015
#define HW_ID_DSRV_VOICE_Q8M_PCI     0xe016
#define HW_ID_DSRV_VOICE_Q8M_V2_PCI  0xe017
#define HW_ID_DSRV_B2M_V2_PCI        0xe018
#define HW_ID_DSRV_VOICE_P30M_V2_PCI 0xe019
#define HW_ID_DSRV_B2F_PCI           0xe01a
#define HW_ID_DSRV_VOICE_B2M_V2_PCI  0xe01b
        /* Hardware IDs USB */
#define EICON_USB_VENDOR_ID          0x071D
#define HW_ID_DIVA_USB_REV1          0x1000
#define HW_ID_DIVA_USB_REV2          0x1003
#define HW_ID_TELEDAT_SURF_USB_REV2  0x1004
#define HW_ID_TELEDAT_SURF_USB_REV1  0x2000
/* --------------------------------------------------------------------------
  Adapter array change notification framework
  -------------------------------------------------------------------------- */
typedef void (IDI_CALL_LINK_T* didd_adapter_change_callback_t)(     void IDI_CALL_ENTITY_T * context, DESCRIPTOR* adapter, int removal);
/* -------------------------------------------------------------------------- */
#define DI_VOICE          0x0 /* obsolete define */
#define DI_FAX3           0x1
#define DI_MODEM          0x2
#define DI_POST           0x4
#define DI_V110           0x8
#define DI_V120           0x10
#define DI_POTS           0x20
#define DI_CODEC          0x40
#define DI_MANAGE         0x80
#define DI_V_42           0x0100
#define DI_EXTD_FAX       0x0200 /* Extended FAX (ECM, 2D, T.6, Polling) */
#define DI_AT_PARSER      0x0400 /* Build-in AT Parser in the L2 */
#define DI_VOICE_OVER_IP  0x0800 /* Voice over IP support */
typedef void (IDI_CALL_LINK_T* _IDI_CALL)(void*, ENTITY*);  
#endif  
