summaryrefslogblamecommitdiffstats
path: root/private/ntos/ndis/digi/pcimac/mtl.h
blob: 06d71919c015fecd172730803bd8b98a9738dd78 (plain) (tree)

















































































































































































































































































































                                                                                                               
/*
 * MTL.H - include file for all MTL modules
 */

#ifndef _MTL_
#define _MTL_

/* some constants values */
// The value for mtl_max_chan has to be <= the value for
// cm_max_chan in cm_pub.h

//
// I set the MTU to a large enough value to allow multi-link,
// bridging and any other future expansion to occur.
//
#define     MTL_MAC_MTU         1600        /* mac size mtu, fixed */

#define     MTL_IDD_MTU         260         /* idd size mtu, default value */

//
// a guess at how much receive space we will need this is 1514 * 16 wich seems
// like alot to me
//
#define     MTL_RX_BUFS         16			/* # of recieve buffers, must be 2^n */

//
// max local tx descriptor buffers based on the maximum number of
// wanpackets we told the wrapper it could send (mydefs.h MAX_WANPACKET_XMITS)
//
#define     MTL_TX_BUFS         8			/* # of transmit buffers */

//
// max fragments per packet
//
#define     MTL_MAX_FRAG        16

//
// index into buffer where destination ethernet address starts
//
#define		DST_ADDR_INDEX		0

//
// index into buffer where source ethernet address starts
//
#define		SRC_ADDR_INDEX		6

//
// index into buffer where length of buffer starts
//
#define		PKT_LEN_INDEX		12

/* mtl error codes */
#define     MTL_E_SUCC          0
#define     MTL_E_NOMEM         1
#define     MTL_E_NOTIMPL       2
#define     MTL_E_NOROOM        3
#define     MTL_E_NOSUCH        4

//
// local mtl defs
//
/* packet receive/transmit assembly/disassembly descriptor */
typedef struct
{
	LIST_ENTRY		link;
	ULONG			Queued;
	ULONG			QueueOverRun;
    UCHAR           seq;                    /* recorded sequence number */
    UCHAR           tot;                    /* total # of fragments (0 free) */
    UCHAR           num;                    /* # of fragments received/transmitted */
    ULONG           ttl;                    /* time to live, in seconds */
    USHORT          len;                    /* accumulated packet length */
    struct _MTL     *mtl;                   /* back pointer to mtl */
	USHORT			State;					/* State of current large frame */
	UCHAR*			DataPtr;				/* current data index into buffer */
	USHORT			MaxRxLength;			/* max frame receive length */
	ULONG			MissCount;				/* rx miss count */
	PUCHAR			buf;
} MTL_AS;

typedef struct
{
	UCHAR	NextFree;
    NDIS_SPIN_LOCK  lock;                   /* access spinlock */
	ULONG	DKFReceiveError1;
	ULONG	DKFReceiveError2;
	ULONG	DKFReceiveError3;
	ULONG	DKFReceiveError4;
	ULONG	DKFReceiveError5;
	ULONG	PPPReceiveError1;
	ULONG	PPPReceiveError2;
	ULONG	PPPReceiveError3;
	ULONG	PPPReceiveError4;
	ULONG	PPPReceiveError5;
	ULONG	IndicateReceiveError1;
	ULONG	IndicateReceiveError2;
	ULONG	IndicateReceiveError3;
	ULONG	TimeOutReceiveError1;
	MTL_AS	as_tbl[MTL_RX_BUFS];
	PUCHAR	Data;
}MTL_RX_TBL;

typedef struct
{
	LIST_ENTRY		head;
	NDIS_SPIN_LOCK	lock;
} MTL_AS_FIFO;

//
// Fifo for storing wan packets before fragment processing
//
typedef struct
{
    LIST_ENTRY		head;					/* head pointer, head==NULL -> empty */
    NDIS_SPIN_LOCK  lock;                   /* access lock */
	ULONG			Count;
	ULONG			Max;
} MTL_WANPACKET_FIFO;

