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