// Ne2000.h: interface for the CNe2000 class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_NE2000_H__9F497E86_4CD1_4D0E_8D3E_195294B52FF8__INCLUDED_)
#define AFX_NE2000_H__9F497E86_4CD1_4D0E_8D3E_195294B52FF8__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include <kernel/driver.h>
#include <kernel/sys.h>
#define PSTART 0x20 /* if NE2000 is byte length */
#define PSTOP 0x40
#define PSTARTW 0x40 /* if NE2000 is wordlength */
#define PSTOPW 0x80
#define MAX_LOAD 12 /* maximum services per IRQ request*/
#define MAX_RX 10 /* maximum packets recieve per call*/
#define MIN_LENGTH 60 /* minimum length for packet data */
#define MAX_LENGTH 1500 /* maximum length for packet data area */
#define TIMEOUT_DMAMATCH 40 /* for nic_block_input() */
#define TIMEOUT_TX 40
/* DP8390 NIC Registers*/
#define COMMAND 0x00
#define STATUS COMMAND+0
#define PHYSICAL COMMAND+1 /* page 1 */
#define MULTICAST COMMAND+8 /* page 1 */
#define PAGESTART COMMAND+1 /* page 0 */
#define PAGESTOP COMMAND+2
#define BOUNDARY COMMAND+3
#define TRANSMITSTATUS COMMAND+4
#define TRANSMITPAGE COMMAND+4
#define TRANSMITBYTECOUNT0 COMMAND+5
#define NCR COMMAND+5
#define TRANSMITBYTECOUNT1 COMMAND+6
#define INTERRUPTSTATUS COMMAND+7
#define CURRENT COMMAND+7 /* page 1 */
#define REMOTESTARTADDRESS0 COMMAND+8
#define CRDMA0 COMMAND+8
#define REMOTESTARTADDRESS1 COMMAND+9
#define CRDMA1 COMMAND+9
#define REMOTEBYTECOUNT0 COMMAND+10 /* how many bytes we will */
#define REMOTEBYTECOUNT1 COMMAND+11 /* read through remote DMA->IO */
#define RECEIVESTATUS COMMAND+12
#define RECEIVECONFIGURATION COMMAND+12
#define TRANSMITCONFIGURATION COMMAND+13
#define FAE_TALLY COMMAND+13 /* page 0 */
#define DATACONFIGURATION COMMAND+14
#define CRC_TALLY COMMAND+14
#define INTERRUPTMASK COMMAND+15
#define MISS_PKT_TALLY COMMAND+15
/* NE2000 specific implementation registers */
#define NE_RESET 0x1f /* Reset */
#define NE_DATA 0x10 /* Data port (use for PROM) */
#define PAR0 COMMAND+1
#define PAR1 COMMAND+2
#define PAR2 COMMAND+3
#define PAR3 COMMAND+4
#define PAR4 COMMAND+5
#define PAR5 COMMAND+6
/* NIC Commands */
#define NIC_STOP 0x01 /* STOP */
#define NIC_START 0x02 /* START */
#define NIC_PAGE0 0x00
#define NIC_PAGE1 0x40
#define NIC_PAGE2 0x80
#define NIC_TRANSMIT 0x04 /* Transmit a frame */
#define NIC_REM_READ 0x08 /* Remote Read */
#define NIC_REM_WRITE 0x10 /* Remote Write */
#define NIC_DMA_DISABLE 0x20 /* Disable DMA */
/* Data Configuration Register */
#define DCR_WTS 0x01 /* Word Transfer Select (0=byte, 1=word) */
#define DCR_BOS 0x02 /* Byte Order Select (0=big-endian) */
#define DCR_LAS 0x04 /* Long Address Select (0=dual 16-bit DMA) */
#define DCR_LS 0x08 /* Loopback Select (0=loopback) */
#define DCR_AR 0x10 /* Auto Initialize Remote */
#define DCR_FT 0x60 /* (FT0 & FT1) FIFO Threshhold (see datasheet) */
/*#define DCR_DEFAULT 0x58 Standard value for the DCR register */
#define DCR_DEFAULT 0x48 /* don't use Automatic send packet */
#define DCR_DEFAULT_WORD 0x49 /* defuault with wold length transfer */
/* Recieve Configure Register */
#define RCR_SEP 0x01 /* Save Errored Packets */
#define RCR_AR 0x02 /* Accept Runt Packets */
#define RCR_AB 0x04 /* Accept Broadcast */
#define RCR_AM 0x08 /* Accept Multicast */
#define RCR_PRO 0x10 /* Promiscuous Physical */
#define RCR_MON 0x20 /* Monitor Mode */
/*#define RCR_DEFAULT 0x00 Standard value for the RCR register */
#define RCR_DEFAULT 0x0c /* Accept Broadcast/Multicast Packets */
/* Recieve Status Register */
/* note, this is also stored in the status byte in the buffer header. */
/* That's the 4 byte entry in the local buffer, not the packet header. */
#define RSR_PRX 0x01 /* Pakcet Received Intact */
#define RSR_CRC 0x02 /* CRC Error */
#define RSR_FAE 0x04 /* Frame Alignment Error */
#define RSR_FO 0x08 /* FIFO Overrun */
#define RSR_MPA 0x10 /* Missed Packet */
#define RSR_PHY 0x20 /* Physical/Multicast Address (0=physical) */
#define RSR_DIS 0x40 /* Receiver Disabled */
#define RSR_DFR 0x80 /* Deferring */
/* Transmit Configure Register */
#define TCR_CRC 0x01 /* Inhibit CRC (0=CRC active) */
#define TCR_LB 0x06 /* (LB0 & LB1) Encoded Loopback Control */
#define TCR_ATD 0x08 /* Auto Transmit Disable (0=normal) */
#define TCR_OFST 0x10 /* Collision Offset Enable (1=low priority) */
#define TCR_DEFAULT 0x00 /* Standard value for the TCR register */
#define TCR_INTERNAL_LOOPBACK 0x02 /* Internal loopback configuration */
/* Transmit Status Register */
#define TSR_PTX 0x01 /* Packet Transmitted */
#define TSR_ND 0x02 /* Non-Deferral (Documented???) */
#define TSR_COL 0x04 /* Transmit Collided */
#define TSR_ABT 0x08 /* Transmit Aborted */
#define TSR_CRS 0x10 /* Carrier Sense Lost */
#define TSR_FU 0x20 /* FIFO Underrun */
#define TSR_CDH 0x40 /* CD Heartbeat */
#define TSR_OWC 0x80 /* Oout of Window Collision */
/* Interrupt Status Register */
#define ISR_PRX 0x01 /* Packet Received */
#define ISR_PTX 0x02 /* Packet Transmitted */
#define ISR_RXE 0x04 /* Receive Error */
#define ISR_TXE 0x08 /* Transmit Error */
#define ISR_OVW 0x10 /* Overwrite Warning */
#define ISR_CNT 0x20 /* Counter Overflow */
#define ISR_RDC 0x40 /* Remote DMA Complete */
#define ISR_RST 0x80 /* Reset Status */
#define ISR_DEFAULT 0x00 /* Standard value for the ISR register */
#define ISR_ALL 0x3f /* The services that we handle in the isr */
/* Interrupt Mask Register */
#define IMR_PRXE 0x01 /* Packet Received Interrupt Enable */
#define IMR_PTXE 0x02 /* Packet Transmitted Interrupt Enable */
#define IMR_RXEE 0x04 /* Receive Error Interrupt Enable */
#define IMR_TXEE 0x08 /* Transmit Error Interrupt Enable */
#define IMR_OVWE 0x10 /* Overwrite Warning Interrupt Enable */
#define IMR_CNTE 0x20 /* Counter Overflow Interrupt Enable */
#define IMR_RDCE 0x40 /* DMA Complete Interrupt Enable */
#define IMR_DEFAULT 0x3f /* CNTE | OVWE | TXEE | RXEE | PTXE | PRXE */
struct packet_data_t { /* each protocol layer can add it's own */
dword len;
byte *ptr;
};
struct packet_buffer_t {
dword page;
dword count, len;
packet_data_t *buf; /* An array of data segments */
};
struct nic_error_stat_t {
long frame_alignment, crc, missed_packets;
long rx, rx_size, rx_dropped, rx_fifo, rx_overruns;
long tx_collisions;
long tx_aborts, tx_carrier, tx_fifo, tx_heartbeat, tx_window;
};
struct nic_stat_t {
long rx_packets;
long tx_buffered, tx_packets;
nic_error_stat_t errors;
};
struct buffer_header_t {
unsigned char status;
unsigned char next;
unsigned short count; /* length of header and packet */
};
#define LEN_PROM 16
#define MAX_TX 2 /* be careful with this (dual buffers) */
#define MAX_PAGESPERPACKET 6
#define TXPAGES (MAX_TX*MAX_PAGESPERPACKET)
#define LEN_ADDR 6
class CNe2000 :
public IUnknown,
public IDevice
{
public:
CNe2000(word port);
virtual ~CNe2000();
static CNe2000* Detect();
// IUnknown methods
IMPLEMENT_IUNKNOWN(CNe2000);
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
// IDevice methods
STDMETHOD(GetInfo)(device_t* buf);
STDMETHOD(DeviceOpen)();
protected:
word m_port;
int m_pstart, m_pstop, m_wordlength, m_current_page;
nic_stat_t m_stat;
//void (*notify)(void *passback, packet_data *newpacket);
//void *kore; /* Passback pointer */
packet_buffer_t *m_tx_packet[MAX_TX], *m_last_tx;
int m_busy, m_send, m_sending;
static void Isr(dword ctx, int irq);
bool Init(byte *prom, byte *manual);
int DumpProm(byte *prom);
void Start(bool promiscuous);
void Overrun();
void Transmit();
void TransmitError();
void GetHeader(dword page, buffer_header_t *header);
void BlockInput(byte *buf, dword len, dword offset);
void Receive();
void Counters();
int Send(dword buf);
};
#endif // !defined(AFX_NE2000_H__9F497E86_4CD1_4D0E_8D3E_195294B52FF8__INCLUDED_)