/* idd packet header */
typedef struct
{
    UCHAR           sig_tot;                /* signature + total fragments */
    UCHAR           seq;                    /* packet sequence number */
    USHORT          ofs;                    /* offset of fragment data into packet */
} MTL_HDR;

//
// this structure is used for data this is fragmented in the DKF format
//
typedef struct
{
	IDD_FRAG        IddFrag[2];		/* two fragments (hdr+data) required */
	MTL_HDR         MtlHeader;		/* header storage */
} DKF_FRAG;

/* trasmit fragement descriptor */
//
// The DKF_FRAG member must be kept at the begining of this structure
// !!!!!!!!!!!!!! mtl_tx.c relies on this !!!!!!!!!!!!!!!
//
typedef struct
{
	DKF_FRAG		DkfFrag;		/* frament descriptor for idd poll_tx */
    IDD_MSG			frag_msg;		/* fragments waiting to be sent vector */
    VOID            *frag_idd;		/* idd accepting fragments */
    USHORT          frag_bchan;		/* destination bchannels */
    VOID            *frag_arg;		/* argument to completion function */
	ULONG			FragSent;		/* flag to indicate if this frag has been xmitted */
} MTL_TX_FRAG;

/* trasmit packet descriptor */
typedef struct
{
	LIST_ENTRY		TxPacketQueue;
	NDIS_SPIN_LOCK	lock;
	ULONG			InUse;					/* this entry is in use */
    USHORT          NumberOfFrags;			/* # of fragments in frag_tbl */
    USHORT          NumberOfFragsSent;		/* # of fragments already sent */
    USHORT          FragReferenceCount;		/* refrence count */
    UCHAR			*frag_buf;				/* pointer to real data buffer */
    NDIS_WAN_PACKET	*WanPacket;				/* related user packet */
    struct _MTL     *mtl;                   /* back pointer to mtl */
    MTL_TX_FRAG     frag_tbl[MTL_MAX_FRAG]; /* fragment table (assembled) */
} MTL_TX_PKT;

/* trasmit packet control table */
typedef struct
{
	LIST_ENTRY		head;
    NDIS_SPIN_LOCK  lock;                   	/* access lock */
    ULONG           seq;                    	/* packet sequence number (for next) */
	ULONG			NextFree;					/* next available packet */
	MTL_TX_PKT      TxPacketTbl[MTL_TX_BUFS];  	/* packet table */
} MTL_TX_TBL;

/* a channel descriptor */
typedef struct
{
    VOID            *idd;                   /* related idd object */
    USHORT          bchan;                  /* related channel within idd, b1=0, b2=1 */
    ULONG           speed;                  /* channel speed in bps */
    struct _MTL     *mtl;                   /* mtl back pointer */
} MTL_CHAN;

/* channel table */
typedef struct
{
    MTL_CHAN        tbl[MAX_CHAN_PER_CONN];  /* table of channels */
    USHORT          num;                    /* # of entries used */
    NDIS_SPIN_LOCK  lock;                   /* access spinlock */
} MTL_CHAN_TBL;

