tc35815.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 1,746 行 · 第 1/4 页

C
1,746
字号
/* tc35815.c: A TOSHIBA TC35815CF PCI 10/100Mbps ethernet driver for linux. * * Copyright 2001 MontaVista Software Inc. * Author: MontaVista Software, Inc.  *                ahennessy@mvista.com * * Based on skelton.c by Donald Becker. * Copyright (C) 2000-2001 Toshiba Corporation * * This program is free software; you can redistribute  it and/or modify it * under  the terms of  the GNU General  Public License as published by the * Free Software Foundation;  either version 2 of the  License, or (at your * option) any later version. * * THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED * WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN * NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF * USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the  GNU General Public License along * with this program; if not, write  to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. */static const char *version =	"tc35815.c:v0.00 26/07/2000 by Toshiba Corporation\n";#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/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/proc_fs.h>#include <linux/spinlock.h>#include <asm/system.h>#include <asm/bitops.h>#include <asm/io.h>#include <asm/dma.h>#include <asm/byteorder.h>/* * The name of the card. Is used for messages and in the requests for * io regions, irqs and dma channels */static const char* cardname = "TC35815CF";#define TC35815_PROC_ENTRY "net/tc35815"#define TC35815_MODULE_NAME "TC35815CF"#define TX_TIMEOUT (4*HZ)/* First, a few definitions that the brave might change. *//* use 0 for production, 1 for verification, >2 for debug */#ifndef TC35815_DEBUG#define TC35815_DEBUG 1#endifstatic unsigned int tc35815_debug = TC35815_DEBUG;#define GATHER_TXINT	/* On-Demand Tx Interrupt */#define vtonocache(p)	KSEG1ADDR(virt_to_phys(p))/* * 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_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                  *//* MII register offsets */#define MII_CONTROL             0x0000#define MII_STATUS              0x0001#define MII_PHY_ID0             0x0002#define MII_PHY_ID1             0x0003#define MII_ANAR                0x0004#define MII_ANLPAR              0x0005#define MII_ANER                0x0006/* MII Control register bit definitions. */#define MIICNTL_FDX             0x0100#define MIICNTL_RST_AUTO        0x0200#define MIICNTL_ISOLATE         0x0400#define MIICNTL_PWRDWN          0x0800#define MIICNTL_AUTO            0x1000#define MIICNTL_SPEED           0x2000#define MIICNTL_LPBK            0x4000#define MIICNTL_RESET           0x8000/* MII Status register bit significance. */#define MIISTAT_EXT             0x0001#define MIISTAT_JAB             0x0002#define MIISTAT_LINK            0x0004#define MIISTAT_CAN_AUTO        0x0008#define MIISTAT_FAULT           0x0010#define MIISTAT_AUTO_DONE       0x0020#define MIISTAT_CAN_T           0x0800#define MIISTAT_CAN_T_FDX       0x1000#define MIISTAT_CAN_TX          0x2000#define MIISTAT_CAN_TX_FDX      0x4000#define MIISTAT_CAN_T4          0x8000/* MII Auto-Negotiation Expansion/RemoteEnd Register Bits */#define MII_AN_TX_FDX           0x0100#define MII_AN_TX_HDX           0x0080#define MII_AN_10_FDX           0x0040#define MII_AN_10_HDX           0x0020/* * 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_EnLCarr | Tx_EnExDefer | Tx_EnUnder | \	Tx_En)	/* maybe  0x7d01 */#else#define TX_CTL_CMD	(Tx_EnComp | Tx_EnTxPar | Tx_EnLateColl | \	Tx_EnExColl | Tx_EnExDefer | Tx_EnUnder | \	Tx_En)	/* maybe  0x7f01 */#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_DParDEn | Int_DParErrEn | \	Int_SSysErrEn  | Int_RMasAbtEn | Int_RTargAbtEn | \	Int_STargAbtEn | \	Int_BLExEn  | Int_FDAExEn) /* maybe 0xb7f*//* Tuning parameters */#define DMA_BURST_SIZE	32#define TX_THRESHOLD	1024#define FD_PAGE_NUM 2#define FD_PAGE_ORDER 1/* 16 + RX_BUF_PAGES * 8 + RX_FD_NUM * 16 + TX_FD_NUM * 32 <= PAGE_SIZE*2 */#define RX_BUF_PAGES	8	/* >= 2 */#define RX_FD_NUM	250	/* >= 32 */#define TX_FD_NUM	128struct 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_PAGES];};extern unsigned long tc_readl(volatile __u32 *addr);extern void tc_writel(unsigned long data, volatile __u32 *addr);dma_addr_t priv_dma_handle;/* Information that need to be kept for each board. */struct tc35815_local {	struct net_device *next_module;	/* statistics */	struct net_device_stats stats;	struct {		int max_tx_qlen;		int tx_ints;		int rx_ints;	} lstats;	int tbusy;	int option;#define TC35815_OPT_AUTO	0x00#define TC35815_OPT_10M	0x01#define TC35815_OPT_100M	0x02#define TC35815_OPT_FULLDUP	0x04	int linkspeed;	/* 10 or 100 */	int fullduplex;	/*	 * Transmitting: Batch Mode.	 *	1 BD in 1 TxFD.	 * Receiving: Packing Mode.	 *	1 circular FD for Free Buffer List.	 *	RX_BUG_PAGES BD in Free Buffer FD.	 *	One Free Buffer BD has PAGE_SIZE data buffer.	 */        struct pci_dev *pdev;	dma_addr_t fd_buf_dma_handle;	void * fd_buf;	/* for TxFD, TxFD, FrFD */	struct TxFD *tfd_base;	int tfd_start;

⌨️ 快捷键说明

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