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

📄 dw4002.c

📁 linux下DVB/IP驱动原代码 DVBWorld 公司产品 www.worlddvb.com
💻 C
📖 第 1 页 / 共 5 页
字号:
#define DRV_NAME	"DVBWORLD DW4002 DVBS PCI NIC"#define DRV_VERSION	"1.0.02"#include <linux/config.h>#include <linux/module.h>MODULE_LICENSE ("Dual BSD/GPL");#include <linux/pci.h>#include <linux/netdevice.h>#include <linux/etherdevice.h>#include <linux/rtnetlink.h>#include <linux/delay.h>#include <linux/ethtool.h>#include <linux/crc32.h>#include <linux/sched.h>#include <linux/interrupt.h>#include <asm/io.h>#include <asm/msr.h>#include <asm/irq.h>		//Added by Kully 11-3-2006#include <linux/string.h>#include <linux/ipc.h>#include <linux/shm.h>//typedef unsigned int          BOOL;#ifndef FALSE#define FALSE                 0#endif#ifndef TRUE#define TRUE                  1#endif#ifdef DM1105_NDEBUG    #define assert(expr) do {} while (0)#else    #define assert(expr) \        if(!(expr)) {					\        printk( "Assertion failed! %s,%s,%s,line=%d\n",	\        #expr,__FILE__,__FUNCTION__,__LINE__);		\        }#endif#define		MAX_UNITS           8static int	media[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};//Maximum events (Rx packets, etc.) to handle at each interrupt.static int max_interrupt_work = 1000;//5;//Kully 10-31-2006//#define IRQ_DATA_LENGTH			(IRQ_TSPACKET_NUM * 188)#define DM1105_IRQ_DATA_LENGTH	(128*4*47)//0x5e00 //64*2*188//Fixed by Kully 11-01-2006#define FILTERPID_PACKNUM		100#define FILTERPID_BUFLENGTH		18800// Rx Buffer Start address+2k buffer+redundant#define RX_BUF_SIZE			(128*188*5)//0x24000(147456)	//144K,DMA Ring buffer size;//Fixed by Kully 11-01-2006#define RX_BUF_TOT_LEN		RX_BUF_SIZE//Real mem buffer size;#define MINDMABUFDATA       564     // 3TS = 3*188//Number of Tx descriptor registers.#define NUM_TX_DESC         4//max supported ethernet frame size -- must be at least (dev->mtu+14+4).#define MAX_ETH_FRAME_SIZE	1536//Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4).#define TX_BUF_SIZE			MAX_ETH_FRAME_SIZE		//1536#define TX_BUF_TOT_LEN		(TX_BUF_SIZE * NUM_TX_DESC)	//1536*4//Operational parameters that usually are not changed.//Time in jiffies before concluding the transmitter is hung.#define TX_TIMEOUT			(6*HZ)//about dm1105#define INTMAK_ALLMASK		0x01	//0x09	//IRM|TSIRQM#define CMD_RxEnable		0x01#define CF_TS_IP            0x0001#define CF_Filter           0x0002#define CF_TsPass           0x0004#define CF_RxEnable         0x0008#define CF_LNBPower         0x0010#define CF_LNB_HV           0x0020#define IOCTL_MINCMD        SIOCDEVPRIVATE#define IOCTL_MAXCMD        (SIOCDEVPRIVATE + 0x0f)enum IoctlCmd {	IOCTL_Dm1105_ReadReg = IOCTL_MINCMD,	IOCTL_Dm1105_WriteReg,	IOCTL_Dm1105_DeviceInfo,	IOCTL_Dm1105_FilterPID,	IOCTL_Dm1105_ConfigReg,	IOCTL_Dm1105_Statistics,};struct dm1105_ioctl_data {	u8  param1;  // register addr	u8  param2;  // operation : 1 - char   2 - word   4 - dword	u8  val_in;	u8  val_out;	unsigned char buf[384];};//Interrupt register bits, using my own meaningful names.enum IntrStatusBits {	PCIErr	= 0x8000,	PCSTimeout = 0x4000,	RxFIFOOver = 0x40,	RxUnderrun = 0x20,	RxOverflow = 0x10,	TxErr	= 0x08,	TxOK	= 0x04,	RxErr	= 0x02,	RxOK	= 0x01,	RxAckBits = RxFIFOOver | RxOverflow | RxOK,};#define ANY_NUM_STATS       4     /* number of ETHTOOL_GSTATS u64's */#define ANY_REGS_VER        1     /* version of reg. data in ETHTOOL_GREGS */#define ANY_MIN_IO_SIZE     0xFF		//0x80// ************************************************************// Filter PID and decode IP function variables// ************************************************************#define RTFAST_HEAD_SIZE      14#define RTFAST_MAX_LOOKAHEAD  (1518 - RTFAST_HEAD_SIZE)#define MPE_MAXSECTIONLEN     2048 //(1516+184)#define MaxIRPQueue           2#define MaxFilterPID          32	//Fixed by Kully //old data:6 #define MaxDecodeIP           32#define MaxMpePID             255// Protocols#define IPPROTO_IP			0        //dummy for IP#define IPPROTO_ICMP		1        //control message protocol#define IPPROTO_IGMP		2        //internet group management protocol #define IPPROTO_GGP			3        //gateway^2 (deprecated) #define IPPROTO_TCP			6        //tcp #define IPPROTO_PUP			12       //pup#define IPPROTO_UDP			17       //user datagram protocol#define IPPROTO_IDP			22       //xns idp */#define IPPROTO_ND			77       //UNOFFICIAL net disk proto#define IPPROTO_RAW			255      //raw IP packet#define IPPROTO_MAX			256enum SetDeviceStatusCmd{	ScanDeviceCmd = 1,	DeviceInfoCmd,	ApplyUseCmd,	FreeUseCmd,};enum FILTERIOCTLTYPE{	FILTERNONE = 0,	FILTERPSI,	FILTERMPE,	FILTERIP,	FILTEREXT,	FILTERSAVE,	FILTERPLAY,};enum FILTERTYPE {	APPLYFILTER = 0,	SETFILTERPID,	STARTFILTER,	PAUSEFILTER,	CONTINUEFILTER,	RESTARTFILTER,	CHECKFILTER,	STOPFILTER,	RESTOREFILTER,};enum FILTERPIDSTATUS {	FILTERPID_READY = 0,	FILTERPID_INIT,	FILTERPID_SET,	FILTERPID_RUN,	FILTERPID_PAUSE,	FILTERPID_OK,	FILTERPID_ERR,};typedef struct _TS_PACKET_HEAD {	unsigned char sync_byte;	unsigned char pid1:5;	unsigned char priorty:1;	unsigned char start_indicator:1;	unsigned char error_indicator:1;	unsigned char pid2;	unsigned char continuity_counter:4;	unsigned char adap:2;	unsigned char scramble:2;}TS_PACKET_HEAD, *PTS_PACKET_HEAD;typedef struct _FILTERPID {	unsigned short wPID[MaxFilterPID];	unsigned char status;   // filter status, INIT RUN PAUSE STOP OVER ...	unsigned char mode;     // 0 : filter from start unit  1 : pass this pid ts  // 2: pass whole ts	unsigned char indicator;   // just for mode = 0	int  packet_num;  // filtered packet number	int  pid_num;     // filtered pid number	int  move_num;	BOOL bmove_flag;	int  lost_num;	unsigned char PacketBuf[FILTERPID_BUFLENGTH];}FILTERPID, *PFILTERPID;typedef struct _DECODE_IP {	unsigned short  wPID;	unsigned char  MACHead[RTFAST_HEAD_SIZE];	unsigned char  SectionBuf[MPE_MAXSECTIONLEN];	unsigned char  IP_address[4];	unsigned short  TotalSectionLen;	unsigned short  CurSectionLen;	unsigned char* IPBuf;	unsigned short  IPPacketLen; // IP len	long long	IPTotalLen;	unsigned long TotalTsNum; // statistic ts lost	unsigned long LostTsNum;	unsigned long TotalIpNum;	unsigned long LostIpNum;	unsigned char  status;   // decode status, READY RUN PAUSE STOP OVER ...	unsigned char  payload_unit_start_indicator:1;	unsigned char  payload_scrambling_control:2;	unsigned char  address_scrambling_control:2;	unsigned char  SectionDone:1;	unsigned char  bInitFlag:1;	unsigned char  IpFilterFlag:1;} DECODE_IP, *PDECODE_IP;typedef struct _MPE_SECTION_HEAD{	unsigned char table_id;	unsigned char section_length1:4;	unsigned char not_use1:2;	unsigned char private_indicator:1;	unsigned char syntax_indicator:1;	unsigned char section_length2;		unsigned char MAC_address6;	unsigned char MAC_address5;		unsigned char next_indicator:1;	unsigned char LLC_SNAP_flag:1;	unsigned char address_scrambling_control:2;	unsigned char payload_scrambling_control:2;	unsigned char not_use2:2;		unsigned char section_number;	unsigned char last_section_number;		unsigned char MAC_address4;	unsigned char MAC_address3;	unsigned char MAC_address2;	unsigned char MAC_address1;} MPE_SECTION_HEAD, *PMPE_SECTION_HEAD;typedef struct _IP_HEAD {	unsigned char headlength:4;	unsigned char version:4;	unsigned char TOS;	unsigned char length1;	unsigned char length2;	unsigned char id1;	unsigned char id2;	unsigned char slice_offset1:5;	unsigned char flags:3;	unsigned char slice_offset2;	unsigned char TTL;	unsigned char protocol;	unsigned char checksum1;	unsigned char checksum2;	unsigned char sourceIP1;	unsigned char sourceIP2;	unsigned char sourceIP3;	unsigned char sourceIP4;	unsigned char destIP1;	unsigned char destIP2;	unsigned char destIP3;	unsigned char destIP4;}IP_HEAD, *PIP_HEAD;typedef struct _UDP_HEAD {	unsigned char source_port[2];	unsigned char dest_port[2];	unsigned char length[2];	unsigned char check_sum[2];} UDP_HEAD, *PUDP_HEAD;typedef struct _MPE_PID {	unsigned short wPID;	unsigned char MAC_address[6];	unsigned char IP_address[4];	unsigned short wPort;} MPE_PID, *PMPE_PID;#define DM1105_VENDOR_ID	0x109f#define	DM1105_DEVICE_ID		0x036ftypedef struct __card_info__{	unsigned short vendor_id;	unsigned short device_id;	char version[16];	char name[64];}card_info,*pcard_info;//CARDINFO device_info;typedef enum {	UNKNOWN_DEV = 0,	DW4002,}board_t;static struct pci_device_id dm1105_pci_tbl[] __devinitdata = {	{0x109f, 0x036f, 0x0000, 0x2002, 0, 0, DW4002},
	{0x109f, 0x036f, 0x0001, 0x2002, 0, 0, DW4002},	{0x109f, 0x036f, 0x0000, 0x4002, 0, 0, DW4002},	{0x109f, 0x036f, 0x0001, 0x4002, 0, 0, DW4002},	{0,}};MODULE_DEVICE_TABLE (pci, dm1105_pci_tbl);////////////////////////////////////////////////////////////////////////////////////void	*local_ioaddr;#define ANY_R8_ET(reg)             inb (((unsigned long)local_ioaddr) + (reg))#define ANY_W8_ET(reg, val8)       outb ((val8), ((unsigned long)local_ioaddr) + (reg))////////////////////////////////////////////////////////////////////////////////////#define ANY_R8(reg)             inb (((unsigned long)ioaddr) + (reg))#define ANY_R16(reg)            inw (((unsigned long)ioaddr) + (reg))#define ANY_R32(reg)            ((unsigned long) inl (((unsigned long)ioaddr) + (reg)))#define ANY_W8(reg, val8)       outb ((val8), ((unsigned long)ioaddr) + (reg))#define ANY_W16(reg, val16)     outw ((val16), ((unsigned long)ioaddr) + (reg))#define ANY_W32(reg, val32)     outl ((val32), ((unsigned long)ioaddr) + (reg))#define ANY_W8_F                ANY_W8#define ANY_W16_F               ANY_W16#define ANY_W32_F               ANY_W32#undef readb#undef readw#undef readl#undef writeb#undef writew#undef writel#define readb(addr) inb((unsigned long)(addr))#define readw(addr) inw((unsigned long)(addr))#define readl(addr) inl((unsigned long)(addr))#define writeb(val,addr) outb((val),(unsigned long)(addr))#define writew(val,addr) outw((val),(unsigned long)(addr))#define writel(val,addr) outl((val),(unsigned long)(addr))enum dm1105_regs //:755: error: `Multimedia' undeclared (first use in this function){		NIC_TSCTR		=0x00,	// TSCTL: TS			NIC_DATALEN    	=0x04,	// DATALEN: 		NIC_POWER     	=0x08,			GPIO89DATA	=0x09,	//0x0A,		NIC_GPIOCTR     =0x0C,            // GPIOCTR: 		GPIO89DIR		=0x0D,	//0x0E,		NIC_PIDN		=0x10,            // PIDN: PID		NIC_CWSEL       =0x14,            // CWSEL: // PCI		NIC_CR			=0x30,            // CR: control register		NIC_RST			=0x34,            // RST: 		NIC_STADR		=0x38,            // STADR: Rx Buffer Start Address		NIC_RLEN		=0x3c,            // RLEN: Receive(Rx) Buffer Len		NIC_WRP			=0x40,            // WRP: Current Buffer Address. (writer pointer)		NIC_INTCNT		=0x44,            // INTCNT: Interrupt cycle counter		NIC_INTMAK		=0x48,            // INTMAK: Interrupt Mask Register		NIC_INTSTS		=0x4c,            // INTSTS: Interrupt Status Register// ir		NIC_IRCTR		=0x64,		NIC_IRMODE		=0x68,		NIC_SYSCODE		=0x6c,		NIC_IRCODE		=0x70,//i2c		NIC_ENCRYPT		=0x74,		NIC_VER			=0x7c,		NIC_I2CCTR		=0x80,            // I2C Command Register		NIC_I2CSTS		=0x81,            // I2C Status  Register		NIC_I2CDAT		=0x82,            // I2C Device Address Register		NIC_I2C_RA		=0x83,            // I2C Data read address		NIC_I2C_WA		=0x84,		DELAY_7C		=100000 ,// 0.1 sec};#define IIC_24C01_addr  0xa0struct any_extra_stats {	unsigned long early_rx;	unsigned long tx_buf_mapped;	unsigned long tx_timeouts;	unsigned long rx_lost_in_ring;};     struct dm1105_private {	void			*base_addr;	struct			pci_dev *pci_dev;	struct			net_device_stats stats;	char			MACaddr[6];	unsigned char	*rx_ring;	unsigned char	*rx_buf_start;	unsigned int	cur_rx;	/* Index into the Rx buffer of next Rx pkt. */	unsigned int	tx_flag;	unsigned long	cur_tx;	unsigned long	dirty_tx;	unsigned char	*tx_buf[NUM_TX_DESC];	/* Tx bounce buffers */	unsigned char	*tx_bufs;	/* Tx bounce buffer region. */	dma_addr_t		rx_ring_dma;	dma_addr_t		tx_bufs_dma;	unsigned int	default_port:4;	/* Last dev->if_port value. */	spinlock_t		lock;	//device info	card_info dev_info;	u8				rx_config;	int				time_to_die;//:755: error: `Multimedia' undeclared (first use in this function)	unsigned int	regs_len;	u8				found_and_inuse;	wait_queue_head_t		thr_wait;	struct completion		thr_exited;	struct any_extra_stats	xstats;	void *		RxVirtualSADTop;	void *  	RxVirtualSAD;	unsigned long  RxBufDataStart;	unsigned long  RxBufDataPtr;	unsigned long  RxBufDataEnd;	//unsigned long  NicCurCBA;      //Write pointer	unsigned long	PacketErrorCount;	// if nonzero, filter pid, scan MPE pid, decode IP	BOOL   bedoing;	BOOL   bFilterPIDFlag;   // if nonzero, filter pid	FILTERPID FilterPID[MaxIRPQueue];	//	unsigned long       NicConfig;   		//ir	BOOL   bDecIPFlag;  // if nonzero, decode IP	DECODE_IP DecodeIP[MaxDecodeIP];	BOOL   bScanMpePIDFlag;  // if nonzero, scan MPE pid	MPE_PID MpePID[MaxMpePID];	unsigned char   MpePIDNum;	unsigned long  ScanTime;	unsigned long  ReceivePacketCount;	unsigned long  FramesXmitGood;         // Good Frames Transmitted	unsigned long  FramesRcvGood;          // Good Frames Received	long long RecDataLength;	unsigned long LostIPTotal;	//added by Hong Fei	unsigned long IPPacketTotalNum;	unsigned long RegStatus;	unsigned long	Version;};int		dm1105_open (struct net_device *dev);void	dm1105_tx_timeout (struct net_device *dev);void	dm1105_init_ring (struct net_device *dev);int		dm1105_start_xmit (struct sk_buff *skb, struct net_device *dev);void	dm1105_interrupt (int irq, void *dev_instance, struct pt_regs *regs);int		dm1105_close (struct net_device *dev);int		netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd);struct	net_device_stats *dm1105_get_stats (struct net_device *dev);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -