NT4/private/ntos/ndis/netflex/macstrct.h
2020-09-30 17:12:29 +02:00

582 lines
22 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//************************************************************************
//************************************************************************
//
// File Name: MACSTRCT.H
//
// Program Name: NetFlex NDIS 3.0 Miniport Driver
//
// Companion Files: None
//
// Function: This module contains the NetFlex Miniport Driver
// interface routines called by the Wrapper and the
// configuration manager.
//
// (c) Compaq Computer Corporation, 1992,1993,1994
//
// This file is licensed by Compaq Computer Corporation to Microsoft
// Corporation pursuant to the letter of August 20, 1992 from
// Gary Stimac to Mark Baber.
//
// History:
//
// 04/15/94 Robert Van Cleve - Converted from NDIS Mac Driver
//***********************************************************************
//***********************************************************************
#ifndef _MACSTRCT_
#define _MACSTRCT_
#if DBG
#define BreakPoint() DbgBreakPoint()
#endif
typedef
USHORT
(FASTCALL *W_PROCESS_RECEIVE_HANDLER) (
struct acb_block *acb
);
typedef struct netflx_parameters {
OPEN utd_open;
USHORT utd_maxtrans;
USHORT utd_maxrcvs;
USHORT utd_maxframesz;
USHORT utd_maxmulticast;
USHORT utd_maxinternalreqs;
USHORT utd_maxinternalbufs;
USHORT utd_numsmallbufs;
USHORT utd_smallbufsz;
BOOLEAN utd_extremecheckforhang;
} NETFLEX_PARMS, *PNETFLEX_PARMS;
/* Netflx parms defaults */
#define MIN_MULTICASTS 10
#define MAX_MULTICASTS 40
#define DF_MULTICASTS 20
#define MIN_INTERNALREQS 10
#define MAX_INTERNALREQS 80
#define DF_INTERNALREQS 40
#define MIN_INTERNALBUFS 2 /* Transmit buffers */
#define MAX_INTERNALBUFS 8
#define DF_INTERNALBUFS 8
//
// Number of xmit packets
// Number of lists is this number * MAX_LISTS_PER_XMIT
//
#define MAX_XMITS_TR 10
#define MIN_XMITS 3
#define DF_XMITS_TR 8
//
// Number of rcv packets.
// Because a packet requires only one list, this is the number of Receive
// list as well.
//
#define MAX_RCVS_ETH 40
#define MAX_RCVS_TR 20
#define MIN_RCVS 3
#define DF_RCVS_ETH 20
#define DF_RCVS_TR 10
#define MAX_XMITS_ETH 20
#define DF_XMITS_ETH 16
#define MAX_FRAMESIZE_ETH 1514
#define DF_FRAMESIZE_ETH 1514
#define MAX_FRAMESIZE_TR4 4096
#define MAX_FRAMESIZE_TR16 17952
#define DF_FRAMESIZE_TR 4500 // Was 4096.
#define MIN_FRAMESIZE 256
//
// Additional Statistics supported by Netflex but not by MS
//
#define OID_802_5_UPSTREAM_ADDRESS 0xff020201
#define OID_802_5_CONGESTION_ERRORS 0xff020202
#define OID_NF_INTERRUPT_COUNT 0xff020203
#define OID_NF_INTERRUPT_RATIO 0xff020204
#define OID_NF_INTERRUPT_RATIO_CHANGES 0xff020205
/*----------------------------------------------------------------------*/
/* Structure Name: Netflx Global MAC structure (MAC) */
/* */
/* Description: The adapter binding block contain the internal variables*/
/* for the binding between a protocol and an adpater. */
/*----------------------------------------------------------------------*/
typedef struct mac
{
struct acb_block *mac_adapters;/* Ptr to registered adapters */
PDRIVER_OBJECT mac_object; /* Value passed by DriverEntry */
NDIS_HANDLE mac_wrapper; /* global handle to miniport wrapper*/
USHORT mac_numadpts; /* number of adpaters on list */
PVOID DownloadCode; /* Virtual address of Download code */
USHORT DownloadLength; /* length of download image */
BOOLEAN Initializing; /* is the system still in intitialization mode */
} MAC, *PMAC;
/*----------------------------------------------------------------------*/
/* Structure Name: Multicast Table */
/* */
/* Description: The multicast table contains a list of the enabled */
/* multicast or group address on the adapter. */
/*----------------------------------------------------------------------*/
typedef struct multi_table {
struct multi_table *mt_next;
UCHAR mt_addr[NET_ADDR_SIZE]; /* Multicast address */
} MULTI_TABLE, *PMULTI_TABLE;
/*----------------------------------------------------------------------*/
/* Structure Name: Mac Request Block */
/* */
/* Description: The mac request block contains the variables necessary */
/* to complete a pending command. */
/*----------------------------------------------------------------------*/
typedef struct macreq_blk
{
struct macreq_blk *req_next; /* Pointer to the next request */
ULONG req_type; /* Type of request and completion */
NDIS_STATUS req_status; /* Status of command */
PVOID req_info; /* Extra info needed to complete the req */
BOOLEAN req_timeout; /* This field is used to timestamp the command blocks */
UCHAR req_timeoutcount; /* Count of the number of times we have retried a command. */
} MACREQ, *PMACREQ;
#define MACREQSIZE sizeof(MACREQ)
#define NO_CMP_NEEDED 0
#define OPENADAPTER_CMP 1
#define OPENADAPTER_DUMCMP 2
#define CLOSEADAPTER_CMP 3
#define CLOSEADAPTER_DUMCMP 4
#define SEND_CMP 5
#define TRANSFERDATA_CMP 6
#define RESET_CMP 7
#define REQUEST_CMP 8
#define INDICATERCV_CMP 9
#define INDICATESTATUS_CMP 10
#define QUERY_CMP 11
#define RESET_STAGE_1 1
#define RESET_STAGE_2 2
#define RESET_STAGE_3 3
#define RESET_STAGE_4 4
#define RESET_HALTED 5
/*----------------------------------------------------------------------*/
/* Structure Name: SCB Request Block */
/* */
/* Description: The SCB Request block contains the variables necessary */
/* to send a command to the adapter, wait for the response */
/* and find the mac request block in order to complete the */
/* request if necessary. */
/*----------------------------------------------------------------------*/
typedef struct scbreq_blk
{
struct scbreq_blk *req_next; /* Pointer to the next request */
SCB req_scb; /* Copy of the SCB to send */
MULTI_BLOCK req_multi;
PMACREQ req_macreq; /* Ptr to the corresponding macreq */
} SCBREQ, *PSCBREQ;
#define SCBREQSIZE sizeof(SCBREQ)
/*----------------------------------------------------------------------*/
/* Structure Name: General Objects structure */
/* */
/* Description: The General Objects strucuture contains the variables */
/* necessary to hold the gerneral operational */
/* characteristics and statistics. */
/*----------------------------------------------------------------------*/
typedef struct general_objs
{
NDIS_MEDIUM media_type_in_use;
ULONG max_frame_size;
ULONG min_frame_size;
ULONG link_speed;
ULONG cur_filter;
ULONG frames_xmitd_ok;
ULONG frames_rcvd_ok;
ULONG frames_xmitd_err;
ULONG frames_rcvd_err;
ULONG interrupt_count;
ULONG interrupt_ratio_changes;
UCHAR perm_staddr[NET_ADDR_SIZE];
UCHAR current_staddr[NET_ADDR_SIZE];
} GENERAL_OBJS, *PGENERAL_OBJS;
typedef struct eth_objs
{
USHORT MaxMulticast;
UCHAR *MulticastEntries;
USHORT NumberOfEntries;
USHORT RSL_AlignmentErr;
USHORT RSL_1_Collision;
USHORT RSL_More_Collision;
USHORT RSL_FrameCheckSeq;
USHORT RSL_DeferredXmit;
USHORT RSL_Excessive;
USHORT RSL_LateCollision;
USHORT RSL_CarrierErr;
} ETH_OBJS, *PETH_OBJS;
typedef struct tr_objs
{
UCHAR cur_func_addr[NET_GROUP_SIZE];
UCHAR cur_grp_addr[NET_GROUP_SIZE];
UCHAR upstream_addr[NET_GROUP_SIZE];
USHORT grp_users_count;
ULONG frames_xmtd_no_return;
UCHAR REL_LineError;
UCHAR REL_Congestion;
UCHAR REL_LostError;
UCHAR REL_BurstError;
UCHAR REL_ARIFCIError;
UCHAR REL_CopiedError;
UCHAR REL_TokenError;
} TR_OBJS, *PTR_OBJS;
/*----------------------------------------------------------------------*/
/* Structure Name: MAC Internal Adapter Control Block (ACB) */
/* */
/* Description: The Mac internal adapter control block contains all */
/* internal variables for ONE SINGLE adapter. The Global */
/* variables structure for this driver contains a pointer */
/* to a linked list of ACBs. (One ACB for each adapter */
/* registered by this driver). The variables in the ACB */
/* are used by the NDI driver to maintain internal */
/* statistics, driver states, and resources. */
/*----------------------------------------------------------------------*/
typedef struct acb_block {
struct acb_block *acb_next; /* Next ACB */
NDIS_HANDLE acb_handle; /* Our Miniport Handle */
USHORT actl_reg; // Saved value of our ACTL_REG
USHORT InterruptsDisabled;
PUCHAR SifIntPort; // SIF interrupt register
PUCHAR SifActlPort; // SIF ACTL register
PRCV acb_rcv_head; /* Head of our Receive Lists */
#ifdef ODD_POINTER
BOOLEAN XmitStalled; /* state of the transmiter */
#endif
NDIS_SPIN_LOCK XmitLock;
PXMIT acb_xmit_head; /* */
PXMIT acb_xmit_ahead; /* */
PXMIT acb_xmit_atail; /* */
USHORT acb_maxrcvs;
USHORT acb_avail_xmit;
USHORT acb_curmap;
USHORT acb_maxmaps;
W_PROCESS_RECEIVE_HANDLER ProcessReceiveHandler;
PSCB acb_scb_virtptr; /* Virt ptr to the SCB */
PSSB acb_ssb_virtptr; /* Virt ptr to the SSB */
USHORT RcvIntRatio;
#ifdef XMIT_INTS
USHORT XmitIntRatio;
#endif
#ifdef ODD_POINTER
BOOLEAN XmitStalled; /* state of the transmiter */
BOOLEAN HandlingInterrupt;
#endif
PBUFFER_DESCRIPTOR OurBuffersListHead;
PBUFFER_DESCRIPTOR SmallBuffersListHead;
//
// Dynamic ratio stuff
//
UINT timer_run_count;
UINT handled_interrupts;
#ifdef NEW_DYNAMIC_RATIO
union {
struct {
USHORT current_run_up;
USHORT current_run_down;
} ;
ULONG current_run_both;
} ;
#else
UINT current_run;
#endif
//
// Dynamic ratio
//
#ifdef DYNAMIC_RATIO_HISTORY
UCHAR IntHistory[1024];
UCHAR RatioHistory[1024];
UINT Hndx;
#endif
#ifndef NEW_DYNAMIC_RATIO
UINT cleartime;
UINT sw24;
#endif
GENERAL_OBJS acb_gen_objs; // General chars and stats
NDIS_MINIPORT_TIMER DpcTimer;
NDIS_MINIPORT_INTERRUPT acb_interrupt;
PNDIS_HANDLE FlushBufferPoolHandle; // The Flush buffer pool
USHORT acb_scbclearout;
USHORT acb_maxtrans;
USHORT acb_smallbufsz;
USHORT acb_padJim;
USHORT acb_maxreqs;
USHORT acb_openoptions;
NDIS_STATUS acb_lastopenstat;
ULONG acb_lastringstate;
ULONG acb_lastringstatus;
NDIS_PHYSICAL_ADDRESS acb_rcv_physptr;
PRCV acb_rcv_virtptr;
NDIS_PHYSICAL_ADDRESS acb_xmit_physptr; /* Ptr to Xmit memory */
PXMIT acb_xmit_virtptr;
PMULTI_BLOCK acb_multiblk_virtptr; /* Virt ptr to Multicast blk */
NDIS_PHYSICAL_ADDRESS acb_multiblk_physptr; /* Phys ptr to Multicast blk */
USHORT acb_multi_index; /* index to Multicast blks */
PRCV acb_rcv_tail; /* Tail, has the odd fwdptr */
PRCV acb_rcv_whead; /* */
PXMIT acb_xmit_whead; /* */
PXMIT acb_xmit_wtail; /* */
PXMIT acb_xmit_chead; /* */
PXMIT acb_xmit_ctail; /* */
USHORT acb_state; /* Adapter Primary State */
ULONG acb_int_timeout; // Interrupt timeout.
ULONG acb_int_count; // Count of interrupts.
//
// Various mapped I/O Port Addresses for this adapter.
//
PUCHAR SifDataPort; // SIF data register
PUCHAR SifDIncPort; // SIF data autoincrment reg
PUCHAR SifAddrPort; // SIF address register
PUCHAR SifAddrxPort; // SIF SIF extended address reg
PUCHAR BasePorts;
PUCHAR MasterBasePorts;
PUCHAR ConfigPorts;
PUCHAR ExtConfigPorts;
PUCHAR AdapterConfigPort; // Adapter configuration reg
PVOID acb_xmitbuf_virtptr; /* Virt ptr to our xmit bufs */
NDIS_PHYSICAL_ADDRESS acb_xmitbuf_physptr; /* Phys ptr to our xmit bufs */
PVOID OurBuffersVirtPtr; /* Virt ptr to our internal bufs */
PVOID SmallBuffersVirtPtr; /* Virt ptr to our internal bufs */
NDIS_PHYSICAL_ADDRESS acb_scb_physptr; /* Phys ptr to the SCB */
NDIS_PHYSICAL_ADDRESS acb_ssb_physptr; /* Phys ptr to the SSB */
USHORT acb_logbuf_valid; /* Validity of the log contents */
PVOID acb_logbuf_virtptr; /* Virt ptr to READ ERROR LOG */
NDIS_PHYSICAL_ADDRESS acb_logbuf_physptr; /* Phys ptr to READ ERROR LOG */
POPEN acb_opnblk_virtptr; /* Virt ptr to OPEN block */
NDIS_PHYSICAL_ADDRESS acb_opnblk_physptr; /* Phys ptr to OPEN block */
INIT acb_initblk; /* Virt ptr to INIT block */
PSCBREQ acb_scbreq_ptr; /* Ptr to SCB Request memory */
PSCBREQ acb_scbreq_head; /* Ptr to next SCB */
PSCBREQ acb_scbreq_tail; /* Ptr to last SCB */
PSCBREQ acb_scbreq_free; /* Ptr to free SCB Requests */
PSCBREQ acb_scbreq_next; /* Ptr to next SCB to execute */
PMACREQ acb_macreq_ptr; /* Ptr to MAC Request memory */
PMACREQ acb_macreq_head; /* Ptr to front of pending reqs */
PMACREQ acb_macreq_tail; /* Ptr to end of pending reqs */
PMACREQ acb_macreq_free; /* Ptr to free MAC Requests */
PMACREQ acb_confirm_qhead; /* Ptr to pending MAC Reqs to complete */
PMACREQ acb_confirm_qtail; /* Ptr to pending MAC Reqs to complete */
PNDIS_OID acb_gbl_oid_list;
PNDIS_OID acb_spec_oid_list;
SHORT acb_gbl_oid_list_size;
SHORT acb_spec_oid_list_size;
PVOID acb_spec_objs; /* Network specific chars and stats */
USHORT acb_promiscuousmode; /* Board accepts all pkts */
USHORT acb_boardid; /* Board id */
USHORT acb_baseaddr; /* Base address of board */
PNETFLEX_PARMS acb_parms; /* Pointer to adp's param's */
USHORT acb_usefpa; /* are using fast pkt accel */
USHORT acb_dualport; /* is this a dual port card */
USHORT acb_portnumber; /* which head of dual card */
struct acb_block *FirstHeadsAcb; /* Pointer to first Head's ACB */
USHORT acb_upstreamaddrptr; /* buffer for read adapter */
USHORT acb_maxinternalbufs; /* maximum internal xmit bufs */
USHORT acb_numsmallbufs; /* maximum small xmit bufs */
BOOLEAN RequestInProgress; // Is there an outstanding request
BOOLEAN AdapterInitializing; // Are we initialing?
//
// These variables hold information about a pending request.
//
PUINT BytesWritten;
PUINT BytesRead;
PUINT BytesNeeded;
NDIS_OID Oid;
PVOID InformationBuffer;
UINT InformationBufferLength;
BOOLEAN InterruptsShared;
BOOLEAN FullDuplexEnabled;
BOOLEAN SmallBuffersAreContiguous;
BOOLEAN MergeBuffersAreContiguous;
BOOLEAN RecvBuffersAreContiguous;
BOOLEAN nfpad1;
USHORT nfpad2;
//
// Stuff Needed for a reset.
//
NDIS_MINIPORT_TIMER ResetTimer;
USHORT ResetState;
USHORT ResetRetries;
USHORT InitRetries;
BOOLEAN SentRingStatusLog;
BOOLEAN ResetErrorLogged;
//
// Memory pools.
//
PVOID ReceiveBufferPoolVirt;
NDIS_PHYSICAL_ADDRESS ReceiveBufferPoolPhys;
PVOID MergeBufferPoolVirt;
NDIS_PHYSICAL_ADDRESS MergeBufferPoolPhys;
PVOID SmallBufferPoolVirt;
NDIS_PHYSICAL_ADDRESS SmallBufferPoolPhys;
#if (DBG || DBGPRINT)
USHORT anum;
USHORT max_int_buffs_used;
USHORT num_int_buffs_used;
ULONG XmitSent;
ULONG LastXmitSent;
#endif
} ACB, *PACB;
/*----------------------------------------------------------------------*/
/* Structure Name: ACB Adpter States (AS) */
/* */
/* Description: These equates define the primary states that an */
/* adapter may take on. */
/*----------------------------------------------------------------------*/
#define AS_NOTINSTALLED 0 // Adapter not installed
#define AS_REGISTERING 1 // Adapter is registering
#define AS_REGISTERED 2 // Adapter has been
// registered - but not initialized
#define AS_INITIALIZING 3 // Adapter is initializing
#define AS_INITIALIZED 4 // Adapter initialized
#define AS_OPENING 5 // Adapter is opening
#define AS_OPENED 6 // Adapter opened
#define AS_CLOSING 7 // Adapter is closing
#define AS_RESET_HOLDING 8 // Adapter reset
#define AS_RESETTING 9 // Adapter is resetting
#define AS_UNLOADING 10
#define AS_REMOVING 11
#define AS_HARDERROR 100 // Adapter suffered hardware error
#define AS_CARDERROR 101 // Adapter reset error
#define AS_INITERROR 102 // Adapter initialization error
#define AS_INSTALLED 103 // Adapter installed (not reset)
#define AS_IRQERROR 104 // Adapter IRQ error
#define AS_DMAERROR 105 // Adapter DMA error
#define AS_DOWNFILERR 106 // Adapter download no file error
#define AS_DOWNMEMERR 107 // Adapter download no mem error
#define AS_MEDIAERROR 108 // Adapter media error
#define AS_SPEEDERROR 109 // Adapter ring speed error
typedef struct netflx_reqrsvd {
PNDIS_REQUEST rsvd_nextreq;
USHORT rsvd_req_type;
} NETFLEX_REQRSVD, *PNETFLEX_REQRSVD;
typedef struct netflx_sendpkt_reqrsvd {
PNDIS_PACKET next;
} NETFLEX_SENDPKT_RESERVED, *PNETFLEX_SENDPKT_RESERVED;
#define RESERVED_FROM_PACKET(Packet)\
((PNETFLEX_SENDPKT_RESERVED)((Packet)->MiniportReserved))
typedef struct netflx_entry {
PVOID next;
} NETFLEX_ENTRY, *PNETFLEX_ENTRY;
//------------------
// Definitions
//------------------
#define NETFLEX_MAJ_VER 4
#define NETFLEX_MIN_VER 0
//-------------------------------------
// External Data Variable References
//-------------------------------------
extern MAC macgbls;
extern USHORT gbl_addingdualport;
extern USHORT gbl_portnumbertoadd;
extern NDIS_HANDLE gbl_confighandle;
extern NDIS_OID NetFlexGlobalOIDs_Eth[];
extern NDIS_OID NetFlexNetworkOIDs_Eth[];
extern NDIS_OID NetFlexGlobalOIDs_Tr[];
extern NDIS_OID NetFlexNetworkOIDs_Tr[];
extern SHORT NetFlexGlobalOIDs_Eth_size;
extern SHORT NetFlexNetworkOIDs_Eth_size;
extern SHORT NetFlexGlobalOIDs_Tr_size;
extern SHORT NetFlexNetworkOIDs_Tr_size;
extern OPEN open_mask;
extern INIT init_mask;
extern NDIS_PHYSICAL_ADDRESS NetFlexHighestAddress;
extern NETFLEX_PARMS NetFlex_Defaults;
#endif