?? dw4002.c
字號:
#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 + -