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