
/*
 *
 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 __DIVA_SYNC__H
#define __DIVA_SYNC__H
#define IDI_SYNC_REQ_REMOVE             0x00
#define IDI_SYNC_REQ_GET_NAME           0x01
#define IDI_SYNC_REQ_GET_SERIAL         0x02
#define IDI_SYNC_REQ_SET_POSTCALL       0x03
#define IDI_SYNC_REQ_GET_XLOG           0x04
#define IDI_SYNC_REQ_GET_FEATURES       0x05
#define IDI_SYNC_REQ_USB_REGISTER       0x06
#define IDI_SYNC_REQ_USB_RELEASE        0x07
#define IDI_SYNC_REQ_USB_ADD_DEVICE     0x08
#define IDI_SYNC_REQ_USB_START_DEVICE   0x09
#define IDI_SYNC_REQ_USB_STOP_DEVICE    0x0A
#define IDI_SYNC_REQ_USB_REMOVE_DEVICE  0x0B
#define IDI_SYNC_REQ_GET_CARDTYPE       0x0C
#define IDI_SYNC_REQ_GET_DBG_XLOG       0x0D
#define DIVA_USB
#define DIVA_USB_REQ                    0xAC
#define DIVA_USB_TEST                   0xAB
#define DIVA_USB_ADD_ADAPTER            0xAC
#define DIVA_USB_REMOVE_ADAPTER         0xAD
#define IDI_SYNC_REQ_SERIAL_HOOK        0x80
#define IDI_SYNC_REQ_XCHANGE_STATUS     0x81
#define IDI_SYNC_REQ_USB_HOOK           0x82
#define IDI_SYNC_REQ_PORTDRV_HOOK       0x83
#define IDI_SYNC_REQ_SLI                0x84   /*  SLI request from 3signal modem drivers */
#define IDI_SYNC_REQ_RECONFIGURE        0x85
#define IDI_SYNC_REQ_RESET              0x86
#define IDI_SYNC_REQ_GET_85X_DEVICE_DATA     0x87
#define IDI_SYNC_REQ_LOCK_85X                   0x88
#define IDI_SYNC_REQ_DIVA_85X_USB_DATA_EXCHANGE 0x99
#define IDI_SYNC_REQ_DIPORT_EXCHANGE_REQ   0x98
#define IDI_SYNC_REQ_GET_85X_EXT_PORT_TYPE      0xA0
/******************************************************************************/
#define IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES  0x92
/*
  To receive XDI features:
  1. set 'buffer_length_in_bytes' to length of you buffer
  2. set 'features' to pointer to your buffer
  3. issue synchronous request to XDI
  4. Check that feature 'DIVA_XDI_EXTENDED_FEATURES_VALID' is present
  after call. This feature does indicate that your request
  was processed and XDI does support this synchronous request
  5. if on return bit 31 (0x80000000) in 'buffer_length_in_bytes' is
  set then provided buffer was too small, and bits 30-0 does
  contain necessary length of buffer.
  in this case only features that do find place in the buffer
  are indicated to caller
*/
typedef struct _diva_xdi_get_extended_xdi_features {
	dword buffer_length_in_bytes;
	byte  *features;
} diva_xdi_get_extended_xdi_features_t;
/*
  features[0]
*/
#define DIVA_XDI_EXTENDED_FEATURES_VALID          0x01
#define DIVA_XDI_EXTENDED_FEATURE_CMA             0x02
#define DIVA_XDI_EXTENDED_FEATURE_SDRAM_BAR       0x04
#define DIVA_XDI_EXTENDED_FEATURE_CAPI_PRMS       0x08
#define DIVA_XDI_EXTENDED_FEATURE_NO_CANCEL_RC    0x10
#define DIVA_XDI_EXTENDED_FEATURE_RX_DMA          0x20
#define DIVA_XDI_EXTENDED_FEATURE_MANAGEMENT_DMA  0x40
#define DIVA_XDI_EXTENDED_FEATURE_WIDE_ID         0x80
#define DIVA_XDI_EXTENDED_FEATURES_MAX_SZ    1
/******************************************************************************/
#define IDI_SYNC_REQ_XDI_GET_ADAPTER_SDRAM_BAR   0x93
typedef struct _diva_xdi_get_adapter_sdram_bar {
	dword bar;
} diva_xdi_get_adapter_sdram_bar_t;
/******************************************************************************/
#define IDI_SYNC_REQ_XDI_GET_CAPI_PARAMS   0x94
/*
  CAPI Parameters will be written in the caller's buffer
*/
typedef struct _diva_xdi_get_capi_parameters {
	dword structure_length;
	byte flag_dynamic_l1_down;
	byte group_optimization_enabled;
} diva_xdi_get_capi_parameters_t;
/******************************************************************************/
#define IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER   0x95
/*
  Get logical adapter number, as assigned by XDI
  'controller' is starting with zero 'sub' controller number
  in case of one adapter that supports multiple interfaces
  'controller' is zero for Master adapter (and adapter that supports
  only one interface)
*/
typedef struct _diva_xdi_get_logical_adapter_number {
	dword logical_adapter_number;
	dword controller;
	dword total_controllers;
} diva_xdi_get_logical_adapter_number_s_t;
/******************************************************************************/
#define IDI_SYNC_REQ_UP1DM_OPERATION   0x96
/******************************************************************************/
#define IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION 0x97
#define IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC     0x01
#define IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE      0x02
typedef struct _diva_xdi_dma_descriptor_operation {
	int operation;
	int descriptor_number;
	void *descriptor_address;
	dword descriptor_magic;
} diva_xdi_dma_descriptor_operation_t;
/******************************************************************************/
#define IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY   0x01
#define IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY     0x02
#define IDI_SYNC_REQ_DIDD_ADD_ADAPTER               0x03
#define IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER            0x04
#define IDI_SYNC_REQ_DIDD_READ_ADAPTER_ARRAY        0x05
#define IDI_SYNC_REQ_DIDD_GET_CFG_LIB_IFC           0x10
typedef struct _diva_didd_adapter_notify {
	dword handle; /* Notification handle */
	void *callback;
	void *context;
} diva_didd_adapter_notify_t;
typedef struct _diva_didd_add_adapter {
	void *descriptor;
} diva_didd_add_adapter_t;
typedef struct _diva_didd_remove_adapter {
	IDI_CALL p_request;
} diva_didd_remove_adapter_t;
typedef struct _diva_didd_read_adapter_array {
	void *buffer;
	dword length;
} diva_didd_read_adapter_array_t;
typedef struct _diva_didd_get_cfg_lib_ifc {
	void *ifc;
} diva_didd_get_cfg_lib_ifc_t;
/******************************************************************************/
#define IDI_SYNC_REQ_XDI_GET_STREAM    0x91
#define DIVA_XDI_SYNCHRONOUS_SERVICE   0x01
#define DIVA_XDI_DMA_SERVICE           0x02
#define DIVA_XDI_AUTO_SERVICE          0x03
#define DIVA_ISTREAM_COMPLETE_NOTIFY   0
#define DIVA_ISTREAM_COMPLETE_READ     1
#define DIVA_ISTREAM_COMPLETE_WRITE    2
typedef struct _diva_xdi_stream_interface {
	unsigned char  Id;                 /* filled by XDI client */
	unsigned char provided_service;    /* filled by XDI        */
	unsigned char requested_service;   /* filled by XDI Client */
	void *xdi_context;    /* filled by XDI */
	void *client_context;   /* filled by XDI client */
	int (*write)(void *context,
		     int Id,
		     void *data,
		     int length,
		     int final,
		     byte usr1,
		     byte usr2);
	int (*read)(void *context,
		    int Id,
		    void *data,
		    int max_length,
		    int *final,
		    byte *usr1,
		    byte *usr2);
	int (*complete)(void *client_context,
			int Id,
			int what,
			void *data,
			int length,
			int *final);
} diva_xdi_stream_interface_t;
/******************************************************************************/
/*
 * IDI_SYNC_REQ_SERIAL_HOOK - special interface for the DIVA Mobile card
 */