/* an MTL object */
typedef struct _MTL
{
	ADAPTER			*Adapter;				/* adapter that owns this mtl */

	NDIS_HANDLE		LinkHandle;				/* handle from wrapper for this link */

	//statistics
	ULONG			FramesXmitted;
	ULONG			FramesReceived;
	ULONG			BytesXmitted;
	ULONG			BytesReceived;

    NDIS_SPIN_LOCK  lock;                   /* access lock */

    VOID            (*rx_handler)();        /* mgr receiver handler routine */
    VOID            *rx_handler_arg;        /* ... handler argument */

    VOID            (*tx_handler)();        /* mgr transmitter handler routine */
    VOID            *tx_handler_arg;        /* ... handler argument */

    USHORT          idd_mtu;                /* idd max frame size */
    BOOL            is_conn;                /* is connected now? */

	ULONG			IddTxFrameType;			/* 0/1 - PPP/DKF */
	ULONG			IddRxFrameType;			/* 0/1 - PPP/DKF */

    MTL_CHAN_TBL    chan_tbl;               /* the channel table */

	//
	// Receive table
	//
	MTL_RX_TBL	rx_tbl;

	//
	// Receive Completion Fifo
	//
	MTL_AS_FIFO	RxIndicationFifo;

	//
	// fifo of wan packets to be transmitted
	//
	MTL_WANPACKET_FIFO	WanPacketFifo;

	//
	// transmit table
	//
	MTL_TX_TBL	tx_tbl;

	//
	// flag to show
	//
	BOOL	RecvCompleteScheduled;

	//
	// backpointer to connection object
	//
	VOID			*cm;	

    SEMA            tx_sema;                /* transmit processing sema */

	//
	// wan wrapper information
	//
	ULONG	MaxSendFrameSize;
	ULONG	MaxRecvFrameSize;
	ULONG	PreamblePadding;
	ULONG	PostamblePadding;
	ULONG	SendFramingBits;
	ULONG	RecvFramingBits;
	ULONG	SendCompressionBits;
	ULONG	RecvCompressionBits;

} MTL;

//
// public mtl defs
//
/* MTL object operations */
INT		mtl_create(VOID** mtl_1, NDIS_HANDLE AdapterHandle);
INT		mtl_destroy(VOID* mtl_1);
INT		mtl_set_rx_handler(VOID* mtl_1, VOID (*handler)(), VOID* handler_arg);
INT		mtl_set_tx_handler(VOID* mtl_1, VOID (*handler)(), VOID* handler_arg);
INT		mtl_set_idd_mtu(VOID* mtl_1, USHORT idd_mtu);
INT		mtl_set_conn_state(VOID* mtl_1, USHORT NumberOfChannels, BOOL is_conn);
INT		mtl_get_conn_speed(VOID* mtl_1, ULONG *speed);
INT		mtl_get_mac_mtu(VOID* mtl_1, ULONG* mtu);
VOID	mtl_tx_packet(VOID* mtl_1, PNDIS_WAN_PACKET pkt);
INT		mtl_add_chan(VOID* mtl_1, VOID* idd, USHORT chan, ULONG speed, ULONG ConnectionType);
INT		mtl_del_chan(VOID* mtl_1, VOID* idd, USHORT chan);
INT		GetStatistics (VOID*, VOID*);
INT		ClearStatistics (VOID*);
INT		MtlSetFramingType (VOID*, ULONG);


/* prototypes for internal functions */
VOID	mtl__rx_bchan_handler(MTL_CHAN* chan, USHORT bchan, ULONG RxFrameType, IDD_XMSG* xmsg);
VOID	IndicateRxToWrapper(MTL*);
VOID	mtl__tx_cmpl_handler(MTL_TX_PKT *pkt, USHORT bchan, IDD_MSG* msg);
VOID	mtl__rx_tick(MTL* mtl);
VOID	mtl__tx_tick(MTL* mtl);
VOID	MtlPollFunction(VOID* a1, ADAPTER *Adapter, VOID* a3, VOID* a4);
VOID	MtlRecvCompleteFunction(ADAPTER *Adapter);
BOOLEAN	IsRxIndicationFifoEmpty(MTL*);
MTL_AS*	GetAssemblyFromRxIndicationFifo(MTL*);
VOID	QueueDescriptorForRxIndication(MTL*, MTL_AS*);
VOID	MtlSendCompleteFunction(ADAPTER	*Adapter);
VOID	IndicateTxCompletionToWrapper(MTL*);
VOID	MtlFlushWanPacketTxQueue(MTL*);
VOID	mtl__tx_packet(MTL*, NDIS_WAN_PACKET*);
VOID	TryToIndicateMtlReceives(ADAPTER *Adapter);

#endif			/* _MTL_ */