tc35815.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:54k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* tc35815.c: A TOSHIBA TC35815CF PCI 10/100Mbps ethernet driver for linux.
  2.  *
  3.  * Copyright 2001 MontaVista Software Inc.
  4.  * Author: MontaVista Software, Inc. 
  5.  *                ahennessy@mvista.com
  6.  *
  7.  * Based on skelton.c by Donald Becker.
  8.  * Copyright (C) 2000-2001 Toshiba Corporation
  9.  *
  10.  * Cleaned up various non portable stuff (save_and_cli etc) and made it
  11.  * build on x86 platforms -- Alan Cox <alan@redhat.com> 20020302
  12.  *
  13.  * This program is free software; you can redistribute  it and/or modify it
  14.  * under  the terms of  the GNU General  Public License as published by the
  15.  * Free Software Foundation;  either version 2 of the  License, or (at your
  16.  * option) any later version.
  17.  *
  18.  * THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
  19.  * WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
  20.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
  21.  * NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
  22.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  23.  * NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
  24.  * USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  25.  * ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
  26.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  27.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28.  *
  29.  * You should have received a copy of the  GNU General Public License along
  30.  * with this program; if not, write  to the Free Software Foundation, Inc.,
  31.  * 675 Mass Ave, Cambridge, MA 02139, USA.
  32.  *
  33.  * TODO:
  34.  * Switch to spin_lock not lock_kernel for scalability.
  35.  */
  36. static const char *version =
  37. "tc35815.c:v0.00-ac 26/07/2000 by Toshiba Corporationn";
  38. #include <linux/module.h>
  39. #include <linux/kernel.h>
  40. #include <linux/sched.h>
  41. #include <linux/types.h>
  42. #include <linux/fcntl.h>
  43. #include <linux/interrupt.h>
  44. #include <linux/ptrace.h>
  45. #include <linux/ioport.h>
  46. #include <linux/in.h>
  47. #include <linux/slab.h>
  48. #include <linux/string.h>
  49. #include <asm/system.h>
  50. #include <asm/bitops.h>
  51. #include <asm/io.h>
  52. #include <asm/dma.h>
  53. #include <linux/errno.h>
  54. #include <linux/init.h>
  55. #include <linux/netdevice.h>
  56. #include <linux/etherdevice.h>
  57. #include <linux/skbuff.h>
  58. #include <linux/delay.h>
  59. #include <linux/pci.h>
  60. #include <linux/proc_fs.h>
  61. #include <asm/byteorder.h>
  62. /*
  63.  * The name of the card. Is used for messages and in the requests for
  64.  * io regions, irqs and dma channels
  65.  */
  66. static const char* cardname = "TC35815CF";
  67. #define TC35815_PROC_ENTRY "net/tc35815"
  68. #define TC35815_MODULE_NAME "TC35815CF"
  69. #define TX_TIMEOUT (4*HZ)
  70. /* First, a few definitions that the brave might change. */
  71. /* use 0 for production, 1 for verification, >2 for debug */
  72. #ifndef TC35815_DEBUG
  73. #define TC35815_DEBUG 1
  74. #endif
  75. static unsigned int tc35815_debug = TC35815_DEBUG;
  76. #define GATHER_TXINT /* On-Demand Tx Interrupt */
  77. #define vtonocache(p) KSEG1ADDR(virt_to_phys(p))
  78. /*
  79.  * Registers
  80.  */
  81. struct tc35815_regs {
  82. volatile __u32 DMA_Ctl; /* 0x00 */
  83. volatile __u32 TxFrmPtr;
  84. volatile __u32 TxThrsh;
  85. volatile __u32 TxPollCtr;
  86. volatile __u32 BLFrmPtr;
  87. volatile __u32 RxFragSize;
  88. volatile __u32 Int_En;
  89. volatile __u32 FDA_Bas;
  90. volatile __u32 FDA_Lim; /* 0x20 */
  91. volatile __u32 Int_Src;
  92. volatile __u32 unused0[2];
  93. volatile __u32 PauseCnt;
  94. volatile __u32 RemPauCnt;
  95. volatile __u32 TxCtlFrmStat;
  96. volatile __u32 unused1;
  97. volatile __u32 MAC_Ctl; /* 0x40 */
  98. volatile __u32 CAM_Ctl;
  99. volatile __u32 Tx_Ctl;
  100. volatile __u32 Tx_Stat;
  101. volatile __u32 Rx_Ctl;
  102. volatile __u32 Rx_Stat;
  103. volatile __u32 MD_Data;
  104. volatile __u32 MD_CA;
  105. volatile __u32 CAM_Adr; /* 0x60 */
  106. volatile __u32 CAM_Data;
  107. volatile __u32 CAM_Ena;
  108. volatile __u32 PROM_Ctl;
  109. volatile __u32 PROM_Data;
  110. volatile __u32 Algn_Cnt;
  111. volatile __u32 CRC_Cnt;
  112. volatile __u32 Miss_Cnt;
  113. };
  114. /*
  115.  * Bit assignments
  116.  */
  117. /* DMA_Ctl bit asign ------------------------------------------------------- */
  118. #define DMA_IntMask            0x00040000 /* 1:Interupt mask                 */
  119. #define DMA_SWIntReq           0x00020000 /* 1:Software Interrupt request    */
  120. #define DMA_TxWakeUp           0x00010000 /* 1:Transmit Wake Up              */
  121. #define DMA_RxBigE             0x00008000 /* 1:Receive Big Endian            */
  122. #define DMA_TxBigE             0x00004000 /* 1:Transmit Big Endian           */
  123. #define DMA_TestMode           0x00002000 /* 1:Test Mode                     */
  124. #define DMA_PowrMgmnt          0x00001000 /* 1:Power Management              */
  125. #define DMA_DmBurst_Mask       0x000001fc /* DMA Burst size                  */
  126. /* RxFragSize bit asign ---------------------------------------------------- */
  127. #define RxFrag_EnPack          0x00008000 /* 1:Enable Packing                */
  128. #define RxFrag_MinFragMask     0x00000ffc /* Minimum Fragment                */
  129. /* MAC_Ctl bit asign ------------------------------------------------------- */
  130. #define MAC_Link10             0x00008000 /* 1:Link Status 10Mbits           */
  131. #define MAC_EnMissRoll         0x00002000 /* 1:Enable Missed Roll            */
  132. #define MAC_MissRoll           0x00000400 /* 1:Missed Roll                   */
  133. #define MAC_Loop10             0x00000080 /* 1:Loop 10 Mbps                  */
  134. #define MAC_Conn_Auto          0x00000000 /*00:Connection mode (Automatic)   */
  135. #define MAC_Conn_10M           0x00000020 /*01:                (10Mbps endec)*/
  136. #define MAC_Conn_Mll           0x00000040 /*10:                (Mll clock)   */
  137. #define MAC_MacLoop            0x00000010 /* 1:MAC Loopback                  */
  138. #define MAC_FullDup            0x00000008 /* 1:Full Duplex 0:Half Duplex     */
  139. #define MAC_Reset              0x00000004 /* 1:Software Reset                */
  140. #define MAC_HaltImm            0x00000002 /* 1:Halt Immediate                */
  141. #define MAC_HaltReq            0x00000001 /* 1:Halt request                  */
  142. /* PROM_Ctl bit asign ------------------------------------------------------ */
  143. #define PROM_Busy              0x00008000 /* 1:Busy (Start Operation)        */
  144. #define PROM_Read              0x00004000 /*10:Read operation                */
  145. #define PROM_Write             0x00002000 /*01:Write operation               */
  146. #define PROM_Erase             0x00006000 /*11:Erase operation               */
  147.                                           /*00:Enable or Disable Writting,   */
  148.                                           /*      as specified in PROM_Addr. */
  149. #define PROM_Addr_Ena          0x00000030 /*11xxxx:PROM Write enable         */
  150.                                           /*00xxxx:           disable        */
  151. /* CAM_Ctl bit asign ------------------------------------------------------- */
  152. #define CAM_CompEn             0x00000010 /* 1:CAM Compare Enable            */
  153. #define CAM_NegCAM             0x00000008 /* 1:Reject packets CAM recognizes,*/
  154.                                           /*                    accept other */
  155. #define CAM_BroadAcc           0x00000004 /* 1:Broadcast assept              */
  156. #define CAM_GroupAcc           0x00000002 /* 1:Multicast assept              */
  157. #define CAM_StationAcc         0x00000001 /* 1:unicast accept                */
  158. /* CAM_Ena bit asign ------------------------------------------------------- */
  159. #define CAM_ENTRY_MAX                  21   /* CAM Data entry max count      */
  160. #define CAM_Ena_Mask ((1<<CAM_ENTRY_MAX)-1) /* CAM Enable bits (Max 21bits)  */
  161. #define CAM_Ena_Bit(index)         (1<<(index))
  162. #define CAM_ENTRY_DESTINATION 0
  163. #define CAM_ENTRY_SOURCE 1
  164. #define CAM_ENTRY_MACCTL 20
  165. /* Tx_Ctl bit asign -------------------------------------------------------- */
  166. #define Tx_En                  0x00000001 /* 1:Transmit enable               */
  167. #define Tx_TxHalt              0x00000002 /* 1:Transmit Halt Request         */
  168. #define Tx_NoPad               0x00000004 /* 1:Suppress Padding              */
  169. #define Tx_NoCRC               0x00000008 /* 1:Suppress Padding              */
  170. #define Tx_FBack               0x00000010 /* 1:Fast Back-off                 */
  171. #define Tx_EnUnder             0x00000100 /* 1:Enable Underrun               */
  172. #define Tx_EnExDefer           0x00000200 /* 1:Enable Excessive Deferral     */
  173. #define Tx_EnLCarr             0x00000400 /* 1:Enable Lost Carrier           */
  174. #define Tx_EnExColl            0x00000800 /* 1:Enable Excessive Collision    */
  175. #define Tx_EnLateColl          0x00001000 /* 1:Enable Late Collision         */
  176. #define Tx_EnTxPar             0x00002000 /* 1:Enable Transmit Parity        */
  177. #define Tx_EnComp              0x00004000 /* 1:Enable Completion             */
  178. /* Tx_Stat bit asign ------------------------------------------------------- */
  179. #define Tx_TxColl_MASK         0x0000000F /* Tx Collision Count              */
  180. #define Tx_ExColl              0x00000010 /* Excessive Collision             */
  181. #define Tx_TXDefer             0x00000020 /* Transmit Defered                */
  182. #define Tx_Paused              0x00000040 /* Transmit Paused                 */
  183. #define Tx_IntTx               0x00000080 /* Interrupt on Tx                 */
  184. #define Tx_Under               0x00000100 /* Underrun                        */
  185. #define Tx_Defer               0x00000200 /* Deferral                        */
  186. #define Tx_NCarr               0x00000400 /* No Carrier                      */
  187. #define Tx_10Stat              0x00000800 /* 10Mbps Status                   */
  188. #define Tx_LateColl            0x00001000 /* Late Collision                  */
  189. #define Tx_TxPar               0x00002000 /* Tx Parity Error                 */
  190. #define Tx_Comp                0x00004000 /* Completion                      */
  191. #define Tx_Halted              0x00008000 /* Tx Halted                       */
  192. #define Tx_SQErr               0x00010000 /* Signal Quality Error(SQE)       */
  193. /* Rx_Ctl bit asign -------------------------------------------------------- */
  194. #define Rx_EnGood              0x00004000 /* 1:Enable Good                   */
  195. #define Rx_EnRxPar             0x00002000 /* 1:Enable Receive Parity         */
  196. #define Rx_EnLongErr           0x00000800 /* 1:Enable Long Error             */
  197. #define Rx_EnOver              0x00000400 /* 1:Enable OverFlow               */
  198. #define Rx_EnCRCErr            0x00000200 /* 1:Enable CRC Error              */
  199. #define Rx_EnAlign             0x00000100 /* 1:Enable Alignment              */
  200. #define Rx_IgnoreCRC           0x00000040 /* 1:Ignore CRC Value              */
  201. #define Rx_StripCRC            0x00000010 /* 1:Strip CRC Value               */
  202. #define Rx_ShortEn             0x00000008 /* 1:Short Enable                  */
  203. #define Rx_LongEn              0x00000004 /* 1:Long Enable                   */
  204. #define Rx_RxHalt              0x00000002 /* 1:Receive Halt Request          */
  205. #define Rx_RxEn                0x00000001 /* 1:Receive Intrrupt Enable       */
  206. /* Rx_Stat bit asign ------------------------------------------------------- */
  207. #define Rx_Halted              0x00008000 /* Rx Halted                       */
  208. #define Rx_Good                0x00004000 /* Rx Good                         */
  209. #define Rx_RxPar               0x00002000 /* Rx Parity Error                 */
  210.                             /* 0x00001000    not use                         */
  211. #define Rx_LongErr             0x00000800 /* Rx Long Error                   */
  212. #define Rx_Over                0x00000400 /* Rx Overflow                     */
  213. #define Rx_CRCErr              0x00000200 /* Rx CRC Error                    */
  214. #define Rx_Align               0x00000100 /* Rx Alignment Error              */
  215. #define Rx_10Stat              0x00000080 /* Rx 10Mbps Status                */
  216. #define Rx_IntRx               0x00000040 /* Rx Interrupt                    */
  217. #define Rx_CtlRecd             0x00000020 /* Rx Control Receive              */
  218. #define Rx_Stat_Mask           0x0000EFC0 /* Rx All Status Mask              */
  219. /* Int_En bit asign -------------------------------------------------------- */
  220. #define Int_NRAbtEn            0x00000800 /* 1:Non-recoverable Abort Enable  */
  221. #define Int_TxCtlCmpEn         0x00000400 /* 1:Transmit Control Complete Enable */
  222. #define Int_DmParErrEn         0x00000200 /* 1:DMA Parity Error Enable       */
  223. #define Int_DParDEn            0x00000100 /* 1:Data Parity Error Enable      */
  224. #define Int_EarNotEn           0x00000080 /* 1:Early Notify Enable           */
  225. #define Int_DParErrEn          0x00000040 /* 1:Detected Parity Error Enable  */
  226. #define Int_SSysErrEn          0x00000020 /* 1:Signalled System Error Enable */
  227. #define Int_RMasAbtEn          0x00000010 /* 1:Received Master Abort Enable  */
  228. #define Int_RTargAbtEn         0x00000008 /* 1:Received Target Abort Enable  */
  229. #define Int_STargAbtEn         0x00000004 /* 1:Signalled Target Abort Enable */
  230. #define Int_BLExEn             0x00000002 /* 1:Buffer List Exhausted Enable  */
  231. #define Int_FDAExEn            0x00000001 /* 1:Free Descriptor Area          */
  232.                                           /*               Exhausted Enable  */
  233. /* Int_Src bit asign ------------------------------------------------------- */
  234. #define Int_NRabt              0x00004000 /* 1:Non Recoverable error         */
  235. #define Int_DmParErrStat       0x00002000 /* 1:DMA Parity Error & Clear      */
  236. #define Int_BLEx               0x00001000 /* 1:Buffer List Empty & Clear     */
  237. #define Int_FDAEx              0x00000800 /* 1:FDA Empty & Clear             */
  238. #define Int_IntNRAbt           0x00000400 /* 1:Non Recoverable Abort         */
  239. #define Int_IntCmp             0x00000200 /* 1:MAC control packet complete   */
  240. #define Int_IntExBD            0x00000100 /* 1:Interrupt Extra BD & Clear    */
  241. #define Int_DmParErr           0x00000080 /* 1:DMA Parity Error & Clear      */
  242. #define Int_IntEarNot          0x00000040 /* 1:Receive Data write & Clear    */
  243. #define Int_SWInt              0x00000020 /* 1:Software request & Clear      */
  244. #define Int_IntBLEx            0x00000010 /* 1:Buffer List Empty & Clear     */
  245. #define Int_IntFDAEx           0x00000008 /* 1:FDA Empty & Clear             */
  246. #define Int_IntPCI             0x00000004 /* 1:PCI controller & Clear        */
  247. #define Int_IntMacRx           0x00000002 /* 1:Rx controller & Clear         */
  248. #define Int_IntMacTx           0x00000001 /* 1:Tx controller & Clear         */
  249. /* MD_CA bit asign --------------------------------------------------------- */
  250. #define MD_CA_PreSup           0x00001000 /* 1:Preamble Supress              */
  251. #define MD_CA_Busy             0x00000800 /* 1:Busy (Start Operation)        */
  252. #define MD_CA_Wr               0x00000400 /* 1:Write 0:Read                  */
  253. /* MII register offsets */
  254. #define MII_CONTROL             0x0000
  255. #define MII_STATUS              0x0001
  256. #define MII_PHY_ID0             0x0002
  257. #define MII_PHY_ID1             0x0003
  258. #define MII_ANAR                0x0004
  259. #define MII_ANLPAR              0x0005
  260. #define MII_ANER                0x0006
  261. /* MII Control register bit definitions. */
  262. #define MIICNTL_FDX             0x0100
  263. #define MIICNTL_RST_AUTO        0x0200
  264. #define MIICNTL_ISOLATE         0x0400
  265. #define MIICNTL_PWRDWN          0x0800
  266. #define MIICNTL_AUTO            0x1000
  267. #define MIICNTL_SPEED           0x2000
  268. #define MIICNTL_LPBK            0x4000
  269. #define MIICNTL_RESET           0x8000
  270. /* MII Status register bit significance. */
  271. #define MIISTAT_EXT             0x0001
  272. #define MIISTAT_JAB             0x0002
  273. #define MIISTAT_LINK            0x0004
  274. #define MIISTAT_CAN_AUTO        0x0008
  275. #define MIISTAT_FAULT           0x0010
  276. #define MIISTAT_AUTO_DONE       0x0020
  277. #define MIISTAT_CAN_T           0x0800
  278. #define MIISTAT_CAN_T_FDX       0x1000
  279. #define MIISTAT_CAN_TX          0x2000
  280. #define MIISTAT_CAN_TX_FDX      0x4000
  281. #define MIISTAT_CAN_T4          0x8000
  282. /* MII Auto-Negotiation Expansion/RemoteEnd Register Bits */
  283. #define MII_AN_TX_FDX           0x0100
  284. #define MII_AN_TX_HDX           0x0080
  285. #define MII_AN_10_FDX           0x0040
  286. #define MII_AN_10_HDX           0x0020
  287. /*
  288.  * Descriptors
  289.  */
  290. /* Frame descripter */
  291. struct FDesc {
  292. volatile __u32 FDNext;
  293. volatile __u32 FDSystem;
  294. volatile __u32 FDStat;
  295. volatile __u32 FDCtl;
  296. };
  297. /* Buffer descripter */
  298. struct BDesc {
  299. volatile __u32 BuffData;
  300. volatile __u32 BDCtl;
  301. };
  302. #define FD_ALIGN 16
  303. /* Frame Descripter bit asign ---------------------------------------------- */
  304. #define FD_FDLength_MASK       0x0000FFFF /* Length MASK                     */
  305. #define FD_BDCnt_MASK          0x001F0000 /* BD count MASK in FD             */
  306. #define FD_FrmOpt_MASK         0x7C000000 /* Frame option MASK               */
  307. #define FD_FrmOpt_BigEndian    0x40000000 /* Tx/Rx */
  308. #define FD_FrmOpt_IntTx        0x20000000 /* Tx only */
  309. #define FD_FrmOpt_NoCRC        0x10000000 /* Tx only */
  310. #define FD_FrmOpt_NoPadding    0x08000000 /* Tx only */
  311. #define FD_FrmOpt_Packing      0x04000000 /* Rx only */
  312. #define FD_CownsFD             0x80000000 /* FD Controller owner bit         */
  313. #define FD_Next_EOL            0x00000001 /* FD EOL indicator                */
  314. #define FD_BDCnt_SHIFT         16
  315. /* Buffer Descripter bit asign --------------------------------------------- */
  316. #define BD_BuffLength_MASK     0x0000FFFF /* Recieve Data Size               */
  317. #define BD_RxBDID_MASK         0x00FF0000 /* BD ID Number MASK               */
  318. #define BD_RxBDSeqN_MASK       0x7F000000 /* Rx BD Sequence Number           */
  319. #define BD_CownsBD             0x80000000 /* BD Controller owner bit         */
  320. #define BD_RxBDID_SHIFT        16
  321. #define BD_RxBDSeqN_SHIFT      24
  322. /* Some useful constants. */
  323. #undef NO_CHECK_CARRIER /* Does not check No-Carrier with TP */
  324. #ifdef NO_CHECK_CARRIER
  325. #define TX_CTL_CMD (Tx_EnComp | Tx_EnTxPar | Tx_EnLateColl | 
  326. Tx_EnExColl | Tx_EnLCarr | Tx_EnExDefer | Tx_EnUnder | 
  327. Tx_En) /* maybe  0x7d01 */
  328. #else
  329. #define TX_CTL_CMD (Tx_EnComp | Tx_EnTxPar | Tx_EnLateColl | 
  330. Tx_EnExColl | Tx_EnExDefer | Tx_EnUnder | 
  331. Tx_En) /* maybe  0x7f01 */
  332. #endif
  333. #define RX_CTL_CMD (Rx_EnGood | Rx_EnRxPar | Rx_EnLongErr | Rx_EnOver 
  334. | Rx_EnCRCErr | Rx_EnAlign | Rx_RxEn) /* maybe 0x6f01 */
  335. #define INT_EN_CMD  (Int_NRAbtEn | 
  336.  Int_DParDEn | Int_DParErrEn | 
  337. Int_SSysErrEn  | Int_RMasAbtEn | Int_RTargAbtEn | 
  338. Int_STargAbtEn | 
  339. Int_BLExEn  | Int_FDAExEn) /* maybe 0xb7f*/
  340. /* Tuning parameters */
  341. #define DMA_BURST_SIZE 32
  342. #define TX_THRESHOLD 1024
  343. #define FD_PAGE_NUM 2
  344. #define FD_PAGE_ORDER 1
  345. /* 16 + RX_BUF_PAGES * 8 + RX_FD_NUM * 16 + TX_FD_NUM * 32 <= PAGE_SIZE*2 */
  346. #define RX_BUF_PAGES 8 /* >= 2 */
  347. #define RX_FD_NUM 250 /* >= 32 */
  348. #define TX_FD_NUM 128
  349. struct TxFD {
  350. struct FDesc fd;
  351. struct BDesc bd;
  352. struct BDesc unused;
  353. };
  354. struct RxFD {
  355. struct FDesc fd;
  356. struct BDesc bd[0]; /* variable length */
  357. };
  358. struct FrFD {
  359. struct FDesc fd;
  360. struct BDesc bd[RX_BUF_PAGES];
  361. };
  362. #if defined(__mips__)
  363. /* MIPS weirdness */
  364. extern unsigned long tc_readl(volatile __u32 *addr);
  365. extern void tc_writel(unsigned long data, volatile __u32 *addr);
  366. #else
  367. #define tc_readl readl
  368. #define tc_writel writel
  369. #endif
  370. dma_addr_t priv_dma_handle;
  371. /* Information that need to be kept for each board. */
  372. struct tc35815_local {
  373. struct net_device *next_module;
  374. /* statistics */
  375. struct net_device_stats stats;
  376. struct {
  377. int max_tx_qlen;
  378. int tx_ints;
  379. int rx_ints;
  380. } lstats;
  381. int tbusy;
  382. int option;
  383. #define TC35815_OPT_AUTO 0x00
  384. #define TC35815_OPT_10M 0x01
  385. #define TC35815_OPT_100M 0x02
  386. #define TC35815_OPT_FULLDUP 0x04
  387. int linkspeed; /* 10 or 100 */
  388. int fullduplex;
  389. /*
  390.  * Transmitting: Batch Mode.
  391.  * 1 BD in 1 TxFD.
  392.  * Receiving: Packing Mode.
  393.  * 1 circular FD for Free Buffer List.
  394.  * RX_BUG_PAGES BD in Free Buffer FD.
  395.  * One Free Buffer BD has PAGE_SIZE data buffer.
  396.  */
  397.         struct pci_dev *pdev;
  398. dma_addr_t fd_buf_dma_handle;
  399. void * fd_buf; /* for TxFD, TxFD, FrFD */
  400. struct TxFD *tfd_base;
  401. int tfd_start;
  402. int tfd_end;
  403. struct RxFD *rfd_base;
  404. struct RxFD *rfd_limit;
  405. struct RxFD *rfd_cur;
  406. struct FrFD *fbl_ptr;
  407. unsigned char fbl_curid;
  408. dma_addr_t data_buf_dma_handle[RX_BUF_PAGES];
  409. void * data_buf[RX_BUF_PAGES]; /* packing */
  410. };
  411. /* Index to functions, as function prototypes. */
  412. static int __init tc35815_probe1(struct pci_dev *pdev, unsigned int base_addr, unsigned int irq);
  413. static int tc35815_open(struct net_device *dev);
  414. static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev);
  415. static void     tc35815_tx_timeout(struct net_device *dev);
  416. static void tc35815_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  417. static void tc35815_rx(struct net_device *dev);
  418. static void tc35815_txdone(struct net_device *dev);
  419. static int tc35815_close(struct net_device *dev);
  420. static struct net_device_stats *tc35815_get_stats(struct net_device *dev);
  421. static void tc35815_set_multicast_list(struct net_device *dev);
  422. static void  tc35815_chip_reset(struct net_device *dev);
  423. static void  tc35815_chip_init(struct net_device *dev);
  424. static void  tc35815_phy_chip_init(struct net_device *dev);
  425. /* A list of all installed tc35815 devices. */
  426. static struct net_device *root_tc35815_dev = NULL;
  427. /*
  428.  * PCI device identifiers for "new style" Linux PCI Device Drivers
  429.  */
  430. static struct pci_device_id tc35815_pci_tbl[] __devinitdata = {
  431.     { PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815CF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
  432.     { 0, }
  433. };
  434. MODULE_DEVICE_TABLE (pci, tc35815_pci_tbl);
  435. int
  436. tc35815_probe(struct pci_dev *pdev,
  437. const struct pci_device_id *ent)
  438. {
  439. static int called = 0;
  440. int err = 0;
  441. int ret;
  442. if (called)
  443. return -ENODEV;
  444. called++;
  445. if (!pci_present())
  446. return -ENODEV;
  447. if (pdev) {
  448. unsigned long pci_memaddr;
  449. unsigned int pci_irq_line;
  450. printk(KERN_INFO "tc35815_probe: found device %#08x.%#08xn", ent->vendor, ent->device);
  451.         pci_memaddr = pci_resource_start (pdev, 1);
  452.         printk(KERN_INFO "    pci_memaddr=%#08lx  resource_flags=%#08lxn", pci_memaddr, pci_resource_flags (pdev, 0));
  453. if (!pci_memaddr) {
  454. printk(KERN_WARNING "no PCI MEM resources, abortingn");
  455. return -ENODEV;
  456. }
  457. pci_irq_line = pdev->irq;
  458. /* irq disabled. */
  459. if (pci_irq_line == 0) {
  460. printk(KERN_WARNING "no PCI irq, abortingn");
  461. return -ENODEV;
  462. }
  463. ret =  tc35815_probe1(pdev, pci_memaddr, pci_irq_line);
  464. if (!ret) {
  465. if ((err = pci_enable_device(pdev)) < 0) {
  466.     printk(KERN_ERR "tc35815_probe: failed to enable device -- err=%dn", err);
  467.     return err;
  468. }
  469. pci_set_master(pdev);
  470. }
  471. return ret;
  472. }
  473. return -ENODEV;
  474. }
  475. static int __init tc35815_probe1(struct pci_dev *pdev, unsigned int base_addr, unsigned int irq)
  476. {
  477. static unsigned version_printed = 0;
  478. int i;
  479. struct tc35815_local *lp;
  480. struct tc35815_regs *tr;
  481. struct net_device *dev;
  482. /* Allocate a new 'dev' if needed. */
  483. dev = init_etherdev(NULL, 0);
  484. if (dev == NULL)
  485. return -ENOMEM;
  486. if (tc35815_debug  &&  version_printed++ == 0)
  487. printk(KERN_DEBUG "%s", version);
  488. printk(KERN_INFO "%s: %s found at %#x, irq %dn",
  489.        dev->name, cardname, base_addr, irq);
  490. /* Fill in the 'dev' fields. */
  491. dev->irq = irq;
  492. dev->base_addr = (unsigned long)ioremap(base_addr,
  493. sizeof(struct tc35815_regs));
  494. tr = (struct tc35815_regs*)dev->base_addr;
  495. tc35815_chip_reset(dev);
  496. /* Retrieve and print the ethernet address. */
  497. while (tc_readl(&tr->PROM_Ctl) & PROM_Busy)
  498. cpu_relax();
  499. for (i = 0; i < 6; i += 2) {
  500. unsigned short data;
  501. tc_writel(PROM_Busy | PROM_Read | (i / 2 + 2), &tr->PROM_Ctl);
  502. while (tc_readl(&tr->PROM_Ctl) & PROM_Busy)
  503. cpu_relax();
  504. data = tc_readl(&tr->PROM_Data);
  505. dev->dev_addr[i] = data & 0xff;
  506. dev->dev_addr[i+1] = data >> 8;
  507. }
  508. for (i = 0; i < 6; i++)
  509. printk(" %2.2x", dev->dev_addr[i]);
  510. printk("n");
  511. /* Initialize the device structure. */
  512. if (dev->priv == NULL) {
  513. dev->priv = kmalloc(sizeof(struct tc35815_local), GFP_KERNEL);
  514. if (dev->priv == NULL)
  515. return -ENODEV;
  516. }
  517. lp = dev->priv;
  518. lp->pdev = pdev;
  519. memset(lp, 0, sizeof(struct tc35815_local));
  520. lp->next_module = root_tc35815_dev;
  521. root_tc35815_dev = dev;
  522. if (dev->mem_start > 0) {
  523. lp->option = dev->mem_start;
  524. if ((lp->option & TC35815_OPT_10M) &&
  525.     (lp->option & TC35815_OPT_100M)) {
  526. /* if both speed speficied, auto select. */
  527. lp->option &= ~(TC35815_OPT_10M | TC35815_OPT_100M);
  528. }
  529. }
  530. //XXX fixme
  531.         lp->option |= TC35815_OPT_10M;
  532. /* do auto negotiation */
  533. tc35815_phy_chip_init(dev);
  534. printk(KERN_INFO "%s: linkspeed %dMbps, %s Duplexn",
  535.        dev->name, lp->linkspeed, lp->fullduplex ? "Full" : "Half");
  536. dev->open = tc35815_open;
  537. dev->stop = tc35815_close;
  538. dev->tx_timeout         = tc35815_tx_timeout;
  539. dev->watchdog_timeo     = TX_TIMEOUT;
  540. dev->hard_start_xmit = tc35815_send_packet;
  541. dev->get_stats = tc35815_get_stats;
  542. dev->set_multicast_list = tc35815_set_multicast_list;
  543. #if 0 /* XXX called in init_etherdev */
  544. /* Fill in the fields of the device structure with ethernet values. */
  545. ether_setup(dev);
  546. #endif
  547. return 0;
  548. }
  549. static int
  550. tc35815_init_queues(struct net_device *dev)
  551. {
  552. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  553. int i;
  554. unsigned long fd_addr;
  555. if (!lp->fd_buf) {
  556. if (sizeof(struct FDesc) +
  557.     sizeof(struct BDesc) * RX_BUF_PAGES +
  558.     sizeof(struct FDesc) * RX_FD_NUM +
  559.     sizeof(struct TxFD) * TX_FD_NUM > PAGE_SIZE * FD_PAGE_NUM) {
  560. printk(KERN_WARNING "%s: Invalid Queue Size.n", dev->name);
  561. return -ENOMEM;
  562. }
  563. if ((lp->fd_buf = (void *)__get_free_pages(GFP_KERNEL, FD_PAGE_ORDER)) == 0)
  564. return -ENOMEM;
  565. for (i = 0; i < RX_BUF_PAGES; i++) {
  566. if ((lp->data_buf[i] = (void *)get_free_page(GFP_KERNEL)) == 0) {
  567. while (--i >= 0) {
  568. free_page((unsigned long)lp->data_buf[i]);
  569. lp->data_buf[i] = 0;
  570. }
  571. free_page((unsigned long)lp->fd_buf);
  572. lp->fd_buf = 0;
  573. return -ENOMEM;
  574. }
  575. #ifdef __mips__
  576. dma_cache_wback_inv((unsigned long)lp->data_buf[i], PAGE_SIZE * FD_PAGE_NUM);
  577. #endif
  578. }
  579. #ifdef __mips__
  580. dma_cache_wback_inv((unsigned long)lp->fd_buf, PAGE_SIZE * FD_PAGE_NUM);
  581. #endif
  582. } else {
  583. clear_page(lp->fd_buf);
  584. #ifdef __mips__
  585. dma_cache_wback_inv((unsigned long)lp->fd_buf, PAGE_SIZE * FD_PAGE_NUM);
  586. #endif
  587. }
  588. #ifdef __mips__
  589. fd_addr = (unsigned long)vtonocache(lp->fd_buf);  
  590. #else
  591. fd_addr = (unsigned long)lp->fd_buf;
  592. #endif
  593. /* Free Descriptors (for Receive) */
  594. lp->rfd_base = (struct RxFD *)fd_addr;
  595. fd_addr += sizeof(struct RxFD) * RX_FD_NUM;
  596. for (i = 0; i < RX_FD_NUM; i++) {
  597. lp->rfd_base[i].fd.FDCtl = cpu_to_le32(FD_CownsFD);
  598. }
  599. lp->rfd_cur = lp->rfd_base;
  600. lp->rfd_limit = (struct RxFD *)(fd_addr -
  601. sizeof(struct FDesc) -
  602. sizeof(struct BDesc) * 30);
  603. /* Transmit Descriptors */
  604. lp->tfd_base = (struct TxFD *)fd_addr;
  605. fd_addr += sizeof(struct TxFD) * TX_FD_NUM;
  606. for (i = 0; i < TX_FD_NUM; i++) {
  607. lp->tfd_base[i].fd.FDNext = cpu_to_le32(virt_to_bus(&lp->tfd_base[i+1]));
  608. lp->tfd_base[i].fd.FDSystem = cpu_to_le32(0);
  609. lp->tfd_base[i].fd.FDCtl = cpu_to_le32(0);
  610. }
  611. lp->tfd_base[TX_FD_NUM-1].fd.FDNext = cpu_to_le32(virt_to_bus(&lp->tfd_base[0]));
  612. lp->tfd_start = 0;
  613. lp->tfd_end = 0;
  614. /* Buffer List (for Receive) */
  615. lp->fbl_ptr = (struct FrFD *)fd_addr;
  616. lp->fbl_ptr->fd.FDNext = cpu_to_le32(virt_to_bus(lp->fbl_ptr));
  617. lp->fbl_ptr->fd.FDCtl = cpu_to_le32(RX_BUF_PAGES | FD_CownsFD);
  618. for (i = 0; i < RX_BUF_PAGES; i++) {
  619. lp->fbl_ptr->bd[i].BuffData = cpu_to_le32(virt_to_bus(lp->data_buf[i]));
  620. /* BDID is index of FrFD.bd[] */
  621. lp->fbl_ptr->bd[i].BDCtl =
  622. cpu_to_le32(BD_CownsBD | (i << BD_RxBDID_SHIFT) | PAGE_SIZE);
  623. }
  624. lp->fbl_curid = 0;
  625. return 0;
  626. }
  627. static void
  628. tc35815_clear_queues(struct net_device *dev)
  629. {
  630. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  631. int i;
  632. for (i = 0; i < TX_FD_NUM; i++) {
  633. struct sk_buff *skb = (struct sk_buff *)
  634. le32_to_cpu(lp->tfd_base[i].fd.FDSystem);
  635. if (skb)
  636. dev_kfree_skb_any(skb);
  637. lp->tfd_base[i].fd.FDSystem = cpu_to_le32(0);
  638. }
  639. tc35815_init_queues(dev);
  640. }
  641. static void
  642. tc35815_free_queues(struct net_device *dev)
  643. {
  644. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  645. int i;
  646. if (lp->tfd_base) {
  647. for (i = 0; i < TX_FD_NUM; i++) {
  648. struct sk_buff *skb = (struct sk_buff *)
  649. le32_to_cpu(lp->tfd_base[i].fd.FDSystem);
  650. if (skb)
  651. dev_kfree_skb_any(skb);
  652. lp->tfd_base[i].fd.FDSystem = cpu_to_le32(0);
  653. }
  654. }
  655. lp->rfd_base = NULL;
  656. lp->rfd_base = NULL;
  657. lp->rfd_limit = NULL;
  658. lp->rfd_cur = NULL;
  659. lp->fbl_ptr = NULL;
  660. for (i = 0; i < RX_BUF_PAGES; i++) {
  661. if (lp->data_buf[i])
  662. free_page((unsigned long)lp->data_buf[i]);
  663. lp->data_buf[i] = 0;
  664. }
  665. if (lp->fd_buf)
  666. __free_pages(lp->fd_buf, FD_PAGE_ORDER);
  667. lp->fd_buf = NULL;
  668. }
  669. static void
  670. dump_txfd(struct TxFD *fd)
  671. {
  672. printk("TxFD(%p): %08x %08x %08x %08xn", fd,
  673.        le32_to_cpu(fd->fd.FDNext),
  674.        le32_to_cpu(fd->fd.FDSystem),
  675.        le32_to_cpu(fd->fd.FDStat),
  676.        le32_to_cpu(fd->fd.FDCtl));
  677. printk("BD: ");
  678. printk(" %08x %08x",
  679.        le32_to_cpu(fd->bd.BuffData),
  680.        le32_to_cpu(fd->bd.BDCtl));
  681. printk("n");
  682. }
  683. static int
  684. dump_rxfd(struct RxFD *fd)
  685. {
  686. int i, bd_count = (le32_to_cpu(fd->fd.FDCtl) & FD_BDCnt_MASK) >> FD_BDCnt_SHIFT;
  687. if (bd_count > 8)
  688. bd_count = 8;
  689. printk("RxFD(%p): %08x %08x %08x %08xn", fd,
  690.        le32_to_cpu(fd->fd.FDNext),
  691.        le32_to_cpu(fd->fd.FDSystem),
  692.        le32_to_cpu(fd->fd.FDStat),
  693.        le32_to_cpu(fd->fd.FDCtl));
  694. if (le32_to_cpu(fd->fd.FDCtl) & FD_CownsFD)
  695.     return 0;
  696. printk("BD: ");
  697. for (i = 0; i < bd_count; i++)
  698. printk(" %08x %08x",
  699.        le32_to_cpu(fd->bd[i].BuffData),
  700.        le32_to_cpu(fd->bd[i].BDCtl));
  701. printk("n");
  702. return bd_count;
  703. }
  704. static void
  705. dump_frfd(struct FrFD *fd)
  706. {
  707. int i;
  708. printk("FrFD(%p): %08x %08x %08x %08xn", fd,
  709.        le32_to_cpu(fd->fd.FDNext),
  710.        le32_to_cpu(fd->fd.FDSystem),
  711.        le32_to_cpu(fd->fd.FDStat),
  712.        le32_to_cpu(fd->fd.FDCtl));
  713. printk("BD: ");
  714. for (i = 0; i < RX_BUF_PAGES; i++)
  715. printk(" %08x %08x",
  716.        le32_to_cpu(fd->bd[i].BuffData),
  717.        le32_to_cpu(fd->bd[i].BDCtl));
  718. printk("n");
  719. }
  720. static void
  721. panic_queues(struct net_device *dev)
  722. {
  723. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  724. int i;
  725. printk("TxFD base %p, start %d, end %dn",
  726.        lp->tfd_base, lp->tfd_start, lp->tfd_end);
  727. printk("RxFD base %p limit %p cur %pn",
  728.        lp->rfd_base, lp->rfd_limit, lp->rfd_cur);
  729. printk("FrFD %pn", lp->fbl_ptr);
  730. for (i = 0; i < TX_FD_NUM; i++)
  731. dump_txfd(&lp->tfd_base[i]);
  732. for (i = 0; i < RX_FD_NUM; i++) {
  733. int bd_count = dump_rxfd(&lp->rfd_base[i]);
  734. i += (bd_count + 1) / 2; /* skip BDs */
  735. }
  736. dump_frfd(lp->fbl_ptr);
  737. panic("%s: Illegal queue state.", dev->name);
  738. }
  739. #if 0
  740. static void print_buf(char *add, int length)
  741. {
  742. int i;
  743. int len = length;
  744. printk("print_buf(%08x)(%x)n", (unsigned int) add,length);
  745. if (len > 100)
  746. len = 100;
  747. for (i = 0; i < len; i++) {
  748. printk(" %2.2X", (unsigned char) add[i]);
  749. if (!(i % 16))
  750. printk("n");
  751. }
  752. printk("n");
  753. }
  754. #endif
  755. static void print_eth(char *add)
  756. {
  757. int i;
  758. printk("print_eth(%08x)n", (unsigned int) add);
  759. for (i = 0; i < 6; i++)
  760. printk(" %2.2X", (unsigned char) add[i + 6]);
  761. printk(" =>");
  762. for (i = 0; i < 6; i++)
  763. printk(" %2.2X", (unsigned char) add[i]);
  764. printk(" : %2.2X%2.2Xn", (unsigned char) add[12], (unsigned char) add[13]);
  765. }
  766. /*
  767.  * Open/initialize the board. This is called (in the current kernel)
  768.  * sometime after booting when the 'ifconfig' program is run.
  769.  *
  770.  * This routine should set everything up anew at each open, even
  771.  * registers that "should" only need to be set once at boot, so that
  772.  * there is non-reboot way to recover if something goes wrong.
  773.  */
  774. static int
  775. tc35815_open(struct net_device *dev)
  776. {
  777. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  778. /*
  779.  * This is used if the interrupt line can turned off (shared).
  780.  * See 3c503.c for an example of selecting the IRQ at config-time.
  781.  */
  782. if (dev->irq == 0  ||
  783.     request_irq(dev->irq, &tc35815_interrupt, SA_SHIRQ, cardname, dev)) {
  784. return -EAGAIN;
  785. }
  786. tc35815_chip_reset(dev);
  787. if (tc35815_init_queues(dev) != 0) {
  788. free_irq(dev->irq, dev);
  789. return -EAGAIN;
  790. }
  791. /* Reset the hardware here. Don't forget to set the station address. */
  792. tc35815_chip_init(dev);
  793. lp->tbusy = 0;
  794. netif_start_queue(dev);
  795. MOD_INC_USE_COUNT;
  796. return 0;
  797. }
  798. static void tc35815_tx_timeout(struct net_device *dev)
  799. {
  800. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  801. struct tc35815_regs *tr = (struct tc35815_regs *)dev->base_addr;
  802. int flags;
  803. save_flags(flags);
  804. cli();
  805. printk(KERN_WARNING "%s: transmit timed out, status %#xn",
  806.        dev->name, tc_readl(&tr->Tx_Stat));
  807. /* Try to restart the adaptor. */
  808. tc35815_chip_reset(dev);
  809. tc35815_clear_queues(dev);
  810. tc35815_chip_init(dev);
  811. lp->tbusy=0;
  812. restore_flags(flags);
  813. dev->trans_start = jiffies;
  814. netif_wake_queue(dev);
  815. }
  816. static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev)
  817. {
  818. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  819. struct tc35815_regs *tr = (struct tc35815_regs *)dev->base_addr;
  820. if (netif_queue_stopped(dev)) {
  821. /*
  822.  * If we get here, some higher level has decided we are broken.
  823.  * There should really be a "kick me" function call instead.
  824.  */
  825. int tickssofar = jiffies - dev->trans_start;
  826. if (tickssofar < 5)
  827. return 1;
  828. printk(KERN_WARNING "%s: transmit timed out, status %#xn",
  829.        dev->name, tc_readl(&tr->Tx_Stat));
  830. /* Try to restart the adaptor. */
  831. tc35815_chip_reset(dev);
  832. tc35815_clear_queues(dev);
  833. tc35815_chip_init(dev);
  834. lp->tbusy=0;
  835. dev->trans_start = jiffies;
  836. netif_wake_queue(dev);
  837. }
  838. /*
  839.  * Block a timer-based transmit from overlapping. This could better be
  840.  * done with atomic_swap(1, lp->tbusy), but set_bit() works as well.
  841.  */
  842. if (test_and_set_bit(0, (void*)&lp->tbusy) != 0) {
  843. printk(KERN_WARNING "%s: Transmitter access conflict.n", dev->name);
  844. dev_kfree_skb_any(skb);
  845. } else {
  846. short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
  847. unsigned char *buf = skb->data;
  848. struct TxFD *txfd = &lp->tfd_base[lp->tfd_start];
  849. int flags;
  850. lp->stats.tx_bytes += skb->len;
  851. #ifdef __mips__
  852. dma_cache_wback_inv((unsigned long)buf, length);
  853. #endif
  854. save_flags(flags);
  855. cli();
  856. /* failsafe... */
  857. if (lp->tfd_start != lp->tfd_end)
  858. tc35815_txdone(dev);
  859. txfd->bd.BuffData = cpu_to_le32(virt_to_bus(buf));
  860. txfd->bd.BDCtl = cpu_to_le32(length);
  861. txfd->fd.FDSystem = cpu_to_le32((__u32)skb);
  862. txfd->fd.FDCtl = cpu_to_le32(FD_CownsFD | (1 << FD_BDCnt_SHIFT));
  863. if (lp->tfd_start == lp->tfd_end) {
  864. /* Start DMA Transmitter. */
  865. txfd->fd.FDNext |= cpu_to_le32(FD_Next_EOL);
  866. #ifdef GATHER_TXINT
  867. txfd->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx);
  868. #endif
  869. if (tc35815_debug > 2) {
  870. printk("%s: starting TxFD.n", dev->name);
  871. dump_txfd(txfd);
  872. if (tc35815_debug > 3)
  873. print_eth(buf);
  874. }
  875. tc_writel(virt_to_bus(txfd), &tr->TxFrmPtr);
  876. } else {
  877. txfd->fd.FDNext &= cpu_to_le32(~FD_Next_EOL);
  878. if (tc35815_debug > 2) {
  879. printk("%s: queueing TxFD.n", dev->name);
  880. dump_txfd(txfd);
  881. if (tc35815_debug > 3)
  882. print_eth(buf);
  883. }
  884. }
  885. lp->tfd_start = (lp->tfd_start + 1) % TX_FD_NUM;
  886. dev->trans_start = jiffies;
  887. if ((lp->tfd_start + 1) % TX_FD_NUM != lp->tfd_end) {
  888. /* we can send another packet */
  889. lp->tbusy = 0;
  890. netif_start_queue(dev);
  891. } else {
  892. netif_stop_queue(dev);
  893. if (tc35815_debug > 1)
  894. printk(KERN_WARNING "%s: TxFD Exhausted.n", dev->name);
  895. }
  896. restore_flags(flags);
  897. }
  898. return 0;
  899. }
  900. #define FATAL_ERROR_INT 
  901. (Int_IntPCI | Int_DmParErr | Int_IntNRAbt)
  902. static void tc35815_fatal_error_interrupt(struct net_device *dev, int status)
  903. {
  904. static int count;
  905. printk(KERN_WARNING "%s: Fatal Error Intterrupt (%#x):",
  906.        dev->name, status);
  907. if (status & Int_IntPCI)
  908. printk(" IntPCI");
  909. if (status & Int_DmParErr)
  910. printk(" DmParErr");
  911. if (status & Int_IntNRAbt)
  912. printk(" IntNRAbt");
  913. printk("n");
  914. if (count++ > 100)
  915. panic("%s: Too many fatal errors.", dev->name);
  916. printk(KERN_WARNING "%s: Resetting %s...n", dev->name, cardname);
  917. /* Try to restart the adaptor. */
  918. tc35815_chip_reset(dev);
  919. tc35815_clear_queues(dev);
  920. tc35815_chip_init(dev);
  921. }
  922. /*
  923.  * The typical workload of the driver:
  924.  *   Handle the network interface interrupts.
  925.  */
  926. static void tc35815_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  927. {
  928. struct net_device *dev = dev_id;
  929. struct tc35815_regs *tr;
  930. struct tc35815_local *lp;
  931. int status, boguscount = 0;
  932. if (dev == NULL) {
  933. printk(KERN_WARNING "%s: irq %d for unknown device.n", cardname, irq);
  934. return;
  935. }
  936. tr = (struct tc35815_regs*)dev->base_addr;
  937. lp = (struct tc35815_local *)dev->priv;
  938. do {
  939. status = tc_readl(&tr->Int_Src);
  940. if (status == 0)
  941. break;
  942. tc_writel(status, &tr->Int_Src); /* write to clear */
  943. /* Fatal errors... */
  944. if (status & FATAL_ERROR_INT) {
  945. tc35815_fatal_error_interrupt(dev, status);
  946. break;
  947. }
  948. /* recoverable errors */
  949. if (status & Int_IntFDAEx) {
  950. /* disable FDAEx int. (until we make rooms...) */
  951. tc_writel(tc_readl(&tr->Int_En) & ~Int_FDAExEn, &tr->Int_En);
  952. printk(KERN_WARNING
  953.        "%s: Free Descriptor Area Exhausted (%#x).n",
  954.        dev->name, status);
  955. lp->stats.rx_dropped++;
  956. }
  957. if (status & Int_IntBLEx) {
  958. /* disable BLEx int. (until we make rooms...) */
  959. tc_writel(tc_readl(&tr->Int_En) & ~Int_BLExEn, &tr->Int_En);
  960. printk(KERN_WARNING
  961.        "%s: Buffer List Exhausted (%#x).n",
  962.        dev->name, status);
  963. lp->stats.rx_dropped++;
  964. }
  965. if (status & Int_IntExBD) {
  966. printk(KERN_WARNING
  967.        "%s: Excessive Buffer Descriptiors (%#x).n",
  968.        dev->name, status);
  969. lp->stats.rx_length_errors++;
  970. }
  971. /* normal notification */
  972. if (status & Int_IntMacRx) {
  973. /* Got a packet(s). */
  974. lp->lstats.rx_ints++;
  975. tc35815_rx(dev);
  976. }
  977. if (status & Int_IntMacTx) {
  978. lp->lstats.tx_ints++;
  979. tc35815_txdone(dev);
  980. }
  981. } while (++boguscount < 20) ;
  982. return;
  983. }
  984. /* We have a good packet(s), get it/them out of the buffers. */
  985. static void
  986. tc35815_rx(struct net_device *dev)
  987. {
  988. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  989. struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
  990. unsigned int fdctl;
  991. int i;
  992. int buf_free_count = 0;
  993. int fd_free_count = 0;
  994. while (!((fdctl = le32_to_cpu(lp->rfd_cur->fd.FDCtl)) & FD_CownsFD)) {
  995. int status = le32_to_cpu(lp->rfd_cur->fd.FDStat);
  996. int pkt_len = fdctl & FD_FDLength_MASK;
  997. struct RxFD *next_rfd;
  998. int bd_count = (fdctl & FD_BDCnt_MASK) >> FD_BDCnt_SHIFT;
  999. if (tc35815_debug > 2)
  1000. dump_rxfd(lp->rfd_cur);
  1001. if (status & Rx_Good) {
  1002. /* Malloc up new buffer. */
  1003. struct sk_buff *skb;
  1004. unsigned char *data;
  1005. int cur_bd, offset;
  1006. lp->stats.rx_bytes += pkt_len;
  1007. skb = dev_alloc_skb(pkt_len + 2); /* +2: for reserve */
  1008. if (skb == NULL) {
  1009. printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.n",
  1010.        dev->name);
  1011. lp->stats.rx_dropped++;
  1012. break;
  1013. }
  1014. skb_reserve(skb, 2);   /* 16 bit alignment */
  1015. skb->dev = dev;
  1016. data = skb_put(skb, pkt_len);
  1017. /* copy from receive buffer */
  1018. cur_bd = 0;
  1019. offset = 0;
  1020. while (offset < pkt_len && cur_bd < bd_count) {
  1021. int len = le32_to_cpu(lp->rfd_cur->bd[cur_bd].BDCtl) &
  1022. BD_BuffLength_MASK;
  1023. void *rxbuf =
  1024. bus_to_virt(le32_to_cpu(lp->rfd_cur->bd[cur_bd].BuffData));
  1025. #ifdef __mips__
  1026. dma_cache_inv((unsigned long)rxbuf, len);
  1027. #endif
  1028. memcpy(data + offset, rxbuf, len);
  1029. offset += len;
  1030. cur_bd++;
  1031. }
  1032. // print_buf(data,pkt_len);
  1033. if (tc35815_debug > 3)
  1034. print_eth(data);
  1035. skb->protocol = eth_type_trans(skb, dev);
  1036. netif_rx(skb);
  1037. lp->stats.rx_packets++;
  1038. } else {
  1039. lp->stats.rx_errors++;
  1040. /* WORKAROUND: LongErr and CRCErr means Overflow. */
  1041. if ((status & Rx_LongErr) && (status & Rx_CRCErr)) {
  1042. status &= ~(Rx_LongErr|Rx_CRCErr);
  1043. status |= Rx_Over;
  1044. }
  1045. if (status & Rx_LongErr) lp->stats.rx_length_errors++;
  1046. if (status & Rx_Over) lp->stats.rx_fifo_errors++;
  1047. if (status & Rx_CRCErr) lp->stats.rx_crc_errors++;
  1048. if (status & Rx_Align) lp->stats.rx_frame_errors++;
  1049. }
  1050. if (bd_count > 0) {
  1051. /* put Free Buffer back to controller */
  1052. int bdctl = le32_to_cpu(lp->rfd_cur->bd[bd_count - 1].BDCtl);
  1053. unsigned char id =
  1054. (bdctl & BD_RxBDID_MASK) >> BD_RxBDID_SHIFT;
  1055. if (id >= RX_BUF_PAGES) {
  1056. printk("%s: invalid BDID.n", dev->name);
  1057. panic_queues(dev);
  1058. }
  1059. /* free old buffers */
  1060. while (lp->fbl_curid != id) {
  1061. bdctl = le32_to_cpu(lp->fbl_ptr->bd[lp->fbl_curid].BDCtl);
  1062. if (bdctl & BD_CownsBD) {
  1063. printk("%s: Freeing invalid BD.n",
  1064.        dev->name);
  1065. panic_queues(dev);
  1066. }
  1067. /* pass BD to controler */
  1068. /* Note: BDLength was modified by chip. */
  1069. lp->fbl_ptr->bd[lp->fbl_curid].BDCtl =
  1070. cpu_to_le32(BD_CownsBD |
  1071.     (lp->fbl_curid << BD_RxBDID_SHIFT) |
  1072.     PAGE_SIZE);
  1073. lp->fbl_curid =
  1074. (lp->fbl_curid + 1) % RX_BUF_PAGES;
  1075. if (tc35815_debug > 2) {
  1076. printk("%s: Entering new FBD %dn",
  1077.        dev->name, lp->fbl_curid);
  1078. dump_frfd(lp->fbl_ptr);
  1079. }
  1080. buf_free_count++;
  1081. }
  1082. }
  1083. /* put RxFD back to controller */
  1084. next_rfd = bus_to_virt(le32_to_cpu(lp->rfd_cur->fd.FDNext));
  1085. #ifdef __mips__
  1086. next_rfd = (struct RxFD *)vtonocache(next_rfd);
  1087. #endif
  1088. if (next_rfd < lp->rfd_base || next_rfd > lp->rfd_limit) {
  1089. printk("%s: RxFD FDNext invalid.n", dev->name);
  1090. panic_queues(dev);
  1091. }
  1092. for (i = 0; i < (bd_count + 1) / 2 + 1; i++) {
  1093. /* pass FD to controler */
  1094. lp->rfd_cur->fd.FDNext = cpu_to_le32(0xdeaddead); /* for debug */
  1095. lp->rfd_cur->fd.FDCtl = cpu_to_le32(FD_CownsFD);
  1096. lp->rfd_cur++;
  1097. fd_free_count++;
  1098. }
  1099. lp->rfd_cur = next_rfd;
  1100. }
  1101. /* re-enable BL/FDA Exhaust interupts. */
  1102. if (fd_free_count) {
  1103. tc_writel(tc_readl(&tr->Int_En) | Int_FDAExEn, &tr->Int_En);
  1104. if (buf_free_count)
  1105. tc_writel(tc_readl(&tr->Int_En) | Int_BLExEn, &tr->Int_En);
  1106. }
  1107. }
  1108. #ifdef NO_CHECK_CARRIER
  1109. #define TX_STA_ERR (Tx_ExColl|Tx_Under|Tx_Defer|Tx_LateColl|Tx_TxPar|Tx_SQErr)
  1110. #else
  1111. #define TX_STA_ERR (Tx_ExColl|Tx_Under|Tx_Defer|Tx_NCarr|Tx_LateColl|Tx_TxPar|Tx_SQErr)
  1112. #endif
  1113. static void
  1114. tc35815_check_tx_stat(struct net_device *dev, int status)
  1115. {
  1116. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  1117. const char *msg = NULL;
  1118. /* count collisions */
  1119. if (status & Tx_ExColl)
  1120. lp->stats.collisions += 16;
  1121. if (status & Tx_TxColl_MASK)
  1122. lp->stats.collisions += status & Tx_TxColl_MASK;
  1123. /* WORKAROUND: ignore LostCrS in full duplex operation */
  1124. if (lp->fullduplex)
  1125. status &= ~Tx_NCarr;
  1126. if (!(status & TX_STA_ERR)) {
  1127. /* no error. */
  1128. lp->stats.tx_packets++;
  1129. return;
  1130. }
  1131. lp->stats.tx_errors++;
  1132. if (status & Tx_ExColl) {
  1133. lp->stats.tx_aborted_errors++;
  1134. msg = "Excessive Collision.";
  1135. }
  1136. if (status & Tx_Under) {
  1137. lp->stats.tx_fifo_errors++;
  1138. msg = "Tx FIFO Underrun.";
  1139. }
  1140. if (status & Tx_Defer) {
  1141. lp->stats.tx_fifo_errors++;
  1142. msg = "Excessive Deferral.";
  1143. }
  1144. #ifndef NO_CHECK_CARRIER
  1145. if (status & Tx_NCarr) {
  1146. lp->stats.tx_carrier_errors++;
  1147. msg = "Lost Carrier Sense.";
  1148. }
  1149. #endif
  1150. if (status & Tx_LateColl) {
  1151. lp->stats.tx_aborted_errors++;
  1152. msg = "Late Collision.";
  1153. }
  1154. if (status & Tx_TxPar) {
  1155. lp->stats.tx_fifo_errors++;
  1156. msg = "Transmit Parity Error.";
  1157. }
  1158. if (status & Tx_SQErr) {
  1159. lp->stats.tx_heartbeat_errors++;
  1160. msg = "Signal Quality Error.";
  1161. }
  1162. if (msg)
  1163. printk(KERN_WARNING "%s: %s (%#x)n", dev->name, msg, status);
  1164. }
  1165. static void
  1166. tc35815_txdone(struct net_device *dev)
  1167. {
  1168. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  1169. struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
  1170. struct TxFD *txfd;
  1171. unsigned int fdctl;
  1172. int num_done = 0;
  1173. txfd = &lp->tfd_base[lp->tfd_end];
  1174. while (lp->tfd_start != lp->tfd_end &&
  1175.        !((fdctl = le32_to_cpu(txfd->fd.FDCtl)) & FD_CownsFD)) {
  1176. int status = le32_to_cpu(txfd->fd.FDStat);
  1177. struct sk_buff *skb;
  1178. unsigned long fdnext = le32_to_cpu(txfd->fd.FDNext);
  1179. if (tc35815_debug > 2) {
  1180. printk("%s: complete TxFD.n", dev->name);
  1181. dump_txfd(txfd);
  1182. }
  1183. tc35815_check_tx_stat(dev, status);
  1184. skb = (struct sk_buff *)le32_to_cpu(txfd->fd.FDSystem);
  1185. if (skb) {
  1186. dev_kfree_skb_any(skb);
  1187. }
  1188. txfd->fd.FDSystem = cpu_to_le32(0);
  1189. num_done++;
  1190. lp->tfd_end = (lp->tfd_end + 1) % TX_FD_NUM;
  1191. txfd = &lp->tfd_base[lp->tfd_end];
  1192. if ((fdnext & ~FD_Next_EOL) != virt_to_bus(txfd)) {
  1193. printk("%s: TxFD FDNext invalid.n", dev->name);
  1194. panic_queues(dev);
  1195. }
  1196. if (fdnext & FD_Next_EOL) {
  1197. /* DMA Transmitter has been stopping... */
  1198. if (lp->tfd_end != lp->tfd_start) {
  1199. int head = (lp->tfd_start + TX_FD_NUM - 1) % TX_FD_NUM;
  1200. struct TxFD* txhead = &lp->tfd_base[head];
  1201. int qlen = (lp->tfd_start + TX_FD_NUM
  1202.     - lp->tfd_end) % TX_FD_NUM;
  1203. if (!(le32_to_cpu(txfd->fd.FDCtl) & FD_CownsFD)) {
  1204. printk("%s: TxFD FDCtl invalid.n", dev->name);
  1205. panic_queues(dev);
  1206. }
  1207. /* log max queue length */
  1208. if (lp->lstats.max_tx_qlen < qlen)
  1209. lp->lstats.max_tx_qlen = qlen;
  1210. /* start DMA Transmitter again */
  1211. txhead->fd.FDNext |= cpu_to_le32(FD_Next_EOL);
  1212. #ifdef GATHER_TXINT
  1213. txhead->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx);
  1214. #endif
  1215. if (tc35815_debug > 2) {
  1216. printk("%s: start TxFD on queue.n",
  1217.        dev->name);
  1218. dump_txfd(txfd);
  1219. }
  1220. tc_writel(virt_to_bus(txfd), &tr->TxFrmPtr);
  1221. }
  1222. break;
  1223. }
  1224. }
  1225. if (num_done > 0 && lp->tbusy) {
  1226. lp->tbusy = 0;
  1227. netif_start_queue(dev);
  1228. }
  1229. }
  1230. /* The inverse routine to tc35815_open(). */
  1231. static int
  1232. tc35815_close(struct net_device *dev)
  1233. {
  1234. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  1235. lp->tbusy = 1;
  1236. netif_stop_queue(dev);
  1237. /* Flush the Tx and disable Rx here. */
  1238. tc35815_chip_reset(dev);
  1239. free_irq(dev->irq, dev);
  1240. tc35815_free_queues(dev);
  1241. MOD_DEC_USE_COUNT;
  1242. return 0;
  1243. }
  1244. /*
  1245.  * Get the current statistics.
  1246.  * This may be called with the card open or closed.
  1247.  */
  1248. static struct net_device_stats *tc35815_get_stats(struct net_device *dev)
  1249. {
  1250. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  1251. struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
  1252. unsigned long flags;
  1253. if (netif_running(dev)) {
  1254. save_flags(flags);
  1255. cli();
  1256. /* Update the statistics from the device registers. */
  1257. lp->stats.rx_missed_errors = tc_readl(&tr->Miss_Cnt);
  1258. restore_flags(flags);
  1259. }
  1260. return &lp->stats;
  1261. }
  1262. static void tc35815_set_cam_entry(struct tc35815_regs *tr, int index, unsigned char *addr)
  1263. {
  1264. int cam_index = index * 6;
  1265. unsigned long cam_data;
  1266. unsigned long saved_addr;
  1267. saved_addr = tc_readl(&tr->CAM_Adr);
  1268. if (tc35815_debug > 1) {
  1269. int i;
  1270. printk(KERN_DEBUG "%s: CAM %d:", cardname, index);
  1271. for (i = 0; i < 6; i++)
  1272. printk(" %02x", addr[i]);
  1273. printk("n");
  1274. }
  1275. if (index & 1) {
  1276. /* read modify write */
  1277. tc_writel(cam_index - 2, &tr->CAM_Adr);
  1278. cam_data = tc_readl(&tr->CAM_Data) & 0xffff0000;
  1279. cam_data |= addr[0] << 8 | addr[1];
  1280. tc_writel(cam_data, &tr->CAM_Data);
  1281. /* write whole word */
  1282. tc_writel(cam_index + 2, &tr->CAM_Adr);
  1283. cam_data = (addr[2] << 24) | (addr[3] << 16) | (addr[4] << 8) | addr[5];
  1284. tc_writel(cam_data, &tr->CAM_Data);
  1285. } else {
  1286. /* write whole word */
  1287. tc_writel(cam_index, &tr->CAM_Adr);
  1288. cam_data = (addr[0] << 24) | (addr[1] << 16) | (addr[2] << 8) | addr[3];
  1289. tc_writel(cam_data, &tr->CAM_Data);
  1290. /* read modify write */
  1291. tc_writel(cam_index + 4, &tr->CAM_Adr);
  1292. cam_data = tc_readl(&tr->CAM_Data) & 0x0000ffff;
  1293. cam_data |= addr[4] << 24 | (addr[5] << 16);
  1294. tc_writel(cam_data, &tr->CAM_Data);
  1295. }
  1296. if (tc35815_debug > 2) {
  1297. int i;
  1298. for (i = cam_index / 4; i < cam_index / 4 + 2; i++) {
  1299. tc_writel(i * 4, &tr->CAM_Adr);
  1300. printk("CAM 0x%x: %08x",
  1301.        i * 4, tc_readl(&tr->CAM_Data));
  1302. }
  1303. }
  1304. tc_writel(saved_addr, &tr->CAM_Adr);
  1305. }
  1306. /*
  1307.  * Set or clear the multicast filter for this adaptor.
  1308.  * num_addrs == -1 Promiscuous mode, receive all packets
  1309.  * num_addrs == 0 Normal mode, clear multicast list
  1310.  * num_addrs > 0 Multicast mode, receive normal and MC packets,
  1311.  * and do best-effort filtering.
  1312.  */
  1313. static void
  1314. tc35815_set_multicast_list(struct net_device *dev)
  1315. {
  1316. struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
  1317. if (dev->flags&IFF_PROMISC)
  1318. {
  1319. /* Enable promiscuous mode */
  1320. tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc | CAM_StationAcc, &tr->CAM_Ctl);
  1321. }
  1322. else if((dev->flags&IFF_ALLMULTI) || dev->mc_count > CAM_ENTRY_MAX - 3)
  1323. {
  1324. /* CAM 0, 1, 20 are reserved. */
  1325. /* Disable promiscuous mode, use normal mode. */
  1326. tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc, &tr->CAM_Ctl);
  1327. }
  1328. else if(dev->mc_count)
  1329. {
  1330. struct dev_mc_list* cur_addr = dev->mc_list;
  1331. int i;
  1332. int ena_bits = CAM_Ena_Bit(CAM_ENTRY_SOURCE);
  1333. tc_writel(0, &tr->CAM_Ctl);
  1334. /* Walk the address list, and load the filter */
  1335. for (i = 0; i < dev->mc_count; i++, cur_addr = cur_addr->next) {
  1336. if (!cur_addr)
  1337. break;
  1338. /* entry 0,1 is reserved. */
  1339. tc35815_set_cam_entry(tr, i + 2, cur_addr->dmi_addr);
  1340. ena_bits |= CAM_Ena_Bit(i + 2);
  1341. }
  1342. tc_writel(ena_bits, &tr->CAM_Ena);
  1343. tc_writel(CAM_CompEn | CAM_BroadAcc, &tr->CAM_Ctl);
  1344. }
  1345. else {
  1346. tc_writel(CAM_Ena_Bit(CAM_ENTRY_SOURCE), &tr->CAM_Ena);
  1347. tc_writel(CAM_CompEn | CAM_BroadAcc, &tr->CAM_Ctl);
  1348. }
  1349. }
  1350. static unsigned long tc_phy_read(struct tc35815_regs *tr, int phy, int phy_reg)
  1351. {
  1352. unsigned long data;
  1353. int flags;
  1354. save_flags(flags);
  1355. cli();
  1356. tc_writel(MD_CA_Busy | (phy << 5) | phy_reg, &tr->MD_CA);
  1357. while (tc_readl(&tr->MD_CA) & MD_CA_Busy)
  1358. cpu_relax();
  1359. data = tc_readl(&tr->MD_Data);
  1360. restore_flags(flags);
  1361. return data;
  1362. }
  1363. static void tc_phy_write(unsigned long d, struct tc35815_regs *tr, int phy, int phy_reg)
  1364. {
  1365. int flags;
  1366. save_flags(flags);
  1367. cli();
  1368. tc_writel(d, &tr->MD_Data);
  1369. tc_writel(MD_CA_Busy | MD_CA_Wr | (phy << 5) | phy_reg, &tr->MD_CA);
  1370. while (tc_readl(&tr->MD_CA) & MD_CA_Busy)
  1371. cpu_relax();
  1372. restore_flags(flags);
  1373. }
  1374. static void tc35815_phy_chip_init(struct net_device *dev)
  1375. {
  1376. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  1377. struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
  1378. static int first = 1;
  1379. unsigned short ctl;
  1380. if (first) {
  1381. unsigned short id0, id1;
  1382. int count;
  1383. first = 0;
  1384. /* first data written to the PHY will be an ID number */
  1385. tc_phy_write(0, tr, 0, MII_CONTROL); /* ID:0 */
  1386. #if 0
  1387. tc_phy_write(MIICNTL_RESET, tr, 0, MII_CONTROL);
  1388. printk(KERN_INFO "%s: Resetting PHY...", dev->name);
  1389. while (tc_phy_read(tr, 0, MII_CONTROL) & MIICNTL_RESET)
  1390. ;
  1391. printk("n");
  1392. tc_phy_write(MIICNTL_AUTO|MIICNTL_SPEED|MIICNTL_FDX, tr, 0,
  1393.      MII_CONTROL);
  1394. #endif
  1395. id0 = tc_phy_read(tr, 0, MII_PHY_ID0);
  1396. id1 = tc_phy_read(tr, 0, MII_PHY_ID1);
  1397. printk(KERN_DEBUG "%s: PHY ID %04x %04xn", dev->name,
  1398.        id0, id1);
  1399. if (lp->option & TC35815_OPT_10M) {
  1400. lp->linkspeed = 10;
  1401. lp->fullduplex = (lp->option & TC35815_OPT_FULLDUP) != 0;
  1402. } else if (lp->option & TC35815_OPT_100M) {
  1403. lp->linkspeed = 100;
  1404. lp->fullduplex = (lp->option & TC35815_OPT_FULLDUP) != 0;
  1405. } else {
  1406. /* auto negotiation */
  1407. unsigned long neg_result;
  1408. tc_phy_write(MIICNTL_AUTO | MIICNTL_RST_AUTO, tr, 0, MII_CONTROL);
  1409. printk(KERN_INFO "%s: Auto Negotiation...", dev->name);
  1410. count = 0;
  1411. while (!(tc_phy_read(tr, 0, MII_STATUS) & MIISTAT_AUTO_DONE)) {
  1412. if (count++ > 5000) {
  1413. printk(" failed. Assume 10Mbpsn");
  1414. lp->linkspeed = 10;
  1415. lp->fullduplex = 0;
  1416. goto done;
  1417. }
  1418. if (count % 512 == 0)
  1419. printk(".");
  1420. mdelay(1);
  1421. }
  1422. printk(" done.n");
  1423. neg_result = tc_phy_read(tr, 0, MII_ANLPAR);
  1424. if (neg_result & (MII_AN_TX_FDX | MII_AN_TX_HDX))
  1425. lp->linkspeed = 100;
  1426. else
  1427. lp->linkspeed = 10;
  1428. if (neg_result & (MII_AN_TX_FDX | MII_AN_10_FDX))
  1429. lp->fullduplex = 1;
  1430. else
  1431. lp->fullduplex = 0;
  1432. done:
  1433. ;
  1434. }
  1435. }
  1436. ctl = 0;
  1437. if (lp->linkspeed == 100)
  1438. ctl |= MIICNTL_SPEED;
  1439. if (lp->fullduplex)
  1440. ctl |= MIICNTL_FDX;
  1441. tc_phy_write(ctl, tr, 0, MII_CONTROL);
  1442. if (lp->fullduplex) {
  1443. tc_writel(tc_readl(&tr->MAC_Ctl) | MAC_FullDup, &tr->MAC_Ctl);
  1444. }
  1445. }
  1446. static void tc35815_chip_reset(struct net_device *dev)
  1447. {
  1448. struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
  1449. /* reset the controller */
  1450. tc_writel(MAC_Reset, &tr->MAC_Ctl);
  1451. while (tc_readl(&tr->MAC_Ctl) & MAC_Reset)
  1452. cpu_relax();
  1453. tc_writel(0, &tr->MAC_Ctl);
  1454. /* initialize registers to default value */
  1455. tc_writel(0, &tr->DMA_Ctl);
  1456. tc_writel(0, &tr->TxThrsh);
  1457. tc_writel(0, &tr->TxPollCtr);
  1458. tc_writel(0, &tr->RxFragSize);
  1459. tc_writel(0, &tr->Int_En);
  1460. tc_writel(0, &tr->FDA_Bas);
  1461. tc_writel(0, &tr->FDA_Lim);
  1462. tc_writel(0xffffffff, &tr->Int_Src); /* Write 1 to clear */
  1463. tc_writel(0, &tr->CAM_Ctl);
  1464. tc_writel(0, &tr->Tx_Ctl);
  1465. tc_writel(0, &tr->Rx_Ctl);
  1466. tc_writel(0, &tr->CAM_Ena);
  1467. (void)tc_readl(&tr->Miss_Cnt); /* Read to clear */
  1468. }
  1469. static void tc35815_chip_init(struct net_device *dev)
  1470. {
  1471. struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
  1472. struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
  1473. int flags;
  1474. unsigned long txctl = TX_CTL_CMD;
  1475. tc35815_phy_chip_init(dev);
  1476. /* load station address to CAM */
  1477. tc35815_set_cam_entry(tr, CAM_ENTRY_SOURCE, dev->dev_addr);
  1478. /* Enable CAM (broadcast and unicast) */
  1479. tc_writel(CAM_Ena_Bit(CAM_ENTRY_SOURCE), &tr->CAM_Ena);
  1480. tc_writel(CAM_CompEn | CAM_BroadAcc, &tr->CAM_Ctl);
  1481. save_flags(flags);
  1482. cli();
  1483. tc_writel(DMA_BURST_SIZE, &tr->DMA_Ctl);
  1484. tc_writel(RxFrag_EnPack | ETH_ZLEN, &tr->RxFragSize); /* Packing */
  1485. tc_writel(0, &tr->TxPollCtr); /* Batch mode */
  1486. tc_writel(TX_THRESHOLD, &tr->TxThrsh);
  1487. tc_writel(INT_EN_CMD, &tr->Int_En);
  1488. /* set queues */
  1489. tc_writel(virt_to_bus(lp->rfd_base), &tr->FDA_Bas);
  1490. tc_writel((unsigned long)lp->rfd_limit - (unsigned long)lp->rfd_base,
  1491.   &tr->FDA_Lim);
  1492. /*
  1493.  * Activation method:
  1494.  * First, enable eht MAC Transmitter and the DMA Receive circuits.
  1495.  * Then enable the DMA Transmitter and the MAC Receive circuits.
  1496.  */
  1497. tc_writel(virt_to_bus(lp->fbl_ptr), &tr->BLFrmPtr); /* start DMA receiver */
  1498. tc_writel(RX_CTL_CMD, &tr->Rx_Ctl); /* start MAC receiver */
  1499. /* start MAC transmitter */
  1500. /* WORKAROUND: ignore LostCrS in full duplex operation */
  1501. if (lp->fullduplex)
  1502. txctl = TX_CTL_CMD & ~Tx_EnLCarr;
  1503. #ifdef GATHER_TXINT
  1504. txctl &= ~Tx_EnComp; /* disable global tx completion int. */
  1505. #endif
  1506. tc_writel(txctl, &tr->Tx_Ctl);
  1507. #if 0 /* No need to polling */
  1508. tc_writel(virt_to_bus(lp->tfd_base), &tr->TxFrmPtr); /* start DMA transmitter */
  1509. #endif
  1510. restore_flags(flags);
  1511. }
  1512. /* XXX */
  1513. void
  1514. tc35815_killall(void)
  1515. {
  1516. struct net_device *dev;
  1517. for (dev = root_tc35815_dev; dev; dev = ((struct tc35815_local *)dev->priv)->next_module) {
  1518. if (dev->flags&IFF_UP){
  1519. dev->stop(dev);
  1520. }
  1521. }
  1522. }
  1523. static struct pci_driver tc35815_driver = {
  1524. name:  TC35815_MODULE_NAME,
  1525. probe: tc35815_probe,
  1526. remove: NULL,
  1527. id_table: tc35815_pci_tbl,
  1528. };
  1529. static int __init tc35815_init_module(void)
  1530. {
  1531. int err;
  1532. if ((err = pci_module_init(&tc35815_driver)) < 0 )
  1533.        return err;      
  1534. else
  1535. return 0;
  1536. }
  1537. static void __exit tc35815_cleanup_module(void)
  1538. {
  1539. struct net_device *next_dev;
  1540. /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
  1541. while (root_tc35815_dev) {
  1542. struct net_device *dev = root_tc35815_dev;
  1543. next_dev = ((struct tc35815_local *)dev->priv)->next_module;
  1544. kfree(dev->priv);
  1545. iounmap((void *)(dev->base_addr));
  1546. unregister_netdev(dev);
  1547. kfree(dev);
  1548. root_tc35815_dev = next_dev;
  1549. }
  1550. }
  1551. module_init(tc35815_init_module);
  1552. module_exit(tc35815_cleanup_module);