439 lines
14 KiB
C
439 lines
14 KiB
C
|
|
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
pc586hrd.h
|
|
|
|
Abstract:
|
|
|
|
This header file is broken into two halves, 82586 specific first and
|
|
pc586 netcard second.
|
|
|
|
Author:
|
|
|
|
Weldon Washburn (o-weldo, Intel) 11/11/90
|
|
|
|
Environment:
|
|
|
|
|
|
Notes:
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#define static
|
|
|
|
// the below #defines were transformed into static USHORTS to workaround
|
|
// a compiler optimization that does not agree with pc586 hardware. See
|
|
// ushort.c for current definitions.
|
|
|
|
#if 0
|
|
// 82586 header file
|
|
|
|
|
|
#define SCBINTMSK 0xf000 // SCB STAT bit mask
|
|
#define SCBINTCX 0x8000 // CX bit, CU finished a command with "I" set
|
|
#define SCBINTFR 0x4000 // FR bit, RU finished receiving a frame
|
|
#define SCBINTCNA 0x2000 // CNA bit, CU not active
|
|
#define SCBINTRNR 0x1000 // RNR bit, RU not ready
|
|
|
|
// command unit status bits
|
|
|
|
#define SCBCUSMSK 0x0700 // SCB CUS bit mask
|
|
#define SCBCUSIDLE 0x0000 // CU idle
|
|
#define SCBCUSSUSPND 0x0100 // CU suspended
|
|
#define SCBCUSACTV 0x0200 // CU active
|
|
|
|
// receive unit status bits
|
|
|
|
#define SCBRUSMSK 0x0070 // SCB RUS bit mask
|
|
#define SCBRUSIDLE 0x0000 // RU idle
|
|
#define SCBRUSSUSPND 0x0010 // RU suspended
|
|
#define SCBRUSNORESRC 0x0020 // RU no resource
|
|
#define SCBRUSREADY 0x0040 // RU ready
|
|
|
|
// bits used to acknowledge an interrupt from 586
|
|
|
|
#define SCBACKMSK 0xf000 // SCB ACK bit mask
|
|
#define SCBACKCX 0x8000 // ACKCX, acknowledge a completed cmd
|
|
#define SCBACKFR 0x4000 // ACKFR, acknowledge a frame reception
|
|
#define SCBACKCNA 0x2000 // ACKCNA, acknowledge CU not active
|
|
#define SCBACKRNR 0x1000 // ACKRNR, acknowledge RU not ready
|
|
|
|
// 586 CU commands
|
|
|
|
#define SCBCUCMSK 0x0700 // SCB CUC bit mask
|
|
#define SCBCUCSTRT 0x0100 // start CU
|
|
#define SCBCUCRSUM 0x0200 // resume CU
|
|
#define SCBCUCSUSPND 0x0300 // suspend CU
|
|
#define SCBCUCABRT 0x0400 // abort CU
|
|
|
|
// 586 RU commands
|
|
|
|
#define SCBRUCMSK 0x0070 // SCB RUC bit mask
|
|
#define SCBRUCSTRT 0x0010 // start RU
|
|
#define SCBRUCRSUM 0x0020 // resume RU
|
|
#define SCBRUCSUSPND 0x0030 // suspend RU
|
|
#define SCBRUCABRT 0x0040 // abort RU
|
|
|
|
#define SCBRESET 0x0080 // software reset of 586
|
|
|
|
// #define's for the command and descriptor blocks
|
|
|
|
#define CSCMPLT 0x8000 // C bit, completed
|
|
#define CSBUSY 0x4000 // B bit, Busy
|
|
#define CSOK 0x2000 // OK bit, error free
|
|
#define CSABORT 0x1000 // A bit, abort
|
|
#define CSEL 0x8000 // EL bit, end of list
|
|
#define CSSUSPND 0x4000 // S bit, suspend
|
|
#define CSINT 0x2000 // I bit, interrupt
|
|
#define CSSTATMSK 0x3fff // Command status mask
|
|
#define CSEOL 0xffff // set for fdrbdofst on unattached FDs
|
|
#define CSEOF 0x8000 // EOF (End Of Frame) in the TBD and RBD
|
|
#define CSRBDCNTMSK 0x3fff // actual count mask in RBD
|
|
|
|
// second level commands
|
|
|
|
#define CSCMDMSK 0x07 // command bits mask
|
|
#define CSCMDNOP 0x00 // NOP
|
|
#define CSCMDIASET 0x01 // Individual Address Set up
|
|
#define CSCMDCONF 0x02 // Configure
|
|
#define CSCMDMCSET 0x03 // Multi-Cast Setup
|
|
#define CSCMDXMIT 0x04 // transmit
|
|
#define CSCMDTDR 0x05 // Time Domain Reflectomete
|
|
#define CSCMDDUMP 0x06 // dump
|
|
#define CSCMDDGNS 0x07 // diagnose
|
|
|
|
#endif // 0
|
|
|
|
extern SCBINTMSK;
|
|
extern SCBINTCX;
|
|
extern SCBINTFR;
|
|
extern SCBINTCNA;
|
|
extern SCBINTRNR;
|
|
|
|
// command unit status bits
|
|
|
|
extern SCBCUSMSK;
|
|
extern SCBCUSIDLE;
|
|
extern SCBCUSSUSPND;
|
|
extern SCBCUSACTV;
|
|
|
|
// receive unit status bits
|
|
|
|
extern SCBRUSMSK;
|
|
extern SCBRUSIDLE;
|
|
extern SCBRUSSUSPND;
|
|
extern SCBRUSNORESRC;
|
|
extern SCBRUSREADY;
|
|
|
|
// bits used to acknowledge an interrupt from 586
|
|
|
|
extern SCBACKMSK;
|
|
extern SCBACKCX;
|
|
extern SCBACKFR;
|
|
extern SCBACKCNA;
|
|
extern SCBACKRNR;
|
|
|
|
// 586 CU commands
|
|
|
|
extern SCBCUCMSK;
|
|
extern SCBCUCSTRT;
|
|
extern SCBCUCRSUM;
|
|
extern SCBCUCSUSPND;
|
|
extern SCBCUCABRT;
|
|
|
|
// 586 RU commands
|
|
|
|
extern SCBRUCMSK;
|
|
extern SCBRUCSTRT;
|
|
extern SCBRUCRSUM;
|
|
extern SCBRUCSUSPND;
|
|
extern SCBRUCABRT;
|
|
|
|
extern SCBRESET;
|
|
|
|
// extern's for the command and descriptor blocks
|
|
|
|
extern CSCMPLT;
|
|
extern CSBUSY;
|
|
extern CSOK;
|
|
extern CSABORT;
|
|
extern CSEL;
|
|
extern CSSUSPND;
|
|
extern CSINT;
|
|
extern CSSTATMSK;
|
|
extern CSEOL;
|
|
extern CSEOF;
|
|
extern CSRBDCNTMSK;
|
|
|
|
// second level commands
|
|
|
|
extern CSCMDMSK;
|
|
extern CSCMDNOP;
|
|
extern CSCMDIASET;
|
|
extern CSCMDCONF;
|
|
extern CSCMDMCSET;
|
|
extern CSCMDXMIT;
|
|
extern CSCMDTDR;
|
|
extern CSCMDDUMP;
|
|
extern CSCMDDGNS;
|
|
|
|
|
|
|
|
#define MAX_MULTICAST_ADDRESS ((UINT)16)
|
|
typedef UCHAR NETADDR[6];
|
|
|
|
// at address 0xfffff6 the 586 sees the following data structure
|
|
|
|
typedef struct SCP {
|
|
USHORT ScpSysBus; // system bus width
|
|
USHORT ScpUnused[2]; // unused area
|
|
USHORT ScpIscp; // points to iscpt
|
|
USHORT ScpIscpBase; // points to iscpt
|
|
} SCP, *PSCP;
|
|
|
|
typedef struct ISCP {
|
|
USHORT IscpBusy; // 1 means 82586 is initializing
|
|
// only the first 8 bit are used
|
|
USHORT IscpScbOfst; // offset of the scb in the shared memory
|
|
PVOID IscpScbBase; // base of shared memory
|
|
} ISCP, *PISCP;
|
|
|
|
// System Control Block
|
|
typedef struct SCB {
|
|
USHORT ScbStatus; // STAT, CUS, RUS
|
|
USHORT ScbCmd; // ACK, CUC, RUC
|
|
USHORT ScbCblOfst; // CBL (Command Block List) offset
|
|
USHORT ScbRfaOfst; // RFA (Receive Frame Area) offset
|
|
USHORT ScbCrcErr; // count of CRC errors.
|
|
USHORT ScbAlnErr; // count of alignment errors
|
|
USHORT ScbRscErr; // count of no resource errors
|
|
USHORT ScbOvrnErr; // count of overrun errors
|
|
} SCB, *PSCB;
|
|
|
|
|
|
// config command sub-block
|
|
|
|
typedef struct CONF {
|
|
USHORT CnfFifoByte; // BYTE CNT, FIFO LIM (TXFIFO)
|
|
USHORT CnfAddMode; // SRDY, SAVBF, ADDRLEN, ALLOC, PREAMLEN
|
|
// INTLPBCK, EXTLPBK
|
|
USHORT CnfPriData; // LINPRIO, ACR, BOFMET, INTERFRAMESPACING
|
|
USHORT CnfSlot; // SLOTTIME, RETRY NUMBER
|
|
USHORT CnfHrdwr; // PRM, BCDIS, MANCH/NRZ, TONOCRS, NCRCINS
|
|
// CRC, BTSTF, PAD,CRSF,CRSSRC,CDTF,CDTSRC
|
|
USHORT CnfMinLen; // MinFRMLEN
|
|
} CONF, *PCONF;
|
|
|
|
// xmt command sub-block
|
|
|
|
typedef struct TRANSMIT {
|
|
USHORT XmtTbdOfst; // Transmit Buffer Descriptor offset
|
|
NETADDR XmtDest; // Destination Address
|
|
USHORT XmtLength; // length of the frame
|
|
} TRANSMIT, *PTRANSMIT;
|
|
|
|
// dump command sub-block
|
|
|
|
typedef struct DUMP {
|
|
USHORT DmpBufOfst; // dump buffer offset
|
|
} DUMP, *PDUMP;
|
|
|
|
typedef struct MCADDR {
|
|
USHORT McCnt;
|
|
USHORT McAddress[MAX_MULTICAST_ADDRESS][MAC_LENGTH_OF_ADDRESS / 2];
|
|
} MCADDR, *PMCADDR;
|
|
|
|
|
|
// command block and sub-blocks
|
|
|
|
typedef struct CMD {
|
|
USHORT CmdStatus, // C, B, command specific status
|
|
CmdCmd, // EL, S, I, opcode
|
|
CmdNxtOfst; // pointer to the next command block
|
|
union {
|
|
DUMP PrmDump; // dump
|
|
TRANSMIT PrmXmit; // transmit
|
|
CONF PrmConf; // configure
|
|
NETADDR PrmIaSet; // individual address setup
|
|
MCADDR PrmMcSet; // multicast command
|
|
} PRMTR; // parameters
|
|
} CMD, *PCMD;
|
|
|
|
// xmt buffer descriptor
|
|
|
|
typedef struct TBD {
|
|
USHORT TbdCount; // End Of Frame(EOF), Actual count(ACTCOUNT)
|
|
USHORT TbdNxtOfst; // offset of next TBD
|
|
USHORT TbdBuff; // tbd address
|
|
USHORT TbdBuffBase; // tbd address
|
|
} TBD, *PTBD;
|
|
|
|
// rcv buffer descriptor
|
|
|
|
typedef struct RBD {
|
|
USHORT RbdStatus; // EOF, ACTCOUNT feild valid (F), ACTCOUNT
|
|
USHORT RbdNxtOfst; // offset of next RBD
|
|
USHORT RbdBuff; // rbd address
|
|
USHORT RbdBuffBase; // rbd address
|
|
USHORT RbdSize; // EL, size of the buffer
|
|
} RBD, *PRBD;
|
|
|
|
// frame descriptor
|
|
|
|
typedef struct _FD {
|
|
USHORT FdStatus; // C, B, OK, S6-S11
|
|
USHORT FdCmd; // End of List (EL), Suspend (S)
|
|
USHORT FdNxtOfst; // offset of next FD
|
|
USHORT FdRbdOfst; // offset of the RBD
|
|
NETADDR FdDest; // destination address
|
|
NETADDR FdSrc; // source address
|
|
USHORT FdLength; // length of the received frame
|
|
} FD, *PFD;
|
|
|
|
// dump buffer definition
|
|
|
|
typedef struct DUMPBUF {
|
|
USHORT
|
|
Dmpfifobyte, // same as in conf. cmd, except for
|
|
Dmpaddmode, // bit 6 of fifobyte
|
|
Dmppridata,
|
|
Dmpslot,
|
|
Dmphware,
|
|
Dmpminlen,
|
|
Dmpiar10, // Individual address bytes
|
|
Dmpiar32,
|
|
Dmpiar54,
|
|
Dmplaststat, // status word of last cmd
|
|
Dmptxcr10, // xmit CRC generator
|
|
Dmptxcr32,
|
|
Dmprxcr10, // rcv CRC generator
|
|
Dmprxcr32,
|
|
Dmptmp10, // Internal temporaries
|
|
Dmptmp32,
|
|
Dmptmp54,
|
|
Dmprsr, // receive status register
|
|
Dmphash10, // Hash table
|
|
Dmphash32,
|
|
Dmphash54,
|
|
Dmphash76,
|
|
Dmplasttdr, // Status of last TDR command
|
|
Dmpfill [8], // Mostly 0 (!)
|
|
Dmpaddrlen,
|
|
Dmpnrbsz, // Size of next receive buffer
|
|
Dmpnrbhi, // High byte of next RB address
|
|
Dmpnrblo, // Lo byte of " " "
|
|
Dmpcrbsz, // # of bytes in last buff used
|
|
Dmplarbd, // Look ahead buff. des. (N+2)
|
|
Dmpnrbd, // Next RBD address
|
|
Dmpcrbd, // Current (last filled) rbd
|
|
Dmpcrbebc, // current rb empty byte count
|
|
Dmpnfdaddr, // next + 1 free frame descriptor
|
|
Dmpcfdaddr, // next free frame descriptor
|
|
Dmptmp,
|
|
Dmpntbcnt, // last tb cnt of completed cmd
|
|
Dmpdbufaddr, // Address of buffer in dump cmd
|
|
Dmpntbaddr, // Next Xmit buff address
|
|
Dmpltbdaddr, // next xmit buff descriptor
|
|
Dmpntbdaddr, // current xmit buff descriptor
|
|
Dmptmp1,
|
|
Dmpncbaddr, // next command block address
|
|
Dmpccbaddr, // current cmd blk address
|
|
Dmptmp2,
|
|
Dmpscbaddr, // Address of SCB
|
|
Dmpfill2 [6],
|
|
Dmpfifolim,
|
|
Dmpfill3 [3],
|
|
Dmprusreq,
|
|
Dmpcusreq,
|
|
Dmprus,
|
|
Dmpfill4 [6],
|
|
Dmpbuffhi, // High address of dump buffer
|
|
Dmpbufflo, // Lo address of dump buffer
|
|
Dmpdmabc, // Receive dma byte count
|
|
Dmpbrbuff, // Base + buffer
|
|
Dmprdmahi, // receive dma address
|
|
Dmprdmalo, // " " "
|
|
Dmpfill5 [7];
|
|
} DUMPBUF, *PDUMPBUF;
|
|
|
|
|
|
|
|
// BOARD SPECIFIC #DEFINES
|
|
|
|
#define OFFSETNORMMODE 0x3000 // 0=esi loopback, 1 normal data xfer
|
|
#define OFFSETCHANATT 0x3002 // 0=clear 586 channel attention, 1 = set
|
|
#define OFFSETRESET 0x3004 // 0=clear 586 h/w reset, 1=set
|
|
#define OFFSETINTENAB 0x3006 // 0=disable board interrupts 1=enable
|
|
#define OFFSET16BXFER 0x3008 // 0=8bit xfer, 1=16bit xfer (for at)
|
|
#define OFFSETSYSTYPE 0x300a // 0=pc or pc/xt, 1=at
|
|
#define OFFSETINTSTAT 0x300c // 0=board's interrupt active, 1=inactive
|
|
#define OFFSETADDRPROM 0x2000 // first byte of on-board ethernet id
|
|
|
|
#define EXTENDEDADDRESS 0x20000 // used when board addr is above 1 meg
|
|
#define OFFSETSCP 0x7ff6 // 586's scp points to the iscp
|
|
#define OFFSETISCP 0x7fee // this points to the system control block
|
|
#define OFFSETSCB 0x7fde // points to rcv frame and command unit areas
|
|
#define OFFSETRU 0x4000 // the RAM for frame descriptors, receive
|
|
// buffer descriptors & rcv buffers is fixed at
|
|
// 0x4000 to 0x7800 on the half-card
|
|
#define OFFSETRBD 0x4228 // rbd+rbuf must start on 32 bit boundry
|
|
#define OFFSETCU 0x7814 // RAM offset for CBLs, TBDs, etc
|
|
// xmt area is from 0x7814 to 0x7f00
|
|
// from 0x7f01 to 0x7fff is scp, iscp, scb
|
|
#define OFFSETTBD 0x7914 // allows 256 bytes for command block
|
|
#define OFFSETTBUF 0x7924 // start of user data to send
|
|
#define NFD 25 // 856 frame descriptor
|
|
#define NRBD 25 // 586 rcv buffer descriptor
|
|
|
|
#define RCVBUFSIZE 532 // 532 * 2 = max size used by tcp
|
|
#define PC586_SIZE_OF_RECEIVE_BUFFERS 532 // 532 * 2 = max size used by tcp
|
|
|
|
#define DLDEAD 0xffff // suppliments 82586.h datalink states
|
|
|
|
#define CMD0 0 // used on 586 half-card command registers
|
|
#define CMD1 0xffff // the mate of the above
|
|
|
|
|
|
|
|
// all accesses to RAM on the pc586 board M*U*S*T be 16 bit accesses.
|
|
// therefore the following struct is used to pack and unpack unsigned short
|
|
|
|
typedef struct { union { UCHAR a[2];
|
|
USHORT b; } c; } PACKUSHORTT;
|
|
|
|
|
|
typedef struct { union { UCHAR AChar[4];
|
|
ULONG ALong; } u; } PACKLONGT;
|
|
|
|
|
|
|
|
//
|
|
// Following def'ns are for PC586 set at IRQ = 5:
|
|
// #define PC586_VECTOR 05
|
|
// #define PC586_IRQL 30
|
|
|
|
//
|
|
// Following allow PC586 to run at whatever IRQL and memory you set below.
|
|
// PC586 at IRQ 10 and memory at 0xC800 in current configuration.
|
|
// (nt\public\spec\nt386\intmgr.txt for details of IRQL/IRQ/VECTOR assignments)
|
|
//
|
|
|
|
#define PC586_DEFAULT_INTERRUPT_VECTOR ((CCHAR)10)
|
|
#define PC586_DEFAULT_INTERRUPT_IRQL ((CCHAR)25)
|
|
#define PC586_DEFAULT_STATIC_RAM 0xC8000
|
|
|
|
//
|
|
//ZZZ Get from configuration file.
|
|
//
|
|
#define MAX_ADAPTERS ((UINT)4)
|
|
#define PC586_LARGE_BUFFER_SIZE 1514
|
|
|