2020-09-30 17:12:29 +02:00

441 lines
17 KiB
C

/*
* IDD.H - IDP Device Driver header
*/
#ifndef _IDD_
#define _IDD_
#include <idd_pub.h>
/* 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_ */