📄 tc35815.c
字号:
/* * 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 + -