| |
| /* |
| * |
| 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 */ |