Added Novell Eagle 2000 Driver

svn path=/trunk/; revision=1319
This commit is contained in:
Casper Hornstrup 2000-08-27 16:35:31 +00:00
parent 33252ab449
commit 9a1e13b7d8
14 changed files with 2881 additions and 4 deletions

View file

@ -14,7 +14,7 @@ include rules.mak
# Required to run the system # Required to run the system
# #
COMPONENTS = iface_native iface_additional ntoskrnl COMPONENTS = iface_native iface_additional ntoskrnl
DLLS = ntdll kernel32 crtdll advapi32 fmifs gdi32 secur32 DLLS = ntdll kernel32 crtdll advapi32 fmifs gdi32 secur32 user32
SUBSYS = smss win32k csrss SUBSYS = smss win32k csrss
# #
@ -41,11 +41,13 @@ FS_DRIVERS = vfat
# ndis tdi tcpip tditest # ndis tdi tcpip tditest
NET_DRIVERS = ndis tcpip tditest NET_DRIVERS = ndis tcpip tditest
KERNEL_SERVICES = $(DEVICE_DRIVERS) $(FS_DRIVERS) $(NET_DRIVERS) # ne2000
NET_DEVICE_DRIVERS = ne2000
KERNEL_SERVICES = $(DEVICE_DRIVERS) $(FS_DRIVERS) $(NET_DRIVERS) $(NET_DEVICE_DRIVERS)
APPS = args hello shell test cat bench apc shm lpc thread event file gditest \ APPS = args hello shell test cat bench apc shm lpc thread event file gditest \
pteb consume dump_shared_data vmtest pteb consume dump_shared_data vmtest wstest
# objdir # objdir
all: buildno $(COMPONENTS) $(DLLS) $(SUBSYS) $(LOADERS) $(KERNEL_SERVICES) $(APPS) all: buildno $(COMPONENTS) $(DLLS) $(SUBSYS) $(LOADERS) $(KERNEL_SERVICES) $(APPS)
@ -183,6 +185,21 @@ $(NET_DRIVERS:%=%_dist): %_dist:
.PHONY: $(NET_DRIVERS) $(NET_DRIVERS:%=%_clean) $(NET_DRIVERS:%=%_install) \ .PHONY: $(NET_DRIVERS) $(NET_DRIVERS:%=%_clean) $(NET_DRIVERS:%=%_install) \
$(NET_DRIVERS:%=%_dist) $(NET_DRIVERS:%=%_dist)
$(NET_DEVICE_DRIVERS): %:
make -C services/net/dd/$*
$(NET_DEVICE_DRIVERS:%=%_clean): %_clean:
make -C services/net/dd/$* clean
$(NET_DEVICE_DRIVERS:%=%_install): %_install:
make -C services/net/dd/$* install
$(NET_DEVICE_DRIVERS:%=%_dist): %_dist:
make -C services/net/dd/$* dist
.PHONY: $(NET_DEVICE_DRIVERS) $(NET_DEVICE_DRIVERS:%=%_clean) \
$(NET_DEVICE_DRIVERS:%=%_install) $(NET_DEVICE_DRIVERS:%=%_dist)
# #
# Kernel loaders # Kernel loaders
# #

View file

@ -0,0 +1 @@
DIRS= ne2000

View file