typedef struct
{ unsigned char LineState;         /* Modem line state (STATUS_R) */
#define SERIAL_GSM_CELL 0x01   /* GSM or CELL cable attached  */
	unsigned char CardState;          /* PCMCIA card state (0 = down) */
	unsigned char IsdnState;          /* ISDN layer 1 state (0 = down)*/
	unsigned char HookState;          /* current logical hook state */
#define SERIAL_ON_HOOK 0x02   /* set in DIVA CTRL_R register */
} SERIAL_STATE;
typedef int (*SERIAL_INT_CB)(void *Context);
typedef int (*SERIAL_DPC_CB)(void *Context);
typedef unsigned char (*SERIAL_I_SYNC)(void *Context);
typedef struct
{ /* 'Req' and 'Rc' must be at the same place as in the ENTITY struct */
	unsigned char Req;             /* request (must be always 0) */
	unsigned char Rc;              /* return code (is the request) */
	unsigned char Function;           /* private function code  */
#define SERIAL_HOOK_ATTACH 0x81
#define SERIAL_HOOK_STATUS 0x82
#define SERIAL_HOOK_I_SYNC 0x83
#define SERIAL_HOOK_NOECHO 0x84
#define SERIAL_HOOK_RING 0x85
#define SERIAL_HOOK_DETACH 0x8f
	unsigned char Flags;           /* function refinements   */
	/* parameters passed by the ATTACH request      */
	SERIAL_INT_CB InterruptHandler; /* called on each interrupt  */
	SERIAL_DPC_CB DeferredHandler; /* called on hook state changes */
	void   *HandlerContext; /* context for both handlers */
	/* return values for both the ATTACH and the STATUS request   */
	unsigned long IoBase;    /* IO port assigned to UART  */
	SERIAL_STATE State;
	/* parameters and return values for the I_SYNC function    */
	SERIAL_I_SYNC SyncFunction;  /* to be called synchronized */
	void   *SyncContext;  /* context for this function */
	unsigned char SyncResult;   /* return value of function  */
} SERIAL_HOOK;
/*
 * IDI_SYNC_REQ_XCHANGE_STATUS - exchange the status between IDI and WMP
 * IDI_SYNC_REQ_RECONFIGURE - reconfiguration of IDI from WMP
 */
typedef struct
{ /* 'Req' and 'Rc' must be at the same place as in the ENTITY struct */
	unsigned char Req;             /* request (must be always 0) */
	unsigned char Rc;              /* return code (is the request) */
#define DRIVER_STATUS_BOOT  0xA1
#define DRIVER_STATUS_INIT_DEV 0xA2
#define DRIVER_STATUS_RUNNING 0xA3
#define DRIVER_STATUS_SHUTDOWN 0xAF
#define DRIVER_STATUS_TRAPPED 0xAE
	unsigned char wmpStatus;          /* exported by WMP              */
	unsigned char idiStatus;   /* exported by IDI              */
	unsigned long wizProto;   /* from WMP registry to IDI     */
	/* the cardtype value is defined by cardtype.h */
	unsigned long cardType;   /* from IDI registry to WMP     */
	unsigned long nt2;    /* from IDI registry to WMP     */
	unsigned long permanent;   /* from IDI registry to WMP     */
	unsigned long stableL2;   /* from IDI registry to WMP     */
	unsigned long tei;    /* from IDI registry to WMP     */
#define CRC4_MASK   0x00000003
#define L1_TRISTATE_MASK 0x00000004
#define WATCHDOG_MASK  0x00000008
#define NO_ORDER_CHECK_MASK 0x00000010
#define LOW_CHANNEL_MASK 0x00000020
#define NO_HSCX30_MASK  0x00000040
#define SET_BOARD   0x00001000
#define SET_CRC4   0x00030000
#define SET_L1_TRISTATE  0x00040000
#define SET_WATCHDOG  0x00080000
#define SET_NO_ORDER_CHECK 0x00100000
#define SET_LOW_CHANNEL  0x00200000
#define SET_NO_HSCX30  0x00400000
#define SET_MODE   0x00800000
#define SET_PROTO   0x02000000
#define SET_CARDTYPE  0x04000000
#define SET_NT2    0x08000000
#define SET_PERMANENT  0x10000000
#define SET_STABLEL2  0x20000000
#define SET_TEI    0x40000000
#define SET_NUMBERLEN  0x80000000
	unsigned long Flag;  /* |31-Type-16|15-Mask-0| */
	unsigned long NumberLen; /* reconfiguration: union is empty */
	union {
		struct {    /* possible reconfiguration, but ... ; SET_BOARD */
			unsigned long SerialNumber;
			char     *pCardname; /* di_defs.h: BOARD_NAME_LENGTH */
		} board;
		struct {      /* reset: need resources */
			void *pRawResources;
			void *pXlatResources;
		} res;
		struct { /* reconfiguration: wizProto == PROTTYPE_RBSCAS */
#define GLARE_RESOLVE_MASK 0x00000001
#define DID_MASK   0x00000002
#define BEARER_CAP_MASK  0x0000000c
#define SET_GLARE_RESOLVE 0x00010000
#define SET_DID    0x00020000
#define SET_BEARER_CAP  0x000c0000
			unsigned long Flag;  /* |31-Type-16|15-VALUE-0| */
			unsigned short DigitTimeout;
			unsigned short AnswerDelay;
		} rbs;
		struct { /* reconfiguration: wizProto == PROTTYPE_QSIG */
#define CALL_REF_LENGTH1_MASK 0x00000001
#define BRI_CHANNEL_ID_MASK  0x00000002
#define SET_CALL_REF_LENGTH  0x00010000
#define SET_BRI_CHANNEL_ID  0x00020000
			unsigned long Flag;  /* |31-Type-16|15-VALUE-0| */
		} qsig;
		struct { /* reconfiguration: NumberLen != 0 */
#define SET_SPID1   0x00010000
#define SET_NUMBER1   0x00020000
#define SET_SUBADDRESS1  0x00040000
#define SET_SPID2   0x00100000
#define SET_NUMBER2   0x00200000
#define SET_SUBADDRESS2  0x00400000
#define MASK_SET   0xffff0000
			unsigned long Flag;   /* |31-Type-16|15-Channel-0| */
			unsigned char *pBuffer; /* number value */
		} isdnNo;
	}
		parms
		;
} isdnProps;
/*
 * IDI_SYNC_REQ_PORTDRV_HOOK - signal plug/unplug (Award Cardware only)
 */
