⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtl8139sw.h

📁 Realtek8139小端口网卡驱动程序源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
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 + -