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 + -
显示快捷键?