📄 rtl8139sw.h
字号:
/****************************************************************************
2004.12 第十项目小组
主编:王翔 徐隽
协助:卢坚 夏亮 傅佳伟 郑皓 黄君炜
测试:王祢
Rtl8139 根据 Win2000 DDK提供的Network Samples框架基础上进行编码
(声明:本驱动程序仅用于学习、探索、实践计算机网络相关知识之用。
请勿在未征得本小组同意的情况下随意传播。对使用本程序可能造成的
硬件问题本小组概不负责。也请勿将它用于学习之外的任何用途,本小组
对此种行为可能造成的不良后果概不负责。)
****************************************************************************/
/*++
模块名:
RTL8139sw.h
概要:
RTL8139 微端口驱动程序的主要头文件
--*/
#ifndef _RTL8139_H
#define _RTL8139_H
#define RTL8139_NDIS_MAJOR_VERSION 0x05
#define RTL8139_NDIS_MINOR_VERSION 0x00
#define RTL8139_VENDOR_ID 0x10EC
#define RTL8139_DEVICE_ID 0x8139
//
// Debug 所用的宏定义
//
#if DBG
#define IF_RTL8139DEBUG(f) if (RTL8139DebugFlag & (f))
extern ULONG RTL8139DebugFlag;
#define RTL8139_DEBUG_LOUD 0x00000001 // Debug信息
#define RTL8139_DEBUG_VERY_LOUD 0x00000002
#define RTL8139_DEBUG_LOG 0x00000004
#define RTL8139_DEBUG_CHECK_DUP_SENDS 0x00000008 // 检验重复发送
#define RTL8139_DEBUG_TRACK_PACKET_LENS 0x00000010
#define RTL8139_DEBUG_WORKAROUND1 0x00000020
#define RTL8139_DEBUG_CARD_BAD 0x00000040
#define RTL8139_DEBUG_CARD_TESTS 0x00000080 // 打印失败原因
#define NUM_OF_PACKETS 0x40 //每次接收包的个数
#define IF_LOUD(A) IF_RTL8139DEBUG( RTL8139_DEBUG_LOUD ) { A }
#define IF_VERY_LOUD(A) IF_RTL8139DEBUG( RTL8139_DEBUG_VERY_LOUD ) { A }
#define IF_LOG(A) IF_RTL8139DEBUG( RTL8139_DEBUG_LOG ) { A }
extern VOID RTL8139Log(UCHAR);
#define IF_INIT(A) A
#define IF_TEST(A) IF_RTL8139DEBUG(RTL8139_DEBUG_CARD_TESTS ) { A }
#else
#define IF_LOUD(A)
#define IF_VERY_LOUD(A)
#define IF_LOG(A)
#define IF_INIT(A)
#define IF_TEST(A)
#endif
#define DEFAULT_NUMBUFFERS 12
#define RTL8139_MOVE_MEM(dest,src,size) NdisMoveMemory(dest,src,size)
//
// 发送缓冲区状态
//
typedef enum {
EMPTY = 0x00,
FULL = 0x02
} BUFFER_STATUS;
//
// 中断类型.
//
typedef enum {
RECEIVE = 0x01,
TRANSMIT = 0x02,
OVERFLOW = 0x04,
COUNTER = 0x08,
UNKNOWN = 0x10
} INTERRUPT_TYPE;
//
// RTL8139IndicatePacket()结果
//
typedef enum {
INDICATE_OK,
SKIPPED,
ABORT,
CARD_BAD
} INDICATE_STATUS;
//
// 以太桢头的大小
//
#define RTL8139_HEADER_SIZE 14
//
// 以太网地址长度
//
#define RTL8139_LENGTH_OF_ADDRESS 6
//
// 允许的最大超前字节数
//
#define RTL8139_MAX_LOOKAHEAD (252 - RTL8139_HEADER_SIZE)
//
// 网卡上缓冲包最大数目
//
#define MAX_XMIT_BUFS 12
//
// 发送缓冲区的定义
//
typedef UINT XMIT_BUF;
//
// 在一个缓冲区里256字节的个数
//
#define BUFS_PER_TX 6
//
// 单个发送缓冲区大小
//
#define TX_BUF_SIZE (BUFS_PER_TX*256)
typedef struct _DRIVER_BLOCK {
//
// NDIS 包裹信息.
NDIS_HANDLE NdisWrapperHandle;
struct _RTL8139_ADAPTER * AdapterQueue;
} DRIVER_BLOCK, * PDRIVER_BLOCK;
#define DEFAULT_MULTICASTLISTMAX 8
typedef struct _RTL8139_ADAPTER {
//
// 指向Adapter结构体的指针
//
//
NDIS_HANDLE MiniportAdapterHandle;
//
// 中断对象
//
NDIS_MINIPORT_INTERRUPT Interrupt;
struct _RTL8139_ADAPTER * NextAdapter;
//
//收到包的个数
ULONG ReceivePacketCount;
UINT NumBuffers;
//
// I/O端口的首地址(基址)
//
UINT IoBaseAddr;
UINT InterruptVector ;
UINT InterruptLevel ;
//
// 网卡支持的Adapter数目
//
UINT MulticastListMax;
UCHAR BusType;
UCHAR InterruptType;
UINT CardType;
ULONG AttributeMemoryAddress;
ULONG AttributeMemorySize;
//
// 发送信息
//
XMIT_BUF NextBufToFill;
XMIT_BUF NextBufToXmit;
XMIT_BUF CurBufXmitting;
BOOLEAN TransmitInterruptPending;
BOOLEAN OverflowRestartXmitDpc;
BUFFER_STATUS BufferStatus[MAX_XMIT_BUFS];
PNDIS_PACKET Packets[MAX_XMIT_BUFS];
UINT PacketLens[MAX_XMIT_BUFS];
PNDIS_PACKET FirstPacket;
PNDIS_PACKET LastPacket;
PUCHAR XmitStart;
//
// 接收空间的首地址
PUCHAR PageStart;
//
// 接收空间的中止地址
//
PUCHAR PageStop;
//
// 最近一次发送的状态
//
UCHAR XmitStatus;
UCHAR NicXmitStart;
UCHAR NicPageStart;
UCHAR NicPageStop;
//
// 接收信息
//
UCHAR NicNextPacket;
UCHAR Current;
//
// 接受包的总长度
//
UINT PacketLen;
//
//选项信息
//
ULONG IoAddr;
UCHAR InterruptStatus;
UCHAR StationAddress[RTL8139_LENGTH_OF_ADDRESS];
UCHAR PermanentAddress[RTL8139_LENGTH_OF_ADDRESS];
PUCHAR RamBase;
ULONG RamSize;
ULONG PacketFilter;
BOOLEAN BufferOverflow;
BOOLEAN IndicateReceiveDone;
BOOLEAN EightBitSlot;
USHORT SlotNum;
BOOLEAN MWIEnable;
//各种收到的帧的状态
ULONG FramesXmitGood;
ULONG FramesRcvGood;
ULONG FramesXmitBad;
ULONG FramesXmitOneCollision;
ULONG FramesXmitManyCollisions;
ULONG FrameAlignmentErrors;
ULONG CrcErrors;
ULONG MissedPackets;
//
// 重置信息
//
UCHAR NicMulticastRegs[8];
UCHAR NicReceiveConfig;
UCHAR NicInterruptMask;
ULONG MaxLookAhead;
UCHAR PacketHeader[4];
PUCHAR PacketHeaderLoc;
UCHAR Lookahead[RTL8139_MAX_LOOKAHEAD + RTL8139_HEADER_SIZE];
CHAR Addresses[DEFAULT_MULTICASTLISTMAX][RTL8139_LENGTH_OF_ADDRESS];
NDIS_HANDLE WrapperConfigurationContext;
UCHAR NetworkAddress[6];
UCHAR mc_filter[8];
PUCHAR ioaddr;
ULONG BaseIO;
NDIS_MINIPORT_INTERRUPT IntObj;
//IRQ
ULONG IRQLevel;
ULONG IRQVector;
ULONG IRQAffinity;
USHORT IRQMode;
PUCHAR tx_bufs;
NDIS_PHYSICAL_ADDRESS tx_bufs_dma;
PUCHAR rx_ring;
NDIS_PHYSICAL_ADDRESS rx_ring_dma;
USHORT read_ptr;
PUCHAR rx_bufs;
NDIS_PHYSICAL_ADDRESS rx_bufs_dma;
NDIS_HANDLE pkt_pool;
NDIS_HANDLE buf_pool;
PNDIS_PACKET pkt_desc[0x40];
PNDIS_BUFFER buf_desc[0x40];
UINT FreeRxPkt, FreeTxDesc;
UINT cur_rx, cur_tx, dirty_tx, dirty_rx;
USHORT curISR;
ULONG ERR_COUNT;
ULONG XMIT_OK, XMIT_ERR;
ULONG RCV_OK, RCV_ERR;
ULONG RCV_NO_BUFFER;
ULONG rev_byte, xmit_byte;
char twistie, twist_row, twist_col;
} RTL8139_ADAPTER, * PRTL8139_ADAPTER;
#define PRTL8139_ADAPTER_FROM_CONTEXT_HANDLE(Handle) \
((PRTL8139_ADAPTER)(Handle))
#define CONTEXT_HANDLE_FROM_PRTL8139_ADAPTER(Ptr) \
((NDIS_HANDLE)(Ptr))
#define MSB(Value) ((UCHAR)((((ULONG)Value) >> 8) & 0xff))
#define LSB(Value) ((UCHAR)(((ULONG)Value) & 0xff))
typedef struct _MINIPORT_RESERVED {
PNDIS_PACKET Next;
} MINIPORT_RESERVED, * PMINIPORT_RESERVED;
#define RESERVED(Packet) ((PMINIPORT_RESERVED)((Packet)->MiniportReserved))
typedef enum _RTL8139_PROC_ID {
cardReset,
cardCopyDownPacket,
cardCopyDownBuffer,
cardCopyUp
} RTL8139_PROC_ID;
//
// 错误日志
//
#define RTL8139_ERRMSG_CARD_SETUP (ULONG)0x01
#define RTL8139_ERRMSG_DATA_PORT_READY (ULONG)0x02
#define RTL8139_ERRMSG_HANDLE_XMIT_COMPLETE (ULONG)0x04
#define EE_CS 0x08
#define EE_CLK 0x04
#define EE_DI 0x02
#define EE_DO 0x01
#define EE_ENB (0x80 | EE_CS)
#define EE_WRITE_CMD 5
#define EE_READ_CMD 6
#define EE_ERASE_CMD 7
typedef enum _OP_ENUM{
OP_WRITE = EE_WRITE_CMD,
OP_READ = EE_READ_CMD,
OP_ERASE = EE_ERASE_CMD,
}OP_ENUM;
#define R39_INTERRUPT_MASK \
(PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -