PageRenderTime 55ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/Kernel/linux-0.11/grub-0.97/netboot/depca.c

http://kanghtta.googlecode.com/
C | 752 lines | 349 code | 57 blank | 346 comment | 45 complexity | 503c94610c4f29ecb2d3f5f59b9b6784 MD5 | raw file
Possible License(s): 0BSD, GPL-2.0, LGPL-2.0, BSD-3-Clause
  1. /* Etherboot: depca.h merged, comments from Linux driver retained */
  2. /* depca.c: A DIGITAL DEPCA & EtherWORKS ethernet driver for linux.
  3. Written 1994, 1995 by David C. Davies.
  4. Copyright 1994 David C. Davies
  5. and
  6. United States Government
  7. (as represented by the Director, National Security Agency).
  8. Copyright 1995 Digital Equipment Corporation.
  9. This software may be used and distributed according to the terms of
  10. the GNU Public License, incorporated herein by reference.
  11. This driver is written for the Digital Equipment Corporation series
  12. of DEPCA and EtherWORKS ethernet cards:
  13. DEPCA (the original)
  14. DE100
  15. DE101
  16. DE200 Turbo
  17. DE201 Turbo
  18. DE202 Turbo (TP BNC)
  19. DE210
  20. DE422 (EISA)
  21. The driver has been tested on DE100, DE200 and DE202 cards in a
  22. relatively busy network. The DE422 has been tested a little.
  23. This driver will NOT work for the DE203, DE204 and DE205 series of
  24. cards, since they have a new custom ASIC in place of the AMD LANCE
  25. chip. See the 'ewrk3.c' driver in the Linux source tree for running
  26. those cards.
  27. I have benchmarked the driver with a DE100 at 595kB/s to (542kB/s from)
  28. a DECstation 5000/200.
  29. The author may be reached at davies@maniac.ultranet.com
  30. =========================================================================
  31. The driver was originally based on the 'lance.c' driver from Donald
  32. Becker which is included with the standard driver distribution for
  33. linux. V0.4 is a complete re-write with only the kernel interface
  34. remaining from the original code.
  35. 1) Lance.c code in /linux/drivers/net/
  36. 2) "Ethernet/IEEE 802.3 Family. 1992 World Network Data Book/Handbook",
  37. AMD, 1992 [(800) 222-9323].
  38. 3) "Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE)",
  39. AMD, Pub. #17881, May 1993.
  40. 4) "Am79C960 PCnet-ISA(tm), Single-Chip Ethernet Controller for ISA",
  41. AMD, Pub. #16907, May 1992
  42. 5) "DEC EtherWORKS LC Ethernet Controller Owners Manual",
  43. Digital Equipment corporation, 1990, Pub. #EK-DE100-OM.003
  44. 6) "DEC EtherWORKS Turbo Ethernet Controller Owners Manual",
  45. Digital Equipment corporation, 1990, Pub. #EK-DE200-OM.003
  46. 7) "DEPCA Hardware Reference Manual", Pub. #EK-DEPCA-PR
  47. Digital Equipment Corporation, 1989
  48. 8) "DEC EtherWORKS Turbo_(TP BNC) Ethernet Controller Owners Manual",
  49. Digital Equipment corporation, 1991, Pub. #EK-DE202-OM.001
  50. Peter Bauer's depca.c (V0.5) was referred to when debugging V0.1 of this
  51. driver.
  52. The original DEPCA card requires that the ethernet ROM address counter
  53. be enabled to count and has an 8 bit NICSR. The ROM counter enabling is
  54. only done when a 0x08 is read as the first address octet (to minimise
  55. the chances of writing over some other hardware's I/O register). The
  56. NICSR accesses have been changed to byte accesses for all the cards
  57. supported by this driver, since there is only one useful bit in the MSB
  58. (remote boot timeout) and it is not used. Also, there is a maximum of
  59. only 48kB network RAM for this card. My thanks to Torbjorn Lindh for
  60. help debugging all this (and holding my feet to the fire until I got it
  61. right).
  62. The DE200 series boards have on-board 64kB RAM for use as a shared
  63. memory network buffer. Only the DE100 cards make use of a 2kB buffer
  64. mode which has not been implemented in this driver (only the 32kB and
  65. 64kB modes are supported [16kB/48kB for the original DEPCA]).
  66. At the most only 2 DEPCA cards can be supported on the ISA bus because
  67. there is only provision for two I/O base addresses on each card (0x300
  68. and 0x200). The I/O address is detected by searching for a byte sequence
  69. in the Ethernet station address PROM at the expected I/O address for the
  70. Ethernet PROM. The shared memory base address is 'autoprobed' by
  71. looking for the self test PROM and detecting the card name. When a
  72. second DEPCA is detected, information is placed in the base_addr
  73. variable of the next device structure (which is created if necessary),
  74. thus enabling ethif_probe initialization for the device. More than 2
  75. EISA cards can be supported, but care will be needed assigning the
  76. shared memory to ensure that each slot has the correct IRQ, I/O address
  77. and shared memory address assigned.
  78. ************************************************************************
  79. NOTE: If you are using two ISA DEPCAs, it is important that you assign
  80. the base memory addresses correctly. The driver autoprobes I/O 0x300
  81. then 0x200. The base memory address for the first device must be less
  82. than that of the second so that the auto probe will correctly assign the
  83. I/O and memory addresses on the same card. I can't think of a way to do
  84. this unambiguously at the moment, since there is nothing on the cards to
  85. tie I/O and memory information together.
  86. I am unable to test 2 cards together for now, so this code is
  87. unchecked. All reports, good or bad, are welcome.
  88. ************************************************************************
  89. The board IRQ setting must be at an unused IRQ which is auto-probed
  90. using Donald Becker's autoprobe routines. DEPCA and DE100 board IRQs are
  91. {2,3,4,5,7}, whereas the DE200 is at {5,9,10,11,15}. Note that IRQ2 is
  92. really IRQ9 in machines with 16 IRQ lines.
  93. No 16MB memory limitation should exist with this driver as DMA is not
  94. used and the common memory area is in low memory on the network card (my
  95. current system has 20MB and I've not had problems yet).
  96. The ability to load this driver as a loadable module has been added. To
  97. utilise this ability, you have to do <8 things:
  98. 0) have a copy of the loadable modules code installed on your system.
  99. 1) copy depca.c from the /linux/drivers/net directory to your favourite
  100. temporary directory.
  101. 2) if you wish, edit the source code near line 1530 to reflect the I/O
  102. address and IRQ you're using (see also 5).
  103. 3) compile depca.c, but include -DMODULE in the command line to ensure
  104. that the correct bits are compiled (see end of source code).
  105. 4) if you are wanting to add a new card, goto 5. Otherwise, recompile a
  106. kernel with the depca configuration turned off and reboot.
  107. 5) insmod depca.o [irq=7] [io=0x200] [mem=0xd0000] [adapter_name=DE100]
  108. [Alan Cox: Changed the code to allow command line irq/io assignments]
  109. [Dave Davies: Changed the code to allow command line mem/name
  110. assignments]
  111. 6) run the net startup bits for your eth?? interface manually
  112. (usually /etc/rc.inet[12] at boot time).
  113. 7) enjoy!
  114. Note that autoprobing is not allowed in loadable modules - the system is
  115. already up and running and you're messing with interrupts.
  116. To unload a module, turn off the associated interface
  117. 'ifconfig eth?? down' then 'rmmod depca'.
  118. To assign a base memory address for the shared memory when running as a
  119. loadable module, see 5 above. To include the adapter name (if you have
  120. no PROM but know the card name) also see 5 above. Note that this last
  121. option will not work with kernel built-in depca's.
  122. The shared memory assignment for a loadable module makes sense to avoid
  123. the 'memory autoprobe' picking the wrong shared memory (for the case of
  124. 2 depca's in a PC).
  125. ************************************************************************
  126. Support for MCA EtherWORKS cards added 11-3-98.
  127. Verified to work with up to 2 DE212 cards in a system (although not
  128. fully stress-tested).
  129. Currently known bugs/limitations:
  130. Note: with the MCA stuff as a module, it trusts the MCA configuration,
  131. not the command line for IRQ and memory address. You can
  132. specify them if you want, but it will throw your values out.
  133. You still have to pass the IO address it was configured as
  134. though.
  135. ************************************************************************
  136. TO DO:
  137. ------
  138. Revision History
  139. ----------------
  140. Version Date Description
  141. 0.1 25-jan-94 Initial writing.
  142. 0.2 27-jan-94 Added LANCE TX hardware buffer chaining.
  143. 0.3 1-feb-94 Added multiple DEPCA support.
  144. 0.31 4-feb-94 Added DE202 recognition.
  145. 0.32 19-feb-94 Tidy up. Improve multi-DEPCA support.
  146. 0.33 25-feb-94 Fix DEPCA ethernet ROM counter enable.
  147. Add jabber packet fix from murf@perftech.com
  148. and becker@super.org
  149. 0.34 7-mar-94 Fix DEPCA max network memory RAM & NICSR access.
  150. 0.35 8-mar-94 Added DE201 recognition. Tidied up.
  151. 0.351 30-apr-94 Added EISA support. Added DE422 recognition.
  152. 0.36 16-may-94 DE422 fix released.
  153. 0.37 22-jul-94 Added MODULE support
  154. 0.38 15-aug-94 Added DBR ROM switch in depca_close().
  155. Multi DEPCA bug fix.
  156. 0.38axp 15-sep-94 Special version for Alpha AXP Linux V1.0.
  157. 0.381 12-dec-94 Added DE101 recognition, fix multicast bug.
  158. 0.382 9-feb-95 Fix recognition bug reported by <bkm@star.rl.ac.uk>.
  159. 0.383 22-feb-95 Fix for conflict with VESA SCSI reported by
  160. <stromain@alf.dec.com>
  161. 0.384 17-mar-95 Fix a ring full bug reported by <bkm@star.rl.ac.uk>
  162. 0.385 3-apr-95 Fix a recognition bug reported by
  163. <ryan.niemi@lastfrontier.com>
  164. 0.386 21-apr-95 Fix the last fix...sorry, must be galloping senility
  165. 0.40 25-May-95 Rewrite for portability & updated.
  166. ALPHA support from <jestabro@amt.tay1.dec.com>
  167. 0.41 26-Jun-95 Added verify_area() calls in depca_ioctl() from
  168. suggestion by <heiko@colossus.escape.de>
  169. 0.42 27-Dec-95 Add 'mem' shared memory assignment for loadable
  170. modules.
  171. Add 'adapter_name' for loadable modules when no PROM.
  172. Both above from a suggestion by
  173. <pchen@woodruffs121.residence.gatech.edu>.
  174. Add new multicasting code.
  175. 0.421 22-Apr-96 Fix alloc_device() bug <jari@markkus2.fimr.fi>
  176. 0.422 29-Apr-96 Fix depca_hw_init() bug <jari@markkus2.fimr.fi>
  177. 0.423 7-Jun-96 Fix module load bug <kmg@barco.be>
  178. 0.43 16-Aug-96 Update alloc_device() to conform to de4x5.c
  179. 0.44 1-Sep-97 Fix *_probe() to test check_region() first - bug
  180. reported by <mmogilvi@elbert.uccs.edu>
  181. 0.45 3-Nov-98 Added support for MCA EtherWORKS (DE210/DE212) cards
  182. by <tymm@computer.org>
  183. 0.451 5-Nov-98 Fixed mca stuff cuz I'm a dummy. <tymm@computer.org>
  184. 0.5 14-Nov-98 Re-spin for 2.1.x kernels.
  185. 0.51 27-Jun-99 Correct received packet length for CRC from
  186. report by <worm@dkik.dk>
  187. =========================================================================
  188. */
  189. #include "etherboot.h"
  190. #include "nic.h"
  191. #include "cards.h"
  192. /*
  193. ** I/O addresses. Note that the 2k buffer option is not supported in
  194. ** this driver.
  195. */
  196. #define DEPCA_NICSR ioaddr+0x00 /* Network interface CSR */
  197. #define DEPCA_RBI ioaddr+0x02 /* RAM buffer index (2k buffer mode) */
  198. #define DEPCA_DATA ioaddr+0x04 /* LANCE registers' data port */
  199. #define DEPCA_ADDR ioaddr+0x06 /* LANCE registers' address port */
  200. #define DEPCA_HBASE ioaddr+0x08 /* EISA high memory base address reg. */
  201. #define DEPCA_PROM ioaddr+0x0c /* Ethernet address ROM data port */
  202. #define DEPCA_CNFG ioaddr+0x0c /* EISA Configuration port */
  203. #define DEPCA_RBSA ioaddr+0x0e /* RAM buffer starting address (2k buff.) */
  204. /*
  205. ** These are LANCE registers addressable through DEPCA_ADDR
  206. */
  207. #define CSR0 0
  208. #define CSR1 1
  209. #define CSR2 2
  210. #define CSR3 3
  211. /*
  212. ** NETWORK INTERFACE CSR (NI_CSR) bit definitions
  213. */
  214. #define TO 0x0100 /* Time Out for remote boot */
  215. #define SHE 0x0080 /* SHadow memory Enable */
  216. #define BS 0x0040 /* Bank Select */
  217. #define BUF 0x0020 /* BUFfer size (1->32k, 0->64k) */
  218. #define RBE 0x0010 /* Remote Boot Enable (1->net boot) */
  219. #define AAC 0x0008 /* Address ROM Address Counter (1->enable) */
  220. #define _128KB 0x0008 /* 128kB Network RAM (1->enable) */
  221. #define IM 0x0004 /* Interrupt Mask (1->mask) */
  222. #define IEN 0x0002 /* Interrupt tristate ENable (1->enable) */
  223. #define LED 0x0001 /* LED control */
  224. /*
  225. ** Control and Status Register 0 (CSR0) bit definitions
  226. */
  227. #define ERR 0x8000 /* Error summary */
  228. #define BABL 0x4000 /* Babble transmitter timeout error */
  229. #define CERR 0x2000 /* Collision Error */
  230. #define MISS 0x1000 /* Missed packet */
  231. #define MERR 0x0800 /* Memory Error */
  232. #define RINT 0x0400 /* Receiver Interrupt */
  233. #define TINT 0x0200 /* Transmit Interrupt */
  234. #define IDON 0x0100 /* Initialization Done */
  235. #define INTR 0x0080 /* Interrupt Flag */
  236. #define INEA 0x0040 /* Interrupt Enable */
  237. #define RXON 0x0020 /* Receiver on */
  238. #define TXON 0x0010 /* Transmitter on */
  239. #define TDMD 0x0008 /* Transmit Demand */
  240. #define STOP 0x0004 /* Stop */
  241. #define STRT 0x0002 /* Start */
  242. #define INIT 0x0001 /* Initialize */
  243. #define INTM 0xff00 /* Interrupt Mask */
  244. #define INTE 0xfff0 /* Interrupt Enable */
  245. /*
  246. ** CONTROL AND STATUS REGISTER 3 (CSR3)
  247. */
  248. #define BSWP 0x0004 /* Byte SWaP */
  249. #define ACON 0x0002 /* ALE control */
  250. #define BCON 0x0001 /* Byte CONtrol */
  251. /*
  252. ** Initialization Block Mode Register
  253. */
  254. #define PROM 0x8000 /* Promiscuous Mode */
  255. #define EMBA 0x0080 /* Enable Modified Back-off Algorithm */
  256. #define INTL 0x0040 /* Internal Loopback */
  257. #define DRTY 0x0020 /* Disable Retry */
  258. #define COLL 0x0010 /* Force Collision */
  259. #define DTCR 0x0008 /* Disable Transmit CRC */
  260. #define LOOP 0x0004 /* Loopback */
  261. #define DTX 0x0002 /* Disable the Transmitter */
  262. #define DRX 0x0001 /* Disable the Receiver */
  263. /*
  264. ** Receive Message Descriptor 1 (RMD1) bit definitions.
  265. */
  266. #define R_OWN 0x80000000 /* Owner bit 0 = host, 1 = lance */
  267. #define R_ERR 0x4000 /* Error Summary */
  268. #define R_FRAM 0x2000 /* Framing Error */
  269. #define R_OFLO 0x1000 /* Overflow Error */
  270. #define R_CRC 0x0800 /* CRC Error */
  271. #define R_BUFF 0x0400 /* Buffer Error */
  272. #define R_STP 0x0200 /* Start of Packet */
  273. #define R_ENP 0x0100 /* End of Packet */
  274. /*
  275. ** Transmit Message Descriptor 1 (TMD1) bit definitions.
  276. */
  277. #define T_OWN 0x80000000 /* Owner bit 0 = host, 1 = lance */
  278. #define T_ERR 0x4000 /* Error Summary */
  279. #define T_ADD_FCS 0x2000 /* More the 1 retry needed to Xmit */
  280. #define T_MORE 0x1000 /* >1 retry to transmit packet */
  281. #define T_ONE 0x0800 /* 1 try needed to transmit the packet */
  282. #define T_DEF 0x0400 /* Deferred */
  283. #define T_STP 0x02000000 /* Start of Packet */
  284. #define T_ENP 0x01000000 /* End of Packet */
  285. #define T_FLAGS 0xff000000 /* TX Flags Field */
  286. /*
  287. ** Transmit Message Descriptor 3 (TMD3) bit definitions.
  288. */
  289. #define TMD3_BUFF 0x8000 /* BUFFer error */
  290. #define TMD3_UFLO 0x4000 /* UnderFLOw error */
  291. #define TMD3_RES 0x2000 /* REServed */
  292. #define TMD3_LCOL 0x1000 /* Late COLlision */
  293. #define TMD3_LCAR 0x0800 /* Loss of CARrier */
  294. #define TMD3_RTRY 0x0400 /* ReTRY error */
  295. /*
  296. ** Ethernet PROM defines
  297. */
  298. #define PROBE_LENGTH 32
  299. /*
  300. ** Set the number of Tx and Rx buffers. Ensure that the memory requested
  301. ** here is <= to the amount of shared memory set up by the board switches.
  302. ** The number of descriptors MUST BE A POWER OF 2.
  303. **
  304. ** total_memory = NUM_RX_DESC*(8+RX_BUFF_SZ) + NUM_TX_DESC*(8+TX_BUFF_SZ)
  305. */
  306. #define NUM_RX_DESC 2 /* Number of RX descriptors */
  307. #define NUM_TX_DESC 2 /* Number of TX descriptors */
  308. #define RX_BUFF_SZ 1536 /* Buffer size for each Rx buffer */
  309. #define TX_BUFF_SZ 1536 /* Buffer size for each Tx buffer */
  310. /*
  311. ** ISA Bus defines
  312. */
  313. #define DEPCA_IO_PORTS {0x300, 0x200, 0}
  314. #ifndef DEPCA_MODEL
  315. #define DEPCA_MODEL DEPCA
  316. #endif
  317. static enum {
  318. DEPCA, DE100, DE101, DE200, DE201, DE202, DE210, DE212, DE422, unknown
  319. } adapter = DEPCA_MODEL;
  320. /*
  321. ** Name <-> Adapter mapping
  322. */
  323. static char *adapter_name[] = {
  324. "DEPCA",
  325. "DE100","DE101",
  326. "DE200","DE201","DE202",
  327. "DE210","DE212",
  328. "DE422",
  329. ""
  330. };
  331. #ifndef DEPCA_RAM_BASE
  332. #define DEPCA_RAM_BASE 0xd0000
  333. #endif
  334. /*
  335. ** Memory Alignment. Each descriptor is 4 longwords long. To force a
  336. ** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and
  337. ** DESC_ALIGN. ALIGN aligns the start address of the private memory area
  338. ** and hence the RX descriptor ring's first entry.
  339. */
  340. #define ALIGN4 ((u32)4 - 1) /* 1 longword align */
  341. #define ALIGN8 ((u32)8 - 1) /* 2 longword (quadword) align */
  342. #define ALIGN ALIGN8 /* Keep the LANCE happy... */
  343. typedef long s32;
  344. typedef unsigned long u32;
  345. typedef short s16;
  346. typedef unsigned short u16;
  347. typedef char s8;
  348. typedef unsigned char u8;
  349. /*
  350. ** The DEPCA Rx and Tx ring descriptors.
  351. */
  352. struct depca_rx_desc {
  353. volatile s32 base;
  354. s16 buf_length; /* This length is negative 2's complement! */
  355. s16 msg_length; /* This length is "normal". */
  356. };
  357. struct depca_tx_desc {
  358. volatile s32 base;
  359. s16 length; /* This length is negative 2's complement! */
  360. s16 misc; /* Errors and TDR info */
  361. };
  362. #define LA_MASK 0x0000ffff /* LANCE address mask for mapping network RAM
  363. to LANCE memory address space */
  364. /*
  365. ** The Lance initialization block, described in databook, in common memory.
  366. */
  367. struct depca_init {
  368. u16 mode; /* Mode register */
  369. u8 phys_addr[ETH_ALEN]; /* Physical ethernet address */
  370. u8 mcast_table[8]; /* Multicast Hash Table. */
  371. u32 rx_ring; /* Rx ring base pointer & ring length */
  372. u32 tx_ring; /* Tx ring base pointer & ring length */
  373. };
  374. struct depca_private {
  375. struct depca_rx_desc *rx_ring;
  376. struct depca_tx_desc *tx_ring;
  377. struct depca_init init_block; /* Shadow init block */
  378. char *rx_memcpy[NUM_RX_DESC];
  379. char *tx_memcpy[NUM_TX_DESC];
  380. u32 bus_offset; /* ISA bus address offset */
  381. u32 sh_mem; /* address of shared mem */
  382. u32 dma_buffs; /* Rx & Tx buffer start */
  383. int rx_cur, tx_cur; /* Next free ring entry */
  384. int txRingMask, rxRingMask;
  385. s32 rx_rlen, tx_rlen;
  386. /* log2([rt]xRingMask+1) for the descriptors */
  387. };
  388. static Address mem_start = DEPCA_RAM_BASE;
  389. static Address mem_len, offset;
  390. static unsigned short ioaddr = 0;
  391. static struct depca_private lp;
  392. /*
  393. ** Miscellaneous defines...
  394. */
  395. #define STOP_DEPCA \
  396. outw(CSR0, DEPCA_ADDR);\
  397. outw(STOP, DEPCA_DATA)
  398. /* Initialize the lance Rx and Tx descriptor rings. */
  399. static void depca_init_ring(struct nic *nic)
  400. {
  401. int i;
  402. u32 p;
  403. lp.rx_cur = lp.tx_cur = 0;
  404. /* Initialize the base addresses and length of each buffer in the ring */
  405. for (i = 0; i <= lp.rxRingMask; i++) {
  406. writel((p = lp.dma_buffs + i * RX_BUFF_SZ) | R_OWN, &lp.rx_ring[i].base);
  407. writew(-RX_BUFF_SZ, &lp.rx_ring[i].buf_length);
  408. lp.rx_memcpy[i] = (char *) (p + lp.bus_offset);
  409. }
  410. for (i = 0; i <= lp.txRingMask; i++) {
  411. writel((p = lp.dma_buffs + (i + lp.txRingMask + 1) * TX_BUFF_SZ) & 0x00ffffff, &lp.tx_ring[i].base);
  412. lp.tx_memcpy[i] = (char *) (p + lp.bus_offset);
  413. }
  414. /* Set up the initialization block */
  415. lp.init_block.rx_ring = ((u32) ((u32) lp.rx_ring) & LA_MASK) | lp.rx_rlen;
  416. lp.init_block.tx_ring = ((u32) ((u32) lp.tx_ring) & LA_MASK) | lp.tx_rlen;
  417. for (i = 0; i < ETH_ALEN; i++)
  418. lp.init_block.phys_addr[i] = nic->node_addr[i];
  419. lp.init_block.mode = 0x0000; /* Enable the Tx and Rx */
  420. memset(lp.init_block.mcast_table, 0, sizeof(lp.init_block.mcast_table));
  421. }
  422. static void LoadCSRs(void)
  423. {
  424. outw(CSR1, DEPCA_ADDR); /* initialisation block address LSW */
  425. outw((u16) (lp.sh_mem & LA_MASK), DEPCA_DATA);
  426. outw(CSR2, DEPCA_ADDR); /* initialisation block address MSW */
  427. outw((u16) ((lp.sh_mem & LA_MASK) >> 16), DEPCA_DATA);
  428. outw(CSR3, DEPCA_ADDR); /* ALE control */
  429. outw(ACON, DEPCA_DATA);
  430. outw(CSR0, DEPCA_ADDR); /* Point back to CSR0 */
  431. }
  432. static int InitRestartDepca(void)
  433. {
  434. int i;
  435. /* Copy the shadow init_block to shared memory */
  436. memcpy_toio((char *)lp.sh_mem, &lp.init_block, sizeof(struct depca_init));
  437. outw(CSR0, DEPCA_ADDR); /* point back to CSR0 */
  438. outw(INIT, DEPCA_DATA); /* initialise DEPCA */
  439. for (i = 0; i < 100 && !(inw(DEPCA_DATA) & IDON); i++)
  440. ;
  441. if (i < 100) {
  442. /* clear IDON by writing a 1, and start LANCE */
  443. outw(IDON | STRT, DEPCA_DATA);
  444. } else {
  445. printf("DEPCA not initialised\n");
  446. return (1);
  447. }
  448. return (0);
  449. }
  450. /**************************************************************************
  451. RESET - Reset adapter
  452. ***************************************************************************/
  453. static void depca_reset(struct nic *nic)
  454. {
  455. s16 nicsr;
  456. int i, j;
  457. STOP_DEPCA;
  458. nicsr = inb(DEPCA_NICSR);
  459. nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
  460. outb(nicsr, DEPCA_NICSR);
  461. if (inw(DEPCA_DATA) != STOP)
  462. {
  463. printf("depca: Cannot stop NIC\n");
  464. return;
  465. }
  466. /* Initialisation block */
  467. lp.sh_mem = mem_start;
  468. mem_start += sizeof(struct depca_init);
  469. /* Tx & Rx descriptors (aligned to a quadword boundary) */
  470. mem_start = (mem_start + ALIGN) & ~ALIGN;
  471. lp.rx_ring = (struct depca_rx_desc *) mem_start;
  472. mem_start += (sizeof(struct depca_rx_desc) * NUM_RX_DESC);
  473. lp.tx_ring = (struct depca_tx_desc *) mem_start;
  474. mem_start += (sizeof(struct depca_tx_desc) * NUM_TX_DESC);
  475. lp.bus_offset = mem_start & 0x00ff0000;
  476. /* LANCE re-mapped start address */
  477. lp.dma_buffs = mem_start & LA_MASK;
  478. /* Finish initialising the ring information. */
  479. lp.rxRingMask = NUM_RX_DESC - 1;
  480. lp.txRingMask = NUM_TX_DESC - 1;
  481. /* Calculate Tx/Rx RLEN size for the descriptors. */
  482. for (i = 0, j = lp.rxRingMask; j > 0; i++) {
  483. j >>= 1;
  484. }
  485. lp.rx_rlen = (s32) (i << 29);
  486. for (i = 0, j = lp.txRingMask; j > 0; i++) {
  487. j >>= 1;
  488. }
  489. lp.tx_rlen = (s32) (i << 29);
  490. /* Load the initialisation block */
  491. depca_init_ring(nic);
  492. LoadCSRs();
  493. InitRestartDepca();
  494. }
  495. /**************************************************************************
  496. POLL - Wait for a frame
  497. ***************************************************************************/
  498. static int depca_poll(struct nic *nic)
  499. {
  500. int entry;
  501. u32 status;
  502. entry = lp.rx_cur;
  503. if ((status = readl(&lp.rx_ring[entry].base) & R_OWN))
  504. return (0);
  505. memcpy(nic->packet, lp.rx_memcpy[entry], nic->packetlen = lp.rx_ring[entry].msg_length);
  506. lp.rx_ring[entry].base |= R_OWN;
  507. lp.rx_cur = (++lp.rx_cur) & lp.rxRingMask;
  508. return (1);
  509. }
  510. /**************************************************************************
  511. TRANSMIT - Transmit a frame
  512. ***************************************************************************/
  513. static void depca_transmit(
  514. struct nic *nic,
  515. const char *d, /* Destination */
  516. unsigned int t, /* Type */
  517. unsigned int s, /* size */
  518. const char *p) /* Packet */
  519. {
  520. int entry, len;
  521. char *mem;
  522. /* send the packet to destination */
  523. /*
  524. ** Caution: the right order is important here... dont
  525. ** setup the ownership rights until all the other
  526. ** information is in place
  527. */
  528. mem = lp.tx_memcpy[entry = lp.tx_cur];
  529. memcpy_toio(mem, d, ETH_ALEN);
  530. memcpy_toio(mem + ETH_ALEN, nic->node_addr, ETH_ALEN);
  531. mem[ETH_ALEN * 2] = t >> 8;
  532. mem[ETH_ALEN * 2 + 1] = t;
  533. memcpy_toio(mem + ETH_HLEN, p, s);
  534. s += ETH_HLEN;
  535. len = (s < ETH_ZLEN ? ETH_ZLEN : s);
  536. /* clean out flags */
  537. writel(readl(&lp.tx_ring[entry].base) & ~T_FLAGS, &lp.tx_ring[entry].base);
  538. /* clears other error flags */
  539. writew(0x0000, &lp.tx_ring[entry].misc);
  540. /* packet length in buffer */
  541. writew(-len, &lp.tx_ring[entry].length);
  542. /* start and end of packet, ownership */
  543. writel(readl(&lp.tx_ring[entry].base) | (T_STP|T_ENP|T_OWN), &lp.tx_ring[entry].base);
  544. /* update current pointers */
  545. lp.tx_cur = (++lp.tx_cur) & lp.txRingMask;
  546. }
  547. /**************************************************************************
  548. DISABLE - Turn off ethernet interface
  549. ***************************************************************************/
  550. static void depca_disable(struct nic *nic)
  551. {
  552. STOP_DEPCA;
  553. }
  554. /*
  555. ** Look for a special sequence in the Ethernet station address PROM that
  556. ** is common across all DEPCA products. Note that the original DEPCA needs
  557. ** its ROM address counter to be initialized and enabled. Only enable
  558. ** if the first address octet is a 0x08 - this minimises the chances of
  559. ** messing around with some other hardware, but it assumes that this DEPCA
  560. ** card initialized itself correctly.
  561. **
  562. ** Search the Ethernet address ROM for the signature. Since the ROM address
  563. ** counter can start at an arbitrary point, the search must include the entire
  564. ** probe sequence length plus the (length_of_the_signature - 1).
  565. ** Stop the search IMMEDIATELY after the signature is found so that the
  566. ** PROM address counter is correctly positioned at the start of the
  567. ** ethernet address for later read out.
  568. */
  569. static int depca_probe1(struct nic *nic)
  570. {
  571. u8 data, nicsr;
  572. /* This is only correct for little endian machines, but then
  573. Etherboot doesn't work on anything but a PC */
  574. u8 sig[] = { 0xFF, 0x00, 0x55, 0xAA, 0xFF, 0x00, 0x55, 0xAA };
  575. int i, j;
  576. long sum, chksum;
  577. data = inb(DEPCA_PROM); /* clear counter on DEPCA */
  578. data = inb(DEPCA_PROM); /* read data */
  579. if (data == 0x8) {
  580. nicsr = inb(DEPCA_NICSR);
  581. nicsr |= AAC;
  582. outb(nicsr, DEPCA_NICSR);
  583. }
  584. for (i = 0, j = 0; j < (int)sizeof(sig) && i < PROBE_LENGTH+((int)sizeof(sig))-1; ++i) {
  585. data = inb(DEPCA_PROM);
  586. if (data == sig[j]) /* track signature */
  587. ++j;
  588. else
  589. j = (data == sig[0]) ? 1 : 0;
  590. }
  591. if (j != sizeof(sig))
  592. return (0);
  593. /* put the card in its initial state */
  594. STOP_DEPCA;
  595. nicsr = ((inb(DEPCA_NICSR) & ~SHE & ~RBE & ~IEN) | IM);
  596. outb(nicsr, DEPCA_NICSR);
  597. if (inw(DEPCA_DATA) != STOP)
  598. return (0);
  599. memcpy((char *)mem_start, sig, sizeof(sig));
  600. if (memcmp((char *)mem_start, sig, sizeof(sig)) != 0)
  601. return (0);
  602. for (i = 0, j = 0, sum = 0; j < 3; j++) {
  603. sum <<= 1;
  604. if (sum > 0xFFFF)
  605. sum -= 0xFFFF;
  606. sum += (u8)(nic->node_addr[i++] = inb(DEPCA_PROM));
  607. sum += (u16)((nic->node_addr[i++] = inb(DEPCA_PROM)) << 8);
  608. if (sum > 0xFFFF)
  609. sum -= 0xFFFF;
  610. }
  611. if (sum == 0xFFFF)
  612. sum = 0;
  613. chksum = (u8)inb(DEPCA_PROM);
  614. chksum |= (u16)(inb(DEPCA_PROM) << 8);
  615. mem_len = (adapter == DEPCA) ? (48 << 10) : (64 << 10);
  616. offset = 0;
  617. if (nicsr & BUF) {
  618. offset = 0x8000;
  619. nicsr &= ~BS;
  620. mem_len -= (32 << 10);
  621. }
  622. if (adapter != DEPCA) /* enable shadow RAM */
  623. outb(nicsr |= SHE, DEPCA_NICSR);
  624. printf("%s base %#hX, memory [%#hX-%#hX], addr %!",
  625. adapter_name[adapter], ioaddr, mem_start, mem_start + mem_len,
  626. nic->node_addr);
  627. if (sum != chksum)
  628. printf(" (bad checksum)");
  629. putchar('\n');
  630. return (1);
  631. }
  632. /**************************************************************************
  633. PROBE - Look for an adapter, this routine's visible to the outside
  634. ***************************************************************************/
  635. struct nic *depca_probe(struct nic *nic, unsigned short *probe_addrs)
  636. {
  637. static unsigned short base[] = DEPCA_IO_PORTS;
  638. int i;
  639. if (probe_addrs == 0 || probe_addrs[0] == 0)
  640. probe_addrs = base; /* Use defaults */
  641. for (i = 0; (ioaddr = base[i]) != 0; ++i) {
  642. if (depca_probe1(nic))
  643. break;
  644. }
  645. if (ioaddr == 0)
  646. return (0);
  647. depca_reset(nic);
  648. /* point to NIC specific routines */
  649. nic->reset = depca_reset;
  650. nic->poll = depca_poll;
  651. nic->transmit = depca_transmit;
  652. nic->disable = depca_disable;
  653. return (nic);
  654. }