Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

mtd80x.c 32KB

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