@ -0,0 +1,118 @@
# $Id: Makefile,v 1.1 2000/08/27 16:35:04 chorns Exp $
#
# NE2000.SYS build spec
#
TARGETNAME=ne2000
BASE_CFLAGS = -I./include -I../../../../include -DNDIS_MINIPORT_DRIVER
RESOURCE_OBJECT = $(TARGETNAME).coff
NE2000_OBJECTS = ne2000/main.o ne2000/8390.o
IMPORT_LIBS = ../../ndis/ndis.a ../../../../ntoskrnl/ntoskrnl.a
all: objects $(TARGETNAME).sys
objects:
mkdir objects
objects/ne2000.o: $(NE2000_OBJECTS)
$(LD) -r $(NE2000_OBJECTS) -o objects/ne2000.o
OBJECTS = objects/ne2000.o
$(TARGETNAME).coff: $(TARGETNAME).rc ../../../include/reactos/resource.h
ifeq ($(DOSCLI),yes)
CLEAN_FILES = \
*.o ne2000\*.o objects\*.o $(TARGETNAME).coff \
$(TARGETNAME).a junk.tmp base.tmp temp.exp \
$(TARGETNAME).sys $(TARGETNAME).sym
else
CLEAN_FILES = \
*.o ne2000\*.o objects/*.o $(TARGETNAME).coff \
$(TARGETNAME).a junk.tmp base.tmp temp.exp \
$(TARGETNAME).sys $(TARGETNAME).sym
endif
$(TARGETNAME).sys: $(OBJECTS) $(TARGETNAME).def
$(LD) -r $(OBJECTS) -o $(TARGETNAME).o
$(DLLTOOL) \
--dllname $(TARGETNAME).sys \
--def $(TARGETNAME).def \
--output-lib $(TARGETNAME).a \
--kill-at
$(CC) \
-specs=../../../../specs \
--subsystem=native \
-mdll \
--dll \
-e _DriverEntry@8 \
-o junk.tmp \
-Wl,--image-base,0x10000 \
-Wl,--file-alignment,0x1000 \
-Wl,--section-alignment,0x1000 \
-Wl,--defsym,_end=end \
-Wl,--defsym,_edata=__data_end__ \
-Wl,--defsym,_etext=etext \
-Wl,--base-file,base.tmp \
$(TARGETNAME).o \
$(IMPORT_LIBS)
- $(RM) junk.tmp
$(DLLTOOL) \
--dllname $(TARGETNAME).sys \
--base-file base.tmp \
--output-exp temp.exp \
--def $(TARGETNAME).def \
--kill-at
- $(RM) base.tmp
$(CC) \
-specs=../../../../specs \
--subsystem=native \
-mdll \
--dll \
-e _DriverEntry@8 \
-o $(TARGETNAME).sys \
-Wl,--image-base,0x0 \
-Wl,--file-alignment,0x1000 \
-Wl,--section-alignment,0x1000 \
-Wl,--defsym,_end=end \
-Wl,--defsym,_edata=__data_end__ \
-Wl,--defsym,_etext=etext \
-Wl,temp.exp \
$(TARGETNAME).o \
$(IMPORT_LIBS)
- $(RM) temp.exp
$(NM) --numeric-sort $(TARGETNAME).sys > $(TARGETNAME).sym
clean: $(CLEAN_FILES:%=%_clean)
$(CLEAN_FILES:%=%_clean): %_clean:
- $(RM) $*
.PHONY: clean $(CLEAN_FILES:%=%_clean)
install: $(FLOPPY_DIR)/drivers/$(TARGETNAME).sys
$(FLOPPY_DIR)/drivers/$(TARGETNAME).sys: $(TARGETNAME).sys
ifeq ($(DOSCLI),yes)
$(CP) $(TARGETNAME).sys $(FLOPPY_DIR)\drivers\$(TARGETNAME).sys
else
$(CP) $(TARGETNAME).sys $(FLOPPY_DIR)/drivers/$(TARGETNAME).sys
endif
dist: $(DIST_DIR)/drivers/$(TARGETNAME).sys
$(DIST_DIR)/drivers/$(TARGETNAME).sys: $(TARGETNAME).sys
ifeq ($(DOSCLI),yes)
$(CP) $(TARGETNAME).sys ..\..\$(DIST_DIR)\drivers\$(TARGETNAME).sys
else
$(CP) $(TARGETNAME).sys ../../$(DIST_DIR)/drivers/$(TARGETNAME).sys
endif
#WITH_DEBUGGING = yes
#WIN32_LEAN_AND_MEAN = yes
#WARNINGS_ARE_ERRORS = yes
include ../../../../rules.mak

View file

@ -0,0 +1,157 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Novell Eagle 2000 driver
* FILE: include/8390.h
* PURPOSE: National Semiconductor 8390 NIC definitions
*/
#ifndef __8390_H
#define __8390_H
/* Page 0 register layout (PS1 = 0, PS0 = 0) */
#define PG0_CR 0x00 /* Command Register (R/W) */
#define PG0_CLDA0 0x01 /* Current Local DMA Address 0 (R) */
#define PG0_PSTART 0x01 /* Page Start Register (W) */
#define PG0_CLDA1 0x02 /* Current Local DMA Address 1 (R) */
#define PG0_PSTOP 0x02 /* Page Stop Register (W) */
#define PG0_BNRY 0x03 /* Boundary Pointer (R/W) */
#define PG0_TSR 0x04 /* Transmit Status Register (R) */
#define PG0_TPSR 0x04 /* Transmit Page Start Register (W) */
#define PG0_NCR 0x05 /* Number of Collisions Register (R) */
#define PG0_TBCR0 0x05 /* Transmit Byte Count Register 0 (W) */
#define PG0_FIFO 0x06 /* FIFO (R) */
#define PG0_TBCR1 0x06 /* Transmit Byte Count Register 1 (W) */
#define PG0_ISR 0x07 /* Interrupt Status Register (R/W) */
#define PG0_CRDA0 0x08 /* Current Remote DMA Address 0 (R) */
#define PG0_RSAR0 0x08 /* Remote Start Address Register 0 (W) */
#define PG0_CRDA1 0x09 /* Current Remote DMA Address 1 (R) */
#define PG0_RSAR1 0x09 /* Remote Start Address Register 1 (W) */
#define PG0_RBCR0 0x0A /* Remote Byte Count Register 0 (W) */
#define PG0_RBCR1 0x0B /* Remote Byte Count Register 1 (W) */
#define PG0_RSR 0x0C /* Receive Status Register (R) */
#define PG0_RCR 0x0C /* Receive Configuration Register (W) */
#define PG0_CNTR0 0x0D /* Tally Counter 0 (Frame Alignment Errors) (R) */
#define PG0_TCR 0x0D /* Transmit Configuration Register (W) */
#define PG0_CNTR1 0x0E /* Tally Counter 1 (CRC Errors) (R) */
#define PG0_DCR 0x0E /* Data Configuration Register (W) */
#define PG0_CNTR2 0x0F /* Tally Counter 2 (Missed Packet Errors) (R) */
#define PG0_IMR 0x0F /* Interrupt Mask Register (W) */
/* Page 1 register layout (PS1 = 0, PS0 = 1) */
#define PG1_CR 0x00 /* Command Register (R/W) */
#define PG1_PAR 0x01 /* Physical Address Registers (6 registers) (R/W) */
#define PG1_CURR 0x07 /* Current Page Register (R/W) */
#define PG1_MAR 0x08 /* Multicast Address Registers (8 registers) (R/W) */
/* Page 2 register layout (PS1 = 1, PS0 = 0) */
#define PG2_CR 0x00 /* Command Register (R/W) */
#define PG2_PSTART 0x01 /* Page Start Register (R) */
#define PG2_CLDA0 0x01 /* Current Local DMA Address 0 (W) */
#define PG2_PSTOP 0x02 /* Page Stop Register (R) */
#define PG2_CLDA1 0x02 /* Current Local DMA Address 1 (W) */
#define PG2_RNPP 0x03 /* Remote Next Packet Pointer (R/W) */
#define PG2_TPSR 0x04 /* Transmit Page Start Address (R) */
#define PG2_LNPP 0x05 /* Local Next Packet Pointer (R/W) */
#define PG2_AC1 0x06 /* Address Counter (Upper) (R/W) */
#define PG2_AC0 0x07 /* Address Counter (Lower) (R/W) */
#define PG2_RCR 0x0C /* Receive Configuration Register (R) */
#define PG2_TCR 0x0D /* Transmit Configuration Register (R) */
#define PG2_DCR 0x0E /* Data Configuration Register (R) */
#define PG2_IMR 0x0F /* Interrupt Mask Register (R) */
/* Bits in PGX_CR - Command Register */
#define CR_STP 0x01 /* Stop chip */
#define CR_STA 0x02 /* Start chip */
#define CR_TXP 0x04 /* Transmit a frame */
#define CR_RD0 0x08 /* Remote read */
#define CR_RD1 0x10 /* Remote write */
#define CR_RD2 0x20 /* Abort/complete remote DMA */
#define CR_PAGE0 0x00 /* Select page 0 of chip registers */
#define CR_PAGE1 0x40 /* Select page 1 of chip registers */
#define CR_PAGE2 0x80 /* Select page 2 of chip registers */
/* Bits in PG0_ISR - Interrupt Status Register */
#define ISR_PRX 0x01 /* Packet received, no errors */
#define ISR_PTX 0x02 /* Packet transmitted, no errors */
#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 */
/* Bits in PG0_TSR - Transmit Status Register */
#define TSR_PTX 0x01h /* Packet transmitted without error */
#define TSR_COL 0x04h /* Collided at least once */
#define TSR_ABT 0x08h /* Collided 16 times and was dropped */
#define TSR_CRS 0x10h /* Carrier sense lost */
#define TSR_FU 0x20h /* Transmit FIFO Underrun */
#define TSR_CDH 0x40h /* Collision detect heartbeat */
#define TSR_OWC 0x80h /* Out of window collision */
/* Bits for PG0_RCR - Receive Configuration Register */
#define RCR_SEP 0x01 /* Save error packets */
#define RCR_AR 0x02 /* Accept runt packets */
#define RCR_AB 0x04 /* Accept broadcasts */
#define RCR_AM 0x08 /* Accept multicast */
#define RCR_PRO 0x10 /* Promiscuous physical addresses */
#define RCR_MON 0x20 /* Monitor mode */
/* Bits in PG0_RSR - Receive Status Register */
#define RSR_PRX 0x01 /* Received packet 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 */
#define RSR_DIS 0x40 /* Receiver disabled (monitor mode) */
#define RSR_DFR 0x80 /* Deferring */
/* Bits in PG0_TCR - Transmit Configuration Register */
#define TCR_CRC 0x01 /* Inhibit CRC, do not append CRC */
#define TCR_LOOP 0x02 /* Set loopback mode */
#define TCR_LB01 0x06 /* Encoded loopback control */
#define TCR_ATD 0x08 /* Auto transmit disable */
#define TCR_OFST 0x10 /* Collision offset enable */
/* Bits in PG0_DCR - Data Configuration Register */
#define DCR_WTS 0x01 /* Word transfer mode selection */
#define DCR_BOS 0x02 /* Byte order selection */
#define DCR_LAS 0x04 /* Long address selection */
#define DCR_LS 0x08 /* Loopback select (when 0) */
#define DCR_ARM 0x10 /* Autoinitialize remote */
#define DCR_FT00 0x00 /* Burst length selection (1 word/2 bytes) */
#define DCR_FT01 0x20 /* burst length selection (2 words/4 bytes) */
#define DCR_FT10 0x40 /* Burst length selection (4 words/8 bytes) */
#define DCR_FT11 0x60 /* Burst length selection (6 words/12 bytes) */
/* Bits in PG0_IMR - 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 /* Remote DMA complete interrupt enable */
#define IMR_ALLE 0x7F /* All interrupts enable */
/* NIC prepended structure to a received packet */
typedef struct _PACKET_HEADER {
UCHAR Status; /* See RSR_* constants */
UCHAR NextPacket; /* Pointer to next packet in chain */
USHORT PacketLength; /* Length of packet including this header */
} PACKET_HEADER, PPACKET_HEADER;
#define NICDisableInterrupts(Adapter) \
NdisRawWritePortUchar((Adapter)->IOBase + PG0_IMR, 0x00);
#define NICEnableInterrupts(Adapter) \
NdisRawWritePortUchar((Adapter)->IOBase + PG0_IMR, (Adapter)->InterruptMask);
VOID MiniportHandleInterrupt(
IN NDIS_HANDLE MiniportAdapterContext);
#endif /* __8390_H */
/* EOF */

