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

📄 tc35815.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * tc35815.c: A TOSHIBA TC35815CF PCI 10/100Mbps ethernet driver for linux. * * Based on skelton.c by Donald Becker. * * This driver is a replacement of older and less maintained version. * This is a header of the older version: *	-----<snip>----- *	Copyright 2001 MontaVista Software Inc. *	Author: MontaVista Software, Inc. *		ahennessy@mvista.com *	Copyright (C) 2000-2001 Toshiba Corporation *	static const char *version = *		"tc35815.c:v0.00 26/07/2000 by Toshiba Corporation\n"; *	-----<snip>----- * * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * (C) Copyright TOSHIBA CORPORATION 2004-2005 * All Rights Reserved. */#ifdef TC35815_NAPI#define DRV_VERSION	"1.36-NAPI"#else#define DRV_VERSION	"1.36"#endifstatic const char *version = "tc35815.c:v" DRV_VERSION "\n";#define MODNAME			"tc35815"#include <linux/module.h>#include <linux/kernel.h>#include <linux/types.h>#include <linux/fcntl.h>#include <linux/interrupt.h>#include <linux/ioport.h>#include <linux/in.h>#include <linux/slab.h>#include <linux/string.h>#include <linux/spinlock.h>#include <linux/errno.h>#include <linux/init.h>#include <linux/netdevice.h>#include <linux/etherdevice.h>#include <linux/skbuff.h>#include <linux/delay.h>#include <linux/pci.h>#include <linux/mii.h>#include <linux/ethtool.h>#include <linux/platform_device.h>#include <asm/io.h>#include <asm/byteorder.h>/* First, a few definitions that the brave might change. */#define GATHER_TXINT	/* On-Demand Tx Interrupt */#define WORKAROUND_LOSTCAR#define WORKAROUND_100HALF_PROMISC/* #define TC35815_USE_PACKEDBUFFER */typedef enum {	TC35815CF = 0,	TC35815_NWU,	TC35815_TX4939,} board_t;/* indexed by board_t, above */static const struct {	const char *name;} board_info[] __devinitdata = {	{ "TOSHIBA TC35815CF 10/100BaseTX" },	{ "TOSHIBA TC35815 with Wake on LAN" },	{ "TOSHIBA TC35815/TX4939" },};static const struct pci_device_id tc35815_pci_tbl[] = {	{PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815CF), .driver_data = TC35815CF },	{PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815_NWU), .driver_data = TC35815_NWU },	{PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815_TX4939), .driver_data = TC35815_TX4939 },	{0,}};MODULE_DEVICE_TABLE (pci, tc35815_pci_tbl);/* see MODULE_PARM_DESC */static struct tc35815_options {	int speed;	int duplex;	int doforce;} options;/* * Registers */struct tc35815_regs {	volatile __u32 DMA_Ctl;		/* 0x00 */	volatile __u32 TxFrmPtr;	volatile __u32 TxThrsh;	volatile __u32 TxPollCtr;	volatile __u32 BLFrmPtr;	volatile __u32 RxFragSize;	volatile __u32 Int_En;	volatile __u32 FDA_Bas;	volatile __u32 FDA_Lim;		/* 0x20 */	volatile __u32 Int_Src;	volatile __u32 unused0[2];	volatile __u32 PauseCnt;	volatile __u32 RemPauCnt;	volatile __u32 TxCtlFrmStat;	volatile __u32 unused1;	volatile __u32 MAC_Ctl;		/* 0x40 */	volatile __u32 CAM_Ctl;	volatile __u32 Tx_Ctl;	volatile __u32 Tx_Stat;	volatile __u32 Rx_Ctl;	volatile __u32 Rx_Stat;	volatile __u32 MD_Data;	volatile __u32 MD_CA;	volatile __u32 CAM_Adr;		/* 0x60 */	volatile __u32 CAM_Data;	volatile __u32 CAM_Ena;	volatile __u32 PROM_Ctl;	volatile __u32 PROM_Data;	volatile __u32 Algn_Cnt;	volatile __u32 CRC_Cnt;	volatile __u32 Miss_Cnt;};/* * Bit assignments *//* DMA_Ctl bit asign ------------------------------------------------------- */#define DMA_RxAlign            0x00c00000 /* 1:Reception Alignment           */#define DMA_RxAlign_1          0x00400000#define DMA_RxAlign_2          0x00800000#define DMA_RxAlign_3          0x00c00000#define DMA_M66EnStat          0x00080000 /* 1:66MHz Enable State            */#define DMA_IntMask            0x00040000 /* 1:Interupt mask                 */#define DMA_SWIntReq           0x00020000 /* 1:Software Interrupt request    */#define DMA_TxWakeUp           0x00010000 /* 1:Transmit Wake Up              */#define DMA_RxBigE             0x00008000 /* 1:Receive Big Endian            */#define DMA_TxBigE             0x00004000 /* 1:Transmit Big Endian           */#define DMA_TestMode           0x00002000 /* 1:Test Mode                     */#define DMA_PowrMgmnt          0x00001000 /* 1:Power Management              */#define DMA_DmBurst_Mask       0x000001fc /* DMA Burst size                  *//* RxFragSize bit asign ---------------------------------------------------- */#define RxFrag_EnPack          0x00008000 /* 1:Enable Packing                */#define RxFrag_MinFragMask     0x00000ffc /* Minimum Fragment                *//* MAC_Ctl bit asign ------------------------------------------------------- */#define MAC_Link10             0x00008000 /* 1:Link Status 10Mbits           */#define MAC_EnMissRoll         0x00002000 /* 1:Enable Missed Roll            */#define MAC_MissRoll           0x00000400 /* 1:Missed Roll                   */#define MAC_Loop10             0x00000080 /* 1:Loop 10 Mbps                  */#define MAC_Conn_Auto          0x00000000 /*00:Connection mode (Automatic)   */#define MAC_Conn_10M           0x00000020 /*01:                (10Mbps endec)*/#define MAC_Conn_Mll           0x00000040 /*10:                (Mll clock)   */#define MAC_MacLoop            0x00000010 /* 1:MAC Loopback                  */#define MAC_FullDup            0x00000008 /* 1:Full Duplex 0:Half Duplex     */#define MAC_Reset              0x00000004 /* 1:Software Reset                */#define MAC_HaltImm            0x00000002 /* 1:Halt Immediate                */#define MAC_HaltReq            0x00000001 /* 1:Halt request                  *//* PROM_Ctl bit asign ------------------------------------------------------ */#define PROM_Busy              0x00008000 /* 1:Busy (Start Operation)        */#define PROM_Read              0x00004000 /*10:Read operation                */#define PROM_Write             0x00002000 /*01:Write operation               */#define PROM_Erase             0x00006000 /*11:Erase operation               */                                          /*00:Enable or Disable Writting,   */                                          /*      as specified in PROM_Addr. */#define PROM_Addr_Ena          0x00000030 /*11xxxx:PROM Write enable         */                                          /*00xxxx:           disable        *//* CAM_Ctl bit asign ------------------------------------------------------- */#define CAM_CompEn             0x00000010 /* 1:CAM Compare Enable            */#define CAM_NegCAM             0x00000008 /* 1:Reject packets CAM recognizes,*/                                          /*                    accept other */#define CAM_BroadAcc           0x00000004 /* 1:Broadcast assept              */#define CAM_GroupAcc           0x00000002 /* 1:Multicast assept              */#define CAM_StationAcc         0x00000001 /* 1:unicast accept                *//* CAM_Ena bit asign ------------------------------------------------------- */#define CAM_ENTRY_MAX                  21   /* CAM Data entry max count      */#define CAM_Ena_Mask ((1<<CAM_ENTRY_MAX)-1) /* CAM Enable bits (Max 21bits)  */#define CAM_Ena_Bit(index)         (1<<(index))#define CAM_ENTRY_DESTINATION	0#define CAM_ENTRY_SOURCE	1#define CAM_ENTRY_MACCTL	20/* Tx_Ctl bit asign -------------------------------------------------------- */#define Tx_En                  0x00000001 /* 1:Transmit enable               */#define Tx_TxHalt              0x00000002 /* 1:Transmit Halt Request         */#define Tx_NoPad               0x00000004 /* 1:Suppress Padding              */#define Tx_NoCRC               0x00000008 /* 1:Suppress Padding              */#define Tx_FBack               0x00000010 /* 1:Fast Back-off                 */#define Tx_EnUnder             0x00000100 /* 1:Enable Underrun               */#define Tx_EnExDefer           0x00000200 /* 1:Enable Excessive Deferral     */#define Tx_EnLCarr             0x00000400 /* 1:Enable Lost Carrier           */#define Tx_EnExColl            0x00000800 /* 1:Enable Excessive Collision    */#define Tx_EnLateColl          0x00001000 /* 1:Enable Late Collision         */#define Tx_EnTxPar             0x00002000 /* 1:Enable Transmit Parity        */#define Tx_EnComp              0x00004000 /* 1:Enable Completion             *//* Tx_Stat bit asign ------------------------------------------------------- */#define Tx_TxColl_MASK         0x0000000F /* Tx Collision Count              */#define Tx_ExColl              0x00000010 /* Excessive Collision             */#define Tx_TXDefer             0x00000020 /* Transmit Defered                */#define Tx_Paused              0x00000040 /* Transmit Paused                 */#define Tx_IntTx               0x00000080 /* Interrupt on Tx                 */#define Tx_Under               0x00000100 /* Underrun                        */#define Tx_Defer               0x00000200 /* Deferral                        */#define Tx_NCarr               0x00000400 /* No Carrier                      */#define Tx_10Stat              0x00000800 /* 10Mbps Status                   */#define Tx_LateColl            0x00001000 /* Late Collision                  */#define Tx_TxPar               0x00002000 /* Tx Parity Error                 */#define Tx_Comp                0x00004000 /* Completion                      */#define Tx_Halted              0x00008000 /* Tx Halted                       */#define Tx_SQErr               0x00010000 /* Signal Quality Error(SQE)       *//* Rx_Ctl bit asign -------------------------------------------------------- */#define Rx_EnGood              0x00004000 /* 1:Enable Good                   */#define Rx_EnRxPar             0x00002000 /* 1:Enable Receive Parity         */#define Rx_EnLongErr           0x00000800 /* 1:Enable Long Error             */#define Rx_EnOver              0x00000400 /* 1:Enable OverFlow               */#define Rx_EnCRCErr            0x00000200 /* 1:Enable CRC Error              */#define Rx_EnAlign             0x00000100 /* 1:Enable Alignment              */#define Rx_IgnoreCRC           0x00000040 /* 1:Ignore CRC Value              */#define Rx_StripCRC            0x00000010 /* 1:Strip CRC Value               */#define Rx_ShortEn             0x00000008 /* 1:Short Enable                  */#define Rx_LongEn              0x00000004 /* 1:Long Enable                   */#define Rx_RxHalt              0x00000002 /* 1:Receive Halt Request          */#define Rx_RxEn                0x00000001 /* 1:Receive Intrrupt Enable       *//* Rx_Stat bit asign ------------------------------------------------------- */#define Rx_Halted              0x00008000 /* Rx Halted                       */#define Rx_Good                0x00004000 /* Rx Good                         */#define Rx_RxPar               0x00002000 /* Rx Parity Error                 */                            /* 0x00001000    not use                         */#define Rx_LongErr             0x00000800 /* Rx Long Error                   */#define Rx_Over                0x00000400 /* Rx Overflow                     */#define Rx_CRCErr              0x00000200 /* Rx CRC Error                    */#define Rx_Align               0x00000100 /* Rx Alignment Error              */#define Rx_10Stat              0x00000080 /* Rx 10Mbps Status                */#define Rx_IntRx               0x00000040 /* Rx Interrupt                    */#define Rx_CtlRecd             0x00000020 /* Rx Control Receive              */#define Rx_Stat_Mask           0x0000EFC0 /* Rx All Status Mask              *//* Int_En bit asign -------------------------------------------------------- */#define Int_NRAbtEn            0x00000800 /* 1:Non-recoverable Abort Enable  */#define Int_TxCtlCmpEn         0x00000400 /* 1:Transmit Control Complete Enable */#define Int_DmParErrEn         0x00000200 /* 1:DMA Parity Error Enable       */#define Int_DParDEn            0x00000100 /* 1:Data Parity Error Enable      */#define Int_EarNotEn           0x00000080 /* 1:Early Notify Enable           */#define Int_DParErrEn          0x00000040 /* 1:Detected Parity Error Enable  */#define Int_SSysErrEn          0x00000020 /* 1:Signalled System Error Enable */#define Int_RMasAbtEn          0x00000010 /* 1:Received Master Abort Enable  */#define Int_RTargAbtEn         0x00000008 /* 1:Received Target Abort Enable  */#define Int_STargAbtEn         0x00000004 /* 1:Signalled Target Abort Enable */#define Int_BLExEn             0x00000002 /* 1:Buffer List Exhausted Enable  */#define Int_FDAExEn            0x00000001 /* 1:Free Descriptor Area          */                                          /*               Exhausted Enable  *//* Int_Src bit asign ------------------------------------------------------- */#define Int_NRabt              0x00004000 /* 1:Non Recoverable error         */#define Int_DmParErrStat       0x00002000 /* 1:DMA Parity Error & Clear      */#define Int_BLEx               0x00001000 /* 1:Buffer List Empty & Clear     */#define Int_FDAEx              0x00000800 /* 1:FDA Empty & Clear             */#define Int_IntNRAbt           0x00000400 /* 1:Non Recoverable Abort         */#define	Int_IntCmp             0x00000200 /* 1:MAC control packet complete   */#define Int_IntExBD            0x00000100 /* 1:Interrupt Extra BD & Clear    */#define Int_DmParErr           0x00000080 /* 1:DMA Parity Error & Clear      */#define Int_IntEarNot          0x00000040 /* 1:Receive Data write & Clear    */#define Int_SWInt              0x00000020 /* 1:Software request & Clear      */#define Int_IntBLEx            0x00000010 /* 1:Buffer List Empty & Clear     */#define Int_IntFDAEx           0x00000008 /* 1:FDA Empty & Clear             */#define Int_IntPCI             0x00000004 /* 1:PCI controller & Clear        */#define Int_IntMacRx           0x00000002 /* 1:Rx controller & Clear         */#define Int_IntMacTx           0x00000001 /* 1:Tx controller & Clear         *//* MD_CA bit asign --------------------------------------------------------- */#define MD_CA_PreSup           0x00001000 /* 1:Preamble Supress              */#define MD_CA_Busy             0x00000800 /* 1:Busy (Start Operation)        */#define MD_CA_Wr               0x00000400 /* 1:Write 0:Read                  *//* * Descriptors *//* Frame descripter */struct FDesc {	volatile __u32 FDNext;	volatile __u32 FDSystem;	volatile __u32 FDStat;	volatile __u32 FDCtl;};/* Buffer descripter */struct BDesc {	volatile __u32 BuffData;	volatile __u32 BDCtl;};#define FD_ALIGN	16/* Frame Descripter bit asign ---------------------------------------------- */#define FD_FDLength_MASK       0x0000FFFF /* Length MASK                     */#define FD_BDCnt_MASK          0x001F0000 /* BD count MASK in FD             */#define FD_FrmOpt_MASK         0x7C000000 /* Frame option MASK               */#define FD_FrmOpt_BigEndian    0x40000000 /* Tx/Rx */#define FD_FrmOpt_IntTx        0x20000000 /* Tx only */#define FD_FrmOpt_NoCRC        0x10000000 /* Tx only */#define FD_FrmOpt_NoPadding    0x08000000 /* Tx only */#define FD_FrmOpt_Packing      0x04000000 /* Rx only */#define FD_CownsFD             0x80000000 /* FD Controller owner bit         */#define FD_Next_EOL            0x00000001 /* FD EOL indicator                */#define FD_BDCnt_SHIFT         16/* Buffer Descripter bit asign --------------------------------------------- */#define BD_BuffLength_MASK     0x0000FFFF /* Recieve Data Size               */#define BD_RxBDID_MASK         0x00FF0000 /* BD ID Number MASK               */#define BD_RxBDSeqN_MASK       0x7F000000 /* Rx BD Sequence Number           */#define BD_CownsBD             0x80000000 /* BD Controller owner bit         */#define BD_RxBDID_SHIFT        16#define BD_RxBDSeqN_SHIFT      24/* Some useful constants. */#undef NO_CHECK_CARRIER	/* Does not check No-Carrier with TP */#ifdef NO_CHECK_CARRIER#define TX_CTL_CMD	(Tx_EnComp | Tx_EnTxPar | Tx_EnLateColl | \	Tx_EnExColl | Tx_EnExDefer | Tx_EnUnder | \	Tx_En)	/* maybe  0x7b01 */#else#define TX_CTL_CMD	(Tx_EnComp | Tx_EnTxPar | Tx_EnLateColl | \	Tx_EnExColl | Tx_EnLCarr | Tx_EnExDefer | Tx_EnUnder | \	Tx_En)	/* maybe  0x7b01 */#endif#define RX_CTL_CMD	(Rx_EnGood | Rx_EnRxPar | Rx_EnLongErr | Rx_EnOver \	| Rx_EnCRCErr | Rx_EnAlign | Rx_RxEn)	/* maybe 0x6f01 */#define INT_EN_CMD  (Int_NRAbtEn | \	Int_DmParErrEn | Int_DParDEn | Int_DParErrEn | \	Int_SSysErrEn  | Int_RMasAbtEn | Int_RTargAbtEn | \	Int_STargAbtEn | \	Int_BLExEn  | Int_FDAExEn) /* maybe 0xb7f*/#define DMA_CTL_CMD	DMA_BURST_SIZE#define HAVE_DMA_RXALIGN(lp)	likely((lp)->boardtype != TC35815CF)/* Tuning parameters */#define DMA_BURST_SIZE	32#define TX_THRESHOLD	1024#define TX_THRESHOLD_MAX 1536       /* used threshold with packet max byte for low pci transfer ability.*/#define TX_THRESHOLD_KEEP_LIMIT 10  /* setting threshold max value when overrun error occured this count. *//* 16 + RX_BUF_NUM * 8 + RX_FD_NUM * 16 + TX_FD_NUM * 32 <= PAGE_SIZE*FD_PAGE_NUM */#ifdef TC35815_USE_PACKEDBUFFER#define FD_PAGE_NUM 2#define RX_BUF_NUM	8	/* >= 2 */#define RX_FD_NUM	250	/* >= 32 */#define TX_FD_NUM	128#define RX_BUF_SIZE	PAGE_SIZE#else /* TC35815_USE_PACKEDBUFFER */#define FD_PAGE_NUM 4#define RX_BUF_NUM	128	/* < 256 */#define RX_FD_NUM	256	/* >= 32 */#define TX_FD_NUM	128#if RX_CTL_CMD & Rx_LongEn#define RX_BUF_SIZE	PAGE_SIZE#elif RX_CTL_CMD & Rx_StripCRC#define RX_BUF_SIZE	ALIGN(ETH_FRAME_LEN + 4 + 2, 32) /* +2: reserve */#else#define RX_BUF_SIZE	ALIGN(ETH_FRAME_LEN + 2, 32) /* +2: reserve */#endif#endif /* TC35815_USE_PACKEDBUFFER */#define RX_FD_RESERVE	(2 / 2)	/* max 2 BD per RxFD */#define NAPI_WEIGHT	16struct TxFD {	struct FDesc fd;	struct BDesc bd;	struct BDesc unused;};struct RxFD {	struct FDesc fd;	struct BDesc bd[0];	/* variable length */};struct FrFD {	struct FDesc fd;	struct BDesc bd[RX_BUF_NUM];};#define tc_readl(addr)	readl(addr)#define tc_writel(d, addr)	writel(d, addr)#define TC35815_TX_TIMEOUT  msecs_to_jiffies(400)/* Timer state engine. */enum tc35815_timer_state {	arbwait  = 0,	/* Waiting for auto negotiation to complete.          */	lupwait  = 1,	/* Auto-neg complete, awaiting link-up status.        */	ltrywait = 2,	/* Forcing try of all modes, from fastest to slowest. */	asleep   = 3,	/* Time inactive.                                     */	lcheck   = 4,	/* Check link status.                                 */};/* Information that need to be kept for each board. */struct tc35815_local {	struct pci_dev *pci_dev;	struct net_device *dev;	struct napi_struct napi;	/* statistics */	struct net_device_stats stats;	struct {		int max_tx_qlen;		int tx_ints;		int rx_ints;	        int tx_underrun;	} lstats;

⌨️ 快捷键说明

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