uli526x.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001
  1. /*
  2. * Copyright 2007, 2010 Freescale Semiconductor, Inc.
  3. *
  4. * Author: Roy Zang <tie-fei.zang@freescale.com>, Sep, 2007
  5. *
  6. * Description:
  7. * ULI 526x Ethernet port driver.
  8. * Based on the Linux driver: drivers/net/tulip/uli526x.c
  9. *
  10. * This is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. */
  15. #include <common.h>
  16. #include <malloc.h>
  17. #include <net.h>
  18. #include <netdev.h>
  19. #include <asm/io.h>
  20. #include <pci.h>
  21. #include <miiphy.h>
  22. /* some kernel function compatible define */
  23. #undef DEBUG
  24. /* Board/System/Debug information/definition */
  25. #define ULI_VENDOR_ID 0x10B9
  26. #define ULI5261_DEVICE_ID 0x5261
  27. #define ULI5263_DEVICE_ID 0x5263
  28. /* ULi M5261 ID*/
  29. #define PCI_ULI5261_ID (ULI5261_DEVICE_ID << 16 | ULI_VENDOR_ID)
  30. /* ULi M5263 ID*/
  31. #define PCI_ULI5263_ID (ULI5263_DEVICE_ID << 16 | ULI_VENDOR_ID)
  32. #define ULI526X_IO_SIZE 0x100
  33. #define TX_DESC_CNT 0x10 /* Allocated Tx descriptors */
  34. #define RX_DESC_CNT PKTBUFSRX /* Allocated Rx descriptors */
  35. #define TX_FREE_DESC_CNT (TX_DESC_CNT - 2) /* Max TX packet count */
  36. #define TX_WAKE_DESC_CNT (TX_DESC_CNT - 3) /* TX wakeup count */
  37. #define DESC_ALL_CNT (TX_DESC_CNT + RX_DESC_CNT)
  38. #define TX_BUF_ALLOC 0x300
  39. #define RX_ALLOC_SIZE PKTSIZE
  40. #define ULI526X_RESET 1
  41. #define CR0_DEFAULT 0
  42. #define CR6_DEFAULT 0x22200000
  43. #define CR7_DEFAULT 0x180c1
  44. #define CR15_DEFAULT 0x06 /* TxJabber RxWatchdog */
  45. #define TDES0_ERR_MASK 0x4302 /* TXJT, LC, EC, FUE */
  46. #define MAX_PACKET_SIZE 1514
  47. #define ULI5261_MAX_MULTICAST 14
  48. #define RX_COPY_SIZE 100
  49. #define MAX_CHECK_PACKET 0x8000
  50. #define ULI526X_10MHF 0
  51. #define ULI526X_100MHF 1
  52. #define ULI526X_10MFD 4
  53. #define ULI526X_100MFD 5
  54. #define ULI526X_AUTO 8
  55. #define ULI526X_TXTH_72 0x400000 /* TX TH 72 byte */
  56. #define ULI526X_TXTH_96 0x404000 /* TX TH 96 byte */
  57. #define ULI526X_TXTH_128 0x0000 /* TX TH 128 byte */
  58. #define ULI526X_TXTH_256 0x4000 /* TX TH 256 byte */
  59. #define ULI526X_TXTH_512 0x8000 /* TX TH 512 byte */
  60. #define ULI526X_TXTH_1K 0xC000 /* TX TH 1K byte */
  61. /* CR9 definition: SROM/MII */
  62. #define CR9_SROM_READ 0x4800
  63. #define CR9_SRCS 0x1
  64. #define CR9_SRCLK 0x2
  65. #define CR9_CRDOUT 0x8
  66. #define SROM_DATA_0 0x0
  67. #define SROM_DATA_1 0x4
  68. #define PHY_DATA_1 0x20000
  69. #define PHY_DATA_0 0x00000
  70. #define MDCLKH 0x10000
  71. #define PHY_POWER_DOWN 0x800
  72. #define SROM_V41_CODE 0x14
  73. #define SROM_CLK_WRITE(data, ioaddr) do { \
  74. outl(data|CR9_SROM_READ|CR9_SRCS, ioaddr); \
  75. udelay(5); \
  76. outl(data|CR9_SROM_READ|CR9_SRCS|CR9_SRCLK, ioaddr); \
  77. udelay(5); \
  78. outl(data|CR9_SROM_READ|CR9_SRCS, ioaddr); \
  79. udelay(5); \
  80. } while (0)
  81. /* Structure/enum declaration */
  82. struct tx_desc {
  83. u32 tdes0, tdes1, tdes2, tdes3; /* Data for the card */
  84. char *tx_buf_ptr; /* Data for us */
  85. struct tx_desc *next_tx_desc;
  86. };
  87. struct rx_desc {
  88. u32 rdes0, rdes1, rdes2, rdes3; /* Data for the card */
  89. char *rx_buf_ptr; /* Data for us */
  90. struct rx_desc *next_rx_desc;
  91. };
  92. struct uli526x_board_info {
  93. u32 chip_id; /* Chip vendor/Device ID */
  94. pci_dev_t pdev;
  95. long ioaddr; /* I/O base address */
  96. u32 cr0_data;
  97. u32 cr5_data;
  98. u32 cr6_data;
  99. u32 cr7_data;
  100. u32 cr15_data;
  101. /* pointer for memory physical address */
  102. dma_addr_t buf_pool_dma_ptr; /* Tx buffer pool memory */
  103. dma_addr_t buf_pool_dma_start; /* Tx buffer pool align dword */
  104. dma_addr_t desc_pool_dma_ptr; /* descriptor pool memory */
  105. dma_addr_t first_tx_desc_dma;
  106. dma_addr_t first_rx_desc_dma;
  107. /* descriptor pointer */
  108. unsigned char *buf_pool_ptr; /* Tx buffer pool memory */
  109. unsigned char *buf_pool_start; /* Tx buffer pool align dword */
  110. unsigned char *desc_pool_ptr; /* descriptor pool memory */
  111. struct tx_desc *first_tx_desc;
  112. struct tx_desc *tx_insert_ptr;
  113. struct tx_desc *tx_remove_ptr;
  114. struct rx_desc *first_rx_desc;
  115. struct rx_desc *rx_ready_ptr; /* packet come pointer */
  116. unsigned long tx_packet_cnt; /* transmitted packet count */
  117. u16 PHY_reg4; /* Saved Phyxcer register 4 value */
  118. u8 media_mode; /* user specify media mode */
  119. u8 op_mode; /* real work dedia mode */
  120. u8 phy_addr;
  121. /* NIC SROM data */
  122. unsigned char srom[128];
  123. };
  124. enum uli526x_offsets {
  125. DCR0 = 0x00, DCR1 = 0x08, DCR2 = 0x10, DCR3 = 0x18, DCR4 = 0x20,
  126. DCR5 = 0x28, DCR6 = 0x30, DCR7 = 0x38, DCR8 = 0x40, DCR9 = 0x48,
  127. DCR10 = 0x50, DCR11 = 0x58, DCR12 = 0x60, DCR13 = 0x68, DCR14 = 0x70,
  128. DCR15 = 0x78
  129. };
  130. enum uli526x_CR6_bits {
  131. CR6_RXSC = 0x2, CR6_PBF = 0x8, CR6_PM = 0x40, CR6_PAM = 0x80,
  132. CR6_FDM = 0x200, CR6_TXSC = 0x2000, CR6_STI = 0x100000,
  133. CR6_SFT = 0x200000, CR6_RXA = 0x40000000, CR6_NO_PURGE = 0x20000000
  134. };
  135. /* Global variable declaration -- */
  136. static unsigned char uli526x_media_mode = ULI526X_AUTO;
  137. static struct tx_desc desc_pool_array[DESC_ALL_CNT + 0x20]
  138. __attribute__ ((aligned(32)));
  139. static char buf_pool[TX_BUF_ALLOC * TX_DESC_CNT + 4];
  140. /* For module input parameter */
  141. static int mode = 8;
  142. /* function declaration -- */
  143. static int uli526x_start_xmit(struct eth_device *dev,
  144. volatile void *packet, int length);
  145. static const struct ethtool_ops netdev_ethtool_ops;
  146. static u16 read_srom_word(long, int);
  147. static void uli526x_descriptor_init(struct uli526x_board_info *, unsigned long);
  148. static void allocate_rx_buffer(struct uli526x_board_info *);
  149. static void update_cr6(u32, unsigned long);
  150. static u16 uli_phy_read(unsigned long, u8, u8, u32);
  151. static u16 phy_readby_cr10(unsigned long, u8, u8);
  152. static void uli_phy_write(unsigned long, u8, u8, u16, u32);
  153. static void phy_writeby_cr10(unsigned long, u8, u8, u16);
  154. static void phy_write_1bit(unsigned long, u32, u32);
  155. static u16 phy_read_1bit(unsigned long, u32);
  156. static int uli526x_rx_packet(struct eth_device *);
  157. static void uli526x_free_tx_pkt(struct eth_device *,
  158. struct uli526x_board_info *);
  159. static void uli526x_reuse_buf(struct rx_desc *);
  160. static void uli526x_init(struct eth_device *);
  161. static void uli526x_set_phyxcer(struct uli526x_board_info *);
  162. static int uli526x_init_one(struct eth_device *, bd_t *);
  163. static void uli526x_disable(struct eth_device *);
  164. static void set_mac_addr(struct eth_device *);
  165. static struct pci_device_id uli526x_pci_tbl[] = {
  166. { ULI_VENDOR_ID, ULI5261_DEVICE_ID}, /* 5261 device */
  167. { ULI_VENDOR_ID, ULI5263_DEVICE_ID}, /* 5263 device */
  168. {}
  169. };
  170. /* ULI526X network board routine */
  171. /*
  172. * Search ULI526X board, register it
  173. */
  174. int uli526x_initialize(bd_t *bis)
  175. {
  176. pci_dev_t devno;
  177. int card_number = 0;
  178. struct eth_device *dev;
  179. struct uli526x_board_info *db; /* board information structure */
  180. u32 iobase;
  181. int idx = 0;
  182. while (1) {
  183. /* Find PCI device */
  184. devno = pci_find_devices(uli526x_pci_tbl, idx++);
  185. if (devno < 0)
  186. break;
  187. pci_read_config_dword(devno, PCI_BASE_ADDRESS_1, &iobase);
  188. iobase &= ~0xf;
  189. dev = (struct eth_device *)malloc(sizeof *dev);
  190. if (!dev) {
  191. printf("uli526x: Can not allocate memory\n");
  192. break;
  193. }
  194. memset(dev, 0, sizeof(*dev));
  195. sprintf(dev->name, "uli526x#%d", card_number);
  196. db = (struct uli526x_board_info *)
  197. malloc(sizeof(struct uli526x_board_info));
  198. dev->priv = db;
  199. db->pdev = devno;
  200. dev->iobase = iobase;
  201. dev->init = uli526x_init_one;
  202. dev->halt = uli526x_disable;
  203. dev->send = uli526x_start_xmit;
  204. dev->recv = uli526x_rx_packet;
  205. /* init db */
  206. db->ioaddr = dev->iobase;
  207. /* get chip id */
  208. pci_read_config_dword(devno, PCI_VENDOR_ID, &db->chip_id);
  209. #ifdef DEBUG
  210. printf("uli526x: uli526x @0x%x\n", iobase);
  211. printf("uli526x: chip_id%x\n", db->chip_id);
  212. #endif
  213. eth_register(dev);
  214. card_number++;
  215. pci_write_config_byte(devno, PCI_LATENCY_TIMER, 0x20);
  216. udelay(10 * 1000);
  217. }
  218. return card_number;
  219. }
  220. static int uli526x_init_one(struct eth_device *dev, bd_t *bis)
  221. {
  222. struct uli526x_board_info *db = dev->priv;
  223. int i;
  224. switch (mode) {
  225. case ULI526X_10MHF:
  226. case ULI526X_100MHF:
  227. case ULI526X_10MFD:
  228. case ULI526X_100MFD:
  229. uli526x_media_mode = mode;
  230. break;
  231. default:
  232. uli526x_media_mode = ULI526X_AUTO;
  233. break;
  234. }
  235. /* Allocate Tx/Rx descriptor memory */
  236. db->desc_pool_ptr = (uchar *)&desc_pool_array[0];
  237. db->desc_pool_dma_ptr = (dma_addr_t)&desc_pool_array[0];
  238. if (db->desc_pool_ptr == NULL)
  239. return -1;
  240. db->buf_pool_ptr = (uchar *)&buf_pool[0];
  241. db->buf_pool_dma_ptr = (dma_addr_t)&buf_pool[0];
  242. if (db->buf_pool_ptr == NULL)
  243. return -1;
  244. db->first_tx_desc = (struct tx_desc *) db->desc_pool_ptr;
  245. db->first_tx_desc_dma = db->desc_pool_dma_ptr;
  246. db->buf_pool_start = db->buf_pool_ptr;
  247. db->buf_pool_dma_start = db->buf_pool_dma_ptr;
  248. #ifdef DEBUG
  249. printf("%s(): db->ioaddr= 0x%x\n",
  250. __FUNCTION__, db->ioaddr);
  251. printf("%s(): media_mode= 0x%x\n",
  252. __FUNCTION__, uli526x_media_mode);
  253. printf("%s(): db->desc_pool_ptr= 0x%x\n",
  254. __FUNCTION__, db->desc_pool_ptr);
  255. printf("%s(): db->desc_pool_dma_ptr= 0x%x\n",
  256. __FUNCTION__, db->desc_pool_dma_ptr);
  257. printf("%s(): db->buf_pool_ptr= 0x%x\n",
  258. __FUNCTION__, db->buf_pool_ptr);
  259. printf("%s(): db->buf_pool_dma_ptr= 0x%x\n",
  260. __FUNCTION__, db->buf_pool_dma_ptr);
  261. #endif
  262. /* read 64 word srom data */
  263. for (i = 0; i < 64; i++)
  264. ((u16 *) db->srom)[i] = cpu_to_le16(read_srom_word(db->ioaddr,
  265. i));
  266. /* Set Node address */
  267. if (((db->srom[0] == 0xff) && (db->srom[1] == 0xff)) ||
  268. ((db->srom[0] == 0x00) && (db->srom[1] == 0x00)))
  269. /* SROM absent, so write MAC address to ID Table */
  270. set_mac_addr(dev);
  271. else { /*Exist SROM*/
  272. for (i = 0; i < 6; i++)
  273. dev->enetaddr[i] = db->srom[20 + i];
  274. }
  275. #ifdef DEBUG
  276. for (i = 0; i < 6; i++)
  277. printf("%c%02x", i ? ':' : ' ', dev->enetaddr[i]);
  278. #endif
  279. db->PHY_reg4 = 0x1e0;
  280. /* system variable init */
  281. db->cr6_data = CR6_DEFAULT ;
  282. db->cr6_data |= ULI526X_TXTH_256;
  283. db->cr0_data = CR0_DEFAULT;
  284. uli526x_init(dev);
  285. return 0;
  286. }
  287. static void uli526x_disable(struct eth_device *dev)
  288. {
  289. #ifdef DEBUG
  290. printf("uli526x_disable\n");
  291. #endif
  292. struct uli526x_board_info *db = dev->priv;
  293. if (!((inl(db->ioaddr + DCR12)) & 0x8)) {
  294. /* Reset & stop ULI526X board */
  295. outl(ULI526X_RESET, db->ioaddr + DCR0);
  296. udelay(5);
  297. uli_phy_write(db->ioaddr, db->phy_addr, 0, 0x8000, db->chip_id);
  298. /* reset the board */
  299. db->cr6_data &= ~(CR6_RXSC | CR6_TXSC); /* Disable Tx/Rx */
  300. update_cr6(db->cr6_data, dev->iobase);
  301. outl(0, dev->iobase + DCR7); /* Disable Interrupt */
  302. outl(inl(dev->iobase + DCR5), dev->iobase + DCR5);
  303. }
  304. }
  305. /* Initialize ULI526X board
  306. * Reset ULI526X board
  307. * Initialize TX/Rx descriptor chain structure
  308. * Send the set-up frame
  309. * Enable Tx/Rx machine
  310. */
  311. static void uli526x_init(struct eth_device *dev)
  312. {
  313. struct uli526x_board_info *db = dev->priv;
  314. u8 phy_tmp;
  315. u16 phy_value;
  316. u16 phy_reg_reset;
  317. /* Reset M526x MAC controller */
  318. outl(ULI526X_RESET, db->ioaddr + DCR0); /* RESET MAC */
  319. udelay(100);
  320. outl(db->cr0_data, db->ioaddr + DCR0);
  321. udelay(5);
  322. /* Phy addr : In some boards,M5261/M5263 phy address != 1 */
  323. db->phy_addr = 1;
  324. db->tx_packet_cnt = 0;
  325. for (phy_tmp = 0; phy_tmp < 32; phy_tmp++) {
  326. /* peer add */
  327. phy_value = uli_phy_read(db->ioaddr, phy_tmp, 3, db->chip_id);
  328. if (phy_value != 0xffff && phy_value != 0) {
  329. db->phy_addr = phy_tmp;
  330. break;
  331. }
  332. }
  333. #ifdef DEBUG
  334. printf("%s(): db->ioaddr= 0x%x\n", __FUNCTION__, db->ioaddr);
  335. printf("%s(): db->phy_addr= 0x%x\n", __FUNCTION__, db->phy_addr);
  336. #endif
  337. if (phy_tmp == 32)
  338. printf("Can not find the phy address!!!");
  339. /* Parser SROM and media mode */
  340. db->media_mode = uli526x_media_mode;
  341. if (!(inl(db->ioaddr + DCR12) & 0x8)) {
  342. /* Phyxcer capability setting */
  343. phy_reg_reset = uli_phy_read(db->ioaddr,
  344. db->phy_addr, 0, db->chip_id);
  345. phy_reg_reset = (phy_reg_reset | 0x8000);
  346. uli_phy_write(db->ioaddr, db->phy_addr, 0,
  347. phy_reg_reset, db->chip_id);
  348. udelay(500);
  349. /* Process Phyxcer Media Mode */
  350. uli526x_set_phyxcer(db);
  351. }
  352. /* Media Mode Process */
  353. if (!(db->media_mode & ULI526X_AUTO))
  354. db->op_mode = db->media_mode; /* Force Mode */
  355. /* Initialize Transmit/Receive decriptor and CR3/4 */
  356. uli526x_descriptor_init(db, db->ioaddr);
  357. /* Init CR6 to program M526X operation */
  358. update_cr6(db->cr6_data, db->ioaddr);
  359. /* Init CR7, interrupt active bit */
  360. db->cr7_data = CR7_DEFAULT;
  361. outl(db->cr7_data, db->ioaddr + DCR7);
  362. /* Init CR15, Tx jabber and Rx watchdog timer */
  363. outl(db->cr15_data, db->ioaddr + DCR15);
  364. /* Enable ULI526X Tx/Rx function */
  365. db->cr6_data |= CR6_RXSC | CR6_TXSC;
  366. update_cr6(db->cr6_data, db->ioaddr);
  367. while (!(inl(db->ioaddr + DCR12) & 0x8))
  368. udelay(10);
  369. }
  370. /*
  371. * Hardware start transmission.
  372. * Send a packet to media from the upper layer.
  373. */
  374. static int uli526x_start_xmit(struct eth_device *dev,
  375. volatile void *packet, int length)
  376. {
  377. struct uli526x_board_info *db = dev->priv;
  378. struct tx_desc *txptr;
  379. unsigned int len = length;
  380. /* Too large packet check */
  381. if (len > MAX_PACKET_SIZE) {
  382. printf(": big packet = %d\n", len);
  383. return 0;
  384. }
  385. /* No Tx resource check, it never happen nromally */
  386. if (db->tx_packet_cnt >= TX_FREE_DESC_CNT) {
  387. printf("No Tx resource %ld\n", db->tx_packet_cnt);
  388. return 0;
  389. }
  390. /* Disable NIC interrupt */
  391. outl(0, dev->iobase + DCR7);
  392. /* transmit this packet */
  393. txptr = db->tx_insert_ptr;
  394. memcpy((char *)txptr->tx_buf_ptr, (char *)packet, (int)length);
  395. txptr->tdes1 = cpu_to_le32(0xe1000000 | length);
  396. /* Point to next transmit free descriptor */
  397. db->tx_insert_ptr = txptr->next_tx_desc;
  398. /* Transmit Packet Process */
  399. if ((db->tx_packet_cnt < TX_DESC_CNT)) {
  400. txptr->tdes0 = cpu_to_le32(0x80000000); /* Set owner bit */
  401. db->tx_packet_cnt++; /* Ready to send */
  402. outl(0x1, dev->iobase + DCR1); /* Issue Tx polling */
  403. }
  404. /* Got ULI526X status */
  405. db->cr5_data = inl(db->ioaddr + DCR5);
  406. outl(db->cr5_data, db->ioaddr + DCR5);
  407. #ifdef TX_DEBUG
  408. printf("%s(): length = 0x%x\n", __FUNCTION__, length);
  409. printf("%s(): cr5_data=%x\n", __FUNCTION__, db->cr5_data);
  410. #endif
  411. outl(db->cr7_data, dev->iobase + DCR7);
  412. uli526x_free_tx_pkt(dev, db);
  413. return length;
  414. }
  415. /*
  416. * Free TX resource after TX complete
  417. */
  418. static void uli526x_free_tx_pkt(struct eth_device *dev,
  419. struct uli526x_board_info *db)
  420. {
  421. struct tx_desc *txptr;
  422. u32 tdes0;
  423. txptr = db->tx_remove_ptr;
  424. while (db->tx_packet_cnt) {
  425. tdes0 = le32_to_cpu(txptr->tdes0);
  426. /* printf(DRV_NAME ": tdes0=%x\n", tdes0); */
  427. if (tdes0 & 0x80000000)
  428. break;
  429. /* A packet sent completed */
  430. db->tx_packet_cnt--;
  431. if (tdes0 != 0x7fffffff) {
  432. #ifdef TX_DEBUG
  433. printf("%s()tdes0=%x\n", __FUNCTION__, tdes0);
  434. #endif
  435. if (tdes0 & TDES0_ERR_MASK) {
  436. if (tdes0 & 0x0002) { /* UnderRun */
  437. if (!(db->cr6_data & CR6_SFT)) {
  438. db->cr6_data = db->cr6_data |
  439. CR6_SFT;
  440. update_cr6(db->cr6_data,
  441. db->ioaddr);
  442. }
  443. }
  444. }
  445. }
  446. txptr = txptr->next_tx_desc;
  447. }/* End of while */
  448. /* Update TX remove pointer to next */
  449. db->tx_remove_ptr = txptr;
  450. }
  451. /*
  452. * Receive the come packet and pass to upper layer
  453. */
  454. static int uli526x_rx_packet(struct eth_device *dev)
  455. {
  456. struct uli526x_board_info *db = dev->priv;
  457. struct rx_desc *rxptr;
  458. int rxlen = 0;
  459. u32 rdes0;
  460. rxptr = db->rx_ready_ptr;
  461. rdes0 = le32_to_cpu(rxptr->rdes0);
  462. #ifdef RX_DEBUG
  463. printf("%s(): rxptr->rdes0=%x:%x\n", __FUNCTION__, rxptr->rdes0);
  464. #endif
  465. if (!(rdes0 & 0x80000000)) { /* packet owner check */
  466. if ((rdes0 & 0x300) != 0x300) {
  467. /* A packet without First/Last flag */
  468. /* reuse this buf */
  469. printf("A packet without First/Last flag");
  470. uli526x_reuse_buf(rxptr);
  471. } else {
  472. /* A packet with First/Last flag */
  473. rxlen = ((rdes0 >> 16) & 0x3fff) - 4;
  474. #ifdef RX_DEBUG
  475. printf("%s(): rxlen =%x\n", __FUNCTION__, rxlen);
  476. #endif
  477. /* error summary bit check */
  478. if (rdes0 & 0x8000) {
  479. /* This is a error packet */
  480. printf("Error: rdes0: %x\n", rdes0);
  481. }
  482. if (!(rdes0 & 0x8000) ||
  483. ((db->cr6_data & CR6_PM) && (rxlen > 6))) {
  484. #ifdef RX_DEBUG
  485. printf("%s(): rx_skb_ptr =%x\n",
  486. __FUNCTION__, rxptr->rx_buf_ptr);
  487. printf("%s(): rxlen =%x\n",
  488. __FUNCTION__, rxlen);
  489. printf("%s(): buf addr =%x\n",
  490. __FUNCTION__, rxptr->rx_buf_ptr);
  491. printf("%s(): rxlen =%x\n",
  492. __FUNCTION__, rxlen);
  493. int i;
  494. for (i = 0; i < 0x20; i++)
  495. printf("%s(): data[%x] =%x\n",
  496. __FUNCTION__, i, rxptr->rx_buf_ptr[i]);
  497. #endif
  498. NetReceive((uchar *)rxptr->rx_buf_ptr, rxlen);
  499. uli526x_reuse_buf(rxptr);
  500. } else {
  501. /* Reuse SKB buffer when the packet is error */
  502. printf("Reuse buffer, rdes0");
  503. uli526x_reuse_buf(rxptr);
  504. }
  505. }
  506. rxptr = rxptr->next_rx_desc;
  507. }
  508. db->rx_ready_ptr = rxptr;
  509. return rxlen;
  510. }
  511. /*
  512. * Reuse the RX buffer
  513. */
  514. static void uli526x_reuse_buf(struct rx_desc *rxptr)
  515. {
  516. if (!(rxptr->rdes0 & cpu_to_le32(0x80000000)))
  517. rxptr->rdes0 = cpu_to_le32(0x80000000);
  518. else
  519. printf("Buffer reuse method error");
  520. }
  521. /*
  522. * Initialize transmit/Receive descriptor
  523. * Using Chain structure, and allocate Tx/Rx buffer
  524. */
  525. static void uli526x_descriptor_init(struct uli526x_board_info *db,
  526. unsigned long ioaddr)
  527. {
  528. struct tx_desc *tmp_tx;
  529. struct rx_desc *tmp_rx;
  530. unsigned char *tmp_buf;
  531. dma_addr_t tmp_tx_dma, tmp_rx_dma;
  532. dma_addr_t tmp_buf_dma;
  533. int i;
  534. /* tx descriptor start pointer */
  535. db->tx_insert_ptr = db->first_tx_desc;
  536. db->tx_remove_ptr = db->first_tx_desc;
  537. outl(db->first_tx_desc_dma, ioaddr + DCR4); /* TX DESC address */
  538. /* rx descriptor start pointer */
  539. db->first_rx_desc = (void *)db->first_tx_desc +
  540. sizeof(struct tx_desc) * TX_DESC_CNT;
  541. db->first_rx_desc_dma = db->first_tx_desc_dma +
  542. sizeof(struct tx_desc) * TX_DESC_CNT;
  543. db->rx_ready_ptr = db->first_rx_desc;
  544. outl(db->first_rx_desc_dma, ioaddr + DCR3); /* RX DESC address */
  545. #ifdef DEBUG
  546. printf("%s(): db->first_tx_desc= 0x%x\n",
  547. __FUNCTION__, db->first_tx_desc);
  548. printf("%s(): db->first_rx_desc_dma= 0x%x\n",
  549. __FUNCTION__, db->first_rx_desc_dma);
  550. #endif
  551. /* Init Transmit chain */
  552. tmp_buf = db->buf_pool_start;
  553. tmp_buf_dma = db->buf_pool_dma_start;
  554. tmp_tx_dma = db->first_tx_desc_dma;
  555. for (tmp_tx = db->first_tx_desc, i = 0;
  556. i < TX_DESC_CNT; i++, tmp_tx++) {
  557. tmp_tx->tx_buf_ptr = (char *)tmp_buf;
  558. tmp_tx->tdes0 = cpu_to_le32(0);
  559. tmp_tx->tdes1 = cpu_to_le32(0x81000000); /* IC, chain */
  560. tmp_tx->tdes2 = cpu_to_le32(tmp_buf_dma);
  561. tmp_tx_dma += sizeof(struct tx_desc);
  562. tmp_tx->tdes3 = cpu_to_le32(tmp_tx_dma);
  563. tmp_tx->next_tx_desc = tmp_tx + 1;
  564. tmp_buf = tmp_buf + TX_BUF_ALLOC;
  565. tmp_buf_dma = tmp_buf_dma + TX_BUF_ALLOC;
  566. }
  567. (--tmp_tx)->tdes3 = cpu_to_le32(db->first_tx_desc_dma);
  568. tmp_tx->next_tx_desc = db->first_tx_desc;
  569. /* Init Receive descriptor chain */
  570. tmp_rx_dma = db->first_rx_desc_dma;
  571. for (tmp_rx = db->first_rx_desc, i = 0; i < RX_DESC_CNT;
  572. i++, tmp_rx++) {
  573. tmp_rx->rdes0 = cpu_to_le32(0);
  574. tmp_rx->rdes1 = cpu_to_le32(0x01000600);
  575. tmp_rx_dma += sizeof(struct rx_desc);
  576. tmp_rx->rdes3 = cpu_to_le32(tmp_rx_dma);
  577. tmp_rx->next_rx_desc = tmp_rx + 1;
  578. }
  579. (--tmp_rx)->rdes3 = cpu_to_le32(db->first_rx_desc_dma);
  580. tmp_rx->next_rx_desc = db->first_rx_desc;
  581. /* pre-allocate Rx buffer */
  582. allocate_rx_buffer(db);
  583. }
  584. /*
  585. * Update CR6 value
  586. * Firstly stop ULI526X, then written value and start
  587. */
  588. static void update_cr6(u32 cr6_data, unsigned long ioaddr)
  589. {
  590. outl(cr6_data, ioaddr + DCR6);
  591. udelay(5);
  592. }
  593. /*
  594. * Allocate rx buffer,
  595. */
  596. static void allocate_rx_buffer(struct uli526x_board_info *db)
  597. {
  598. int index;
  599. struct rx_desc *rxptr;
  600. rxptr = db->first_rx_desc;
  601. u32 addr;
  602. for (index = 0; index < RX_DESC_CNT; index++) {
  603. addr = (u32)NetRxPackets[index];
  604. addr += (16 - (addr & 15));
  605. rxptr->rx_buf_ptr = (char *) addr;
  606. rxptr->rdes2 = cpu_to_le32(addr);
  607. rxptr->rdes0 = cpu_to_le32(0x80000000);
  608. #ifdef DEBUG
  609. printf("%s(): Number 0x%x:\n", __FUNCTION__, index);
  610. printf("%s(): addr 0x%x:\n", __FUNCTION__, addr);
  611. printf("%s(): rxptr address = 0x%x\n", __FUNCTION__, rxptr);
  612. printf("%s(): rxptr buf address = 0x%x\n", \
  613. __FUNCTION__, rxptr->rx_buf_ptr);
  614. printf("%s(): rdes2 = 0x%x\n", __FUNCTION__, rxptr->rdes2);
  615. #endif
  616. rxptr = rxptr->next_rx_desc;
  617. }
  618. }
  619. /*
  620. * Read one word data from the serial ROM
  621. */
  622. static u16 read_srom_word(long ioaddr, int offset)
  623. {
  624. int i;
  625. u16 srom_data = 0;
  626. long cr9_ioaddr = ioaddr + DCR9;
  627. outl(CR9_SROM_READ, cr9_ioaddr);
  628. outl(CR9_SROM_READ | CR9_SRCS, cr9_ioaddr);
  629. /* Send the Read Command 110b */
  630. SROM_CLK_WRITE(SROM_DATA_1, cr9_ioaddr);
  631. SROM_CLK_WRITE(SROM_DATA_1, cr9_ioaddr);
  632. SROM_CLK_WRITE(SROM_DATA_0, cr9_ioaddr);
  633. /* Send the offset */
  634. for (i = 5; i >= 0; i--) {
  635. srom_data = (offset & (1 << i)) ? SROM_DATA_1 : SROM_DATA_0;
  636. SROM_CLK_WRITE(srom_data, cr9_ioaddr);
  637. }
  638. outl(CR9_SROM_READ | CR9_SRCS, cr9_ioaddr);
  639. for (i = 16; i > 0; i--) {
  640. outl(CR9_SROM_READ | CR9_SRCS | CR9_SRCLK, cr9_ioaddr);
  641. udelay(5);
  642. srom_data = (srom_data << 1) | ((inl(cr9_ioaddr) & CR9_CRDOUT)
  643. ? 1 : 0);
  644. outl(CR9_SROM_READ | CR9_SRCS, cr9_ioaddr);
  645. udelay(5);
  646. }
  647. outl(CR9_SROM_READ, cr9_ioaddr);
  648. return srom_data;
  649. }
  650. /*
  651. * Set 10/100 phyxcer capability
  652. * AUTO mode : phyxcer register4 is NIC capability
  653. * Force mode: phyxcer register4 is the force media
  654. */
  655. static void uli526x_set_phyxcer(struct uli526x_board_info *db)
  656. {
  657. u16 phy_reg;
  658. /* Phyxcer capability setting */
  659. phy_reg = uli_phy_read(db->ioaddr,
  660. db->phy_addr, 4, db->chip_id) & ~0x01e0;
  661. if (db->media_mode & ULI526X_AUTO) {
  662. /* AUTO Mode */
  663. phy_reg |= db->PHY_reg4;
  664. } else {
  665. /* Force Mode */
  666. switch (db->media_mode) {
  667. case ULI526X_10MHF: phy_reg |= 0x20; break;
  668. case ULI526X_10MFD: phy_reg |= 0x40; break;
  669. case ULI526X_100MHF: phy_reg |= 0x80; break;
  670. case ULI526X_100MFD: phy_reg |= 0x100; break;
  671. }
  672. }
  673. /* Write new capability to Phyxcer Reg4 */
  674. if (!(phy_reg & 0x01e0)) {
  675. phy_reg |= db->PHY_reg4;
  676. db->media_mode |= ULI526X_AUTO;
  677. }
  678. uli_phy_write(db->ioaddr, db->phy_addr, 4, phy_reg, db->chip_id);
  679. /* Restart Auto-Negotiation */
  680. uli_phy_write(db->ioaddr, db->phy_addr, 0, 0x1200, db->chip_id);
  681. udelay(50);
  682. }
  683. /*
  684. * Write a word to Phy register
  685. */
  686. static void uli_phy_write(unsigned long iobase, u8 phy_addr, u8 offset,
  687. u16 phy_data, u32 chip_id)
  688. {
  689. u16 i;
  690. unsigned long ioaddr;
  691. if (chip_id == PCI_ULI5263_ID) {
  692. phy_writeby_cr10(iobase, phy_addr, offset, phy_data);
  693. return;
  694. }
  695. /* M5261/M5263 Chip */
  696. ioaddr = iobase + DCR9;
  697. /* Send 33 synchronization clock to Phy controller */
  698. for (i = 0; i < 35; i++)
  699. phy_write_1bit(ioaddr, PHY_DATA_1, chip_id);
  700. /* Send start command(01) to Phy */
  701. phy_write_1bit(ioaddr, PHY_DATA_0, chip_id);
  702. phy_write_1bit(ioaddr, PHY_DATA_1, chip_id);
  703. /* Send write command(01) to Phy */
  704. phy_write_1bit(ioaddr, PHY_DATA_0, chip_id);
  705. phy_write_1bit(ioaddr, PHY_DATA_1, chip_id);
  706. /* Send Phy address */
  707. for (i = 0x10; i > 0; i = i >> 1)
  708. phy_write_1bit(ioaddr, phy_addr & i ?
  709. PHY_DATA_1 : PHY_DATA_0, chip_id);
  710. /* Send register address */
  711. for (i = 0x10; i > 0; i = i >> 1)
  712. phy_write_1bit(ioaddr, offset & i ?
  713. PHY_DATA_1 : PHY_DATA_0, chip_id);
  714. /* written trasnition */
  715. phy_write_1bit(ioaddr, PHY_DATA_1, chip_id);
  716. phy_write_1bit(ioaddr, PHY_DATA_0, chip_id);
  717. /* Write a word data to PHY controller */
  718. for (i = 0x8000; i > 0; i >>= 1)
  719. phy_write_1bit(ioaddr, phy_data & i ?
  720. PHY_DATA_1 : PHY_DATA_0, chip_id);
  721. }
  722. /*
  723. * Read a word data from phy register
  724. */
  725. static u16 uli_phy_read(unsigned long iobase, u8 phy_addr, u8 offset,
  726. u32 chip_id)
  727. {
  728. int i;
  729. u16 phy_data;
  730. unsigned long ioaddr;
  731. if (chip_id == PCI_ULI5263_ID)
  732. return phy_readby_cr10(iobase, phy_addr, offset);
  733. /* M5261/M5263 Chip */
  734. ioaddr = iobase + DCR9;
  735. /* Send 33 synchronization clock to Phy controller */
  736. for (i = 0; i < 35; i++)
  737. phy_write_1bit(ioaddr, PHY_DATA_1, chip_id);
  738. /* Send start command(01) to Phy */
  739. phy_write_1bit(ioaddr, PHY_DATA_0, chip_id);
  740. phy_write_1bit(ioaddr, PHY_DATA_1, chip_id);
  741. /* Send read command(10) to Phy */
  742. phy_write_1bit(ioaddr, PHY_DATA_1, chip_id);
  743. phy_write_1bit(ioaddr, PHY_DATA_0, chip_id);
  744. /* Send Phy address */
  745. for (i = 0x10; i > 0; i = i >> 1)
  746. phy_write_1bit(ioaddr, phy_addr & i ?
  747. PHY_DATA_1 : PHY_DATA_0, chip_id);
  748. /* Send register address */
  749. for (i = 0x10; i > 0; i = i >> 1)
  750. phy_write_1bit(ioaddr, offset & i ?
  751. PHY_DATA_1 : PHY_DATA_0, chip_id);
  752. /* Skip transition state */
  753. phy_read_1bit(ioaddr, chip_id);
  754. /* read 16bit data */
  755. for (phy_data = 0, i = 0; i < 16; i++) {
  756. phy_data <<= 1;
  757. phy_data |= phy_read_1bit(ioaddr, chip_id);
  758. }
  759. return phy_data;
  760. }
  761. static u16 phy_readby_cr10(unsigned long iobase, u8 phy_addr, u8 offset)
  762. {
  763. unsigned long ioaddr, cr10_value;
  764. ioaddr = iobase + DCR10;
  765. cr10_value = phy_addr;
  766. cr10_value = (cr10_value<<5) + offset;
  767. cr10_value = (cr10_value<<16) + 0x08000000;
  768. outl(cr10_value, ioaddr);
  769. udelay(1);
  770. while (1) {
  771. cr10_value = inl(ioaddr);
  772. if (cr10_value & 0x10000000)
  773. break;
  774. }
  775. return (cr10_value&0x0ffff);
  776. }
  777. static void phy_writeby_cr10(unsigned long iobase, u8 phy_addr,
  778. u8 offset, u16 phy_data)
  779. {
  780. unsigned long ioaddr, cr10_value;
  781. ioaddr = iobase + DCR10;
  782. cr10_value = phy_addr;
  783. cr10_value = (cr10_value<<5) + offset;
  784. cr10_value = (cr10_value<<16) + 0x04000000 + phy_data;
  785. outl(cr10_value, ioaddr);
  786. udelay(1);
  787. }
  788. /*
  789. * Write one bit data to Phy Controller
  790. */
  791. static void phy_write_1bit(unsigned long ioaddr, u32 phy_data, u32 chip_id)
  792. {
  793. outl(phy_data , ioaddr); /* MII Clock Low */
  794. udelay(1);
  795. outl(phy_data | MDCLKH, ioaddr); /* MII Clock High */
  796. udelay(1);
  797. outl(phy_data , ioaddr); /* MII Clock Low */
  798. udelay(1);
  799. }
  800. /*
  801. * Read one bit phy data from PHY controller
  802. */
  803. static u16 phy_read_1bit(unsigned long ioaddr, u32 chip_id)
  804. {
  805. u16 phy_data;
  806. outl(0x50000 , ioaddr);
  807. udelay(1);
  808. phy_data = (inl(ioaddr) >> 19) & 0x1;
  809. outl(0x40000 , ioaddr);
  810. udelay(1);
  811. return phy_data;
  812. }
  813. /*
  814. * Set MAC address to ID Table
  815. */
  816. static void set_mac_addr(struct eth_device *dev)
  817. {
  818. int i;
  819. u16 addr;
  820. struct uli526x_board_info *db = dev->priv;
  821. outl(0x10000, db->ioaddr + DCR0); /* Diagnosis mode */
  822. /* Reset dianostic pointer port */
  823. outl(0x1c0, db->ioaddr + DCR13);
  824. outl(0, db->ioaddr + DCR14); /* Clear reset port */
  825. outl(0x10, db->ioaddr + DCR14); /* Reset ID Table pointer */
  826. outl(0, db->ioaddr + DCR14); /* Clear reset port */
  827. outl(0, db->ioaddr + DCR13); /* Clear CR13 */
  828. /* Select ID Table access port */
  829. outl(0x1b0, db->ioaddr + DCR13);
  830. /* Read MAC address from CR14 */
  831. for (i = 0; i < 3; i++) {
  832. addr = dev->enetaddr[2 * i] | (dev->enetaddr[2 * i + 1] << 8);
  833. outl(addr, db->ioaddr + DCR14);
  834. }
  835. /* write end */
  836. outl(0, db->ioaddr + DCR13); /* Clear CR13 */
  837. outl(0, db->ioaddr + DCR0); /* Clear CR0 */
  838. udelay(10);
  839. return;
  840. }