View file

@ -0,0 +1,92 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Novell Eagle 2000 driver
* FILE: include/debug.h
* PURPOSE: Debugging support macros
* DEFINES: DBG - Enable debug output
* NASSERT - Disable assertions
*/
#ifndef __DEBUG_H
#define __DEBUG_H
#define NORMAL_MASK 0x000000FF
#define SPECIAL_MASK 0xFFFFFF00
#define MIN_TRACE 0x00000001
#define MID_TRACE 0x00000002
#define MAX_TRACE 0x00000003
#define DEBUG_MEMORY 0x00000100
#define DEBUG_ULTRA 0xFFFFFFFF
#ifdef DBG
extern ULONG DebugTraceLevel;
#ifdef _MSC_VER
#define NDIS_DbgPrint(_t_, _x_) \
if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \
((DebugTraceLevel & _t_) > NORMAL_MASK)) { \
DbgPrint("(%s:%d) ", __FILE__, __LINE__); \
DbgPrint _x_ ; \
}
#else /* _MSC_VER */
#define NDIS_DbgPrint(_t_, _x_) \
if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \
((DebugTraceLevel & _t_) > NORMAL_MASK)) { \
DbgPrint("(%s:%d)(%s) ", __FILE__, __LINE__, __FUNCTION__); \
DbgPrint _x_ ; \
}
#endif /* _MSC_VER */
#ifdef ASSERT
#undef ASSERT
#endif
#ifdef NASSERT
#define ASSERT(x)
#else /* NASSERT */
#define ASSERT(x) if (!(x)) { NDIS_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); KeBugCheck(0); }
#endif /* NASSERT */
#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x))
#else /* DBG */
#define NDIS_DbgPrint(_t_, _x_)
#define ASSERT_IRQL(x)
#define ASSERT(x)
#endif /* DBG */
#define assert(x) ASSERT(x)
#define assert_irql(x) ASSERT_IRQL(x)
#ifdef _MSC_VER
#define UNIMPLEMENTED \
NDIS_DbgPrint(MIN_TRACE, ("The function at %s:%d is unimplemented, \
but come back another day.\n", __FILE__, __LINE__));
#else /* _MSC_VER */
#define UNIMPLEMENTED \
NDIS_DbgPrint(MIN_TRACE, ("%s at %s:%d is unimplemented, \
but come back another day.\n", __FUNCTION__, __FILE__, __LINE__));
#endif /* _MSC_VER */
#define CHECKPOINT \
do { NDIS_DbgPrint(MIN_TRACE, ("%s:%d\n", __FILE__, __LINE__)); } while(0);
#endif /* __DEBUG_H */
/* EOF */

View file