typedef void (*PORTDRV_HOOK_CB)(void *Context, int Plug);
typedef struct
{ /* 'Req' and 'Rc' must be at the same place as in the ENTITY struct */
	unsigned char Req;             /* request (must be always 0) */
	unsigned char Rc;              /* return code (is the request) */
	unsigned char Function;           /* private function code  */
	unsigned char Flags;           /* function refinements   */
	PORTDRV_HOOK_CB Callback;   /* to be called on plug/unplug */
	void   *Context;   /* context for callback   */
	unsigned long Info;    /* more info if needed   */
} PORTDRV_HOOK;
/*  Codes for the 'Rc' element in structure below. */
#define SLI_INSTALL     (0xA1)
#define SLI_UNINSTALL   (0xA2)
typedef int (*SLIENTRYPOINT)(void *p3SignalAPI, void *pContext);
typedef struct
{   /* 'Req' and 'Rc' must be at the same place as in the ENTITY struct */
	unsigned char   Req;                /* request (must be always 0)   */
	unsigned char   Rc;                 /* return code (is the request) */
	unsigned char   Function;           /* private function code        */
	unsigned char   Flags;              /* function refinements         */
	SLIENTRYPOINT   Callback;           /* to be called on plug/unplug  */
	void            *Context;           /* context for callback         */
	unsigned long   Info;               /* more info if needed          */
} SLIENTRYPOINT_REQ;
/******************************************************************************/
/*
 *  Definitions for DIVA USB
 */
typedef int (*USB_SEND_REQ)(unsigned char PipeIndex, unsigned char Type, void *Data, int sizeData);
typedef int (*USB_START_DEV)(void *Adapter, void *Ipac);
/* called from WDM */
typedef void (*USB_RECV_NOTIFY)(void *Ipac, void *msg);
typedef void (*USB_XMIT_NOTIFY)(void *Ipac, unsigned char PipeIndex);
/******************************************************************************/
/*
 * Parameter description for synchronous requests.
 *
 * Sorry, must repeat some parts of di_defs.h here because
 * they are not defined for all operating environments
 */
