/* * IDD.H - IDP Device Driver header */ #ifndef _IDD_ #define _IDD_ #include /* idd error codes */ #define IDD_E_SUCC 0 #define IDD_E_NOMEM 1 #define IDD_E_MEMERR 2 #define IDD_E_NOSUCH 3 #define IDD_E_NOROOM 4 #define IDD_E_BADPORT 5 #define IDD_E_IORERR 6 #define IDD_E_IOWERR 7 #define IDD_E_FMAPERR 8 #define IDD_E_RUNERR 9 #define IDD_E_PORTMAPERR 10 #define IDD_E_PORTBINDERR 11 #define IDD_E_PARTQINIT 12 #define IDD_E_FAILINSTALL 13 #define IDD_E_BUSY 14 #define IDD_E_AREA 15 // // Idd receive data framing types // #define DKF_UUS_SIG 0x50 #define PPP_SIG_0 0xFF #define PPP_SIG_1 0x03 /* IDD ports, rx/tx overlap! */ #define IDD_PORT_B1_RX 0 /* recieve b1 data */ #define IDD_PORT_B1_TX 0 /* trasmit b1 data */ #define IDD_PORT_B2_RX 1 /* recieve b1 data */ #define IDD_PORT_B2_TX 1 /* trasmit b1 data */ #define IDD_PORT_U_RX 2 /* receive uart data */ #define IDD_PORT_U_TX 2 /* trasmit uart data */ #define IDD_PORT_CMD_RX 3 /* receive control messages */ #define IDD_PORT_CMD_TX 3 /* trasmit control commands */ #define IDD_PORT_CM0_RX 4 /* receive connection mgr events */ #define IDD_PORT_CM0_TX 4 /* transmit connection mgr events */ #define IDD_PORT_CM1_RX 5 /* ... on secondary tei (opt) */ #define IDD_PORT_CM1_TX 5 /* ... on secondary tei (opt) */ // // local idd def's // /* some max values */ #define IDD_FNAME_LEN 128 /* size of a filename (path) */ #define IDD_DEF_SIZE 1000 /* size of definition database */ #define IDD_MAX_SEND (6*32) /* max # of pending send allowed */ #define IDD_MAX_RECEIVE (6*32) /* max # of pending receives on adapter*/ #define IDD_MAX_HAND (6*6) /* max # of receive handles allowed */ #define IDD_RX_PORTS 6 /* # of recieve ports defined */ #define IDD_TX_PORTS 6 /* # of transmit ports defined */ #define IDD_TX_PARTQ 4 /* # of (buffer) partition queues for tx */ #define IDD_PAGE_NONE (UCHAR)0xFF /* no page arg for idd__cpage */ #define IDP_MAX_RX_BUFFER 350 /* stupid double buffer buffer */ /* memory banks */ #define IDD_BANK_BUF 0 #define IDD_BANK_DATA 1 #define IDD_BANK_CODE 2 /* representation of physical hardware */ typedef struct { ULONG base_io; /* base i/o address */ ULONG base_mem; /* base memory address */ CHAR idp_bin[IDD_FNAME_LEN]; /* binary image filename */ NDIS_HANDLE fbin; /* idp bin file handle */ UINT fbin_len; /* length in bytes of idp bin file */ } IDD_PHW; /* virualization of hardware, in os (ndis) terms */ typedef struct { ULONG vbase_io; // virtual i/o base CHAR *vmem; /* virtual address for memory */ } IDD_VHW; /* descriptor for a message to be sent on a port */ typedef struct { IDD_MSG msg; /* copy of user's message */ VOID (*handler)(); /* user's completion handler */ VOID *handler_arg; /* handler's argument */ } IDD_SMSG; /* a queue for messages waiting to be sent */ typedef struct { IDD_SMSG *tbl; /* send message table address */ INT num; /* # of entries in queue */ INT max; /* max # of entries allowed/alloc */ INT put; /* put/insert index */ INT get; /* get/remove index */ NDIS_SPIN_LOCK lock; /* spin lock guarding access */ } IDD_SENDQ; /* a descriptor for user's handler for a receiver port */ typedef struct { VOID (*handler)(); /* user's handler */ VOID *handler_arg; /* handler's argument */ } IDD_RHAND; /* a table of user's handlers on a reciever port */ typedef struct { IDD_RHAND *tbl; /* table of receiver handlers */ ULONG RxFrameType; /* current receive framining mode */ INT num; /* # of entries in table */ INT max; /* max # of entries allowed/alloc */ NDIS_SPIN_LOCK lock; /* spin lock guarding access */ } IDD_RECIT; /* idp low level (shared memory) command interface structure */ #pragma pack(2) typedef struct { UCHAR opcode; /* command opcode */ #define IDP_L_MAP 0 /* - map a port name to id */ #define IDP_L_READ 1 /* - read from a port */ #define IDP_L_WRITE 2 /* - write to a port */ #define IDP_L_BIND 3 /* - bind a port to a status bit */ #define IDP_L_UNBIND 4 /* - unbind a port from a status bit */ #define IDP_L_POLL 5 /* - poll a prot (check for read) */ #define IDP_L_GET_WBUF 6 /* - get a write buffer */ #define IDP_L_PUT_RBUF 7 /* - put (free) a read buffer */ UCHAR status; /* command status */ #define IDP_S_PEND 0xFF /* - command pending */ #define IDP_S_EXEC 0xFE /* - command is executing */ #define IDP_S_OK 0x00 /* - command complted succ */ #define IDP_S_NOPORT 0x01 /* - no such port error */ #define IDP_S_NOMSG 0x02 /* - no messages error */ #define IDP_S_NOBUF 0x03 /* - no local buffer error */ #define IDP_S_NOBIT 0x04 /* - no status bit left error */ #define IDP_S_BOUND 0x05 /* - port already bound error */ #define IDP_S_NOTBOUND 0x06 /* - port not bound error */ #define IDP_S_TIMEOUT 0x07 /* - command timed out error */ #define IDP_S_DONE(s) (!(s & 0x80)) /* -command execution done (<0x80) */ USHORT port_id; /* related port identifier */ CHAR port_name[16]; /* related port name */ USHORT port_bitpatt; /* related port bit pattern */ UCHAR res[8]; /* 8 bytes of reserved area */ USHORT msg_opcode; /* message opcode (type) */ USHORT msg_buflen; /* related buffer length */ ULONG msg_bufptr; /* related buffer pointer (0=none) */ ULONG msg_bufid; /* related buffer id */ ULONG msg_param; /* parameter area */ } IDP_CMD; #pragma pack() /* adp low level (shared memory) command interface structure */ #pragma pack(2) typedef struct { UCHAR opcode; /* command opcode */ #define ADP_L_MAP 0 /* - map a port name to id */ #define ADP_L_READ 1 /* - read from a port */ #define ADP_L_WRITE 2 /* - write to a port */ #define ADP_L_BIND 3 /* - bind a port to a status bit */ #define ADP_L_UNBIND 4 /* - unbind a port from a status bit */ #define ADP_L_POLL 5 /* - poll a prot (check for read) */ #define ADP_L_GET_WBUF 6 /* - get a write buffer */ #define ADP_L_PUT_RBUF 7 /* - put (free) a read buffer */ UCHAR status; /* command status */ #define ADP_S_PEND 0xFF /* - command pending */ #define ADP_S_EXEC 0xFE /* - command is executing */ #define ADP_S_OK 0x00 /* - command complted succ */ #define ADP_S_NOPORT 0x01 /* - no such port error */ #define ADP_S_NOMSG 0x02 /* - no messages error */ #define ADP_S_NOBUF 0x03 /* - no local buffer error */ #define ADP_S_NOBIT 0x04 /* - no status bit left error */ #define ADP_S_BOUND 0x05 /* - port already bound error */ #define ADP_S_NOTBOUND 0x06 /* - port not bound error */ #define ADP_S_TIMEOUT 0x07 /* - command timed out error */ #define ADP_S_DONE(s) (!(s & 0x80)) /* -command execution done (<0x80) */ USHORT port_id; /* related port identifier */ CHAR port_name[8]; /* related port name */ USHORT port_bitpatt; /* related port bit pattern */ USHORT msg_opcode; /* message opcode (type) */ USHORT msg_buflen; /* related buffer length */ CHAR *msg_bufptr; /* related buffer pointer (0=none) */ ULONG msg_bufid; /* related buffer id */ ULONG msg_param; /* parameter area */ } ADP_CMD; #pragma pack() typedef struct tagIDD_LINESTATE { ULONG LineActive; /* is this idd's line active */ ULONG L1TxState; /* Layer 1 Tx state */ ULONG L1RxState; /* Layer 1 Rx state */ ULONG L2State; /* Layer 2 State */ ULONG L3State; /* Layer 3 State */ ULONG L3ServiceState; /* Layer 3 Service State */ }IDD_LINESTATE; typedef struct tagIDD_CALLINFO { ULONG ChannelsUsed; /* # of bchans used on this idd */ ULONG NumLTerms; /* # of lterms 1/2 */ VOID* cm[2]; /* cm that is using an lterm */ }IDD_CALLINFO; #ifdef DBG typedef struct { INT Count; ULONG Put; ULONG Get; ULONG TxState; ULONG FragsSinceBegin; ULONG Buffer[32]; }BUFFER_MANAGER; #endif /* IDD object */ typedef struct _IDD { USHORT state; /* IDD object state */ #define IDD_S_INIT 0 /* - initial state */ #define IDD_S_CHECK 1 /* - in check hardware phase */ #define IDD_S_STARTUP 2 /* - in startup */ #define IDD_S_RUN 3 /* - now running */ #define IDD_S_SHUTDOWN 4 /* - in shutdown */ #ifdef DBG BUFFER_MANAGER BufferStuff[4]; #endif ULONG WaitCounter; ULONG MaxWaitCounter; USHORT AbortReason; NDIS_SPIN_LOCK lock; /* spin lock guarding access to obj */ NDIS_HANDLE adapter_handle; /* related adapter handle */ IDD_PHW phw; /* physical hardware */ IDD_VHW vhw; /* virtualization of hardware */ IDD_SENDQ sendq[IDD_TX_PORTS]; /* send queues for tx ports */ IDD_SMSG smsg_pool[IDD_MAX_SEND]; /* pool of smsgs for sendqs */ IDD_RECIT recit[IDD_RX_PORTS]; /* receive table for rx ports */ IDD_RHAND rhand_pool[IDD_MAX_HAND]; /* pool or rhand for recit table */ USHORT rx_port[IDD_RX_PORTS]; /* port id's in idp terms for rx */ USHORT tx_port[IDD_TX_PORTS]; /* ... for tx */ ULONG rx_buf; /* id for last received (old) buffer from idp */ ULONG tx_buf[IDD_TX_PARTQ]; /* (new) tx buffer as idp bufids */ USHORT tx_partq[IDD_TX_PORTS]; /* related memory parition queues */ IDP_CMD volatile *IdpCmd; /* pointer to idp command struct */ USHORT volatile *IdpStat; /* pointer to status register */ UCHAR volatile *IdpEnv; /* pointer to status register */ ADP_CMD AdpCmd; /* pointer to adp command struct */ USHORT AdpStat; /* pointer to status register */ SEMA proc_sema; /* processing sema */ CHAR name[64]; /* name (device name?) */ USHORT btype; /* board type idd related to */ USHORT bnumber; /* board number of this idd */ USHORT bline; /* line index inside board */ IDD_CALLINFO CallInfo; /* information about active calls */ IDD_LINESTATE LineState; /* structure of idd state info */ VOID *res_mem; /* resource mgr handle for memory */ VOID *res_io; /* resource mgr handle for i/o */ ULONG (*CheckIO)(); /* Check Base I/O */ ULONG (*CheckMem)(); /* Check Base Mem */ VOID (*SetBank)(); /* set memory bank */ VOID (*SetPage)(); /* set memory page - or none */ VOID (*SetBasemem)(); /* set base memory address */ INT (*LoadCode)(); /* load the adapter */ ULONG (*PollTx)(); /* poll the adapter for xmits*/ ULONG (*PollRx)(); /* poll the adapter for recvs */ UCHAR (*Execute)(); /* Execute a command */ VOID (*OutToPort)(); /* Write Char to port*/ UCHAR (*InFromPort)(); /* Read Char from port*/ USHORT (*ApiGetPort)(); /* Get Port ID from adapter*/ INT (*ApiBindPort)(); /* Bind a Port to a status bit*/ ULONG (*ApiAllocBuffer)(); /* Get a buffer from the adapter*/ VOID (*ResetAdapter)(); /* Reset the adapter*/ USHORT (*NVRamRead)(); /* Read Adapters NVRam*/ VOID (*ChangePage)(); /* Change Memory Page on Adapter*/ IDD_AREA Area; /* idd area storage */ VOID *trc; /* related trace object */ UCHAR DefinitionTable[IDD_DEF_SIZE]; /* init definition database */ USHORT DefinitionTableLength; /* length of definition database */ UCHAR RxBuffer[IDP_MAX_RX_BUFFER]; /* receive storage */ } IDD; /* IDD object operation prototypes */ INT idd_create(VOID** ret_idd, USHORT btype); INT idd_destroy(VOID* idd_1); INT idd_set_base_io(VOID* idd_1, USHORT base_io); INT idd_set_base_mem(VOID* idd_1, ULONG base_mem, CHAR* vmem); INT idd_set_idp_bin(VOID* idd_1, CHAR* idp_bin); INT idd_add_def(IDD *idd, CHAR* name, CHAR* val); INT idd_get_nvram(VOID *idd_1, USHORT addr, USHORT* val); INT idd_check(VOID* idd_1); INT idd_startup(VOID* idd_1); INT idd_shutdown(VOID* idd_1); ULONG idd_process(IDD* idd, UCHAR TxOnly); INT idd_send_msg(VOID* idd_1, IDD_MSG *msg, USHORT port, VOID (*handler)(), VOID* handler_arg); INT idd_attach(VOID* idd_1, USHORT port, VOID (*handler)(), VOID* handler_arg); INT idd_detach(VOID* idd_1, USHORT port, VOID (*handler)(), VOID* handler_arg); CHAR* idd_get_name(VOID* idd_1); ULONG idd_get_baseio(VOID* idd_1); ULONG idd_get_basemem(VOID* idd_1); USHORT idd_get_btype(VOID* idd_1); USHORT idd_get_bline(VOID* idd_1); VOID* idd_get_trc(VOID *idd_1); VOID idd_set_trc(VOID *idd_1, VOID *Trace); INT idd_install(NDIS_HANDLE adapter_handle); INT idd_remove(NDIS_HANDLE adapter_handle); VOID idd_start_timers(VOID* Adapter_1); INT idd_reset_area(VOID* idd_1); INT idd_get_area(VOID* idd_1, ULONG area_id, VOID(*handler)(), VOID*handler_arg); INT idd_get_area_stat(VOID* idd_1, IDD_AREA *IddStat); VOID IddSetRxFraming(VOID* idd_1, USHORT port, ULONG FrameType); VOID IddPollFunction(VOID* a1, VOID* Adapter_1, VOID* a3, VOID* a4); VOID LineStateTimerTick(VOID* a1, VOID* Adapter_1, VOID* a3, VOID *a4); VOID idd__cmd_handler(IDD *idd, USHORT chan, ULONG Reserved, IDD_MSG* msg); VOID DetectFramingHandler(IDD *idd, USHORT chan, ULONG IddRxFrameType, IDD_XMSG *msg); ULONG EnumIddInSystem(VOID); ULONG EnumIddPerAdapter(VOID *Adapter_1); IDD* GetIddByIndex(ULONG); INT IoEnumIdd(VOID *cmd); ULONG idd_init(VOID); INT IdpLoadCode(IDD* idd); INT AdpLoadCode(IDD* idd); INT IdpBindPort(IDD* idd, USHORT port, USHORT bitpatt); INT AdpBindPort(IDD* idd, USHORT port, USHORT bitpatt); INT IdpResetBoard(IDD* idd); INT AdpResetBoard(IDD* idd); ULONG IdpAllocBuf(IDD*, INT); ULONG AdpAllocBuf(IDD*, INT); USHORT IdpGetPort(IDD *idd, CHAR name[8]); USHORT AdpGetPort(IDD *idd, CHAR name[8]); ULONG IdpCheckIO(IDD*); ULONG AdpCheckIO(IDD*); ULONG IdpCheckMem(IDD*); ULONG AdpCheckMem(IDD*); /* board specific routines */ VOID IdpPcSetBank(IDD* idd, UCHAR bank, UCHAR run); VOID IdpPc4SetBank(IDD* idd, UCHAR bank, UCHAR run); VOID IdpMcSetBank(IDD* idd, UCHAR bank, UCHAR run); VOID AdpSetBank(IDD* idd, UCHAR bank, UCHAR run); VOID IdpPcSetPage(IDD* idd, UCHAR page); VOID IdpPc4SetPage(IDD* idd, UCHAR page); VOID IdpMcSetPage(IDD* idd, UCHAR page); VOID AdpSetPage(IDD* idd, UCHAR page); VOID IdpPcSetBasemem(IDD* idd, ULONG basemem); VOID IdpPc4SetBasemem(IDD* idd, ULONG basemem); VOID IdpMcSetBasemem(IDD* idd, ULONG basemem); VOID AdpSetBasemem(IDD* idd, ULONG basemem); UCHAR IdpInp(IDD* idd, USHORT port); UCHAR AdpInp(IDD* idd, USHORT port); VOID IdpOutp(IDD* idd, USHORT port, UCHAR val); VOID AdpOutp(IDD* idd, USHORT port, UCHAR val); ULONG IdpPollTx(IDD* idd); ULONG AdpPollTx(IDD* idd); ULONG IdpPollRx(IDD* idd); ULONG AdpPollRx(IDD* idd); UCHAR IdpExec(IDD *idd, UCHAR opcode); UCHAR AdpExec(IDD *idd, UCHAR opcode); VOID IdpCPage(IDD *idd, UCHAR page); VOID AdpCPage(IDD *idd, UCHAR page); USHORT IdpNVRead(IDD* idd, USHORT addr); USHORT AdpNVRead(IDD* idd, USHORT addr); VOID IdpNVWrite(IDD* idd, USHORT addr, USHORT val); VOID AdpNVWrite(IDD* idd, USHORT addr, USHORT val); VOID IdpNVErase(IDD* idd); VOID AdpNVErase(IDD* idd); VOID IdpMemset(UCHAR* dst, USHORT val, int size); VOID AdpMemset(UCHAR* dst, USHORT val, int size); VOID IdpMemcpy(UCHAR* dst, UCHAR* src, int size); VOID AdpMemcpy(UCHAR* dst, UCHAR* src, int size); USHORT IdpCopyin(IDD* idd, UCHAR* dst, UCHAR* src, USHORT src_len); USHORT AdpCopyin(IDD* idd, UCHAR* src, USHORT src_len); VOID AdpWriteControlBit (IDD *idd, UCHAR Bit, UCHAR Value); VOID AdpPutBuffer (IDD *idd, ULONG Destination, PUCHAR Source, USHORT Length); VOID AdpGetBuffer (IDD *idd, PUCHAR Destination, ULONG Source, USHORT Length); VOID AdpWriteCommandStatus(IDD *idd, UCHAR Value); UCHAR AdpReadCommandStatus(IDD *idd); VOID AdpSetAddress(IDD *idd, ULONG Address); VOID AdpPutUByte(IDD *idd, ULONG Address, UCHAR Value); VOID AdpPutUShort(IDD *idd, ULONG Address, USHORT Value); VOID AdpPutULong(IDD *idd, ULONG Address, ULONG Value); UCHAR AdpGetUByte(IDD *idd, ULONG Address); USHORT AdpGetUShort(IDD *idd, ULONG Address); ULONG AdpGetULong(IDD *idd, ULONG Address); UCHAR AdpReadReceiveStatus(IDD *idd); UCHAR IdpGetUByteIO(IDD* idd, USHORT port); VOID IdpGetBuffer(IDD* idd, ULONG Bank, ULONG Page, ULONG Address, USHORT Length, PUCHAR Buffer); VOID IdpPutUByteIO(IDD* idd, USHORT Port, UCHAR Value); VOID IdpPutBuffer(IDD* idd, ULONG Bank, ULONG Page, ULONG Address, USHORT Length, PUCHAR Buffer); VOID IddGetDataFromAdapter(VOID *idd_1, PUCHAR Destination, PUCHAR Source, USHORT Length); VOID LineStateHandler(VOID* idd_1, ULONG AreaId, CHAR* AreaBuffer, ULONG BufferLen); #endif /* _IDD_ */