@ -0,0 +1,249 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Novell Eagle 2000 driver
* FILE: include/ne2000.h
* PURPOSE: NE2000 driver definitions
*/
#ifndef __NE2000_H
#define __NE2000_H
#ifdef _MSC_VER
#ifndef ULONG_PTR
#define ULONG ULONG_PTR
#endif
#include <ndis.h>
#else
#include <net/ndis.h>
#endif
#include <8390.h>
#include <debug.h>
/* Define NOCARD to test NDIS without a card */
//#define NOCARD
/* NE2000 sepcific constants */
#define NIC_DATA 0x10 /* Data register */
#define NIC_RESET 0x1F /* Reset register */
/* Global constants */
#define DRIVER_NDIS_MAJOR_VERSION 3
#define DRIVER_NDIS_MINOR_VERSION 0
#define DRIVER_DEFAULT_IO_BASE_ADDRESS 0x300
#define DRIVER_DEFAULT_INTERRUPT_NUMBER 10
#define DRIVER_MAX_MULTICAST_LIST_SIZE 8
#define DRIVER_VENDOR_DESCRIPTION "Novell Eagle 2000 Adapter."
#define DRIVER_VENDOR_DRIVER_VERSION 0x0100 /* 1.0 */
#define DRIVER_FRAME_SIZE 1514 /* Size of an ethernet frame */
#define DRIVER_HEADER_SIZE 14 /* Size of an ethernet header */
#define DRIVER_LENGTH_OF_ADDRESS 6 /* Size of an ethernet address */
/* Maximum lookahead buffer size */
#define DRIVER_MAXIMUM_LOOKAHEAD (252 - DRIVER_HEADER_SIZE)
/* Size of a block in a buffer ring */
#define DRIVER_BLOCK_SIZE 256
/* Default number of transmit buffers */
#define DRIVER_DEFAULT_TX_BUFFER_COUNT 12
/* Interrupt Mask Register value */
#define DRIVER_INTERRUPT_MASK IMR_ALLE - IMR_RDCE
/* Global structures */
typedef struct _MINIPORT_RESERVED
{
PNDIS_PACKET Next;
} MINIPORT_RESERVED, *PMINIPORT_RESERVED;
#define RESERVED(Packet) ((PMINIPORT_RESERVED)((Packet)->u.s1.MiniportReserved))
typedef UCHAR DRIVER_HARDWARE_ADDRESS[DRIVER_LENGTH_OF_ADDRESS];
/* Information about an adapter */
typedef struct _NIC_ADAPTER
{
/* Entry on global adapter list */
LIST_ENTRY ListEntry;
/* Adapter handle */
NDIS_HANDLE MiniportAdapterHandle;
/* NDIS interrupt object */
NDIS_MINIPORT_INTERRUPT Interrupt;
/* I/O base address and interrupt number of adapter */
ULONG IoBaseAddress;
ULONG InterruptNumber;
/* Mapped address of the I/O base port */
PUCHAR IOBase;
/* TRUE if the NIC can transfer in word mode */
BOOLEAN WordMode;
/* Base address and size of the onboard memory window */
PUCHAR RamBase;
UINT RamSize;
/* Station Address PROM (SAPROM) */
UCHAR SAPROM[16];
/* Onboard ethernet address from the manufacturer */
DRIVER_HARDWARE_ADDRESS PermanentAddress;
/* Ethernet address currently in use */
DRIVER_HARDWARE_ADDRESS StationAddress;
/* Maximum number of multicast addresses this adapter supports */
ULONG MaxMulticastListSize;
/* List of multicast addresses in use */
DRIVER_HARDWARE_ADDRESS Addresses[DRIVER_MAX_MULTICAST_LIST_SIZE];
/* Current multicast address mask */
UCHAR MulticastAddressMask[8];
/* Masked interrupts (IMR value) */
ULONG InterruptMask;
/* Interrupts that have occurred */
UCHAR InterruptStatus;
/* Current packet filter */
ULONG PacketFilter;
/* Lookahead buffer */
UINT LookaheadSize;
UCHAR Lookahead[DRIVER_MAXIMUM_LOOKAHEAD + DRIVER_HEADER_SIZE];
/* Receive buffer ring */
UINT PageStart;
UINT PageStop;
UINT CurrentPage;
UINT NextPacket;
/* TRUE if there was a buffer overflow */
BOOLEAN BufferOverflow;
/* TRUE if an error occurred during reception of a packet */
BOOLEAN ReceiveError;
/* TRUE if an error occurred during transmission of a packet */
BOOLEAN TransmitError;
/* TRUE if a transmit interrupt is pending */
BOOLEAN TransmitPending;
/* Received packet header */
PACKET_HEADER PacketHeader;
/* Offset in onboard RAM of received packet */
ULONG PacketOffset;
/* TRUE if receive indications are done and should be completed */
BOOLEAN DoneIndicating;
/* Transmit buffers */
UINT TXStart; /* Start block of transmit buffer ring */
UINT TXCount; /* Number of blocks in transmit buffer ring */
UINT TXFree; /* Number of free transmit buffers */
UINT TXNext; /* Next buffer to use */
/* Length of packet. 0 means buffer is unused */
INT TXSize[DRIVER_DEFAULT_TX_BUFFER_COUNT];
INT TXCurrent; /* Current buffer beeing transmitted. -1 means none */
/* Head of transmit queue */
PNDIS_PACKET TXQueueHead;
/* Tail of transmit queue */
PNDIS_PACKET TXQueueTail;
/* Statistics */
ULONG FrameAlignmentErrors;
ULONG CrcErrors;
ULONG MissedPackets;
/* Flags used for driver cleanup */
BOOLEAN IOPortRangeRegistered;
BOOLEAN InterruptRegistered;
} NIC_ADAPTER, *PNIC_ADAPTER;
/* Global driver information */
typedef struct _DRIVER_INFORMATION
{
NDIS_HANDLE NdisWrapperHandle; /* Returned from NdisInitializeWrapper */
NDIS_HANDLE NdisMacHandle; /* Returned from NdisRegisterMac */
LIST_ENTRY AdapterListHead; /* Adapters this driver control */
} DRIVER_INFORMATION, *PDRIVER_INFORMATION;
/* Global variable */
extern DRIVER_INFORMATION DriverInfo;
extern NDIS_PHYSICAL_ADDRESS HighestAcceptableMax;
/* Prototypes */
BOOLEAN NICCheck(
PNIC_ADAPTER Adapter);
NDIS_STATUS NICInitialize(
PNIC_ADAPTER Adapter);
NDIS_STATUS NICSetup(
PNIC_ADAPTER Adapter);
NDIS_STATUS NICStart(
PNIC_ADAPTER Adapter);
NDIS_STATUS NICStop(
PNIC_ADAPTER Adapter);
NDIS_STATUS NICReset(
PNIC_ADAPTER Adapter);
VOID NICUpdateCounters(
PNIC_ADAPTER Adapter);
VOID NICReadDataAlign(
PNIC_ADAPTER Adapter,
PUSHORT Target,
ULONG Source,
USHORT Length);
VOID NICWriteDataAlign(
PNIC_ADAPTER Adapter,
ULONG Target,
PUSHORT Source,
USHORT Length);
VOID NICReadData(
PNIC_ADAPTER Adapter,
PUCHAR Target,
ULONG Source,
USHORT Length);
VOID NICWriteData(
PNIC_ADAPTER Adapter,
ULONG Target,
PUCHAR Source,
USHORT Length);
VOID NICTransmit(
PNIC_ADAPTER Adapter);
#endif /* __NE2000_H */
/* EOF */

View file

@ -0,0 +1,7 @@
; Novell Eagle 2000 driver - ReactOS Operating System
LIBRARY NE2000.SYS
EXPORTS
; EOF

View file

@ -0,0 +1,38 @@
#include <defines.h>
#include <reactos/resource.h>
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
VS_VERSION_INFO VERSIONINFO
FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD
PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", RES_STR_COMPANY_NAME
VALUE "FileDescription", "Novell NE2000 network driver\0"
VALUE "FileVersion", "0.0.0\0"
VALUE "InternalName", "ne2000\0"
VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT
VALUE "OriginalFilename", "ne2000.sys\0"
VALUE "ProductName", RES_STR_PRODUCT_NAME
VALUE "ProductVersion", RES_STR_PRODUCT_VERSION
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,6 @@
#
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the components of NT OS/2
#
!INCLUDE $(NTMAKEENV)\makefile.def

View file

@ -0,0 +1,10 @@
#include <windows.h>
#include <ntverp.h>
#define VER_FILETYPE VFT_DRV
#define VER_FILESUBTYPE VFT2_DRV_NETWORK
#define VER_FILEDESCRIPTION_STR "Novell NE2000 network driver"
#define VER_INTERNALNAME_STR "NE2000.SYS"
#define VER_ORIGINALFILENAME_STR "NE2000.SYS"
#include "common.ver"

View file

@ -0,0 +1,15 @@
TARGETNAME=ne2000
TARGETPATH=..\objects
TARGETTYPE=DRIVER
TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib
C_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DDBG
INCLUDES=..\include;..\..\..\..\..\include\net;$(BASEDIR)\inc
SOURCES=main.c \
8390.c \
RESOURCE.RC
MSC_WARNING_LEVEL=/W3 /WX

View file

@ -0,0 +1,806 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Novell Eagle 2000 driver
* FILE: ne2000/main.c
* PURPOSE: Driver entry point
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
* REVISIONS:
* CSH 27/08-2000 Created
*/
#include <ne2000.h>
#ifdef DBG
/* See debug.h for debug/trace constants */
ULONG DebugTraceLevel = MIN_TRACE;
#endif /* DBG */
/* List of supported OIDs */
static ULONG MiniportOIDList[] = {
OID_GEN_SUPPORTED_LIST,
OID_GEN_HARDWARE_STATUS,
OID_GEN_MEDIA_SUPPORTED,
OID_GEN_MEDIA_IN_USE,
OID_GEN_MAXIMUM_LOOKAHEAD,
OID_GEN_MAXIMUM_FRAME_SIZE,
OID_GEN_LINK_SPEED,
OID_GEN_TRANSMIT_BUFFER_SPACE,
OID_GEN_RECEIVE_BUFFER_SPACE,
OID_GEN_TRANSMIT_BLOCK_SIZE,
OID_GEN_RECEIVE_BLOCK_SIZE,
OID_GEN_VENDOR_ID,
OID_GEN_VENDOR_DESCRIPTION,
OID_GEN_VENDOR_DRIVER_VERSION,
OID_GEN_CURRENT_PACKET_FILTER,
OID_GEN_CURRENT_LOOKAHEAD,
OID_GEN_DRIVER_VERSION,
OID_GEN_MAXIMUM_TOTAL_SIZE,
OID_GEN_PROTOCOL_OPTIONS,
OID_GEN_MAC_OPTIONS,
OID_GEN_MEDIA_CONNECT_STATUS,
OID_GEN_MAXIMUM_SEND_PACKETS,
OID_802_3_PERMANENT_ADDRESS,
OID_802_3_CURRENT_ADDRESS,
OID_802_3_MULTICAST_LIST,
OID_802_3_MAXIMUM_LIST_SIZE,
OID_802_3_MAC_OPTIONS
};
DRIVER_INFORMATION DriverInfo = {0};
NDIS_PHYSICAL_ADDRESS HighestAcceptableMax = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
BOOLEAN MiniportCheckForHang(
IN NDIS_HANDLE MiniportAdapterContext)
/*
* FUNCTION: Examines if an adapter has hung
* ARGUMENTS:
* MiniportAdapterContext = Pointer to adapter context area
* RETURNS:
* TRUE if the adapter has hung, FALSE if not
*/
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
return FALSE;
}
VOID MiniportDisableInterrupt(
IN NDIS_HANDLE MiniportAdapterContext)
/*
* FUNCTION: Disables interrupts from an adapter
* ARGUMENTS:
* MiniportAdapterContext = Pointer to adapter context area
*/
{
NDIS_DbgPrint(MAX_TRACE, ("Called. (MiniportDisableInterrupt).\n"));
#ifndef NOCARD
NICDisableInterrupts((PNIC_ADAPTER)MiniportAdapterContext);
#endif
}
VOID MiniportEnableInterrupt(
IN NDIS_HANDLE MiniportAdapterContext)
/*
* FUNCTION: Enables interrupts from an adapter
* ARGUMENTS:
* MiniportAdapterContext = Pointer to adapter context area
*/
{
NDIS_DbgPrint(MAX_TRACE, ("Called. (MiniportEnableInterrupt).\n"));
#ifndef NOCARD
NICEnableInterrupts((PNIC_ADAPTER)MiniportAdapterContext);
#endif
}
VOID MiniportHalt(
IN NDIS_HANDLE MiniportAdapterContext)
/*
* FUNCTION: Deallocates resources for and halts an adapter
* ARGUMENTS:
* MiniportAdapterContext = Pointer to adapter context area
*/
{
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
#ifndef NOCARD
/* Stop the NIC */
NICStop(Adapter);
#endif
/* Wait for any DPCs to complete. FIXME: Use something else */
NdisStallExecution(250000);
if (Adapter->InterruptRegistered)
/* Deregister interrupt */
NdisMDeregisterInterrupt(&Adapter->Interrupt);
if (Adapter->IOPortRangeRegistered)
/* Deregister I/O port range */
NdisMDeregisterIoPortRange(
Adapter->MiniportAdapterHandle,
Adapter->IoBaseAddress,
0x20,
Adapter->IOBase);
/* Remove adapter from global adapter list */
RemoveEntryList(&Adapter->ListEntry);
/* Free adapter context area */
NdisFreeMemory(Adapter, sizeof(NIC_ADAPTER), 0);
}
NDIS_STATUS MiniportInitialize(
OUT PNDIS_STATUS OpenErrorStatus,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
IN UINT MediumArraySize,
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE WrapperConfigurationContext)
/*
* FUNCTION: Adapter initialization function
* ARGUMENTS:
* OpenErrorStatus = Address of buffer to place additional status information
* SelectedMediumIndex = Address of buffer to place selected medium index
* MediumArray = Pointer to an array of NDIS_MEDIUMs
* MediaArraySize = Number of elements in MediumArray
* MiniportAdapterHandle = Miniport adapter handle assigned by NDIS
* WrapperConfigurationContext = Handle used to identify configuration context
* RETURNS:
* Status of operation
*/
{
UINT i;
NDIS_STATUS Status;
PNIC_ADAPTER Adapter;
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
/* Search for 802.3 media which is the only one we support */
for (i = 0; i < MediumArraySize; i++) {
if (MediumArray[i] == NdisMedium802_3)
break;
}
if (i == MediumArraySize) {
NDIS_DbgPrint(MIN_TRACE, ("No supported medias.\n"));
return NDIS_STATUS_UNSUPPORTED_MEDIA;
}
*SelectedMediumIndex = i;
Status = NdisAllocateMemory((PVOID)&Adapter,
sizeof(NIC_ADAPTER),
0,
HighestAcceptableMax);
if (Status != NDIS_STATUS_SUCCESS) {
NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
return Status;
}
NdisZeroMemory(Adapter, sizeof(NIC_ADAPTER));
Adapter->MiniportAdapterHandle = MiniportAdapterHandle;
Adapter->IoBaseAddress = DRIVER_DEFAULT_IO_BASE_ADDRESS;
Adapter->InterruptNumber = DRIVER_DEFAULT_INTERRUPT_NUMBER;
Adapter->MaxMulticastListSize = DRIVER_MAX_MULTICAST_LIST_SIZE;
Adapter->InterruptMask = DRIVER_INTERRUPT_MASK;
Adapter->LookaheadSize = DRIVER_MAXIMUM_LOOKAHEAD;
NdisMSetAttributes(
MiniportAdapterHandle,
(NDIS_HANDLE)Adapter,
FALSE,
NdisInterfaceIsa);
Status = NdisMRegisterIoPortRange(
(PVOID*)&Adapter->IOBase,
MiniportAdapterHandle,
Adapter->IoBaseAddress,
0x20);
if (Status != NDIS_STATUS_SUCCESS) {
NDIS_DbgPrint(MIN_TRACE, ("Cannot register port range. Status (0x%X).\n", Status));
MiniportHalt((NDIS_HANDLE)Adapter);
return Status;
}
Adapter->IOPortRangeRegistered = TRUE;
/* Initialize NIC */
#ifndef NOCARD
Status = NICInitialize(Adapter);
if (Status != NDIS_STATUS_SUCCESS) {
NDIS_DbgPrint(MIN_TRACE, ("Cannot find NE2000 NIC. Status (0x%X).\n", Status));
MiniportHalt((NDIS_HANDLE)Adapter);
return Status;
}
NDIS_DbgPrint(MAX_TRACE, ("BOARDDATA:\n"));
for (i = 0; i < 4; i++) {
NDIS_DbgPrint(MAX_TRACE, ("%02X %02X %02X %02X\n",
Adapter->SAPROM[i*4+0],
Adapter->SAPROM[i*4+1],
Adapter->SAPROM[i*4+2],
Adapter->SAPROM[i*4+3]));
}
/* Setup adapter structure */
Adapter->TXStart = ((ULONG_PTR)Adapter->RamBase >> 8);
Adapter->TXCount = DRIVER_DEFAULT_TX_BUFFER_COUNT;
Adapter->TXFree = DRIVER_DEFAULT_TX_BUFFER_COUNT;
Adapter->TXCurrent = -1;
Adapter->PageStart = Adapter->TXStart + Adapter->TXCount;
Adapter->PageStop = Adapter->TXStart + (Adapter->RamSize >> 8);
/* Initialize multicast address mask to accept all */
for (i = 0; i < 8; i++)
Adapter->MulticastAddressMask[i] = 0xFF;
/* Setup the NIC */
NICSetup(Adapter);
NDIS_DbgPrint(MIN_TRACE, ("TXStart (0x%X) TXCount (0x%X) PageStart (0x%X)\n",
Adapter->TXStart,
Adapter->TXCount,
Adapter->PageStart));
NDIS_DbgPrint(MIN_TRACE, ("PageStop (0x%X) CurrentPage (0x%X) NextPacket (0x%X).\n",
Adapter->PageStop,
Adapter->CurrentPage,
Adapter->NextPacket));
#endif
/* Register the interrupt */
Status = NdisMRegisterInterrupt(
&Adapter->Interrupt,
MiniportAdapterHandle,
Adapter->InterruptNumber,
Adapter->InterruptNumber,
FALSE,
FALSE,
NdisInterruptLatched);
if (Status != NDIS_STATUS_SUCCESS) {
NDIS_DbgPrint(MIN_TRACE, ("Cannot register interrupt. Status (0x%X).\n", Status));
MiniportHalt((NDIS_HANDLE)Adapter);
return Status;
}
Adapter->InterruptRegistered = TRUE;
#ifndef NOCARD
/* Start the NIC */
NICStart(Adapter);
#endif
/* Add adapter to the global adapter list */
InsertTailList(&DriverInfo.AdapterListHead, &Adapter->ListEntry);
NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n"));
return NDIS_STATUS_SUCCESS;
}
VOID MiniportISR(
OUT PBOOLEAN InterruptRecognized,
OUT PBOOLEAN QueueMiniportHandleInterrupt,
IN NDIS_HANDLE MiniportAdapterContext)
/*
* FUNCTION: Interrupt Service Routine for controlled adapters
* ARGUMENTS:
* InterruptRecognized = Address of buffer to place wether
* the adapter generated the interrupt
* QueueMiniportHandleInterrupt = Address of buffer to place wether
* MiniportHandleInterrupt should be called
* MiniportAdapterContext = Pointer to adapter context area
* NOTES:
* All pending interrupts are handled
*/
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
NICDisableInterrupts((PNIC_ADAPTER)MiniportAdapterContext);
*InterruptRecognized = TRUE;
*QueueMiniportHandleInterrupt = TRUE;
}
NDIS_STATUS MiniportQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded)
/*
* FUNCTION: Handler to process queries
* ARGUMENTS:
* MiniportAdapterContext = Pointer to adapter context area
* Oid = OID code designating query operation
* InformationBuffer = Address of return buffer
* InformationBufferLength = Length of return buffer
* BytesWritten = Address of buffer to place number of bytes returned
* BytesNeeded = Address of buffer to place number of bytes needed
* in InformationBuffer for specified OID
* RETURNS:
* Status of operation
*/
{
NDIS_STATUS Status;
PVOID CopyFrom;
UINT CopySize;
ULONG GenericULONG;
USHORT GenericUSHORT;
NDIS_MEDIUM Medium = NdisMedium802_3;
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
NDIS_DbgPrint(MAX_TRACE, ("Called. Oid (0x%X).\n", Oid));
Status = NDIS_STATUS_SUCCESS;
CopyFrom = (PVOID)&GenericULONG;
CopySize = sizeof(ULONG);
switch (Oid) {
case OID_GEN_SUPPORTED_LIST:
CopyFrom = (PVOID)&MiniportOIDList;
CopySize = sizeof(MiniportOIDList);
break;
case OID_GEN_HARDWARE_STATUS:
GenericULONG = (ULONG)NdisHardwareStatusReady;
break;
case OID_GEN_MEDIA_SUPPORTED:
case OID_GEN_MEDIA_IN_USE:
CopyFrom = (PVOID)&Medium;
CopySize = sizeof(NDIS_MEDIUM);
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
GenericULONG = DRIVER_MAXIMUM_LOOKAHEAD;
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
GenericULONG = DRIVER_FRAME_SIZE - DRIVER_HEADER_SIZE;
break;
case OID_GEN_LINK_SPEED:
GenericULONG = 100000; /* 10Mbps */
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
GenericULONG = Adapter->TXCount * DRIVER_BLOCK_SIZE;
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
GenericULONG = Adapter->RamSize -
(ULONG_PTR)Adapter->RamBase -
(Adapter->TXCount * DRIVER_BLOCK_SIZE);
break;
case OID_GEN_TRANSMIT_BLOCK_SIZE:
GenericULONG = DRIVER_BLOCK_SIZE;
break;
case OID_GEN_RECEIVE_BLOCK_SIZE:
GenericULONG = DRIVER_BLOCK_SIZE;
break;
case OID_GEN_VENDOR_ID:
NdisMoveMemory(&GenericULONG, &Adapter->PermanentAddress, 3);
GenericULONG &= 0xFFFFFF00;
GenericULONG |= 0x01;
break;
case OID_GEN_VENDOR_DESCRIPTION:
CopyFrom = (PVOID)&DRIVER_VENDOR_DESCRIPTION;
CopySize = sizeof(DRIVER_VENDOR_DESCRIPTION);
break;
case OID_GEN_VENDOR_DRIVER_VERSION:
GenericUSHORT = (USHORT)DRIVER_VENDOR_DRIVER_VERSION;
CopyFrom = (PVOID)&GenericUSHORT;
CopySize = sizeof(USHORT);
break;
case OID_GEN_CURRENT_PACKET_FILTER:
GenericULONG = Adapter->PacketFilter;
break;
case OID_GEN_CURRENT_LOOKAHEAD:
GenericULONG = Adapter->LookaheadSize;
break;
case OID_GEN_DRIVER_VERSION:
GenericUSHORT = ((USHORT)DRIVER_NDIS_MAJOR_VERSION << 8) | DRIVER_NDIS_MINOR_VERSION;
CopyFrom = (PVOID)&GenericUSHORT;
CopySize = sizeof(USHORT);
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
GenericULONG = DRIVER_FRAME_SIZE;
break;
case OID_GEN_PROTOCOL_OPTIONS:
NDIS_DbgPrint(MAX_TRACE, ("OID_GEN_PROTOCOL_OPTIONS.\n"));
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_GEN_MAC_OPTIONS:
GenericULONG = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |
NDIS_MAC_OPTION_RECEIVE_SERIALIZED |
NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |
NDIS_MAC_OPTION_NO_LOOPBACK;
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
GenericULONG = (ULONG)NdisMediaStateConnected;
break;
case OID_GEN_MAXIMUM_SEND_PACKETS:
GenericULONG = 1;
break;
case OID_802_3_PERMANENT_ADDRESS:
CopyFrom = (PVOID)&Adapter->PermanentAddress;
CopySize = DRIVER_LENGTH_OF_ADDRESS;
break;
case OID_802_3_CURRENT_ADDRESS:
CopyFrom = (PVOID)&Adapter->StationAddress;
CopySize = DRIVER_LENGTH_OF_ADDRESS;
break;
case OID_802_3_MULTICAST_LIST:
NDIS_DbgPrint(MAX_TRACE, ("OID_802_3_MULTICAST_LIST.\n"));
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_802_3_MAXIMUM_LIST_SIZE:
GenericULONG = Adapter->MaxMulticastListSize;
break;
case OID_802_3_MAC_OPTIONS:
NDIS_DbgPrint(MAX_TRACE, ("OID_802_3_MAC_OPTIONS.\n"));
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
default:
NDIS_DbgPrint(MIN_TRACE, ("Unknown OID (0x%X).\n", Oid));
Status = NDIS_STATUS_INVALID_OID;
break;
}
if (Status == NDIS_STATUS_SUCCESS) {
if (CopySize > InformationBufferLength) {
*BytesNeeded = (CopySize - InformationBufferLength);
*BytesWritten = 0;
Status = NDIS_STATUS_INVALID_LENGTH;
} else {
NdisMoveMemory(InformationBuffer, CopyFrom, CopySize);
*BytesWritten = CopySize;
*BytesNeeded = 0;
}
}
NDIS_DbgPrint(MAX_TRACE, ("Leaving. Status is (0x%X).\n", Status));
return Status;
}
NDIS_STATUS MiniportReconfigure(
OUT PNDIS_STATUS OpenErrorStatus,
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE WrapperConfigurationContext)
/*
* FUNCTION: Reconfigures an adapter
* ARGUMENTS:
* OpenErrorStatus = Address of buffer to place additional status information
* MiniportAdapterContext = Pointer to adapter context area
* WrapperConfigurationContext = Handle used to identify configuration context
* RETURNS:
* Status of operation
* NOTES:
* Never called by NDIS library
*/
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
return NDIS_STATUS_FAILURE;
}
NDIS_STATUS MiniportReset(
OUT PBOOLEAN AddressingReset,
IN NDIS_HANDLE MiniportAdapterContext)
/*
* FUNCTION: Resets an adapter
* ARGUMENTS:
* AddressingReset = Address of a buffer to place value indicating
* wether NDIS library should call MiniportSetInformation
* to restore addressing information
* MiniportAdapterContext = Pointer to adapter context area
* RETURNS:
* Status of operation
*/
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
return NDIS_STATUS_FAILURE;
}
NDIS_STATUS MiniportSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags)
/*
* FUNCTION: Transmits a packet
* ARGUMENTS:
* MiniportAdapterContext = Pointer to adapter context area
* Packet = Pointer to a packet descriptor specifying
* the data to be transmitted
* Flags = Specifies optional packet flags
* RETURNS:
* Status of operation
*/
{
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
NDIS_DbgPrint(MAX_TRACE, ("Queueing packet.\n"));
#ifdef NOCARD
NdisMSendComplete(Adapter->MiniportAdapterHandle,
Packet,
NDIS_STATUS_SUCCESS);
#else
/* Queue the packet on the transmit queue */
RESERVED(Packet)->Next = NULL;
if (Adapter->TXQueueHead == NULL) {
Adapter->TXQueueHead = Packet;
} else {
RESERVED(Adapter->TXQueueTail)->Next = Packet;
}
Adapter->TXQueueTail = Packet;
/* Transmit the packet */
NICTransmit(Adapter);
#endif
return NDIS_STATUS_PENDING;
}
NDIS_STATUS MiniportSetInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded)
/*
* FUNCTION: Changes state information in the driver
* ARGUMENTS:
* MiniportAdapterContext = Pointer to adapter context area
* Oid = OID code designating set operation
* InformationBuffer = Pointer to buffer with state information
* InformationBufferLength = Length of InformationBuffer
* BytesRead = Address of buffer to place number of bytes read
* BytesNeeded = Address of buffer to place number of extra bytes
* needed in InformationBuffer for specified OID
* RETURNS:
* Status of operation
*/
{
ULONG GenericULONG;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
NDIS_DbgPrint(MAX_TRACE, ("Called. Oid (0x%X).\n", Oid));
switch (Oid) {
case OID_GEN_CURRENT_PACKET_FILTER:
/* Verify length */
if (InformationBufferLength < sizeof(ULONG)) {
*BytesRead = 0;
*BytesNeeded = sizeof(ULONG) - InformationBufferLength;
Status = NDIS_STATUS_INVALID_LENGTH;
break;
}
NdisMoveMemory(&GenericULONG, InformationBuffer, sizeof(ULONG));
/* Check for properties the driver don't support */
if (GenericULONG &
(NDIS_PACKET_TYPE_ALL_FUNCTIONAL |
NDIS_PACKET_TYPE_FUNCTIONAL |
NDIS_PACKET_TYPE_GROUP |
NDIS_PACKET_TYPE_MAC_FRAME |
NDIS_PACKET_TYPE_SMT |
NDIS_PACKET_TYPE_SOURCE_ROUTING)) {
*BytesRead = 4;
*BytesNeeded = 0;
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
}
Adapter->PacketFilter = GenericULONG;
/* FIXME: Set filter on hardware */
break;
case OID_GEN_CURRENT_LOOKAHEAD:
/* Verify length */
if (InformationBufferLength < sizeof(ULONG)) {
*BytesRead = 0;
*BytesNeeded = sizeof(ULONG) - InformationBufferLength;
Status = NDIS_STATUS_INVALID_LENGTH;
break;
}
NdisMoveMemory(&GenericULONG, InformationBuffer, sizeof(ULONG));
if (GenericULONG > DRIVER_MAXIMUM_LOOKAHEAD)
Status = NDIS_STATUS_INVALID_LENGTH;
else
Adapter->LookaheadSize = GenericULONG;
break;
case OID_802_3_MULTICAST_LIST:
/* Verify length. Must be multiplum of hardware address length */
if ((InformationBufferLength % DRIVER_LENGTH_OF_ADDRESS) != 0) {
*BytesRead = 0;
*BytesNeeded = 0;
Status = NDIS_STATUS_INVALID_LENGTH;
break;
}
/* Set new multicast address list */
NdisMoveMemory(Adapter->Addresses, InformationBuffer, InformationBufferLength);
/* FIXME: Update hardware */
break;
default:
NDIS_DbgPrint(MIN_TRACE, ("Invalid object ID (0x%X).\n", Oid));
*BytesRead = 0;
*BytesNeeded = 0;
Status = NDIS_STATUS_INVALID_OID;
break;
}
if (Status == NDIS_STATUS_SUCCESS) {
*BytesRead = InformationBufferLength;
*BytesNeeded = 0;
}
NDIS_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X).\n", Status));
return Status;
}
NDIS_STATUS MiniportTransferData(
OUT PNDIS_PACKET Packet,
OUT PUINT BytesTransferred,
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE MiniportReceiveContext,
IN UINT ByteOffset,
IN UINT BytesToTransfer)
/*
* FUNCTION: Transfers data from a received frame into an NDIS packet
* ARGUMENTS:
* Packet = Address of packet to copy received data into
* BytesTransferred = Address of buffer to place number of bytes transmitted
* MiniportAdapterContext = Pointer to adapter context area
* MiniportReceiveContext = Pointer to receive context area (actually NULL)
* ByteOffset = Offset within received packet to begin copying
* BytesToTransfer = Number of bytes to copy into packet
* RETURNS:
* Status of operation
*/
{
PNDIS_BUFFER DstBuffer;
UINT BytesCopied, BytesToCopy, DstSize;
ULONG SrcData;
PUCHAR DstData;
UINT RecvStart;
UINT RecvStop;
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
NDIS_DbgPrint(MAX_TRACE, ("Called. Packet (0x%X) ByteOffset (0x%X) BytesToTransfer (%d).\n",
Packet, ByteOffset, BytesToTransfer));
if (BytesToTransfer == 0) {
*BytesTransferred = 0;
return NDIS_STATUS_SUCCESS;
}
RecvStart = Adapter->PageStart * DRIVER_BLOCK_SIZE;
RecvStop = Adapter->PageStop * DRIVER_BLOCK_SIZE;
NdisQueryPacket(Packet, NULL, NULL, &DstBuffer, NULL);
NdisQueryBuffer(DstBuffer, (PVOID)&DstData, &DstSize);
SrcData = Adapter->PacketOffset + sizeof(PACKET_HEADER) + ByteOffset;
if (ByteOffset + sizeof(PACKET_HEADER) + BytesToTransfer > Adapter->PacketHeader.PacketLength)
BytesToTransfer = Adapter->PacketHeader.PacketLength- sizeof(PACKET_HEADER) - ByteOffset;
/* Start copying the data */
BytesCopied = 0;
for (;;) {
BytesToCopy = (DstSize < BytesToTransfer)? DstSize : BytesToTransfer;
if (SrcData + BytesToCopy > RecvStop)
BytesToCopy = (RecvStop - SrcData);
NICReadData(Adapter, DstData, SrcData, BytesToCopy);
BytesCopied += BytesToCopy;
SrcData += BytesToCopy;
(ULONG_PTR)DstData += BytesToCopy;
BytesToTransfer -= BytesToCopy;
if (BytesToTransfer == 0)
break;
DstSize -= BytesToCopy;
if (DstSize == 0) {
/* No more bytes in destination buffer. Proceed to
the next buffer in the destination buffer chain */
NdisGetNextBuffer(DstBuffer, &DstBuffer);
if (!DstBuffer)
break;
NdisQueryBuffer(DstBuffer, (PVOID)&DstData, &DstSize);
}
if (SrcData == RecvStop)
SrcData = RecvStart;
}
NDIS_DbgPrint(MAX_TRACE, ("Transferred (%d) bytes.\n", BytesToTransfer));
*BytesTransferred = BytesCopied;
return NDIS_STATUS_SUCCESS;
}
NTSTATUS
#ifndef _MSC_VER
STDCALL
#endif
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
/*
* FUNCTION: Main driver entry point
* ARGUMENTS:
* DriverObject = Pointer to a driver object for this driver
* RegistryPath = Registry node for configuration parameters
* RETURNS:
* Status of driver initialization
*/
{
NDIS_STATUS Status;
NDIS_HANDLE NdisWrapperHandle;
NDIS_MINIPORT_CHARACTERISTICS Miniport;
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
NdisZeroMemory(&Miniport, sizeof(Miniport));
Miniport.MajorNdisVersion = DRIVER_NDIS_MAJOR_VERSION;
Miniport.MinorNdisVersion = DRIVER_NDIS_MINOR_VERSION;
Miniport.CheckForHangHandler = NULL; //MiniportCheckForHang;
Miniport.DisableInterruptHandler = MiniportDisableInterrupt;
Miniport.EnableInterruptHandler = MiniportEnableInterrupt;
Miniport.HaltHandler = MiniportHalt;
Miniport.HandleInterruptHandler = MiniportHandleInterrupt;
Miniport.InitializeHandler = MiniportInitialize;
Miniport.ISRHandler = MiniportISR;
Miniport.QueryInformationHandler = MiniportQueryInformation;
Miniport.ReconfigureHandler = MiniportReconfigure;
Miniport.ResetHandler = MiniportReset;
Miniport.u1.SendHandler = MiniportSend;
Miniport.SetInformationHandler = MiniportSetInformation;
Miniport.u2.TransferDataHandler = MiniportTransferData;
NdisMInitializeWrapper(&NdisWrapperHandle,
DriverObject,
RegistryPath,
NULL);
DriverInfo.NdisWrapperHandle = NdisWrapperHandle;
DriverInfo.NdisMacHandle = NULL;
InitializeListHead(&DriverInfo.AdapterListHead);
Status = NdisMRegisterMiniport(NdisWrapperHandle,
&Miniport,
sizeof(NDIS_MINIPORT_CHARACTERISTICS));
if (Status != NDIS_STATUS_SUCCESS) {
NDIS_DbgPrint(MIN_TRACE, ("NdisMRegisterMiniport() failed with status code (0x%X).\n", Status));
NdisTerminateWrapper(NdisWrapperHandle, NULL);
return STATUS_UNSUCCESSFUL;
}
return STATUS_SUCCESS;
}
/* EOF */

View file

@ -0,0 +1,18 @@
Build instructions for NE2000 driver
------------------------------------
Building with Visual C++ and Windows NT DDK:
Variables:
%BASEDIR% = path to NT4 DDK (e.g. c:\ntddk)
%DDKBUILDENV% = DDK build environment (free or checked)
DDK environment variables must be set! (run setenv.bat)
- Create the directory objects/i386/%DDKBUILDENV%
- Run "build" to build the driver
Building with Mingw32 and ReactOS include files:
- Run "make ne2000" FROM THE ReactOS ROOT DIRECTORY to build the driver