You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097
  1. /**************************************************************************
  2. *
  3. * mtd80x.c: Etherboot device driver for the mtd80x Ethernet chip.
  4. * Written 2004-2004 by Erdem Güven <zuencap@yahoo.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. *
  20. * Portions of this code based on:
  21. * fealnx.c: A Linux device driver for the mtd80x Ethernet chip
  22. * Written 1998-2000 by Donald Becker
  23. *
  24. ***************************************************************************/
  25. /* to get some global routines like printf */
  26. #include "etherboot.h"
  27. /* to get the interface to the body of the program */
  28. #include "nic.h"
  29. /* to get the PCI support functions, if this is a PCI NIC */
  30. #include "pci.h"
  31. #if 0
  32. #define DBGPRNT( x ) printf x
  33. #else
  34. #define DBGPRNT( x )
  35. #endif
  36. typedef unsigned char u8;
  37. typedef signed char s8;
  38. typedef unsigned short u16;
  39. typedef signed short s16;
  40. typedef unsigned int u32;
  41. typedef signed int s32;
  42. /* Condensed operations for readability. */
  43. #define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr))
  44. #define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr))
  45. #define get_unaligned(ptr) (*(ptr))
  46. /* Operational parameters that are set at compile time. */
  47. /* Keep the ring sizes a power of two for compile efficiency. */
  48. /* The compiler will convert <unsigned>'%'<2^N> into a bit mask. */
  49. /* Making the Tx ring too large decreases the effectiveness of channel */
  50. /* bonding and packet priority. */
  51. /* There are no ill effects from too-large receive rings. */
  52. #define TX_RING_SIZE 2
  53. #define TX_QUEUE_LEN 10 /* Limit ring entries actually used. */
  54. #define RX_RING_SIZE 4
  55. /* Operational parameters that usually are not changed. */
  56. /* Time in jiffies before concluding the transmitter is hung. */
  57. #define HZ 100
  58. #define TX_TIME_OUT (6*HZ)
  59. /* Allocation size of Rx buffers with normal sized Ethernet frames.
  60. Do not change this value without good reason. This is not a limit,
  61. but a way to keep a consistent allocation size among drivers.
  62. */
  63. #define PKT_BUF_SZ 1536
  64. /* Generic MII registers. */
  65. #define MII_BMCR 0x00 /* Basic mode control register */
  66. #define MII_BMSR 0x01 /* Basic mode status register */
  67. #define MII_PHYSID1 0x02 /* PHYS ID 1 */
  68. #define MII_PHYSID2 0x03 /* PHYS ID 2 */
  69. #define MII_ADVERTISE 0x04 /* Advertisement control reg */
  70. #define MII_LPA 0x05 /* Link partner ability reg */
  71. #define MII_EXPANSION 0x06 /* Expansion register */
  72. #define MII_DCOUNTER 0x12 /* Disconnect counter */
  73. #define MII_FCSCOUNTER 0x13 /* False carrier counter */
  74. #define MII_NWAYTEST 0x14 /* N-way auto-neg test reg */
  75. #define MII_RERRCOUNTER 0x15 /* Receive error counter */
  76. #define MII_SREVISION 0x16 /* Silicon revision */
  77. #define MII_RESV1 0x17 /* Reserved... */
  78. #define MII_LBRERROR 0x18 /* Lpback, rx, bypass error */
  79. #define MII_PHYADDR 0x19 /* PHY address */
  80. #define MII_RESV2 0x1a /* Reserved... */
  81. #define MII_TPISTATUS 0x1b /* TPI status for 10mbps */
  82. #define MII_NCONFIG 0x1c /* Network interface config */
  83. /* Basic mode control register. */
  84. #define BMCR_RESV 0x007f /* Unused... */
  85. #define BMCR_CTST 0x0080 /* Collision test */
  86. #define BMCR_FULLDPLX 0x0100 /* Full duplex */
  87. #define BMCR_ANRESTART 0x0200 /* Auto negotiation restart */
  88. #define BMCR_ISOLATE 0x0400 /* Disconnect DP83840 from MII */
  89. #define BMCR_PDOWN 0x0800 /* Powerdown the DP83840 */
  90. #define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */
  91. #define BMCR_SPEED100 0x2000 /* Select 100Mbps */
  92. #define BMCR_LOOPBACK 0x4000 /* TXD loopback bits */
  93. #define BMCR_RESET 0x8000 /* Reset the DP83840 */
  94. /* Basic mode status register. */
  95. #define BMSR_ERCAP 0x0001 /* Ext-reg capability */
  96. #define BMSR_JCD 0x0002 /* Jabber detected */
  97. #define BMSR_LSTATUS 0x0004 /* Link status */
  98. #define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */
  99. #define BMSR_RFAULT 0x0010 /* Remote fault detected */
  100. #define BMSR_ANEGCOMPLETE 0x0020 /* Auto-negotiation complete */
  101. #define BMSR_RESV 0x07c0 /* Unused... */
  102. #define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */
  103. #define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */
  104. #define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */
  105. #define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */
  106. #define BMSR_100BASE4 0x8000 /* Can do 100mbps, 4k packets */
  107. /* Advertisement control register. */
  108. #define ADVERTISE_SLCT 0x001f /* Selector bits */
  109. #define ADVERTISE_CSMA 0x0001 /* Only selector supported */
  110. #define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */
  111. #define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */
  112. #define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */
  113. #define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */
  114. #define ADVERTISE_100BASE4 0x0200 /* Try for 100mbps 4k packets */
  115. #define ADVERTISE_RESV 0x1c00 /* Unused... */
  116. #define ADVERTISE_RFAULT 0x2000 /* Say we can detect faults */
  117. #define ADVERTISE_LPACK 0x4000 /* Ack link partners response */
  118. #define ADVERTISE_NPAGE 0x8000 /* Next page bit */
  119. #define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | \
  120. ADVERTISE_CSMA)
  121. #define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \
  122. ADVERTISE_100HALF | ADVERTISE_100FULL)
  123. /* for different PHY */
  124. enum phy_type_flags {
  125. MysonPHY = 1,
  126. AhdocPHY = 2,
  127. SeeqPHY = 3,
  128. MarvellPHY = 4,
  129. Myson981 = 5,
  130. LevelOnePHY = 6,
  131. OtherPHY = 10,
  132. };
  133. /* A chip capabilities table*/
  134. enum chip_capability_flags {
  135. HAS_MII_XCVR,
  136. HAS_CHIP_XCVR,
  137. };
  138. #if 0 /* not used */
  139. static
  140. struct chip_info
  141. {
  142. u16 dev_id;
  143. int flag;
  144. }
  145. mtd80x_chips[] = {
  146. {0x0800, HAS_MII_XCVR},
  147. {0x0803, HAS_CHIP_XCVR},
  148. {0x0891, HAS_MII_XCVR}
  149. };
  150. static int chip_cnt = sizeof( mtd80x_chips ) / sizeof( struct chip_info );
  151. #endif
  152. /* Offsets to the Command and Status Registers. */
  153. enum mtd_offsets {
  154. PAR0 = 0x0, /* physical address 0-3 */
  155. PAR1 = 0x04, /* physical address 4-5 */
  156. MAR0 = 0x08, /* multicast address 0-3 */
  157. MAR1 = 0x0C, /* multicast address 4-7 */
  158. FAR0 = 0x10, /* flow-control address 0-3 */
  159. FAR1 = 0x14, /* flow-control address 4-5 */
  160. TCRRCR = 0x18, /* receive & transmit configuration */
  161. BCR = 0x1C, /* bus command */
  162. TXPDR = 0x20, /* transmit polling demand */
  163. RXPDR = 0x24, /* receive polling demand */
  164. RXCWP = 0x28, /* receive current word pointer */
  165. TXLBA = 0x2C, /* transmit list base address */
  166. RXLBA = 0x30, /* receive list base address */
  167. ISR = 0x34, /* interrupt status */
  168. IMR = 0x38, /* interrupt mask */
  169. FTH = 0x3C, /* flow control high/low threshold */
  170. MANAGEMENT = 0x40, /* bootrom/eeprom and mii management */
  171. TALLY = 0x44, /* tally counters for crc and mpa */
  172. TSR = 0x48, /* tally counter for transmit status */
  173. BMCRSR = 0x4c, /* basic mode control and status */
  174. PHYIDENTIFIER = 0x50, /* phy identifier */
  175. ANARANLPAR = 0x54, /* auto-negotiation advertisement and link
  176. partner ability */
  177. ANEROCR = 0x58, /* auto-negotiation expansion and pci conf. */
  178. BPREMRPSR = 0x5c, /* bypass & receive error mask and phy status */
  179. };
  180. /* Bits in the interrupt status/enable registers. */
  181. /* The bits in the Intr Status/Enable registers, mostly interrupt sources. */
  182. enum intr_status_bits {
  183. RFCON = 0x00020000, /* receive flow control xon packet */
  184. RFCOFF = 0x00010000, /* receive flow control xoff packet */
  185. LSCStatus = 0x00008000, /* link status change */
  186. ANCStatus = 0x00004000, /* autonegotiation completed */
  187. FBE = 0x00002000, /* fatal bus error */
  188. FBEMask = 0x00001800, /* mask bit12-11 */
  189. ParityErr = 0x00000000, /* parity error */
  190. TargetErr = 0x00001000, /* target abort */
  191. MasterErr = 0x00000800, /* master error */
  192. TUNF = 0x00000400, /* transmit underflow */
  193. ROVF = 0x00000200, /* receive overflow */
  194. ETI = 0x00000100, /* transmit early int */
  195. ERI = 0x00000080, /* receive early int */
  196. CNTOVF = 0x00000040, /* counter overflow */
  197. RBU = 0x00000020, /* receive buffer unavailable */
  198. TBU = 0x00000010, /* transmit buffer unavilable */
  199. TI = 0x00000008, /* transmit interrupt */
  200. RI = 0x00000004, /* receive interrupt */
  201. RxErr = 0x00000002, /* receive error */
  202. };
  203. /* Bits in the NetworkConfig register. */
  204. enum rx_mode_bits {
  205. RxModeMask = 0xe0,
  206. AcceptAllPhys = 0x80, /* promiscuous mode */
  207. AcceptBroadcast = 0x40, /* accept broadcast */
  208. AcceptMulticast = 0x20, /* accept mutlicast */
  209. AcceptRunt = 0x08, /* receive runt pkt */
  210. ALP = 0x04, /* receive long pkt */
  211. AcceptErr = 0x02, /* receive error pkt */
  212. AcceptMyPhys = 0x00000000,
  213. RxEnable = 0x00000001,
  214. RxFlowCtrl = 0x00002000,
  215. TxEnable = 0x00040000,
  216. TxModeFDX = 0x00100000,
  217. TxThreshold = 0x00e00000,
  218. PS1000 = 0x00010000,
  219. PS10 = 0x00080000,
  220. FD = 0x00100000,
  221. };
  222. /* Bits in network_desc.status */
  223. enum rx_desc_status_bits {
  224. RXOWN = 0x80000000, /* own bit */
  225. FLNGMASK = 0x0fff0000, /* frame length */
  226. FLNGShift = 16,
  227. MARSTATUS = 0x00004000, /* multicast address received */
  228. BARSTATUS = 0x00002000, /* broadcast address received */
  229. PHYSTATUS = 0x00001000, /* physical address received */
  230. RXFSD = 0x00000800, /* first descriptor */
  231. RXLSD = 0x00000400, /* last descriptor */
  232. ErrorSummary = 0x80, /* error summary */
  233. RUNT = 0x40, /* runt packet received */
  234. LONG = 0x20, /* long packet received */
  235. FAE = 0x10, /* frame align error */
  236. CRC = 0x08, /* crc error */
  237. RXER = 0x04, /* receive error */
  238. };
  239. enum rx_desc_control_bits {
  240. RXIC = 0x00800000, /* interrupt control */
  241. RBSShift = 0,
  242. };
  243. enum tx_desc_status_bits {
  244. TXOWN = 0x80000000, /* own bit */
  245. JABTO = 0x00004000, /* jabber timeout */
  246. CSL = 0x00002000, /* carrier sense lost */
  247. LC = 0x00001000, /* late collision */
  248. EC = 0x00000800, /* excessive collision */
  249. UDF = 0x00000400, /* fifo underflow */
  250. DFR = 0x00000200, /* deferred */
  251. HF = 0x00000100, /* heartbeat fail */
  252. NCRMask = 0x000000ff, /* collision retry count */
  253. NCRShift = 0,
  254. };
  255. enum tx_desc_control_bits {
  256. TXIC = 0x80000000, /* interrupt control */
  257. ETIControl = 0x40000000, /* early transmit interrupt */
  258. TXLD = 0x20000000, /* last descriptor */
  259. TXFD = 0x10000000, /* first descriptor */
  260. CRCEnable = 0x08000000, /* crc control */
  261. PADEnable = 0x04000000, /* padding control */
  262. RetryTxLC = 0x02000000, /* retry late collision */
  263. PKTSMask = 0x3ff800, /* packet size bit21-11 */
  264. PKTSShift = 11,
  265. TBSMask = 0x000007ff, /* transmit buffer bit 10-0 */
  266. TBSShift = 0,
  267. };
  268. /* BootROM/EEPROM/MII Management Register */
  269. #define MASK_MIIR_MII_READ 0x00000000
  270. #define MASK_MIIR_MII_WRITE 0x00000008
  271. #define MASK_MIIR_MII_MDO 0x00000004
  272. #define MASK_MIIR_MII_MDI 0x00000002
  273. #define MASK_MIIR_MII_MDC 0x00000001
  274. /* ST+OP+PHYAD+REGAD+TA */
  275. #define OP_READ 0x6000 /* ST:01+OP:10+PHYAD+REGAD+TA:Z0 */
  276. #define OP_WRITE 0x5002 /* ST:01+OP:01+PHYAD+REGAD+TA:10 */
  277. /* ------------------------------------------------------------------------- */
  278. /* Constants for Myson PHY */
  279. /* ------------------------------------------------------------------------- */
  280. #define MysonPHYID 0xd0000302
  281. /* 89-7-27 add, (begin) */
  282. #define MysonPHYID0 0x0302
  283. #define StatusRegister 18
  284. #define SPEED100 0x0400 // bit10
  285. #define FULLMODE 0x0800 // bit11
  286. /* 89-7-27 add, (end) */
  287. /* ------------------------------------------------------------------------- */
  288. /* Constants for Seeq 80225 PHY */
  289. /* ------------------------------------------------------------------------- */
  290. #define SeeqPHYID0 0x0016
  291. #define MIIRegister18 18
  292. #define SPD_DET_100 0x80
  293. #define DPLX_DET_FULL 0x40
  294. /* ------------------------------------------------------------------------- */
  295. /* Constants for Ahdoc 101 PHY */
  296. /* ------------------------------------------------------------------------- */
  297. #define AhdocPHYID0 0x0022
  298. #define DiagnosticReg 18
  299. #define DPLX_FULL 0x0800
  300. #define Speed_100 0x0400
  301. /* 89/6/13 add, */
  302. /* -------------------------------------------------------------------------- */
  303. /* Constants */
  304. /* -------------------------------------------------------------------------- */
  305. #define MarvellPHYID0 0x0141
  306. #define LevelOnePHYID0 0x0013
  307. #define MII1000BaseTControlReg 9
  308. #define MII1000BaseTStatusReg 10
  309. #define SpecificReg 17
  310. /* for 1000BaseT Control Register */
  311. #define PHYAbletoPerform1000FullDuplex 0x0200
  312. #define PHYAbletoPerform1000HalfDuplex 0x0100
  313. #define PHY1000AbilityMask 0x300
  314. // for phy specific status register, marvell phy.
  315. #define SpeedMask 0x0c000
  316. #define Speed_1000M 0x08000
  317. #define Speed_100M 0x4000
  318. #define Speed_10M 0
  319. #define Full_Duplex 0x2000
  320. // 89/12/29 add, for phy specific status register, levelone phy, (begin)
  321. #define LXT1000_100M 0x08000
  322. #define LXT1000_1000M 0x0c000
  323. #define LXT1000_Full 0x200
  324. // 89/12/29 add, for phy specific status register, levelone phy, (end)
  325. #if 0
  326. /* for 3-in-1 case */
  327. #define PS10 0x00080000
  328. #define FD 0x00100000
  329. #define PS1000 0x00010000
  330. #endif
  331. /* for PHY */
  332. #define LinkIsUp 0x0004
  333. #define LinkIsUp2 0x00040000
  334. /* Create a static buffer of size PKT_BUF_SZ for each
  335. TX Descriptor. All descriptors point to a
  336. part of this buffer */
  337. static u8 txb[PKT_BUF_SZ * TX_RING_SIZE]
  338. __attribute__ ((aligned(8)));
  339. /* Create a static buffer of size PKT_BUF_SZ for each
  340. RX Descriptor All descriptors point to a
  341. part of this buffer */
  342. static u8 rxb[PKT_BUF_SZ * RX_RING_SIZE]
  343. __attribute__ ((aligned(8)));
  344. /* The Tulip Rx and Tx buffer descriptors. */
  345. struct mtd_desc
  346. {
  347. s32 status;
  348. s32 control;
  349. u32 buffer;
  350. u32 next_desc;
  351. struct mtd_desc *next_desc_logical;
  352. u8* skbuff;
  353. u32 reserved1;
  354. u32 reserved2;
  355. };
  356. struct mtd_private
  357. {
  358. struct mtd_desc rx_ring[RX_RING_SIZE];
  359. struct mtd_desc tx_ring[TX_RING_SIZE];
  360. /* Frequently used values: keep some adjacent for cache effect. */
  361. int flags;
  362. struct pci_dev *pci_dev;
  363. unsigned long crvalue;
  364. unsigned long bcrvalue;
  365. /*unsigned long imrvalue;*/
  366. struct mtd_desc *cur_rx;
  367. struct mtd_desc *lack_rxbuf;
  368. int really_rx_count;
  369. struct mtd_desc *cur_tx;
  370. struct mtd_desc *cur_tx_copy;
  371. int really_tx_count;
  372. int free_tx_count;
  373. unsigned int rx_buf_sz; /* Based on MTU+slack. */
  374. /* These values are keep track of the transceiver/media in use. */
  375. unsigned int linkok;
  376. unsigned int line_speed;
  377. unsigned int duplexmode;
  378. unsigned int default_port:
  379. 4; /* Last dev->if_port value. */
  380. unsigned int PHYType;
  381. /* MII transceiver section. */
  382. int mii_cnt; /* MII device addresses. */
  383. unsigned char phys[1]; /* MII device addresses. */
  384. /*other*/
  385. const char *nic_name;
  386. int ioaddr;
  387. u16 dev_id;
  388. };
  389. static struct mtd_private mtdx;
  390. static int mdio_read(struct nic * , int phy_id, int location);
  391. static void getlinktype(struct nic * );
  392. static void getlinkstatus(struct nic * );
  393. static void set_rx_mode(struct nic *);
  394. /**************************************************************************
  395. * init_ring - setup the tx and rx descriptors
  396. *************************************************************************/
  397. static void init_ring(struct nic *nic __unused)
  398. {
  399. int i;
  400. mtdx.cur_rx = &mtdx.rx_ring[0];
  401. mtdx.rx_buf_sz = PKT_BUF_SZ;
  402. /*mtdx.rx_head_desc = &mtdx.rx_ring[0];*/
  403. /* Initialize all Rx descriptors. */
  404. /* Fill in the Rx buffers. Handle allocation failure gracefully. */
  405. for (i = 0; i < RX_RING_SIZE; i++)
  406. {
  407. mtdx.rx_ring[i].status = RXOWN;
  408. mtdx.rx_ring[i].control = mtdx.rx_buf_sz << RBSShift;
  409. mtdx.rx_ring[i].next_desc = virt_to_le32desc(&mtdx.rx_ring[i+1]);
  410. mtdx.rx_ring[i].next_desc_logical = &mtdx.rx_ring[i+1];
  411. mtdx.rx_ring[i].buffer = virt_to_le32desc(&rxb[i * PKT_BUF_SZ]);
  412. mtdx.rx_ring[i].skbuff = &rxb[i * PKT_BUF_SZ];
  413. }
  414. /* Mark the last entry as wrapping the ring. */
  415. mtdx.rx_ring[i-1].next_desc = virt_to_le32desc(&mtdx.rx_ring[0]);
  416. mtdx.rx_ring[i-1].next_desc_logical = &mtdx.rx_ring[0];
  417. /* We only use one transmit buffer, but two
  418. * descriptors so transmit engines have somewhere
  419. * to point should they feel the need */
  420. mtdx.tx_ring[0].status = 0x00000000;
  421. mtdx.tx_ring[0].buffer = virt_to_bus(&txb[0]);
  422. mtdx.tx_ring[0].next_desc = virt_to_le32desc(&mtdx.tx_ring[1]);
  423. /* This descriptor is never used */
  424. mtdx.tx_ring[1].status = 0x00000000;
  425. mtdx.tx_ring[1].buffer = 0; /*virt_to_bus(&txb[1]); */
  426. mtdx.tx_ring[1].next_desc = virt_to_le32desc(&mtdx.tx_ring[0]);
  427. return;
  428. }
  429. /**************************************************************************
  430. RESET - Reset Adapter
  431. ***************************************************************************/
  432. static void mtd_reset(struct nic *nic)
  433. {
  434. /* Reset the chip to erase previous misconfiguration. */
  435. outl(0x00000001, mtdx.ioaddr + BCR);
  436. init_ring(nic);
  437. outl(virt_to_bus(mtdx.rx_ring), mtdx.ioaddr + RXLBA);
  438. outl(virt_to_bus(mtdx.tx_ring), mtdx.ioaddr + TXLBA);
  439. /* Initialize other registers. */
  440. /* Configure the PCI bus bursts and FIFO thresholds. */
  441. mtdx.bcrvalue = 0x10; /* little-endian, 8 burst length */
  442. mtdx.crvalue = 0xa00; /* rx 128 burst length */
  443. if ( mtdx.dev_id == 0x891 ) {
  444. mtdx.bcrvalue |= 0x200; /* set PROG bit */
  445. mtdx.crvalue |= 0x02000000; /* set enhanced bit */
  446. }
  447. outl( mtdx.bcrvalue, mtdx.ioaddr + BCR);
  448. /* Restart Rx engine if stopped. */
  449. outl(0, mtdx.ioaddr + RXPDR);
  450. getlinkstatus(nic);
  451. if (mtdx.linkok)
  452. {
  453. char* texts[]={"half","full","10","100","1000"};
  454. getlinktype(nic);
  455. DBGPRNT(("Link is OK : %s %s\n", texts[mtdx.duplexmode-1], texts[mtdx.line_speed+1] ));
  456. } else
  457. {
  458. DBGPRNT(("No link!!!\n"));
  459. }
  460. mtdx.crvalue |= /*TxEnable |*/ RxEnable | TxThreshold;
  461. set_rx_mode(nic);
  462. /* Clear interrupts by setting the interrupt mask. */
  463. outl(FBE | TUNF | CNTOVF | RBU | TI | RI, mtdx.ioaddr + ISR);
  464. outl( 0, mtdx.ioaddr + IMR);
  465. }
  466. /**************************************************************************
  467. POLL - Wait for a frame
  468. ***************************************************************************/
  469. static int mtd_poll(struct nic *nic, int retrieve)
  470. {
  471. s32 rx_status = mtdx.cur_rx->status;
  472. int retval = 0;
  473. if( ( rx_status & RXOWN ) != 0 )
  474. {
  475. return 0;
  476. }
  477. if (rx_status & ErrorSummary)
  478. { /* there was a fatal error */
  479. printf( "%s: Receive error, Rx status %8.8x, Error(s) %s%s%s\n",
  480. mtdx.nic_name, rx_status ,
  481. (rx_status & (LONG | RUNT)) ? "length_error ":"",
  482. (rx_status & RXER) ? "frame_error ":"",
  483. (rx_status & CRC) ? "crc_error ":"" );
  484. retval = 0;
  485. } else if( !((rx_status & RXFSD) && (rx_status & RXLSD)) )
  486. {
  487. /* this pkt is too long, over one rx buffer */
  488. printf("Pkt is too long, over one rx buffer.\n");
  489. retval = 0;
  490. } else
  491. { /* this received pkt is ok */
  492. /* Omit the four octet CRC from the length. */
  493. short pkt_len = ((rx_status & FLNGMASK) >> FLNGShift) - 4;
  494. DBGPRNT(( " netdev_rx() normal Rx pkt length %d"
  495. " status %x.\n", pkt_len, rx_status));
  496. nic->packetlen = pkt_len;
  497. memcpy(nic->packet, mtdx.cur_rx->skbuff, pkt_len);
  498. retval = 1;
  499. }
  500. while( ( mtdx.cur_rx->status & RXOWN ) == 0 )
  501. {
  502. mtdx.cur_rx->status = RXOWN;
  503. mtdx.cur_rx = mtdx.cur_rx->next_desc_logical;
  504. }
  505. /* Restart Rx engine if stopped. */
  506. outl(0, mtdx.ioaddr + RXPDR);
  507. return retval;
  508. }
  509. /**************************************************************************
  510. TRANSMIT - Transmit a frame
  511. ***************************************************************************/
  512. static void mtd_transmit(
  513. struct nic *nic,
  514. const char *dest, /* Destination */
  515. unsigned int type, /* Type */
  516. unsigned int size, /* size */
  517. const char *data) /* Packet */
  518. {
  519. u32 to;
  520. u32 tx_status;
  521. unsigned int nstype = htons ( type );
  522. memcpy( txb, dest, ETH_ALEN );
  523. memcpy( txb + ETH_ALEN, nic->node_addr, ETH_ALEN );
  524. memcpy( txb + 2 * ETH_ALEN, &nstype, 2 );
  525. memcpy( txb + ETH_HLEN, data, size );
  526. size += ETH_HLEN;
  527. size &= 0x0FFF;
  528. while( size < ETH_ZLEN )
  529. {
  530. txb[size++] = '\0';
  531. }
  532. mtdx.tx_ring[0].control = TXLD | TXFD | CRCEnable | PADEnable;
  533. mtdx.tx_ring[0].control |= (size << PKTSShift); /* pkt size */
  534. mtdx.tx_ring[0].control |= (size << TBSShift); /* buffer size */
  535. mtdx.tx_ring[0].status = TXOWN;
  536. /* Point to transmit descriptor */
  537. outl(virt_to_bus(mtdx.tx_ring), mtdx.ioaddr + TXLBA);
  538. /* Enable Tx */
  539. outl( mtdx.crvalue | TxEnable, mtdx.ioaddr + TCRRCR);
  540. /* Wake the potentially-idle transmit channel. */
  541. outl(0, mtdx.ioaddr + TXPDR);
  542. to = currticks() + TX_TIME_OUT;
  543. while(( mtdx.tx_ring[0].status & TXOWN) && (currticks() < to));
  544. /* Disable Tx */
  545. outl( mtdx.crvalue & (~TxEnable), mtdx.ioaddr + TCRRCR);
  546. tx_status = mtdx.tx_ring[0].status;
  547. if (currticks() >= to){
  548. DBGPRNT(("TX Time Out"));
  549. } else if( tx_status & (CSL | LC | EC | UDF | HF)){
  550. printf("Transmit error: %s %s %s %s %s.\n",
  551. tx_status,
  552. tx_status & EC ? "abort" : "",
  553. tx_status & CSL ? "carrier" : "",
  554. tx_status & LC ? "late" : "",
  555. tx_status & UDF ? "fifo" : "",
  556. tx_status & HF ? "heartbeat" : "" );
  557. }
  558. /*hex_dump( txb, size );*/
  559. /*pause();*/
  560. DBGPRNT(("TRANSMIT\n"));
  561. }
  562. /**************************************************************************
  563. DISABLE - Turn off ethernet interface
  564. ***************************************************************************/
  565. static void mtd_disable ( struct nic *nic ) {
  566. /* put the card in its initial state */
  567. /* Disable Tx Rx*/
  568. outl( mtdx.crvalue & (~TxEnable) & (~RxEnable), mtdx.ioaddr + TCRRCR);
  569. /* Reset the chip to erase previous misconfiguration. */
  570. mtd_reset(nic);
  571. DBGPRNT(("DISABLE\n"));
  572. }
  573. static struct nic_operations mtd_operations = {
  574. .connect = dummy_connect,
  575. .poll = mtd_poll,
  576. .transmit = mtd_transmit,
  577. .irq = dummy_irq,
  578. .disable = mtd_disable,
  579. };
  580. static struct pci_id mtd80x_nics[] = {
  581. PCI_ROM(0x1516, 0x0800, "MTD800", "Myson MTD800"),
  582. PCI_ROM(0x1516, 0x0803, "MTD803", "Surecom EP-320X"),
  583. PCI_ROM(0x1516, 0x0891, "MTD891", "Myson MTD891"),
  584. };
  585. static struct pci_driver mtd80x_driver =
  586. PCI_DRIVER ( "MTD80X", mtd80x_nics, PCI_NO_CLASS );
  587. /**************************************************************************
  588. PROBE - Look for an adapter, this routine's visible to the outside
  589. ***************************************************************************/
  590. static int mtd_probe ( struct dev *dev ) {
  591. struct nic *nic = nic_device ( dev );
  592. struct pci_device *pci = pci_device ( dev );
  593. int i;
  594. if ( ! find_pci_device ( pci, &mtd80x_driver ) )
  595. return 0;
  596. if (pci->ioaddr == 0)
  597. return 0;
  598. /* Mask the bit that says "this is an io addr" */
  599. mtdx.ioaddr = pci->ioaddr;
  600. mtdx.nic_name = dev->name;
  601. mtdx.dev_id = pci->dev_id;
  602. /* read ethernet id */
  603. for (i = 0; i < 6; ++i)
  604. {
  605. nic->node_addr[i] = inb(mtdx.ioaddr + PAR0 + i);
  606. }
  607. if (memcmp(nic->node_addr, "\0\0\0\0\0", 6) == 0)
  608. {
  609. return 0;
  610. }
  611. DBGPRNT(("%s : ioaddr %#hX, addr %!\n",mtdx.nic_name, mtdx.ioaddr, nic->node_addr));
  612. /* Reset the chip to erase previous misconfiguration. */
  613. outl(0x00000001, mtdx.ioaddr + BCR);
  614. /* find the connected MII xcvrs */
  615. if( mtdx.dev_id != 0x803 )
  616. {
  617. int phy, phy_idx = 0;
  618. for (phy = 1; phy < 32 && phy_idx < 1; phy++) {
  619. int mii_status = mdio_read(nic, phy, 1);
  620. if (mii_status != 0xffff && mii_status != 0x0000) {
  621. mtdx.phys[phy_idx] = phy;
  622. DBGPRNT(("%s: MII PHY found at address %d, status "
  623. "0x%4.4x.\n", mtdx.nic_name, phy, mii_status));
  624. /* get phy type */
  625. {
  626. unsigned int data;
  627. data = mdio_read(nic, mtdx.phys[phy_idx], 2);
  628. if (data == SeeqPHYID0)
  629. mtdx.PHYType = SeeqPHY;
  630. else if (data == AhdocPHYID0)
  631. mtdx.PHYType = AhdocPHY;
  632. else if (data == MarvellPHYID0)
  633. mtdx.PHYType = MarvellPHY;
  634. else if (data == MysonPHYID0)
  635. mtdx.PHYType = Myson981;
  636. else if (data == LevelOnePHYID0)
  637. mtdx.PHYType = LevelOnePHY;
  638. else
  639. mtdx.PHYType = OtherPHY;
  640. }
  641. phy_idx++;
  642. }
  643. }
  644. mtdx.mii_cnt = phy_idx;
  645. if (phy_idx == 0) {
  646. printf("%s: MII PHY not found -- this device may "
  647. "not operate correctly.\n", mtdx.nic_name);
  648. }
  649. } else {
  650. mtdx.phys[0] = 32;
  651. /* get phy type */
  652. if (inl(mtdx.ioaddr + PHYIDENTIFIER) == MysonPHYID ) {
  653. mtdx.PHYType = MysonPHY;
  654. DBGPRNT(("MysonPHY\n"));
  655. } else {
  656. mtdx.PHYType = OtherPHY;
  657. DBGPRNT(("OtherPHY\n"));
  658. }
  659. }
  660. getlinkstatus(nic);
  661. if( !mtdx.linkok )
  662. {
  663. printf("No link!!!\n");
  664. return 0;
  665. }
  666. mtd_reset( nic );
  667. /* point to NIC specific routines */
  668. nic->nic_op = &mtd_operations;
  669. return 1;
  670. }
  671. /**************************************************************************/
  672. static void set_rx_mode(struct nic *nic __unused)
  673. {
  674. u32 mc_filter[2]; /* Multicast hash filter */
  675. u32 rx_mode;
  676. /* Too many to match, or accept all multicasts. */
  677. mc_filter[1] = mc_filter[0] = ~0;
  678. rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
  679. outl(mc_filter[0], mtdx.ioaddr + MAR0);
  680. outl(mc_filter[1], mtdx.ioaddr + MAR1);
  681. mtdx.crvalue = ( mtdx.crvalue & ~RxModeMask ) | rx_mode;
  682. outb( mtdx.crvalue, mtdx.ioaddr + TCRRCR);
  683. }
  684. /**************************************************************************/
  685. static unsigned int m80x_read_tick(void)
  686. /* function: Reads the Timer tick count register which decrements by 2 from */
  687. /* 65536 to 0 every 1/36.414 of a second. Each 2 decrements of the */
  688. /* count represents 838 nsec's. */
  689. /* input : none. */
  690. /* output : none. */
  691. {
  692. unsigned char tmp;
  693. int value;
  694. outb((char) 0x06, 0x43); // Command 8254 to latch T0's count
  695. // now read the count.
  696. tmp = (unsigned char) inb(0x40);
  697. value = ((int) tmp) << 8;
  698. tmp = (unsigned char) inb(0x40);
  699. value |= (((int) tmp) & 0xff);
  700. return (value);
  701. }
  702. static void m80x_delay(unsigned int interval)
  703. /* function: to wait for a specified time. */
  704. /* input : interval ... the specified time. */
  705. /* output : none. */
  706. {
  707. unsigned int interval1, interval2, i = 0;
  708. interval1 = m80x_read_tick(); // get initial value
  709. do
  710. {
  711. interval2 = m80x_read_tick();
  712. if (interval1 < interval2)
  713. interval1 += 65536;
  714. ++i;
  715. } while (((interval1 - interval2) < (u16) interval) && (i < 65535));
  716. }
  717. static u32 m80x_send_cmd_to_phy(long miiport, int opcode, int phyad, int regad)
  718. {
  719. u32 miir;
  720. int i;
  721. unsigned int mask, data;
  722. /* enable MII output */
  723. miir = (u32) inl(miiport);
  724. miir &= 0xfffffff0;
  725. miir |= MASK_MIIR_MII_WRITE + MASK_MIIR_MII_MDO;
  726. /* send 32 1's preamble */
  727. for (i = 0; i < 32; i++) {
  728. /* low MDC; MDO is already high (miir) */
  729. miir &= ~MASK_MIIR_MII_MDC;
  730. outl(miir, miiport);
  731. /* high MDC */
  732. miir |= MASK_MIIR_MII_MDC;
  733. outl(miir, miiport);
  734. }
  735. /* calculate ST+OP+PHYAD+REGAD+TA */
  736. data = opcode | (phyad << 7) | (regad << 2);
  737. /* sent out */
  738. mask = 0x8000;
  739. while (mask) {
  740. /* low MDC, prepare MDO */
  741. miir &= ~(MASK_MIIR_MII_MDC + MASK_MIIR_MII_MDO);
  742. if (mask & data)
  743. miir |= MASK_MIIR_MII_MDO;
  744. outl(miir, miiport);
  745. /* high MDC */
  746. miir |= MASK_MIIR_MII_MDC;
  747. outl(miir, miiport);
  748. m80x_delay(30);
  749. /* next */
  750. mask >>= 1;
  751. if (mask == 0x2 && opcode == OP_READ)
  752. miir &= ~MASK_MIIR_MII_WRITE;
  753. }
  754. return miir;
  755. }
  756. static int mdio_read(struct nic *nic __unused, int phyad, int regad)
  757. {
  758. long miiport = mtdx.ioaddr + MANAGEMENT;
  759. u32 miir;
  760. unsigned int mask, data;
  761. miir = m80x_send_cmd_to_phy(miiport, OP_READ, phyad, regad);
  762. /* read data */
  763. mask = 0x8000;
  764. data = 0;
  765. while (mask)
  766. {
  767. /* low MDC */
  768. miir &= ~MASK_MIIR_MII_MDC;
  769. outl(miir, miiport);
  770. /* read MDI */
  771. miir = inl(miiport);
  772. if (miir & MASK_MIIR_MII_MDI)
  773. data |= mask;
  774. /* high MDC, and wait */
  775. miir |= MASK_MIIR_MII_MDC;
  776. outl(miir, miiport);
  777. m80x_delay((int) 30);
  778. /* next */
  779. mask >>= 1;
  780. }
  781. /* low MDC */
  782. miir &= ~MASK_MIIR_MII_MDC;
  783. outl(miir, miiport);
  784. return data & 0xffff;
  785. }
  786. #if 0 /* not used */
  787. static void mdio_write(struct nic *nic __unused, int phyad, int regad,
  788. int data)
  789. {
  790. long miiport = mtdx.ioaddr + MANAGEMENT;
  791. u32 miir;
  792. unsigned int mask;
  793. miir = m80x_send_cmd_to_phy(miiport, OP_WRITE, phyad, regad);
  794. /* write data */
  795. mask = 0x8000;
  796. while (mask)
  797. {
  798. /* low MDC, prepare MDO */
  799. miir &= ~(MASK_MIIR_MII_MDC + MASK_MIIR_MII_MDO);
  800. if (mask & data)
  801. miir |= MASK_MIIR_MII_MDO;
  802. outl(miir, miiport);
  803. /* high MDC */
  804. miir |= MASK_MIIR_MII_MDC;
  805. outl(miir, miiport);
  806. /* next */
  807. mask >>= 1;
  808. }
  809. /* low MDC */
  810. miir &= ~MASK_MIIR_MII_MDC;
  811. outl(miir, miiport);
  812. return;
  813. }
  814. #endif
  815. static void getlinkstatus(struct nic *nic)
  816. /* function: Routine will read MII Status Register to get link status. */
  817. /* input : dev... pointer to the adapter block. */
  818. /* output : none. */
  819. {
  820. unsigned int i, DelayTime = 0x1000;
  821. mtdx.linkok = 0;
  822. if (mtdx.PHYType == MysonPHY)
  823. {
  824. for (i = 0; i < DelayTime; ++i) {
  825. if (inl(mtdx.ioaddr + BMCRSR) & LinkIsUp2) {
  826. mtdx.linkok = 1;
  827. return;
  828. }
  829. // delay
  830. m80x_delay(100);
  831. }
  832. } else
  833. {
  834. for (i = 0; i < DelayTime; ++i) {
  835. if (mdio_read(nic, mtdx.phys[0], MII_BMSR) & BMSR_LSTATUS) {
  836. mtdx.linkok = 1;
  837. return;
  838. }
  839. // delay
  840. m80x_delay(100);
  841. }
  842. }
  843. }
  844. static void getlinktype(struct nic *dev)
  845. {
  846. if (mtdx.PHYType == MysonPHY)
  847. { /* 3-in-1 case */
  848. if (inl(mtdx.ioaddr + TCRRCR) & FD)
  849. mtdx.duplexmode = 2; /* full duplex */
  850. else
  851. mtdx.duplexmode = 1; /* half duplex */
  852. if (inl(mtdx.ioaddr + TCRRCR) & PS10)
  853. mtdx.line_speed = 1; /* 10M */
  854. else
  855. mtdx.line_speed = 2; /* 100M */
  856. } else
  857. {
  858. if (mtdx.PHYType == SeeqPHY) { /* this PHY is SEEQ 80225 */
  859. unsigned int data;
  860. data = mdio_read(dev, mtdx.phys[0], MIIRegister18);
  861. if (data & SPD_DET_100)
  862. mtdx.line_speed = 2; /* 100M */
  863. else
  864. mtdx.line_speed = 1; /* 10M */
  865. if (data & DPLX_DET_FULL)
  866. mtdx.duplexmode = 2; /* full duplex mode */
  867. else
  868. mtdx.duplexmode = 1; /* half duplex mode */
  869. } else if (mtdx.PHYType == AhdocPHY) {
  870. unsigned int data;
  871. data = mdio_read(dev, mtdx.phys[0], DiagnosticReg);
  872. if (data & Speed_100)
  873. mtdx.line_speed = 2; /* 100M */
  874. else
  875. mtdx.line_speed = 1; /* 10M */
  876. if (data & DPLX_FULL)
  877. mtdx.duplexmode = 2; /* full duplex mode */
  878. else
  879. mtdx.duplexmode = 1; /* half duplex mode */
  880. }
  881. /* 89/6/13 add, (begin) */
  882. else if (mtdx.PHYType == MarvellPHY) {
  883. unsigned int data;
  884. data = mdio_read(dev, mtdx.phys[0], SpecificReg);
  885. if (data & Full_Duplex)
  886. mtdx.duplexmode = 2; /* full duplex mode */
  887. else
  888. mtdx.duplexmode = 1; /* half duplex mode */
  889. data &= SpeedMask;
  890. if (data == Speed_1000M)
  891. mtdx.line_speed = 3; /* 1000M */
  892. else if (data == Speed_100M)
  893. mtdx.line_speed = 2; /* 100M */
  894. else
  895. mtdx.line_speed = 1; /* 10M */
  896. }
  897. /* 89/6/13 add, (end) */
  898. /* 89/7/27 add, (begin) */
  899. else if (mtdx.PHYType == Myson981) {
  900. unsigned int data;
  901. data = mdio_read(dev, mtdx.phys[0], StatusRegister);
  902. if (data & SPEED100)
  903. mtdx.line_speed = 2;
  904. else
  905. mtdx.line_speed = 1;
  906. if (data & FULLMODE)
  907. mtdx.duplexmode = 2;
  908. else
  909. mtdx.duplexmode = 1;
  910. }
  911. /* 89/7/27 add, (end) */
  912. /* 89/12/29 add */
  913. else if (mtdx.PHYType == LevelOnePHY) {
  914. unsigned int data;
  915. data = mdio_read(dev, mtdx.phys[0], SpecificReg);
  916. if (data & LXT1000_Full)
  917. mtdx.duplexmode = 2; /* full duplex mode */
  918. else
  919. mtdx.duplexmode = 1; /* half duplex mode */
  920. data &= SpeedMask;
  921. if (data == LXT1000_1000M)
  922. mtdx.line_speed = 3; /* 1000M */
  923. else if (data == LXT1000_100M)
  924. mtdx.line_speed = 2; /* 100M */
  925. else
  926. mtdx.line_speed = 1; /* 10M */
  927. }
  928. // chage crvalue
  929. // mtdx.crvalue&=(~PS10)&(~FD);
  930. mtdx.crvalue &= (~PS10) & (~FD) & (~PS1000);
  931. if (mtdx.line_speed == 1)
  932. mtdx.crvalue |= PS10;
  933. else if (mtdx.line_speed == 3)
  934. mtdx.crvalue |= PS1000;
  935. if (mtdx.duplexmode == 2)
  936. mtdx.crvalue |= FD;
  937. }
  938. }
  939. BOOT_DRIVER ( "MTD80X", mtd_probe );