|
|
1.1 root 1: /* depca.c: A DIGITAL DEPCA & EtherWORKS ethernet driver for linux.
2:
3: Written 1994, 1995 by David C. Davies.
4:
5:
6: Copyright 1994 David C. Davies
7: and
8: United States Government
9: (as represented by the Director, National Security Agency).
10:
11: Copyright 1995 Digital Equipment Corporation.
12:
13:
14: This software may be used and distributed according to the terms of
15: the GNU Public License, incorporated herein by reference.
16:
17: This driver is written for the Digital Equipment Corporation series
18: of DEPCA and EtherWORKS ethernet cards:
19:
20: DEPCA (the original)
21: DE100
22: DE101
23: DE200 Turbo
24: DE201 Turbo
25: DE202 Turbo (TP BNC)
26: DE210
27: DE422 (EISA)
28:
29: The driver has been tested on DE100, DE200 and DE202 cards in a
30: relatively busy network. The DE422 has been tested a little.
31:
32: This driver will NOT work for the DE203, DE204 and DE205 series of
33: cards, since they have a new custom ASIC in place of the AMD LANCE
34: chip. See the 'ewrk3.c' driver in the Linux source tree for running
35: those cards.
36:
37: I have benchmarked the driver with a DE100 at 595kB/s to (542kB/s from)
38: a DECstation 5000/200.
39:
40: The author may be reached at [email protected]
41:
42: =========================================================================
43:
44: The driver was originally based on the 'lance.c' driver from Donald
45: Becker which is included with the standard driver distribution for
46: linux. V0.4 is a complete re-write with only the kernel interface
47: remaining from the original code.
48:
49: 1) Lance.c code in /linux/drivers/net/
50: 2) "Ethernet/IEEE 802.3 Family. 1992 World Network Data Book/Handbook",
51: AMD, 1992 [(800) 222-9323].
52: 3) "Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE)",
53: AMD, Pub. #17881, May 1993.
54: 4) "Am79C960 PCnet-ISA(tm), Single-Chip Ethernet Controller for ISA",
55: AMD, Pub. #16907, May 1992
56: 5) "DEC EtherWORKS LC Ethernet Controller Owners Manual",
57: Digital Equipment corporation, 1990, Pub. #EK-DE100-OM.003
58: 6) "DEC EtherWORKS Turbo Ethernet Controller Owners Manual",
59: Digital Equipment corporation, 1990, Pub. #EK-DE200-OM.003
60: 7) "DEPCA Hardware Reference Manual", Pub. #EK-DEPCA-PR
61: Digital Equipment Corporation, 1989
62: 8) "DEC EtherWORKS Turbo_(TP BNC) Ethernet Controller Owners Manual",
63: Digital Equipment corporation, 1991, Pub. #EK-DE202-OM.001
64:
65:
66: Peter Bauer's depca.c (V0.5) was referred to when debugging V0.1 of this
67: driver.
68:
69: The original DEPCA card requires that the ethernet ROM address counter
70: be enabled to count and has an 8 bit NICSR. The ROM counter enabling is
71: only done when a 0x08 is read as the first address octet (to minimise
72: the chances of writing over some other hardware's I/O register). The
73: NICSR accesses have been changed to byte accesses for all the cards
74: supported by this driver, since there is only one useful bit in the MSB
75: (remote boot timeout) and it is not used. Also, there is a maximum of
76: only 48kB network RAM for this card. My thanks to Torbjorn Lindh for
77: help debugging all this (and holding my feet to the fire until I got it
78: right).
79:
80: The DE200 series boards have on-board 64kB RAM for use as a shared
81: memory network buffer. Only the DE100 cards make use of a 2kB buffer
82: mode which has not been implemented in this driver (only the 32kB and
83: 64kB modes are supported [16kB/48kB for the original DEPCA]).
84:
85: At the most only 2 DEPCA cards can be supported on the ISA bus because
86: there is only provision for two I/O base addresses on each card (0x300
87: and 0x200). The I/O address is detected by searching for a byte sequence
88: in the Ethernet station address PROM at the expected I/O address for the
89: Ethernet PROM. The shared memory base address is 'autoprobed' by
90: looking for the self test PROM and detecting the card name. When a
91: second DEPCA is detected, information is placed in the base_addr
92: variable of the next device structure (which is created if necessary),
93: thus enabling ethif_probe initialization for the device. More than 2
94: EISA cards can be supported, but care will be needed assigning the
95: shared memory to ensure that each slot has the correct IRQ, I/O address
96: and shared memory address assigned.
97:
98: ************************************************************************
99:
100: NOTE: If you are using two ISA DEPCAs, it is important that you assign
101: the base memory addresses correctly. The driver autoprobes I/O 0x300
102: then 0x200. The base memory address for the first device must be less
103: than that of the second so that the auto probe will correctly assign the
104: I/O and memory addresses on the same card. I can't think of a way to do
105: this unambiguously at the moment, since there is nothing on the cards to
106: tie I/O and memory information together.
107:
108: I am unable to test 2 cards together for now, so this code is
109: unchecked. All reports, good or bad, are welcome.
110:
111: ************************************************************************
112:
113: The board IRQ setting must be at an unused IRQ which is auto-probed
114: using Donald Becker's autoprobe routines. DEPCA and DE100 board IRQs are
115: {2,3,4,5,7}, whereas the DE200 is at {5,9,10,11,15}. Note that IRQ2 is
116: really IRQ9 in machines with 16 IRQ lines.
117:
118: No 16MB memory limitation should exist with this driver as DMA is not
119: used and the common memory area is in low memory on the network card (my
120: current system has 20MB and I've not had problems yet).
121:
122: The ability to load this driver as a loadable module has been added. To
123: utilise this ability, you have to do <8 things:
124:
125: 0) have a copy of the loadable modules code installed on your system.
126: 1) copy depca.c from the /linux/drivers/net directory to your favourite
127: temporary directory.
128: 2) if you wish, edit the source code near line 1530 to reflect the I/O
129: address and IRQ you're using (see also 5).
130: 3) compile depca.c, but include -DMODULE in the command line to ensure
131: that the correct bits are compiled (see end of source code).
132: 4) if you are wanting to add a new card, goto 5. Otherwise, recompile a
133: kernel with the depca configuration turned off and reboot.
134: 5) insmod depca.o [irq=7] [io=0x200] [mem=0xd0000] [adapter_name=DE100]
135: [Alan Cox: Changed the code to allow command line irq/io assignments]
136: [Dave Davies: Changed the code to allow command line mem/name
137: assignments]
138: 6) run the net startup bits for your eth?? interface manually
139: (usually /etc/rc.inet[12] at boot time).
140: 7) enjoy!
141:
142: Note that autoprobing is not allowed in loadable modules - the system is
143: already up and running and you're messing with interrupts.
144:
145: To unload a module, turn off the associated interface
146: 'ifconfig eth?? down' then 'rmmod depca'.
147:
148: To assign a base memory address for the shared memory when running as a
149: loadable module, see 5 above. To include the adapter name (if you have
150: no PROM but know the card name) also see 5 above. Note that this last
151: option will not work with kernel built-in depca's.
152:
153: The shared memory assignment for a loadable module makes sense to avoid
154: the 'memory autoprobe' picking the wrong shared memory (for the case of
155: 2 depca's in a PC).
156:
157:
158: TO DO:
159: ------
160:
161:
162: Revision History
163: ----------------
164:
165: Version Date Description
166:
167: 0.1 25-jan-94 Initial writing.
168: 0.2 27-jan-94 Added LANCE TX hardware buffer chaining.
169: 0.3 1-feb-94 Added multiple DEPCA support.
170: 0.31 4-feb-94 Added DE202 recognition.
171: 0.32 19-feb-94 Tidy up. Improve multi-DEPCA support.
172: 0.33 25-feb-94 Fix DEPCA ethernet ROM counter enable.
173: Add jabber packet fix from [email protected]
174: and [email protected]
175: 0.34 7-mar-94 Fix DEPCA max network memory RAM & NICSR access.
176: 0.35 8-mar-94 Added DE201 recognition. Tidied up.
177: 0.351 30-apr-94 Added EISA support. Added DE422 recognition.
178: 0.36 16-may-94 DE422 fix released.
179: 0.37 22-jul-94 Added MODULE support
180: 0.38 15-aug-94 Added DBR ROM switch in depca_close().
181: Multi DEPCA bug fix.
182: 0.38axp 15-sep-94 Special version for Alpha AXP Linux V1.0.
183: 0.381 12-dec-94 Added DE101 recognition, fix multicast bug.
184: 0.382 9-feb-95 Fix recognition bug reported by <[email protected]>.
185: 0.383 22-feb-95 Fix for conflict with VESA SCSI reported by
186: <[email protected]>
187: 0.384 17-mar-95 Fix a ring full bug reported by <[email protected]>
188: 0.385 3-apr-95 Fix a recognition bug reported by
189: <[email protected]>
190: 0.386 21-apr-95 Fix the last fix...sorry, must be galloping senility
191: 0.40 25-May-95 Rewrite for portability & updated.
192: ALPHA support from <[email protected]>
193: 0.41 26-Jun-95 Added verify_area() calls in depca_ioctl() from
194: suggestion by <[email protected]>
195: 0.42 27-Dec-95 Add 'mem' shared memory assignment for loadable
196: modules.
197: Add 'adapter_name' for loadable modules when no PROM.
198: Both above from a suggestion by
199: <[email protected]>.
200: Add new multicasting code.
201: 0.421 22-Apr-96 Fix alloc_device() bug <[email protected]>
202: 0.422 29-Apr-96 Fix depca_hw_init() bug <[email protected]>
203: 0.423 7-Jun-96 Fix module load bug <[email protected]>
204: 0.43 16-Aug-96 Update alloc_device() to conform to de4x5.c
205:
206: =========================================================================
207: */
208:
209: static const char *version = "depca.c:v0.43 96/8/16 [email protected]\n";
210:
211: #include <linux/module.h>
212:
213: #include <linux/kernel.h>
214: #include <linux/sched.h>
215: #include <linux/string.h>
216: #include <linux/ptrace.h>
217: #include <linux/errno.h>
218: #include <linux/ioport.h>
219: #include <linux/malloc.h>
220: #include <linux/interrupt.h>
221: #include <linux/delay.h>
222: #include <asm/segment.h>
223: #include <asm/bitops.h>
224: #include <asm/io.h>
225: #include <asm/dma.h>
226:
227: #include <linux/netdevice.h>
228: #include <linux/etherdevice.h>
229: #include <linux/skbuff.h>
230:
231: #include <linux/time.h>
232: #include <linux/types.h>
233: #include <linux/unistd.h>
234: #include <linux/ctype.h>
235:
236: #include "depca.h"
237:
238: #ifdef DEPCA_DEBUG
239: static int depca_debug = DEPCA_DEBUG;
240: #else
241: static int depca_debug = 1;
242: #endif
243:
244: #define DEPCA_NDA 0xffe0 /* No Device Address */
245:
246: /*
247: ** Ethernet PROM defines
248: */
249: #define PROBE_LENGTH 32
250: #define ETH_PROM_SIG 0xAA5500FFUL
251:
252: /*
253: ** Set the number of Tx and Rx buffers. Ensure that the memory requested
254: ** here is <= to the amount of shared memory set up by the board switches.
255: ** The number of descriptors MUST BE A POWER OF 2.
256: **
257: ** total_memory = NUM_RX_DESC*(8+RX_BUFF_SZ) + NUM_TX_DESC*(8+TX_BUFF_SZ)
258: */
259: #define NUM_RX_DESC 8 /* Number of RX descriptors */
260: #define NUM_TX_DESC 8 /* Number of TX descriptors */
261: #define RX_BUFF_SZ 1536 /* Buffer size for each Rx buffer */
262: #define TX_BUFF_SZ 1536 /* Buffer size for each Tx buffer */
263:
264: #define CRC_POLYNOMIAL_BE 0x04c11db7UL /* Ethernet CRC, big endian */
265: #define CRC_POLYNOMIAL_LE 0xedb88320UL /* Ethernet CRC, little endian */
266:
267: /*
268: ** EISA bus defines
269: */
270: #define DEPCA_EISA_IO_PORTS 0x0c00 /* I/O port base address, slot 0 */
271: #define MAX_EISA_SLOTS 16
272: #define EISA_SLOT_INC 0x1000
273:
274: /*
275: ** ISA Bus defines
276: */
277: #define DEPCA_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0xe0000,0x00000}
278: #define DEPCA_IO_PORTS {0x300, 0x200, 0}
279: #define DEPCA_TOTAL_SIZE 0x10
280: static short mem_chkd = 0;
281:
282: /*
283: ** Name <-> Adapter mapping
284: */
285: #define DEPCA_SIGNATURE {"DEPCA",\
286: "DE100","DE101",\
287: "DE200","DE201","DE202",\
288: "DE210",\
289: "DE422",\
290: ""}
291: static enum {DEPCA, de100, de101, de200, de201, de202, de210, de422, unknown} adapter;
292:
293: /*
294: ** Miscellaneous info...
295: */
296: #define DEPCA_STRLEN 16
297: #define MAX_NUM_DEPCAS 2
298:
299: /*
300: ** Memory Alignment. Each descriptor is 4 longwords long. To force a
301: ** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and
302: ** DESC_ALIGN. ALIGN aligns the start address of the private memory area
303: ** and hence the RX descriptor ring's first entry.
304: */
305: #define ALIGN4 ((u_long)4 - 1) /* 1 longword align */
306: #define ALIGN8 ((u_long)8 - 1) /* 2 longword (quadword) align */
307: #define ALIGN ALIGN8 /* Keep the LANCE happy... */
308:
309: /*
310: ** The DEPCA Rx and Tx ring descriptors.
311: */
312: struct depca_rx_desc {
313: volatile s32 base;
314: s16 buf_length; /* This length is negative 2's complement! */
315: s16 msg_length; /* This length is "normal". */
316: };
317:
318: struct depca_tx_desc {
319: volatile s32 base;
320: s16 length; /* This length is negative 2's complement! */
321: s16 misc; /* Errors and TDR info */
322: };
323:
324: #define LA_MASK 0x0000ffff /* LANCE address mask for mapping network RAM
325: to LANCE memory address space */
326:
327: /*
328: ** The Lance initialization block, described in databook, in common memory.
329: */
330: struct depca_init {
331: u16 mode; /* Mode register */
332: u8 phys_addr[ETH_ALEN]; /* Physical ethernet address */
333: u8 mcast_table[8]; /* Multicast Hash Table. */
334: u32 rx_ring; /* Rx ring base pointer & ring length */
335: u32 tx_ring; /* Tx ring base pointer & ring length */
336: };
337:
338: #define DEPCA_PKT_STAT_SZ 16
339: #define DEPCA_PKT_BIN_SZ 128 /* Should be >=100 unless you
340: increase DEPCA_PKT_STAT_SZ */
341: struct depca_private {
342: char devname[DEPCA_STRLEN]; /* Device Product String */
343: char adapter_name[DEPCA_STRLEN];/* /proc/ioports string */
344: char adapter; /* Adapter type */
345: struct depca_rx_desc *rx_ring; /* Pointer to start of RX descriptor ring */
346: struct depca_tx_desc *tx_ring; /* Pointer to start of TX descriptor ring */
347: struct depca_init init_block;/* Shadow Initialization block */
348: char *rx_memcpy[NUM_RX_DESC]; /* CPU virt address of sh'd memory buffs */
349: char *tx_memcpy[NUM_TX_DESC]; /* CPU virt address of sh'd memory buffs */
350: u_long bus_offset; /* (E)ISA bus address offset vs LANCE */
351: u_long sh_mem; /* Physical start addr of shared mem area */
352: u_long dma_buffs; /* LANCE Rx and Tx buffers start address. */
353: int rx_new, tx_new; /* The next free ring entry */
354: int rx_old, tx_old; /* The ring entries to be free()ed. */
355: struct enet_statistics stats;
356: struct { /* Private stats counters */
357: u32 bins[DEPCA_PKT_STAT_SZ];
358: u32 unicast;
359: u32 multicast;
360: u32 broadcast;
361: u32 excessive_collisions;
362: u32 tx_underruns;
363: u32 excessive_underruns;
364: } pktStats;
365: int txRingMask; /* TX ring mask */
366: int rxRingMask; /* RX ring mask */
367: s32 rx_rlen; /* log2(rxRingMask+1) for the descriptors */
368: s32 tx_rlen; /* log2(txRingMask+1) for the descriptors */
369: };
370:
371: /*
372: ** The transmit ring full condition is described by the tx_old and tx_new
373: ** pointers by:
374: ** tx_old = tx_new Empty ring
375: ** tx_old = tx_new+1 Full ring
376: ** tx_old+txRingMask = tx_new Full ring (wrapped condition)
377: */
378: #define TX_BUFFS_AVAIL ((lp->tx_old<=lp->tx_new)?\
379: lp->tx_old+lp->txRingMask-lp->tx_new:\
380: lp->tx_old -lp->tx_new-1)
381:
382: /*
383: ** Public Functions
384: */
385: static int depca_open(struct device *dev);
386: static int depca_start_xmit(struct sk_buff *skb, struct device *dev);
387: static void depca_interrupt(int irq, void *dev_id, struct pt_regs * regs);
388: static int depca_close(struct device *dev);
389: static int depca_ioctl(struct device *dev, struct ifreq *rq, int cmd);
390: static struct enet_statistics *depca_get_stats(struct device *dev);
391: static void set_multicast_list(struct device *dev);
392:
393: /*
394: ** Private functions
395: */
396: static int depca_hw_init(struct device *dev, u_long ioaddr);
397: static void depca_init_ring(struct device *dev);
398: static int depca_rx(struct device *dev);
399: static int depca_tx(struct device *dev);
400:
401: static void LoadCSRs(struct device *dev);
402: static int InitRestartDepca(struct device *dev);
403: static void DepcaSignature(char *name, u_long paddr);
404: static int DevicePresent(u_long ioaddr);
405: static int get_hw_addr(struct device *dev);
406: static int EISA_signature(char *name, s32 eisa_id);
407: static void SetMulticastFilter(struct device *dev);
408: static void isa_probe(struct device *dev, u_long iobase);
409: static void eisa_probe(struct device *dev, u_long iobase);
410: static struct device *alloc_device(struct device *dev, u_long iobase);
411: static int depca_dev_index(char *s);
412: static struct device *insert_device(struct device *dev, u_long iobase, int (*init)(struct device *));
413: static int load_packet(struct device *dev, struct sk_buff *skb);
414: static void depca_dbg_open(struct device *dev);
415:
416: #ifdef MODULE
417: int init_module(void);
418: void cleanup_module(void);
419: static int autoprobed = 1, loading_module = 1;
420: # else
421: static u_char de1xx_irq[] = {2,3,4,5,7,9,0};
422: static u_char de2xx_irq[] = {5,9,10,11,15,0};
423: static u_char de422_irq[] = {5,9,10,11,0};
424: static u_char *depca_irq;
425: static int autoprobed = 0, loading_module = 0;
426: #endif /* MODULE */
427:
428: static char name[DEPCA_STRLEN];
429: static int num_depcas = 0, num_eth = 0;
430: static int mem=0; /* For loadable module assignment
431: use insmod mem=0x????? .... */
432: static char *adapter_name = '\0'; /* If no PROM when loadable module
433: use insmod adapter_name=DE??? ...
434: */
435: /*
436: ** Miscellaneous defines...
437: */
438: #define STOP_DEPCA \
439: outw(CSR0, DEPCA_ADDR);\
440: outw(STOP, DEPCA_DATA)
441:
442:
443:
444: int depca_probe(struct device *dev)
445: {
446: int tmp = num_depcas, status = -ENODEV;
447: u_long iobase = dev->base_addr;
448:
449: if ((iobase == 0) && loading_module){
450: printk("Autoprobing is not supported when loading a module based driver.\n");
451: status = -EIO;
452: } else {
453: isa_probe(dev, iobase);
454: eisa_probe(dev, iobase);
455:
456: if ((tmp == num_depcas) && (iobase != 0) && loading_module) {
457: printk("%s: depca_probe() cannot find device at 0x%04lx.\n", dev->name,
458: iobase);
459: }
460:
461: /*
462: ** Walk the device list to check that at least one device
463: ** initialised OK
464: */
465: for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next);
466:
467: if (dev->priv) status = 0;
468: if (iobase == 0) autoprobed = 1;
469: }
470:
471: return status;
472: }
473:
474: static int
475: depca_hw_init(struct device *dev, u_long ioaddr)
476: {
477: struct depca_private *lp;
478: int i, j, offset, netRAM, mem_len, status=0;
479: s16 nicsr;
480: u_long mem_start=0, mem_base[] = DEPCA_RAM_BASE_ADDRESSES;
481:
482: STOP_DEPCA;
483:
484: nicsr = inb(DEPCA_NICSR);
485: nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
486: outb(nicsr, DEPCA_NICSR);
487:
488: if (inw(DEPCA_DATA) == STOP) {
489: do {
490: strcpy(name, (adapter_name ? adapter_name : ""));
491: mem_start = (mem ? mem & 0xf0000 : mem_base[mem_chkd++]);
492: DepcaSignature(name, mem_start);
493: } while (!mem && mem_base[mem_chkd] && (adapter == unknown));
494:
495: if ((adapter != unknown) && mem_start) { /* found a DEPCA device */
496: dev->base_addr = ioaddr;
497:
498: if ((ioaddr&0x0fff)==DEPCA_EISA_IO_PORTS) {/* EISA slot address */
499: printk("%s: %s at 0x%04lx (EISA slot %d)",
500: dev->name, name, ioaddr, (int)((ioaddr>>12)&0x0f));
501: } else { /* ISA port address */
502: printk("%s: %s at 0x%04lx", dev->name, name, ioaddr);
503: }
504:
505: printk(", h/w address ");
506: status = get_hw_addr(dev);
507: for (i=0; i<ETH_ALEN - 1; i++) { /* get the ethernet address */
508: printk("%2.2x:", dev->dev_addr[i]);
509: }
510: printk("%2.2x", dev->dev_addr[i]);
511:
512: if (status == 0) {
513: /* Set up the maximum amount of network RAM(kB) */
514: netRAM = ((adapter != DEPCA) ? 64 : 48);
515: if ((nicsr & _128KB) && (adapter == de422)) netRAM = 128;
516: offset = 0x0000;
517:
518: /* Shared Memory Base Address */
519: if (nicsr & BUF) {
520: offset = 0x8000; /* 32kbyte RAM offset*/
521: nicsr &= ~BS; /* DEPCA RAM in top 32k */
522: netRAM -= 32;
523: }
524: mem_start += offset; /* (E)ISA start address */
525: if ((mem_len = (NUM_RX_DESC*(sizeof(struct depca_rx_desc)+RX_BUFF_SZ) +
526: NUM_TX_DESC*(sizeof(struct depca_tx_desc)+TX_BUFF_SZ) +
527: sizeof(struct depca_init))) <=
528: (netRAM<<10)) {
529: printk(",\n has %dkB RAM at 0x%.5lx", netRAM, mem_start);
530:
531: /* Enable the shadow RAM. */
532: if (adapter != DEPCA) {
533: nicsr |= SHE;
534: outb(nicsr, DEPCA_NICSR);
535: }
536:
537: /* Define the device private memory */
538: dev->priv = (void *) kmalloc(sizeof(struct depca_private), GFP_KERNEL);
539: if (dev->priv == NULL)
540: return -ENOMEM;
541: lp = (struct depca_private *)dev->priv;
542: memset((char *)dev->priv, 0, sizeof(struct depca_private));
543: lp->adapter = adapter;
544: sprintf(lp->adapter_name,"%s (%s)", name, dev->name);
545: request_region(ioaddr, DEPCA_TOTAL_SIZE, lp->adapter_name);
546:
547: /* Initialisation Block */
548: lp->sh_mem = mem_start;
549: mem_start += sizeof(struct depca_init);
550:
551: /* Tx & Rx descriptors (aligned to a quadword boundary) */
552: mem_start = (mem_start + ALIGN) & ~ALIGN;
553: lp->rx_ring = (struct depca_rx_desc *)mem_start;
554:
555: mem_start += (sizeof(struct depca_rx_desc) * NUM_RX_DESC);
556: lp->tx_ring = (struct depca_tx_desc *)mem_start;
557:
558: mem_start += (sizeof(struct depca_tx_desc) * NUM_TX_DESC);
559: lp->bus_offset = mem_start & 0x00ff0000;
560: mem_start &= LA_MASK; /* LANCE re-mapped start address */
561:
562: lp->dma_buffs = mem_start;
563:
564: /* Finish initialising the ring information. */
565: lp->rxRingMask = NUM_RX_DESC - 1;
566: lp->txRingMask = NUM_TX_DESC - 1;
567:
568: /* Calculate Tx/Rx RLEN size for the descriptors. */
569: for (i=0, j = lp->rxRingMask; j>0; i++) {
570: j >>= 1;
571: }
572: lp->rx_rlen = (s32)(i << 29);
573: for (i=0, j = lp->txRingMask; j>0; i++) {
574: j >>= 1;
575: }
576: lp->tx_rlen = (s32)(i << 29);
577:
578: /* Load the initialisation block */
579: depca_init_ring(dev);
580:
581: /* Initialise the control and status registers */
582: LoadCSRs(dev);
583:
584: /* Enable DEPCA board interrupts for autoprobing */
585: nicsr = ((nicsr & ~IM)|IEN);
586: outb(nicsr, DEPCA_NICSR);
587:
588: /* To auto-IRQ we enable the initialization-done and DMA err,
589: interrupts. For now we will always get a DMA error. */
590: if (dev->irq < 2) {
591: #ifndef MODULE
592: unsigned char irqnum;
593: autoirq_setup(0);
594:
595: /* Assign the correct irq list */
596: switch (lp->adapter) {
597: case DEPCA:
598: case de100:
599: case de101:
600: depca_irq = de1xx_irq;
601: break;
602: case de200:
603: case de201:
604: case de202:
605: case de210:
606: depca_irq = de2xx_irq;
607: break;
608: case de422:
609: depca_irq = de422_irq;
610: break;
611: }
612:
613: /* Trigger an initialization just for the interrupt. */
614: outw(INEA | INIT, DEPCA_DATA);
615:
616: irqnum = autoirq_report(1);
617: if (!irqnum) {
618: printk(" and failed to detect IRQ line.\n");
619: status = -ENXIO;
620: } else {
621: for (dev->irq=0,i=0; (depca_irq[i]) && (!dev->irq); i++) {
622: if (irqnum == depca_irq[i]) {
623: dev->irq = irqnum;
624: printk(" and uses IRQ%d.\n", dev->irq);
625: }
626: }
627:
628: if (!dev->irq) {
629: printk(" but incorrect IRQ line detected.\n");
630: status = -ENXIO;
631: }
632: }
633: #endif /* MODULE */
634: } else {
635: printk(" and assigned IRQ%d.\n", dev->irq);
636: }
637: if (status) release_region(ioaddr, DEPCA_TOTAL_SIZE);
638: } else {
639: printk(",\n requests %dkB RAM: only %dkB is available!\n",
640: (mem_len>>10), netRAM);
641: status = -ENXIO;
642: }
643: } else {
644: printk(" which has an Ethernet PROM CRC error.\n");
645: status = -ENXIO;
646: }
647: } else {
648: status = -ENXIO;
649: }
650: if (!status) {
651: if (depca_debug > 1) {
652: printk(version);
653: }
654:
655: /* The DEPCA-specific entries in the device structure. */
656: dev->open = &depca_open;
657: dev->hard_start_xmit = &depca_start_xmit;
658: dev->stop = &depca_close;
659: dev->get_stats = &depca_get_stats;
660: dev->set_multicast_list = &set_multicast_list;
661: dev->do_ioctl = &depca_ioctl;
662:
663: dev->mem_start = 0;
664:
665: /* Fill in the generic field of the device structure. */
666: ether_setup(dev);
667: } else { /* Incorrectly initialised hardware */
668: if (dev->priv) {
669: kfree_s(dev->priv, sizeof(struct depca_private));
670: dev->priv = NULL;
671: }
672: }
673: } else {
674: status = -ENXIO;
675: }
676:
677: return status;
678: }
679:
680:
681: static int
682: depca_open(struct device *dev)
683: {
684: struct depca_private *lp = (struct depca_private *)dev->priv;
685: u_long ioaddr = dev->base_addr;
686: s16 nicsr;
687: int status = 0;
688:
689: irq2dev_map[dev->irq] = dev;
690: STOP_DEPCA;
691: nicsr = inb(DEPCA_NICSR);
692:
693: /* Make sure the shadow RAM is enabled */
694: if (adapter != DEPCA) {
695: nicsr |= SHE;
696: outb(nicsr, DEPCA_NICSR);
697: }
698:
699: /* Re-initialize the DEPCA... */
700: depca_init_ring(dev);
701: LoadCSRs(dev);
702:
703: depca_dbg_open(dev);
704:
705: if (request_irq(dev->irq, &depca_interrupt, 0, lp->adapter_name, NULL)) {
706: printk("depca_open(): Requested IRQ%d is busy\n",dev->irq);
707: status = -EAGAIN;
708: } else {
709:
710: /* Enable DEPCA board interrupts and turn off LED */
711: nicsr = ((nicsr & ~IM & ~LED)|IEN);
712: outb(nicsr, DEPCA_NICSR);
713: outw(CSR0,DEPCA_ADDR);
714:
715: dev->tbusy = 0;
716: dev->interrupt = 0;
717: dev->start = 1;
718:
719: status = InitRestartDepca(dev);
720:
721: if (depca_debug > 1){
722: printk("CSR0: 0x%4.4x\n",inw(DEPCA_DATA));
723: printk("nicsr: 0x%02x\n",inb(DEPCA_NICSR));
724: }
725: }
726:
727: MOD_INC_USE_COUNT;
728:
729: return status;
730: }
731:
732: /* Initialize the lance Rx and Tx descriptor rings. */
733: static void
734: depca_init_ring(struct device *dev)
735: {
736: struct depca_private *lp = (struct depca_private *)dev->priv;
737: u_int i;
738: u_long p;
739:
740: /* Lock out other processes whilst setting up the hardware */
741: set_bit(0, (void *)&dev->tbusy);
742:
743: lp->rx_new = lp->tx_new = 0;
744: lp->rx_old = lp->tx_old = 0;
745:
746: /* Initialize the base addresses and length of each buffer in the ring */
747: for (i = 0; i <= lp->rxRingMask; i++) {
748: writel((p=lp->dma_buffs+i*RX_BUFF_SZ) | R_OWN, &lp->rx_ring[i].base);
749: writew(-RX_BUFF_SZ, &lp->rx_ring[i].buf_length);
750: lp->rx_memcpy[i]=(char *)(p+lp->bus_offset);
751: }
752: for (i = 0; i <= lp->txRingMask; i++) {
753: writel((p=lp->dma_buffs+(i+lp->txRingMask+1)*TX_BUFF_SZ) & 0x00ffffff,
754: &lp->tx_ring[i].base);
755: lp->tx_memcpy[i]=(char *)(p+lp->bus_offset);
756: }
757:
758: /* Set up the initialization block */
759: lp->init_block.rx_ring = ((u32)((u_long)lp->rx_ring)&LA_MASK) | lp->rx_rlen;
760: lp->init_block.tx_ring = ((u32)((u_long)lp->tx_ring)&LA_MASK) | lp->tx_rlen;
761:
762: SetMulticastFilter(dev);
763:
764: for (i = 0; i < ETH_ALEN; i++) {
765: lp->init_block.phys_addr[i] = dev->dev_addr[i];
766: }
767:
768: lp->init_block.mode = 0x0000; /* Enable the Tx and Rx */
769:
770: return;
771: }
772:
773: /*
774: ** Writes a socket buffer to TX descriptor ring and starts transmission
775: */
776: static int
777: depca_start_xmit(struct sk_buff *skb, struct device *dev)
778: {
779: struct depca_private *lp = (struct depca_private *)dev->priv;
780: u_long ioaddr = dev->base_addr;
781: int status = 0;
782:
783: /* Transmitter timeout, serious problems. */
784: if (dev->tbusy) {
785: int tickssofar = jiffies - dev->trans_start;
786: if (tickssofar < 1*HZ) {
787: status = -1;
788: } else {
789: printk("%s: transmit timed out, status %04x, resetting.\n",
790: dev->name, inw(DEPCA_DATA));
791:
792: STOP_DEPCA;
793: depca_init_ring(dev);
794: LoadCSRs(dev);
795: dev->interrupt = UNMASK_INTERRUPTS;
796: dev->start = 1;
797: dev->tbusy=0;
798: dev->trans_start = jiffies;
799: InitRestartDepca(dev);
800: dev_kfree_skb(skb, FREE_WRITE);
801: }
802: return status;
803: } else if (skb == NULL) {
804: dev_tint(dev);
805: } else if (skb->len > 0) {
806: /* Enforce 1 process per h/w access */
807: if (set_bit(0, (void*)&dev->tbusy) != 0) {
808: printk("%s: Transmitter access conflict.\n", dev->name);
809: status = -1;
810: } else {
811: if (TX_BUFFS_AVAIL) { /* Fill in a Tx ring entry */
812: status = load_packet(dev, skb);
813:
814: if (!status) {
815: /* Trigger an immediate send demand. */
816: outw(CSR0, DEPCA_ADDR);
817: outw(INEA | TDMD, DEPCA_DATA);
818:
819: dev->trans_start = jiffies;
820: dev_kfree_skb(skb, FREE_WRITE);
821: }
822: if (TX_BUFFS_AVAIL) {
823: dev->tbusy=0;
824: }
825: } else {
826: status = -1;
827: }
828: }
829: }
830:
831: return status;
832: }
833:
834: /*
835: ** The DEPCA interrupt handler.
836: */
837: static void
838: depca_interrupt(int irq, void *dev_id, struct pt_regs * regs)
839: {
840: struct device *dev = (struct device *)(irq2dev_map[irq]);
841: struct depca_private *lp;
842: s16 csr0, nicsr;
843: u_long ioaddr;
844:
845: if (dev == NULL) {
846: printk ("depca_interrupt(): irq %d for unknown device.\n", irq);
847: } else {
848: lp = (struct depca_private *)dev->priv;
849: ioaddr = dev->base_addr;
850:
851: if (dev->interrupt)
852: printk("%s: Re-entering the interrupt handler.\n", dev->name);
853:
854: dev->interrupt = MASK_INTERRUPTS;
855:
856: /* mask the DEPCA board interrupts and turn on the LED */
857: nicsr = inb(DEPCA_NICSR);
858: nicsr |= (IM|LED);
859: outb(nicsr, DEPCA_NICSR);
860:
861: outw(CSR0, DEPCA_ADDR);
862: csr0 = inw(DEPCA_DATA);
863:
864: /* Acknowledge all of the current interrupt sources ASAP. */
865: outw(csr0 & INTE, DEPCA_DATA);
866:
867: if (csr0 & RINT) /* Rx interrupt (packet arrived) */
868: depca_rx(dev);
869:
870: if (csr0 & TINT) /* Tx interrupt (packet sent) */
871: depca_tx(dev);
872:
873: if ((TX_BUFFS_AVAIL >= 0) && dev->tbusy) { /* any resources available? */
874: dev->tbusy = 0; /* clear TX busy flag */
875: mark_bh(NET_BH);
876: }
877:
878: /* Unmask the DEPCA board interrupts and turn off the LED */
879: nicsr = (nicsr & ~IM & ~LED);
880: outb(nicsr, DEPCA_NICSR);
881:
882: dev->interrupt = UNMASK_INTERRUPTS;
883: }
884:
885: return;
886: }
887:
888: static int
889: depca_rx(struct device *dev)
890: {
891: struct depca_private *lp = (struct depca_private *)dev->priv;
892: int i, entry;
893: s32 status;
894:
895: for (entry=lp->rx_new;
896: !(readl(&lp->rx_ring[entry].base) & R_OWN);
897: entry=lp->rx_new){
898: status = readl(&lp->rx_ring[entry].base) >> 16 ;
899: if (status & R_STP) { /* Remember start of frame */
900: lp->rx_old = entry;
901: }
902: if (status & R_ENP) { /* Valid frame status */
903: if (status & R_ERR) { /* There was an error. */
904: lp->stats.rx_errors++; /* Update the error stats. */
905: if (status & R_FRAM) lp->stats.rx_frame_errors++;
906: if (status & R_OFLO) lp->stats.rx_over_errors++;
907: if (status & R_CRC) lp->stats.rx_crc_errors++;
908: if (status & R_BUFF) lp->stats.rx_fifo_errors++;
909: } else {
910: short len, pkt_len = readw(&lp->rx_ring[entry].msg_length);
911: struct sk_buff *skb;
912:
913: skb = dev_alloc_skb(pkt_len+2);
914: if (skb != NULL) {
915: unsigned char *buf;
916: skb_reserve(skb,2); /* 16 byte align the IP header */
917: buf = skb_put(skb,pkt_len);
918: skb->dev = dev;
919: if (entry < lp->rx_old) { /* Wrapped buffer */
920: len = (lp->rxRingMask - lp->rx_old + 1) * RX_BUFF_SZ;
921: memcpy_fromio(buf, lp->rx_memcpy[lp->rx_old], len);
922: memcpy_fromio(buf + len, lp->rx_memcpy[0], pkt_len-len);
923: } else { /* Linear buffer */
924: memcpy_fromio(buf, lp->rx_memcpy[lp->rx_old], pkt_len);
925: }
926:
927: /*
928: ** Notify the upper protocol layers that there is another
929: ** packet to handle
930: */
931: skb->protocol=eth_type_trans(skb,dev);
932: netif_rx(skb);
933:
934: /*
935: ** Update stats
936: */
937: lp->stats.rx_packets++;
938: for (i=1; i<DEPCA_PKT_STAT_SZ-1; i++) {
939: if (pkt_len < (i*DEPCA_PKT_BIN_SZ)) {
940: lp->pktStats.bins[i]++;
941: i = DEPCA_PKT_STAT_SZ;
942: }
943: }
944: if (buf[0] & 0x01) { /* Multicast/Broadcast */
945: if ((*(s16 *)&buf[0] == -1) &&
946: (*(s16 *)&buf[2] == -1) &&
947: (*(s16 *)&buf[4] == -1)) {
948: lp->pktStats.broadcast++;
949: } else {
950: lp->pktStats.multicast++;
951: }
952: } else if ((*(s16 *)&buf[0] == *(s16 *)&dev->dev_addr[0]) &&
953: (*(s16 *)&buf[2] == *(s16 *)&dev->dev_addr[2]) &&
954: (*(s16 *)&buf[4] == *(s16 *)&dev->dev_addr[4])) {
955: lp->pktStats.unicast++;
956: }
957:
958: lp->pktStats.bins[0]++; /* Duplicates stats.rx_packets */
959: if (lp->pktStats.bins[0] == 0) { /* Reset counters */
960: memset((char *)&lp->pktStats, 0, sizeof(lp->pktStats));
961: }
962: } else {
963: printk("%s: Memory squeeze, deferring packet.\n", dev->name);
964: lp->stats.rx_dropped++; /* Really, deferred. */
965: break;
966: }
967: }
968: /* Change buffer ownership for this last frame, back to the adapter */
1.1.1.2 ! root 969: for (; lp->rx_old!=entry; lp->rx_old=(lp->rx_old+1)&lp->rxRingMask) {
1.1 root 970: writel(readl(&lp->rx_ring[lp->rx_old].base) | R_OWN,
971: &lp->rx_ring[lp->rx_old].base);
972: }
973: writel(readl(&lp->rx_ring[entry].base) | R_OWN, &lp->rx_ring[entry].base);
974: }
975:
976: /*
977: ** Update entry information
978: */
1.1.1.2 ! root 979: lp->rx_new = (lp->rx_new + 1) & lp->rxRingMask;
1.1 root 980: }
981:
982: return 0;
983: }
984:
985: /*
986: ** Buffer sent - check for buffer errors.
987: */
988: static int
989: depca_tx(struct device *dev)
990: {
991: struct depca_private *lp = (struct depca_private *)dev->priv;
992: int entry;
993: s32 status;
994: u_long ioaddr = dev->base_addr;
995:
996: for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) {
997: status = readl(&lp->tx_ring[entry].base) >> 16 ;
998:
999: if (status < 0) { /* Packet not yet sent! */
1000: break;
1001: } else if (status & T_ERR) { /* An error occurred. */
1002: status = readl(&lp->tx_ring[entry].misc);
1003: lp->stats.tx_errors++;
1004: if (status & TMD3_RTRY) lp->stats.tx_aborted_errors++;
1005: if (status & TMD3_LCAR) lp->stats.tx_carrier_errors++;
1006: if (status & TMD3_LCOL) lp->stats.tx_window_errors++;
1007: if (status & TMD3_UFLO) lp->stats.tx_fifo_errors++;
1008: if (status & (TMD3_BUFF | TMD3_UFLO)) {
1009: /* Trigger an immediate send demand. */
1010: outw(CSR0, DEPCA_ADDR);
1011: outw(INEA | TDMD, DEPCA_DATA);
1012: }
1013: } else if (status & (T_MORE | T_ONE)) {
1014: lp->stats.collisions++;
1015: } else {
1016: lp->stats.tx_packets++;
1017: }
1018:
1019: /* Update all the pointers */
1.1.1.2 ! root 1020: lp->tx_old = (lp->tx_old + 1) & lp->txRingMask;
1.1 root 1021: }
1022:
1023: return 0;
1024: }
1025:
1026: static int
1027: depca_close(struct device *dev)
1028: {
1029: struct depca_private *lp = (struct depca_private *)dev->priv;
1030: s16 nicsr;
1031: u_long ioaddr = dev->base_addr;
1032:
1033: dev->start = 0;
1034: dev->tbusy = 1;
1035:
1036: outw(CSR0, DEPCA_ADDR);
1037:
1038: if (depca_debug > 1) {
1039: printk("%s: Shutting down ethercard, status was %2.2x.\n",
1040: dev->name, inw(DEPCA_DATA));
1041: }
1042:
1043: /*
1044: ** We stop the DEPCA here -- it occasionally polls
1045: ** memory if we don't.
1046: */
1047: outw(STOP, DEPCA_DATA);
1048:
1049: /*
1050: ** Give back the ROM in case the user wants to go to DOS
1051: */
1052: if (lp->adapter != DEPCA) {
1053: nicsr = inb(DEPCA_NICSR);
1054: nicsr &= ~SHE;
1055: outb(nicsr, DEPCA_NICSR);
1056: }
1057:
1058: /*
1059: ** Free the associated irq
1060: */
1061: free_irq(dev->irq, NULL);
1062: irq2dev_map[dev->irq] = NULL;
1063:
1064: MOD_DEC_USE_COUNT;
1065:
1066: return 0;
1067: }
1068:
1069: static void LoadCSRs(struct device *dev)
1070: {
1071: struct depca_private *lp = (struct depca_private *)dev->priv;
1072: u_long ioaddr = dev->base_addr;
1073:
1074: outw(CSR1, DEPCA_ADDR); /* initialisation block address LSW */
1075: outw((u16)(lp->sh_mem & LA_MASK), DEPCA_DATA);
1076: outw(CSR2, DEPCA_ADDR); /* initialisation block address MSW */
1077: outw((u16)((lp->sh_mem & LA_MASK) >> 16), DEPCA_DATA);
1078: outw(CSR3, DEPCA_ADDR); /* ALE control */
1079: outw(ACON, DEPCA_DATA);
1080:
1081: outw(CSR0, DEPCA_ADDR); /* Point back to CSR0 */
1082:
1083: return;
1084: }
1085:
1086: static int InitRestartDepca(struct device *dev)
1087: {
1088: struct depca_private *lp = (struct depca_private *)dev->priv;
1089: u_long ioaddr = dev->base_addr;
1090: int i, status=0;
1091:
1092: /* Copy the shadow init_block to shared memory */
1093: memcpy_toio((char *)lp->sh_mem, &lp->init_block, sizeof(struct depca_init));
1094:
1095: outw(CSR0, DEPCA_ADDR); /* point back to CSR0 */
1096: outw(INIT, DEPCA_DATA); /* initialize DEPCA */
1097:
1098: /* wait for lance to complete initialisation */
1099: for (i=0;(i<100) && !(inw(DEPCA_DATA) & IDON); i++);
1100:
1101: if (i!=100) {
1102: /* clear IDON by writing a "1", enable interrupts and start lance */
1103: outw(IDON | INEA | STRT, DEPCA_DATA);
1104: if (depca_debug > 2) {
1105: printk("%s: DEPCA open after %d ticks, init block 0x%08lx csr0 %4.4x.\n",
1106: dev->name, i, lp->sh_mem, inw(DEPCA_DATA));
1107: }
1108: } else {
1109: printk("%s: DEPCA unopen after %d ticks, init block 0x%08lx csr0 %4.4x.\n",
1110: dev->name, i, lp->sh_mem, inw(DEPCA_DATA));
1111: status = -1;
1112: }
1113:
1114: return status;
1115: }
1116:
1117: static struct enet_statistics *
1118: depca_get_stats(struct device *dev)
1119: {
1120: struct depca_private *lp = (struct depca_private *)dev->priv;
1121:
1122: /* Null body since there is no framing error counter */
1123:
1124: return &lp->stats;
1125: }
1126:
1127: /*
1128: ** Set or clear the multicast filter for this adaptor.
1129: */
1130: static void
1131: set_multicast_list(struct device *dev)
1132: {
1133: struct depca_private *lp = (struct depca_private *)dev->priv;
1134: u_long ioaddr = dev->base_addr;
1135:
1136: if (irq2dev_map[dev->irq] != NULL) {
1137: while(dev->tbusy); /* Stop ring access */
1138: set_bit(0, (void*)&dev->tbusy);
1139: while(lp->tx_old != lp->tx_new); /* Wait for the ring to empty */
1140:
1141: STOP_DEPCA; /* Temporarily stop the depca. */
1142: depca_init_ring(dev); /* Initialize the descriptor rings */
1143:
1144: if (dev->flags & IFF_PROMISC) { /* Set promiscuous mode */
1145: lp->init_block.mode |= PROM;
1146: } else {
1147: SetMulticastFilter(dev);
1148: lp->init_block.mode &= ~PROM; /* Unset promiscuous mode */
1149: }
1150:
1151: LoadCSRs(dev); /* Reload CSR3 */
1152: InitRestartDepca(dev); /* Resume normal operation. */
1153: dev->tbusy = 0; /* Unlock the TX ring */
1154: }
1155: }
1156:
1157: /*
1158: ** Calculate the hash code and update the logical address filter
1159: ** from a list of ethernet multicast addresses.
1160: ** Big endian crc one liner is mine, all mine, ha ha ha ha!
1161: ** LANCE calculates its hash codes big endian.
1162: */
1163: static void SetMulticastFilter(struct device *dev)
1164: {
1165: struct depca_private *lp = (struct depca_private *)dev->priv;
1166: struct dev_mc_list *dmi=dev->mc_list;
1167: char *addrs;
1168: int i, j, bit, byte;
1169: u16 hashcode;
1170: s32 crc, poly = CRC_POLYNOMIAL_BE;
1171:
1172: if (dev->flags & IFF_ALLMULTI) { /* Set all multicast bits */
1173: for (i=0; i<(HASH_TABLE_LEN>>3); i++) {
1174: lp->init_block.mcast_table[i] = (char)0xff;
1175: }
1176: } else {
1177: for (i=0; i<(HASH_TABLE_LEN>>3); i++){ /* Clear the multicast table */
1178: lp->init_block.mcast_table[i]=0;
1179: }
1180: /* Add multicast addresses */
1181: for (i=0;i<dev->mc_count;i++) { /* for each address in the list */
1182: addrs=dmi->dmi_addr;
1183: dmi=dmi->next;
1184: if ((*addrs & 0x01) == 1) { /* multicast address? */
1185: crc = 0xffffffff; /* init CRC for each address */
1186: for (byte=0;byte<ETH_ALEN;byte++) {/* for each address byte */
1187: /* process each address bit */
1188: for (bit = *addrs++,j=0;j<8;j++, bit>>=1) {
1189: crc = (crc << 1) ^ ((((crc<0?1:0) ^ bit) & 0x01) ? poly : 0);
1190: }
1191: }
1192: hashcode = (crc & 1); /* hashcode is 6 LSb of CRC ... */
1193: for (j=0;j<5;j++) { /* ... in reverse order. */
1194: hashcode = (hashcode << 1) | ((crc>>=1) & 1);
1195: }
1196:
1197:
1198: byte = hashcode >> 3; /* bit[3-5] -> byte in filter */
1199: bit = 1 << (hashcode & 0x07); /* bit[0-2] -> bit in byte */
1200: lp->init_block.mcast_table[byte] |= bit;
1201: }
1202: }
1203: }
1204:
1205: return;
1206: }
1207:
1208: /*
1209: ** ISA bus I/O device probe
1210: */
1211: static void isa_probe(struct device *dev, u_long ioaddr)
1212: {
1213: int i = num_depcas, maxSlots;
1214: s32 ports[] = DEPCA_IO_PORTS;
1215:
1216: if (!ioaddr && autoprobed) return ; /* Been here before ! */
1217: if (ioaddr > 0x400) return; /* EISA Address */
1218: if (i >= MAX_NUM_DEPCAS) return; /* Too many ISA adapters */
1219:
1220: if (ioaddr == 0) { /* Autoprobing */
1221: maxSlots = MAX_NUM_DEPCAS;
1222: } else { /* Probe a specific location */
1223: ports[i] = ioaddr;
1224: maxSlots = i + 1;
1225: }
1226:
1227: for (; (i<maxSlots) && (dev!=NULL) && ports[i]; i++) {
1228: if (DevicePresent(ports[i]) == 0) {
1229: if (check_region(ports[i], DEPCA_TOTAL_SIZE) == 0) {
1230: if ((dev = alloc_device(dev, ports[i])) != NULL) {
1231: if (depca_hw_init(dev, ports[i]) == 0) {
1232: num_depcas++;
1233: }
1234: num_eth++;
1235: }
1236: } else if (autoprobed) {
1237: printk("%s: region already allocated at 0x%04x.\n", dev->name,ports[i]);
1238: }
1239: }
1240: }
1241:
1242: return;
1243: }
1244:
1245: /*
1246: ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually
1247: ** the motherboard. Upto 15 EISA devices are supported.
1248: */
1249: static void eisa_probe(struct device *dev, u_long ioaddr)
1250: {
1251: int i, maxSlots;
1252: u_long iobase;
1253: char name[DEPCA_STRLEN];
1254:
1255: if (!ioaddr && autoprobed) return ; /* Been here before ! */
1256: if ((ioaddr < 0x400) && (ioaddr > 0)) return; /* ISA Address */
1257:
1258: if (ioaddr == 0) { /* Autoprobing */
1259: iobase = EISA_SLOT_INC; /* Get the first slot address */
1260: i = 1;
1261: maxSlots = MAX_EISA_SLOTS;
1262: } else { /* Probe a specific location */
1263: iobase = ioaddr;
1264: i = (ioaddr >> 12);
1265: maxSlots = i + 1;
1266: }
1267: if ((iobase & 0x0fff) == 0) iobase += DEPCA_EISA_IO_PORTS;
1268:
1269: for (; (i<maxSlots) && (dev!=NULL); i++, iobase+=EISA_SLOT_INC) {
1270: if (EISA_signature(name, EISA_ID)) {
1271: if (DevicePresent(iobase) == 0) {
1272: if (check_region(iobase, DEPCA_TOTAL_SIZE) == 0) {
1273: if ((dev = alloc_device(dev, iobase)) != NULL) {
1274: if (depca_hw_init(dev, iobase) == 0) {
1275: num_depcas++;
1276: }
1277: num_eth++;
1278: }
1279: } else if (autoprobed) {
1280: printk("%s: region already allocated at 0x%04lx.\n",dev->name,iobase);
1281: }
1282: }
1283: }
1284: }
1285:
1286: return;
1287: }
1288:
1289: /*
1290: ** Search the entire 'eth' device list for a fixed probe. If a match isn't
1291: ** found then check for an autoprobe or unused device location. If they
1292: ** are not available then insert a new device structure at the end of
1293: ** the current list.
1294: */
1295: static struct device *
1296: alloc_device(struct device *dev, u_long iobase)
1297: {
1298: struct device *adev = NULL;
1299: int fixed = 0, new_dev = 0;
1300:
1301: num_eth = depca_dev_index(dev->name);
1302: if (loading_module) return dev;
1303:
1304: while (1) {
1305: if (((dev->base_addr == DEPCA_NDA) || (dev->base_addr==0)) && !adev) {
1306: adev=dev;
1307: } else if ((dev->priv == NULL) && (dev->base_addr==iobase)) {
1308: fixed = 1;
1309: } else {
1310: if (dev->next == NULL) {
1311: new_dev = 1;
1312: } else if (strncmp(dev->next->name, "eth", 3) != 0) {
1313: new_dev = 1;
1314: }
1315: }
1316: if ((dev->next == NULL) || new_dev || fixed) break;
1317: dev = dev->next;
1318: num_eth++;
1319: }
1320: if (adev && !fixed) {
1321: dev = adev;
1322: num_eth = depca_dev_index(dev->name);
1323: new_dev = 0;
1324: }
1325:
1326: if (((dev->next == NULL) &&
1327: ((dev->base_addr != DEPCA_NDA) && (dev->base_addr != 0)) && !fixed) ||
1328: new_dev) {
1329: num_eth++; /* New device */
1330: dev = insert_device(dev, iobase, depca_probe);
1331: }
1332:
1333: return dev;
1334: }
1335:
1336: /*
1337: ** If at end of eth device list and can't use current entry, malloc
1338: ** one up. If memory could not be allocated, print an error message.
1339: */
1340: static struct device *
1341: insert_device(struct device *dev, u_long iobase, int (*init)(struct device *))
1342: {
1343: struct device *new;
1344:
1345: new = (struct device *)kmalloc(sizeof(struct device)+8, GFP_KERNEL);
1346: if (new == NULL) {
1347: printk("eth%d: Device not initialised, insufficient memory\n",num_eth);
1348: return NULL;
1349: } else {
1350: new->next = dev->next;
1351: dev->next = new;
1352: dev = dev->next; /* point to the new device */
1353: dev->name = (char *)(dev + 1);
1354: if (num_eth > 9999) {
1355: sprintf(dev->name,"eth????");/* New device name */
1356: } else {
1357: sprintf(dev->name,"eth%d", num_eth);/* New device name */
1358: }
1359: dev->base_addr = iobase; /* assign the io address */
1360: dev->init = init; /* initialisation routine */
1361: }
1362:
1363: return dev;
1364: }
1365:
1366: static int
1367: depca_dev_index(char *s)
1368: {
1369: int i=0, j=0;
1370:
1371: for (;*s; s++) {
1372: if (isdigit(*s)) {
1373: j=1;
1374: i = (i * 10) + (*s - '0');
1375: } else if (j) break;
1376: }
1377:
1378: return i;
1379: }
1380:
1381: /*
1382: ** Look for a particular board name in the on-board Remote Diagnostics
1383: ** and Boot (readb) ROM. This will also give us a clue to the network RAM
1384: ** base address.
1385: */
1386: static void DepcaSignature(char *name, u_long paddr)
1387: {
1388: u_int i,j,k;
1389: const char *signatures[] = DEPCA_SIGNATURE;
1390: char tmpstr[16];
1391:
1392: /* Copy the first 16 bytes of ROM */
1393: for (i=0;i<16;i++) {
1394: tmpstr[i] = readb(paddr+0xc000+i);
1395: }
1396:
1397: /* Check if PROM contains a valid string */
1398: for (i=0;*signatures[i]!='\0';i++) {
1399: for (j=0,k=0;j<16 && k<strlen(signatures[i]);j++) {
1400: if (signatures[i][k] == tmpstr[j]) { /* track signature */
1401: k++;
1402: } else { /* lost signature; begin search again */
1403: k=0;
1404: }
1405: }
1406: if (k == strlen(signatures[i])) break;
1407: }
1408:
1409: /* Check if name string is valid, provided there's no PROM */
1410: if (*name && (i == unknown)) {
1411: for (i=0;*signatures[i]!='\0';i++) {
1412: if (strcmp(name,signatures[i]) == 0) break;
1413: }
1414: }
1415:
1416: /* Update search results */
1417: strcpy(name,signatures[i]);
1418: adapter = i;
1419:
1420: return;
1421: }
1422:
1423: /*
1424: ** Look for a special sequence in the Ethernet station address PROM that
1425: ** is common across all DEPCA products. Note that the original DEPCA needs
1426: ** its ROM address counter to be initialized and enabled. Only enable
1427: ** if the first address octet is a 0x08 - this minimises the chances of
1428: ** messing around with some other hardware, but it assumes that this DEPCA
1429: ** card initialized itself correctly.
1430: **
1431: ** Search the Ethernet address ROM for the signature. Since the ROM address
1432: ** counter can start at an arbitrary point, the search must include the entire
1433: ** probe sequence length plus the (length_of_the_signature - 1).
1434: ** Stop the search IMMEDIATELY after the signature is found so that the
1435: ** PROM address counter is correctly positioned at the start of the
1436: ** ethernet address for later read out.
1437: */
1438: static int DevicePresent(u_long ioaddr)
1439: {
1440: union {
1441: struct {
1442: u32 a;
1443: u32 b;
1444: } llsig;
1445: char Sig[sizeof(u32) << 1];
1446: } dev;
1447: short sigLength=0;
1448: s8 data;
1449: s16 nicsr;
1450: int i, j, status = 0;
1451:
1452: data = inb(DEPCA_PROM); /* clear counter on DEPCA */
1453: data = inb(DEPCA_PROM); /* read data */
1454:
1455: if (data == 0x08) { /* Enable counter on DEPCA */
1456: nicsr = inb(DEPCA_NICSR);
1457: nicsr |= AAC;
1458: outb(nicsr, DEPCA_NICSR);
1459: }
1460:
1461: dev.llsig.a = ETH_PROM_SIG;
1462: dev.llsig.b = ETH_PROM_SIG;
1463: sigLength = sizeof(u32) << 1;
1464:
1465: for (i=0,j=0;j<sigLength && i<PROBE_LENGTH+sigLength-1;i++) {
1466: data = inb(DEPCA_PROM);
1467: if (dev.Sig[j] == data) { /* track signature */
1468: j++;
1469: } else { /* lost signature; begin search again */
1470: if (data == dev.Sig[0]) { /* rare case.... */
1471: j=1;
1472: } else {
1473: j=0;
1474: }
1475: }
1476: }
1477:
1478: if (j!=sigLength) {
1479: status = -ENODEV; /* search failed */
1480: }
1481:
1482: return status;
1483: }
1484:
1485: /*
1486: ** The DE100 and DE101 PROM accesses were made non-standard for some bizarre
1487: ** reason: access the upper half of the PROM with x=0; access the lower half
1488: ** with x=1.
1489: */
1490: static int get_hw_addr(struct device *dev)
1491: {
1492: u_long ioaddr = dev->base_addr;
1493: int i, k, tmp, status = 0;
1494: u_short j, x, chksum;
1495:
1496: x = (((adapter == de100) || (adapter == de101)) ? 1 : 0);
1497:
1498: for (i=0,k=0,j=0;j<3;j++) {
1499: k <<= 1 ;
1500: if (k > 0xffff) k-=0xffff;
1501:
1502: k += (u_char) (tmp = inb(DEPCA_PROM + x));
1503: dev->dev_addr[i++] = (u_char) tmp;
1504: k += (u_short) ((tmp = inb(DEPCA_PROM + x)) << 8);
1505: dev->dev_addr[i++] = (u_char) tmp;
1506:
1507: if (k > 0xffff) k-=0xffff;
1508: }
1509: if (k == 0xffff) k=0;
1510:
1511: chksum = (u_char) inb(DEPCA_PROM + x);
1512: chksum |= (u_short) (inb(DEPCA_PROM + x) << 8);
1513: if (k != chksum) status = -1;
1514:
1515: return status;
1516: }
1517:
1518: /*
1519: ** Load a packet into the shared memory
1520: */
1521: static int load_packet(struct device *dev, struct sk_buff *skb)
1522: {
1523: struct depca_private *lp = (struct depca_private *)dev->priv;
1524: int i, entry, end, len, status = 0;
1525:
1526: entry = lp->tx_new; /* Ring around buffer number. */
1527: end = (entry + (skb->len - 1) / TX_BUFF_SZ) & lp->txRingMask;
1528: if (!(readl(&lp->tx_ring[end].base) & T_OWN)) {/* Enough room? */
1529: /*
1530: ** Caution: the write order is important here... don't set up the
1531: ** ownership rights until all the other information is in place.
1532: */
1533: if (end < entry) { /* wrapped buffer */
1534: len = (lp->txRingMask - entry + 1) * TX_BUFF_SZ;
1535: memcpy_toio(lp->tx_memcpy[entry], skb->data, len);
1536: memcpy_toio(lp->tx_memcpy[0], skb->data + len, skb->len - len);
1537: } else { /* linear buffer */
1538: memcpy_toio(lp->tx_memcpy[entry], skb->data, skb->len);
1539: }
1540:
1541: /* set up the buffer descriptors */
1542: len = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
1.1.1.2 ! root 1543: for (i = entry; i != end; i = (i + 1) & lp->txRingMask) {
1.1 root 1544: /* clean out flags */
1545: writel(readl(&lp->tx_ring[i].base) & ~T_FLAGS, &lp->tx_ring[i].base);
1546: writew(0x0000, &lp->tx_ring[i].misc); /* clears other error flags */
1547: writew(-TX_BUFF_SZ, &lp->tx_ring[i].length);/* packet length in buffer */
1548: len -= TX_BUFF_SZ;
1549: }
1550: /* clean out flags */
1551: writel(readl(&lp->tx_ring[end].base) & ~T_FLAGS, &lp->tx_ring[end].base);
1552: writew(0x0000, &lp->tx_ring[end].misc); /* clears other error flags */
1553: writew(-len, &lp->tx_ring[end].length); /* packet length in last buff */
1554:
1555: /* start of packet */
1556: writel(readl(&lp->tx_ring[entry].base) | T_STP, &lp->tx_ring[entry].base);
1557: /* end of packet */
1558: writel(readl(&lp->tx_ring[end].base) | T_ENP, &lp->tx_ring[end].base);
1559:
1560: for (i=end; i!=entry; --i) {
1561: /* ownership of packet */
1562: writel(readl(&lp->tx_ring[i].base) | T_OWN, &lp->tx_ring[i].base);
1563: if (i == 0) i=lp->txRingMask+1;
1564: }
1565: writel(readl(&lp->tx_ring[entry].base) | T_OWN, &lp->tx_ring[entry].base);
1566:
1567: lp->tx_new = (++end) & lp->txRingMask; /* update current pointers */
1568: } else {
1569: status = -1;
1570: }
1571:
1572: return status;
1573: }
1574:
1575: /*
1576: ** Look for a particular board name in the EISA configuration space
1577: */
1578: static int EISA_signature(char *name, s32 eisa_id)
1579: {
1580: u_int i;
1581: const char *signatures[] = DEPCA_SIGNATURE;
1582: char ManCode[DEPCA_STRLEN];
1583: union {
1584: s32 ID;
1585: char Id[4];
1586: } Eisa;
1587: int status = 0;
1588:
1589: *name = '\0';
1590: Eisa.ID = inl(eisa_id);
1591:
1592: ManCode[0]=(((Eisa.Id[0]>>2)&0x1f)+0x40);
1593: ManCode[1]=(((Eisa.Id[1]&0xe0)>>5)+((Eisa.Id[0]&0x03)<<3)+0x40);
1594: ManCode[2]=(((Eisa.Id[2]>>4)&0x0f)+0x30);
1595: ManCode[3]=(( Eisa.Id[2]&0x0f)+0x30);
1596: ManCode[4]=(((Eisa.Id[3]>>4)&0x0f)+0x30);
1597: ManCode[5]='\0';
1598:
1599: for (i=0;(*signatures[i] != '\0') && (*name == '\0');i++) {
1600: if (strstr(ManCode, signatures[i]) != NULL) {
1601: strcpy(name,ManCode);
1602: status = 1;
1603: }
1604: }
1605:
1606: return status;
1607: }
1608:
1609: static void depca_dbg_open(struct device *dev)
1610: {
1611: struct depca_private *lp = (struct depca_private *)dev->priv;
1612: u_long ioaddr = dev->base_addr;
1613: struct depca_init *p = (struct depca_init *)lp->sh_mem;
1614: int i;
1615:
1616: if (depca_debug > 1){
1617: /* Copy the shadow init_block to shared memory */
1618: memcpy_toio((char *)lp->sh_mem,&lp->init_block,sizeof(struct depca_init));
1619:
1620: printk("%s: depca open with irq %d\n",dev->name,dev->irq);
1621: printk("Descriptor head addresses:\n");
1622: printk("\t0x%lx 0x%lx\n",(u_long)lp->rx_ring, (u_long)lp->tx_ring);
1623: printk("Descriptor addresses:\nRX: ");
1624: for (i=0;i<lp->rxRingMask;i++){
1625: if (i < 3) {
1626: printk("0x%8.8lx ", (long) &lp->rx_ring[i].base);
1627: }
1628: }
1629: printk("...0x%8.8lx\n", (long) &lp->rx_ring[i].base);
1630: printk("TX: ");
1631: for (i=0;i<lp->txRingMask;i++){
1632: if (i < 3) {
1633: printk("0x%8.8lx ", (long) &lp->tx_ring[i].base);
1634: }
1635: }
1636: printk("...0x%8.8lx\n", (long) &lp->tx_ring[i].base);
1637: printk("\nDescriptor buffers:\nRX: ");
1638: for (i=0;i<lp->rxRingMask;i++){
1639: if (i < 3) {
1640: printk("0x%8.8x ", readl(&lp->rx_ring[i].base));
1641: }
1642: }
1643: printk("...0x%8.8x\n", readl(&lp->rx_ring[i].base));
1644: printk("TX: ");
1645: for (i=0;i<lp->txRingMask;i++){
1646: if (i < 3) {
1647: printk("0x%8.8x ", readl(&lp->tx_ring[i].base));
1648: }
1649: }
1650: printk("...0x%8.8x\n", readl(&lp->tx_ring[i].base));
1651: printk("Initialisation block at 0x%8.8lx\n",lp->sh_mem);
1652: printk("\tmode: 0x%4.4x\n",readw(&p->mode));
1653: printk("\tphysical address: ");
1654: for (i=0;i<ETH_ALEN-1;i++){
1655: printk("%2.2x:",(u_char)readb(&p->phys_addr[i]));
1656: }
1657: printk("%2.2x\n",(u_char)readb(&p->phys_addr[i]));
1658: printk("\tmulticast hash table: ");
1659: for (i=0;i<(HASH_TABLE_LEN >> 3)-1;i++){
1660: printk("%2.2x:",(u_char)readb(&p->mcast_table[i]));
1661: }
1662: printk("%2.2x\n",(u_char)readb(&p->mcast_table[i]));
1663: printk("\trx_ring at: 0x%8.8x\n",readl(&p->rx_ring));
1664: printk("\ttx_ring at: 0x%8.8x\n",readl(&p->tx_ring));
1665: printk("dma_buffs: 0x%8.8lx\n",lp->dma_buffs);
1666: printk("Ring size:\nRX: %d Log2(rxRingMask): 0x%8.8x\n",
1667: (int)lp->rxRingMask + 1,
1668: lp->rx_rlen);
1669: printk("TX: %d Log2(txRingMask): 0x%8.8x\n",
1670: (int)lp->txRingMask + 1,
1671: lp->tx_rlen);
1672: outw(CSR2,DEPCA_ADDR);
1673: printk("CSR2&1: 0x%4.4x",inw(DEPCA_DATA));
1674: outw(CSR1,DEPCA_ADDR);
1675: printk("%4.4x\n",inw(DEPCA_DATA));
1676: outw(CSR3,DEPCA_ADDR);
1677: printk("CSR3: 0x%4.4x\n",inw(DEPCA_DATA));
1678: }
1679:
1680: return;
1681: }
1682:
1683: /*
1684: ** Perform IOCTL call functions here. Some are privileged operations and the
1685: ** effective uid is checked in those cases.
1686: ** All MCA IOCTLs will not work here and are for testing purposes only.
1687: */
1688: static int depca_ioctl(struct device *dev, struct ifreq *rq, int cmd)
1689: {
1690: struct depca_private *lp = (struct depca_private *)dev->priv;
1691: struct depca_ioctl *ioc = (struct depca_ioctl *) &rq->ifr_data;
1692: int i, status = 0;
1693: u_long ioaddr = dev->base_addr;
1694: union {
1695: u8 addr[(HASH_TABLE_LEN * ETH_ALEN)];
1696: u16 sval[(HASH_TABLE_LEN * ETH_ALEN) >> 1];
1697: u32 lval[(HASH_TABLE_LEN * ETH_ALEN) >> 2];
1698: } tmp;
1699:
1700: switch(ioc->cmd) {
1701: case DEPCA_GET_HWADDR: /* Get the hardware address */
1702: for (i=0; i<ETH_ALEN; i++) {
1703: tmp.addr[i] = dev->dev_addr[i];
1704: }
1705: ioc->len = ETH_ALEN;
1706: if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len))) {
1707: memcpy_tofs(ioc->data, tmp.addr, ioc->len);
1708: }
1709:
1710: break;
1711: case DEPCA_SET_HWADDR: /* Set the hardware address */
1712: if (suser()) {
1713: if (!(status = verify_area(VERIFY_READ, (void *)ioc->data, ETH_ALEN))) {
1714: memcpy_fromfs(tmp.addr,ioc->data,ETH_ALEN);
1715: for (i=0; i<ETH_ALEN; i++) {
1716: dev->dev_addr[i] = tmp.addr[i];
1717: }
1718: while(dev->tbusy); /* Stop ring access */
1719: set_bit(0, (void*)&dev->tbusy);
1720: while(lp->tx_old != lp->tx_new);/* Wait for the ring to empty */
1721:
1722: STOP_DEPCA; /* Temporarily stop the depca. */
1723: depca_init_ring(dev); /* Initialize the descriptor rings */
1724: LoadCSRs(dev); /* Reload CSR3 */
1725: InitRestartDepca(dev); /* Resume normal operation. */
1726: dev->tbusy = 0; /* Unlock the TX ring */
1727: }
1728: } else {
1729: status = -EPERM;
1730: }
1731:
1732: break;
1733: case DEPCA_SET_PROM: /* Set Promiscuous Mode */
1734: if (suser()) {
1735: while(dev->tbusy); /* Stop ring access */
1736: set_bit(0, (void*)&dev->tbusy);
1737: while(lp->tx_old != lp->tx_new); /* Wait for the ring to empty */
1738:
1739: STOP_DEPCA; /* Temporarily stop the depca. */
1740: depca_init_ring(dev); /* Initialize the descriptor rings */
1741: lp->init_block.mode |= PROM; /* Set promiscuous mode */
1742:
1743: LoadCSRs(dev); /* Reload CSR3 */
1744: InitRestartDepca(dev); /* Resume normal operation. */
1745: dev->tbusy = 0; /* Unlock the TX ring */
1746: } else {
1747: status = -EPERM;
1748: }
1749:
1750: break;
1751: case DEPCA_CLR_PROM: /* Clear Promiscuous Mode */
1752: if (suser()) {
1753: while(dev->tbusy); /* Stop ring access */
1754: set_bit(0, (void*)&dev->tbusy);
1755: while(lp->tx_old != lp->tx_new); /* Wait for the ring to empty */
1756:
1757: STOP_DEPCA; /* Temporarily stop the depca. */
1758: depca_init_ring(dev); /* Initialize the descriptor rings */
1759: lp->init_block.mode &= ~PROM; /* Clear promiscuous mode */
1760:
1761: LoadCSRs(dev); /* Reload CSR3 */
1762: InitRestartDepca(dev); /* Resume normal operation. */
1763: dev->tbusy = 0; /* Unlock the TX ring */
1764: } else {
1765: status = -EPERM;
1766: }
1767:
1768: break;
1769: case DEPCA_SAY_BOO: /* Say "Boo!" to the kernel log file */
1770: printk("%s: Boo!\n", dev->name);
1771:
1772: break;
1773: case DEPCA_GET_MCA: /* Get the multicast address table */
1774: ioc->len = (HASH_TABLE_LEN >> 3);
1775: if (!(status = verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
1776: memcpy_tofs(ioc->data, lp->init_block.mcast_table, ioc->len);
1777: }
1778:
1779: break;
1780: case DEPCA_SET_MCA: /* Set a multicast address */
1781: if (suser()) {
1782: if (!(status=verify_area(VERIFY_READ, ioc->data, ETH_ALEN*ioc->len))) {
1783: memcpy_fromfs(tmp.addr, ioc->data, ETH_ALEN * ioc->len);
1784: set_multicast_list(dev);
1785: }
1786: } else {
1787: status = -EPERM;
1788: }
1789:
1790: break;
1791: case DEPCA_CLR_MCA: /* Clear all multicast addresses */
1792: if (suser()) {
1793: set_multicast_list(dev);
1794: } else {
1795: status = -EPERM;
1796: }
1797:
1798: break;
1799: case DEPCA_MCA_EN: /* Enable pass all multicast addressing */
1800: if (suser()) {
1801: set_multicast_list(dev);
1802: } else {
1803: status = -EPERM;
1804: }
1805:
1806: break;
1807: case DEPCA_GET_STATS: /* Get the driver statistics */
1808: cli();
1809: ioc->len = sizeof(lp->pktStats);
1810: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
1811: memcpy_tofs(ioc->data, &lp->pktStats, ioc->len);
1812: }
1813: sti();
1814:
1815: break;
1816: case DEPCA_CLR_STATS: /* Zero out the driver statistics */
1817: if (suser()) {
1818: cli();
1819: memset(&lp->pktStats, 0, sizeof(lp->pktStats));
1820: sti();
1821: } else {
1822: status = -EPERM;
1823: }
1824:
1825: break;
1826: case DEPCA_GET_REG: /* Get the DEPCA Registers */
1827: i=0;
1828: tmp.sval[i++] = inw(DEPCA_NICSR);
1829: outw(CSR0, DEPCA_ADDR); /* status register */
1830: tmp.sval[i++] = inw(DEPCA_DATA);
1831: memcpy(&tmp.sval[i], &lp->init_block, sizeof(struct depca_init));
1832: ioc->len = i+sizeof(struct depca_init);
1833: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
1834: memcpy_tofs(ioc->data, tmp.addr, ioc->len);
1835: }
1836:
1837: break;
1838: default:
1839: status = -EOPNOTSUPP;
1840: }
1841:
1842: return status;
1843: }
1844:
1845: #ifdef MODULE
1846: static char devicename[9] = { 0, };
1847: static struct device thisDepca = {
1848: devicename, /* device name is inserted by /linux/drivers/net/net_init.c */
1849: 0, 0, 0, 0,
1850: 0x200, 7, /* I/O address, IRQ */
1851: 0, 0, 0, NULL, depca_probe };
1852:
1853: static int irq=7; /* EDIT THESE LINE FOR YOUR CONFIGURATION */
1854: static int io=0x200; /* Or use the irq= io= options to insmod */
1855:
1856: /* See depca_probe() for autoprobe messages when a module */
1857: int
1858: init_module(void)
1859: {
1860: thisDepca.irq=irq;
1861: thisDepca.base_addr=io;
1862:
1863: if (register_netdev(&thisDepca) != 0)
1864: return -EIO;
1865:
1866: return 0;
1867: }
1868:
1869: void
1870: cleanup_module(void)
1871: {
1872: if (thisDepca.priv) {
1873: kfree(thisDepca.priv);
1874: thisDepca.priv = NULL;
1875: }
1876: thisDepca.irq=0;
1877:
1878: unregister_netdev(&thisDepca);
1879: release_region(thisDepca.base_addr, DEPCA_TOTAL_SIZE);
1880: }
1881: #endif /* MODULE */
1882:
1883:
1884: /*
1885: * Local variables:
1886: * compile-command: "gcc -D__KERNEL__ -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c depca.c"
1887: *
1888: * compile-command: "gcc -D__KERNEL__ -DMODULE -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c depca.c"
1889: * End:
1890: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.