typedef union
{ ENTITY Entity;
	struct
	{ /* 'Req' and 'Rc' are at the same place as in the ENTITY struct */
		unsigned char   Req; /* request (must be always 0) */
		unsigned char   Rc;  /* return code (is the request) */
	}   Request;
	struct
	{ unsigned char   Req; /* request (must be always 0) */
		unsigned char   Rc;  /* return code (0x01)   */
		unsigned char   name[BOARD_NAME_LENGTH];
	}   GetName;
	struct
	{ unsigned char   Req; /* request (must be always 0) */
		unsigned char   Rc;  /* return code (0x02)   */
		unsigned long   serial; /* serial number    */
	}   GetSerial;
	struct
	{ unsigned char   Req; /* request (must be always 0) */
		unsigned char   Rc;  /* return code (0x02)   */
		unsigned long   lineIdx;/* line, 0 if card has only one */
	}   GetLineIdx;
	struct
	{ unsigned char  Req;     /* request (must be always 0) */
		unsigned char  Rc;      /* return code (0x02)   */
		unsigned long  cardtype;/* card type        */
	}   GetCardType;
	struct
	{ unsigned short command;/* command = 0x0300 */
		unsigned short dummy; /* not used */
		IDI_CALL       callback;/* routine to call back */
		ENTITY      *contxt; /* ptr to entity to use */
	}   PostCall;
	struct
	{ unsigned char  Req;  /* request (must be always 0) */
		unsigned char  Rc;   /* return code (0x04)   */
		unsigned char  pcm[1]; /* buffer (a pc_maint struct) */
	}   GetXlog;
	struct
	{ unsigned char  Req;  /* request (must be always 0) */
		unsigned char  Rc;   /* return code (0x05)   */
		unsigned short features;/* feature defines see below */
	}   GetFeatures;
	SERIAL_HOOK  SerialHook;
/* Added for DIVA USB */
	struct
	{ unsigned char   Req;
		unsigned char   Rc;
		USB_SEND_REQ    UsbSendRequest; /* function in Diva Usb WDM driver in usb_os.c, */
		/* called from usb_drv.c to send a message to our device */
		/* eg UsbSendRequest (USB_PIPE_SIGNAL, USB_IPAC_START, 0, 0); */
		USB_RECV_NOTIFY usb_recv;       /* called from usb_os.c to pass a received message and ptr to IPAC */
		/* on to usb_drv.c by a call to usb_recv(). */
		USB_XMIT_NOTIFY usb_xmit;       /* called from usb_os.c in DivaUSB.sys WDM to indicate a completed transmit */
		/* to usb_drv.c by a call to usb_xmit(). */
		USB_START_DEV   UsbStartDevice; /* Start the USB Device, in usb_os.c */
		IDI_CALL        callback;       /* routine to call back */
		ENTITY          *contxt;     /* ptr to entity to use */
		void **ipac_ptr;    /* pointer to struct IPAC in VxD */
	} Usb_Msg_old;
/* message used by WDM and VXD to pass pointers of function and IPAC* */
	struct
	{ unsigned char Req;
		unsigned char Rc;
		USB_SEND_REQ    pUsbSendRequest;/* function in Diva Usb WDM driver in usb_os.c, */
		/* called from usb_drv.c to send a message to our device */
		/* eg UsbSendRequest (USB_PIPE_SIGNAL, USB_IPAC_START, 0, 0); */
		USB_RECV_NOTIFY p_usb_recv;     /* called from usb_os.c to pass a received message and ptr to IPAC */
		/* on to usb_drv.c by a call to usb_recv(). */
		USB_XMIT_NOTIFY p_usb_xmit;     /* called from usb_os.c in DivaUSB.sys WDM to indicate a completed transmit */
		/* to usb_drv.c by a call to usb_xmit().*/
		void            *ipac_ptr;      /* &Diva.ipac pointer to struct IPAC in VxD */
	} Usb_Msg;
	PORTDRV_HOOK PortdrvHook;
	SLIENTRYPOINT_REQ   sliEntryPointReq;
	struct {
		unsigned char Req;
		unsigned char Rc;
		diva_xdi_stream_interface_t info;
	} xdi_stream_info;
	struct {
		unsigned char Req;
		unsigned char Rc;
		diva_xdi_get_extended_xdi_features_t info;
	} xdi_extended_features;
	struct {
		unsigned char Req;
		unsigned char Rc;
		diva_xdi_get_adapter_sdram_bar_t info;
	} xdi_sdram_bar;
	struct {
		unsigned char Req;
		unsigned char Rc;
		diva_xdi_get_capi_parameters_t info;
	} xdi_capi_prms;
	struct {
		ENTITY           e;
		diva_didd_adapter_notify_t info;
	} didd_notify;
	struct {
		ENTITY           e;
		diva_didd_add_adapter_t   info;
	} didd_add_adapter;
	struct {
		ENTITY           e;
		diva_didd_remove_adapter_t info;
	} didd_remove_adapter;
	struct {
		ENTITY             e;
		diva_didd_read_adapter_array_t info;
	} didd_read_adapter_array;
	struct {
		ENTITY             e;
		diva_didd_get_cfg_lib_ifc_t     info;
	} didd_get_cfg_lib_ifc;
	struct {
		unsigned char Req;
		unsigned char Rc;
		diva_xdi_get_logical_adapter_number_s_t info;
	} xdi_logical_adapter_number;
	struct {
		unsigned char Req;
		unsigned char Rc;
		diva_xdi_dma_descriptor_operation_t info;
	} xdi_dma_descriptor_operation;
} IDI_SYNC_REQ;
/******************************************************************************/
#endif /* __DIVA_SYNC__H */
