|
|
1.1 root 1: /* ewrk3.c: A DIGITAL EtherWORKS 3 ethernet driver for Linux.
2:
3: Written 1994 by David C. Davies.
4:
5: Copyright 1994 Digital Equipment Corporation.
6:
7: This software may be used and distributed according to the terms of
8: the GNU Public License, incorporated herein by reference.
9:
10: This driver is written for the Digital Equipment Corporation series
11: of EtherWORKS ethernet cards:
12:
13: DE203 Turbo (BNC)
14: DE204 Turbo (TP)
15: DE205 Turbo (TP BNC)
16:
17: The driver has been tested on a relatively busy network using the DE205
18: card and benchmarked with 'ttcp': it transferred 16M of data at 975kB/s
19: (7.8Mb/s) to a DECstation 5000/200.
20:
21: The author may be reached at [email protected] or
22: [email protected] or Digital Equipment Corporation, 550 King
23: Street, Littleton MA 01460.
24:
25: =========================================================================
26: This driver has been written substantially from scratch, although its
27: inheritance of style and stack interface from 'depca.c' and in turn from
28: Donald Becker's 'lance.c' should be obvious.
29:
30: The DE203/4/5 boards all use a new proprietary chip in place of the
31: LANCE chip used in prior cards (DEPCA, DE100, DE200/1/2, DE210, DE422).
32: Use the depca.c driver in the standard distribution for the LANCE based
33: cards from DIGITAL; this driver will not work with them.
34:
35: The DE203/4/5 cards have 2 main modes: shared memory and I/O only. I/O
36: only makes all the card accesses through I/O transactions and no high
37: (shared) memory is used. This mode provides a >48% performance penalty
38: and is deprecated in this driver, although allowed to provide initial
39: setup when hardstrapped.
40:
41: The shared memory mode comes in 3 flavours: 2kB, 32kB and 64kB. There is
42: no point in using any mode other than the 2kB mode - their performances
43: are virtually identical, although the driver has been tested in the 2kB
44: and 32kB modes. I would suggest you uncomment the line:
45:
46: FORCE_2K_MODE;
47:
48: to allow the driver to configure the card as a 2kB card at your current
49: base address, thus leaving more room to clutter your system box with
50: other memory hungry boards.
51:
52: As many ISA and EISA cards can be supported under this driver as you
53: wish, limited primarily by the available IRQ lines, rather than by the
54: available I/O addresses (24 ISA, 16 EISA). I have checked different
55: configurations of multiple depca cards and ewrk3 cards and have not
56: found a problem yet (provided you have at least depca.c v0.38) ...
57:
58: The board IRQ setting must be at an unused IRQ which is auto-probed
59: using Donald Becker's autoprobe routines. All these cards are at
60: {5,10,11,15}.
61:
62: No 16MB memory limitation should exist with this driver as DMA is not
63: used and the common memory area is in low memory on the network card (my
64: current system has 20MB and I've not had problems yet).
65:
66: The ability to load this driver as a loadable module has been included
67: and used extensively during the driver development (to save those long
68: reboot sequences). To utilise this ability, you have to do 8 things:
69:
70: 0) have a copy of the loadable modules code installed on your system.
71: 1) copy ewrk3.c from the /linux/drivers/net directory to your favourite
72: temporary directory.
73: 2) edit the source code near line 1880 to reflect the I/O address and
74: IRQ you're using.
75: 3) compile ewrk3.c, but include -DMODULE in the command line to ensure
76: that the correct bits are compiled (see end of source code).
77: 4) if you are wanting to add a new card, goto 5. Otherwise, recompile a
78: kernel with the ewrk3 configuration turned off and reboot.
79: 5) insmod ewrk3.o
80: [Alan Cox: Changed this so you can insmod ewrk3.o irq=x io=y]
81: 6) run the net startup bits for your new eth?? interface manually
82: (usually /etc/rc.inet[12] at boot time).
83: 7) enjoy!
84:
85: Note that autoprobing is not allowed in loadable modules - the system is
86: already up and running and you're messing with interrupts.
87:
88: To unload a module, turn off the associated interface
89: 'ifconfig eth?? down' then 'rmmod ewrk3'.
90:
91: Promiscuous mode has been turned off in this driver, but all the
92: multicast address bits have been turned on. This improved the send
93: performance on a busy network by about 13%.
94:
95: Ioctl's have now been provided (primarily because I wanted to grab some
96: packet size statistics). They are patterned after 'plipconfig.c' from a
97: suggestion by Alan Cox. Using these ioctls, you can enable promiscuous
98: mode, add/delete multicast addresses, change the hardware address, get
99: packet size distribution statistics and muck around with the control and
100: status register. I'll add others if and when the need arises.
101:
102: TO DO:
103: ------
104:
105:
106: Revision History
107: ----------------
108:
109: Version Date Description
110:
111: 0.1 26-aug-94 Initial writing. ALPHA code release.
112: 0.11 31-aug-94 Fixed: 2k mode memory base calc.,
113: LeMAC version calc.,
114: IRQ vector assignments during autoprobe.
115: 0.12 31-aug-94 Tested working on LeMAC2 (DE20[345]-AC) card.
116: Fixed up MCA hash table algorithm.
117: 0.20 4-sep-94 Added IOCTL functionality.
118: 0.21 14-sep-94 Added I/O mode.
119: 0.21axp 15-sep-94 Special version for ALPHA AXP Linux V1.0.
120: 0.22 16-sep-94 Added more IOCTLs & tidied up.
121: 0.23 21-sep-94 Added transmit cut through.
122: 0.24 31-oct-94 Added uid checks in some ioctls.
123: 0.30 1-nov-94 BETA code release.
124: 0.31 5-dec-94 Added check/allocate region code.
125: 0.32 16-jan-95 Broadcast packet fix.
126: 0.33 10-Feb-95 Fix recognition bug reported by <[email protected]>.
127: 0.40 27-Dec-95 Rationalise MODULE and autoprobe code.
128: Rewrite for portability & updated.
129: ALPHA support from <[email protected]>
130: Added verify_area() calls in depca_ioctl() from
131: suggestion by <[email protected]>.
132: Add new multicasting code.
133:
134: =========================================================================
135: */
136:
137: static const char *version = "ewrk3.c:v0.40 95/12/27 [email protected]\n";
138:
139: #include <linux/module.h>
140:
141: #include <linux/kernel.h>
142: #include <linux/sched.h>
143: #include <linux/string.h>
144: #include <linux/ptrace.h>
145: #include <linux/errno.h>
146: #include <linux/ioport.h>
147: #include <linux/malloc.h>
148: #include <linux/interrupt.h>
149: #include <linux/delay.h>
150: #include <asm/bitops.h>
151: #include <asm/io.h>
152: #include <asm/dma.h>
153: #include <asm/segment.h>
154:
155: #include <linux/netdevice.h>
156: #include <linux/etherdevice.h>
157: #include <linux/skbuff.h>
158:
159: #include <linux/time.h>
160: #include <linux/types.h>
161: #include <linux/unistd.h>
162:
163: #include "ewrk3.h"
164:
165: #ifdef EWRK3_DEBUG
166: static int ewrk3_debug = EWRK3_DEBUG;
167: #else
168: static int ewrk3_debug = 1;
169: #endif
170:
171: #define EWRK3_NDA 0xffe0 /* No Device Address */
172:
173: #define PROBE_LENGTH 32
174: #define ETH_PROM_SIG 0xAA5500FFUL
175:
176: #ifndef EWRK3_SIGNATURE
177: #define EWRK3_SIGNATURE {"DE203","DE204","DE205",""}
178: #define EWRK3_STRLEN 8
179: #endif
180:
181: #ifndef EWRK3_RAM_BASE_ADDRESSES
182: #define EWRK3_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0x00000}
183: #endif
184:
185: /*
186: ** Sets up the I/O area for the autoprobe.
187: */
188: #define EWRK3_IO_BASE 0x100 /* Start address for probe search */
189: #define EWRK3_IOP_INC 0x20 /* I/O address increment */
190: #define EWRK3_TOTAL_SIZE 0x20 /* required I/O address length */
191:
192: #ifndef MAX_NUM_EWRK3S
193: #define MAX_NUM_EWRK3S 21
194: #endif
195:
196: #ifndef EWRK3_EISA_IO_PORTS
197: #define EWRK3_EISA_IO_PORTS 0x0c00 /* I/O port base address, slot 0 */
198: #endif
199:
200: #ifndef MAX_EISA_SLOTS
201: #define MAX_EISA_SLOTS 16
202: #define EISA_SLOT_INC 0x1000
203: #endif
204:
205: #define CRC_POLYNOMIAL_BE 0x04c11db7UL /* Ethernet CRC, big endian */
206: #define CRC_POLYNOMIAL_LE 0xedb88320UL /* Ethernet CRC, little endian */
207:
208: #define QUEUE_PKT_TIMEOUT (100) /* Jiffies */
209:
210: /*
211: ** EtherWORKS 3 shared memory window sizes
212: */
213: #define IO_ONLY 0x00
214: #define SHMEM_2K 0x800
215: #define SHMEM_32K 0x8000
216: #define SHMEM_64K 0x10000
217:
218: /*
219: ** EtherWORKS 3 IRQ ENABLE/DISABLE
220: */
221: #define ENABLE_IRQs { \
222: icr |= lp->irq_mask;\
223: outb(icr, EWRK3_ICR); /* Enable the IRQs */\
224: }
225:
226: #define DISABLE_IRQs { \
227: icr = inb(EWRK3_ICR);\
228: icr &= ~lp->irq_mask;\
229: outb(icr, EWRK3_ICR); /* Disable the IRQs */\
230: }
231:
232: /*
233: ** EtherWORKS 3 START/STOP
234: */
235: #define START_EWRK3 { \
236: csr = inb(EWRK3_CSR);\
237: csr &= ~(CSR_TXD|CSR_RXD);\
238: outb(csr, EWRK3_CSR); /* Enable the TX and/or RX */\
239: }
240:
241: #define STOP_EWRK3 { \
242: csr = (CSR_TXD|CSR_RXD);\
243: outb(csr, EWRK3_CSR); /* Disable the TX and/or RX */\
244: }
245:
246: /*
247: ** The EtherWORKS 3 private structure
248: */
249: #define EWRK3_PKT_STAT_SZ 16
250: #define EWRK3_PKT_BIN_SZ 128 /* Should be >=100 unless you
251: increase EWRK3_PKT_STAT_SZ */
252:
253: struct ewrk3_private {
254: char adapter_name[80]; /* Name exported to /proc/ioports */
255: u_long shmem_base; /* Shared memory start address */
256: u_long shmem_length; /* Shared memory window length */
257: struct enet_statistics stats; /* Public stats */
258: struct {
259: u32 bins[EWRK3_PKT_STAT_SZ]; /* Private stats counters */
260: u32 unicast;
261: u32 multicast;
262: u32 broadcast;
263: u32 excessive_collisions;
264: u32 tx_underruns;
265: u32 excessive_underruns;
266: } pktStats;
267: u_char irq_mask; /* Adapter IRQ mask bits */
268: u_char mPage; /* Maximum 2kB Page number */
269: u_char lemac; /* Chip rev. level */
270: u_char hard_strapped; /* Don't allow a full open */
271: u_char lock; /* Lock the page register */
272: u_char txc; /* Transmit cut through */
273: u_char *mctbl; /* Pointer to the multicast table */
274: };
275:
276: /*
277: ** Force the EtherWORKS 3 card to be in 2kB MODE
278: */
279: #define FORCE_2K_MODE { \
280: shmem_length = SHMEM_2K;\
281: outb(((mem_start - 0x80000) >> 11), EWRK3_MBR);\
282: }
283:
284: /*
285: ** Public Functions
286: */
287: static int ewrk3_open(struct device *dev);
288: static int ewrk3_queue_pkt(struct sk_buff *skb, struct device *dev);
289: static void ewrk3_interrupt(int irq, struct pt_regs *regs);
290: static int ewrk3_close(struct device *dev);
291: static struct enet_statistics *ewrk3_get_stats(struct device *dev);
292: static void set_multicast_list(struct device *dev);
293: static int ewrk3_ioctl(struct device *dev, struct ifreq *rq, int cmd);
294:
295: /*
296: ** Private functions
297: */
298: static int ewrk3_hw_init(struct device *dev, u_long iobase);
299: static void ewrk3_init(struct device *dev);
300: static int ewrk3_rx(struct device *dev);
301: static int ewrk3_tx(struct device *dev);
302:
303: static void EthwrkSignature(char * name, char *eeprom_image);
304: static int DevicePresent(u_long iobase);
305: static void SetMulticastFilter(struct device *dev);
306: static int EISA_signature(char *name, s32 eisa_id);
307:
308: static int Read_EEPROM(u_long iobase, u_char eaddr);
309: static int Write_EEPROM(short data, u_long iobase, u_char eaddr);
310: static u_char get_hw_addr (struct device *dev, u_char *eeprom_image, char chipType);
311:
312: static void isa_probe(struct device *dev, u_long iobase);
313: static void eisa_probe(struct device *dev, u_long iobase);
314: static struct device *alloc_device(struct device *dev, u_long iobase);
315:
316:
317: #ifdef MODULE
318: int init_module(void);
319: void cleanup_module(void);
320: static int autoprobed = 1, loading_module = 1;
321:
322: # else
323: static u_char irq[] = {5,0,10,3,11,9,15,12};
324: static int autoprobed = 0, loading_module = 0;
325:
326: #endif /* MODULE */
327:
328: static char name[EWRK3_STRLEN + 1];
329: static int num_ewrk3s = 0, num_eth = 0;
330:
331: /*
332: ** Miscellaneous defines...
333: */
334: #define INIT_EWRK3 {\
335: outb(EEPROM_INIT, EWRK3_IOPR);\
336: udelay(1000);\
337: }
338:
339:
340:
341:
342: int ewrk3_probe(struct device *dev)
343: {
344: int tmp = num_ewrk3s, status = -ENODEV;
345: u_long iobase = dev->base_addr;
346:
347: if ((iobase == 0) && loading_module){
348: printk("Autoprobing is not supported when loading a module based driver.\n");
349: status = -EIO;
350: } else { /* First probe for the Ethernet */
351: /* Address PROM pattern */
352: isa_probe(dev, iobase);
353: eisa_probe(dev, iobase);
354:
355: if ((tmp == num_ewrk3s) && (iobase != 0) && loading_module) {
356: printk("%s: ewrk3_probe() cannot find device at 0x%04lx.\n", dev->name,
357: iobase);
358: }
359:
360: /*
361: ** Walk the device list to check that at least one device
362: ** initialised OK
363: */
364: for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next);
365:
366: if (dev->priv) status = 0;
367: if (iobase == 0) autoprobed = 1;
368: }
369:
370: return status;
371: }
372:
373: static int
374: ewrk3_hw_init(struct device *dev, u_long iobase)
375: {
376: struct ewrk3_private *lp;
377: int i, status=0;
378: u_long mem_start, shmem_length;
379: u_char cr, cmr, icr, nicsr, lemac, hard_strapped = 0;
380: u_char eeprom_image[EEPROM_MAX], chksum, eisa_cr = 0;
381:
382: /*
383: ** Stop the EWRK3. Enable the DBR ROM. Disable interrupts and remote boot.
384: ** This also disables the EISA_ENABLE bit in the EISA Control Register.
385: */
386: if (iobase > 0x400) eisa_cr = inb(EISA_CR);
387: INIT_EWRK3;
388:
389: nicsr = inb(EWRK3_CSR);
390:
391: icr = inb(EWRK3_ICR);
392: icr |= 0xf0;
393: outb(icr, EWRK3_ICR); /* Disable all the IRQs */
394:
395: if (nicsr == CSR_TXD|CSR_RXD) {
396:
397: /* Check that the EEPROM is alive and well and not living on Pluto... */
398: for (chksum=0, i=0; i<EEPROM_MAX; i+=2) {
399: union {
400: short val;
401: char c[2];
402: } tmp;
403:
404: tmp.val = (short)Read_EEPROM(iobase, (i>>1));
405: eeprom_image[i] = tmp.c[0];
406: eeprom_image[i+1] = tmp.c[1];
407: chksum += eeprom_image[i] + eeprom_image[i+1];
408: }
409:
410: if (chksum != 0) { /* Bad EEPROM Data! */
411: printk("%s: Device has a bad on-board EEPROM.\n", dev->name);
412: status = -ENXIO;
413: } else {
414: EthwrkSignature(name, eeprom_image);
415: if (*name != '\0') { /* found a EWRK3 device */
416: dev->base_addr = iobase;
417:
418: if (iobase > 0x400) {
419: outb(eisa_cr, EISA_CR); /* Rewrite the EISA CR */
420: }
421:
422: lemac = eeprom_image[EEPROM_CHIPVER];
423: cmr = inb(EWRK3_CMR);
424:
425: if (((lemac == LeMAC) && ((cmr & CMR_NO_EEPROM) != CMR_NO_EEPROM)) ||
426: ((lemac == LeMAC2) && !(cmr & CMR_HS))) {
427: printk("%s: %s at %#4lx", dev->name, name, iobase);
428: hard_strapped = 1;
429: } else if ((iobase&0x0fff)==EWRK3_EISA_IO_PORTS) {
430: /* EISA slot address */
431: printk("%s: %s at %#4lx (EISA slot %ld)",
432: dev->name, name, iobase, ((iobase>>12)&0x0f));
433: } else { /* ISA port address */
434: printk("%s: %s at %#4lx", dev->name, name, iobase);
435: }
436:
437: if (!status) {
438: printk(", h/w address ");
439: if (lemac!=LeMAC2) DevicePresent(iobase);/* need after EWRK3_INIT */
440: status = get_hw_addr(dev, eeprom_image, lemac);
441: for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet addr. */
442: printk("%2.2x:", dev->dev_addr[i]);
443: }
444: printk("%2.2x,\n", dev->dev_addr[i]);
445:
446: if (status) {
447: printk(" which has an EEPROM CRC error.\n");
448: status = -ENXIO;
449: } else {
450: if (lemac == LeMAC2) { /* Special LeMAC2 CMR things */
451: cmr &= ~(CMR_RA | CMR_WB | CMR_LINK | CMR_POLARITY | CMR_0WS);
452: if (eeprom_image[EEPROM_MISC0] & READ_AHEAD) cmr |= CMR_RA;
453: if (eeprom_image[EEPROM_MISC0] & WRITE_BEHIND) cmr |= CMR_WB;
454: if (eeprom_image[EEPROM_NETMAN0] & NETMAN_POL) cmr |= CMR_POLARITY;
455: if (eeprom_image[EEPROM_NETMAN0] & NETMAN_LINK) cmr |= CMR_LINK;
456: if (eeprom_image[EEPROM_MISC0] & _0WS_ENA) cmr |= CMR_0WS;
457: }
458: if (eeprom_image[EEPROM_SETUP] & SETUP_DRAM) cmr |= CMR_DRAM;
459: outb(cmr, EWRK3_CMR);
460:
461: cr = inb(EWRK3_CR); /* Set up the Control Register */
462: cr |= eeprom_image[EEPROM_SETUP] & SETUP_APD;
463: if (cr & SETUP_APD) cr |= eeprom_image[EEPROM_SETUP] & SETUP_PS;
464: cr |= eeprom_image[EEPROM_MISC0] & FAST_BUS;
465: cr |= eeprom_image[EEPROM_MISC0] & ENA_16;
466: outb(cr, EWRK3_CR);
467:
468: /*
469: ** Determine the base address and window length for the EWRK3
470: ** RAM from the memory base register.
471: */
472: mem_start = inb(EWRK3_MBR);
473: shmem_length = 0;
474: if (mem_start != 0) {
475: if ((mem_start >= 0x0a) && (mem_start <= 0x0f)) {
476: mem_start *= SHMEM_64K;
477: shmem_length = SHMEM_64K;
478: } else if ((mem_start >= 0x14) && (mem_start <= 0x1f)) {
479: mem_start *= SHMEM_32K;
480: shmem_length = SHMEM_32K;
481: } else if ((mem_start >= 0x40) && (mem_start <= 0xff)) {
482: mem_start = mem_start * SHMEM_2K + 0x80000;
483: shmem_length = SHMEM_2K;
484: } else {
485: status = -ENXIO;
486: }
487: }
488:
489: /*
490: ** See the top of this source code for comments about
491: ** uncommenting this line.
492: */
493: /* FORCE_2K_MODE;*/
494:
495: if (!status) {
496: if (hard_strapped) {
497: printk(" is hard strapped.\n");
498: } else if (mem_start) {
499: printk(" has a %dk RAM window", (int)(shmem_length >> 10));
500: printk(" at 0x%.5lx", mem_start);
501: } else {
502: printk(" is in I/O only mode");
503: }
504:
505: /* private area & initialise */
506: dev->priv = (void *) kmalloc(sizeof(struct ewrk3_private),
507: GFP_KERNEL);
508: if (dev->priv == NULL) {
509: return -ENOMEM;
510: }
511: lp = (struct ewrk3_private *)dev->priv;
512: memset(dev->priv, 0, sizeof(struct ewrk3_private));
513: lp->shmem_base = mem_start;
514: lp->shmem_length = shmem_length;
515: lp->lemac = lemac;
516: lp->hard_strapped = hard_strapped;
517:
518: lp->mPage = 64;
519: if (cmr & CMR_DRAM) lp->mPage <<= 1 ;/* 2 DRAMS on module */
520:
521: sprintf(lp->adapter_name,"%s (%s)", name, dev->name);
522: request_region(iobase, EWRK3_TOTAL_SIZE, lp->adapter_name);
523:
524: lp->irq_mask = ICR_TNEM|ICR_TXDM|ICR_RNEM|ICR_RXDM;
525:
526: if (!hard_strapped) {
527: /*
528: ** Enable EWRK3 board interrupts for autoprobing
529: */
530: icr |= ICR_IE; /* Enable interrupts */
531: outb(icr, EWRK3_ICR);
532:
533: /* The DMA channel may be passed in on this parameter. */
534: dev->dma = 0;
535:
536: /* To auto-IRQ we enable the initialization-done and DMA err,
537: interrupts. For now we will always get a DMA error. */
538: if (dev->irq < 2) {
539: #ifndef MODULE
540: u_char irqnum;
541:
542: autoirq_setup(0);
543:
544: /*
545: ** Trigger a TNE interrupt.
546: */
547: icr |=ICR_TNEM;
548: outb(1,EWRK3_TDQ); /* Write to the TX done queue */
549: outb(icr, EWRK3_ICR); /* Unmask the TXD interrupt */
550:
551: irqnum = irq[((icr & IRQ_SEL) >> 4)];
552:
553: dev->irq = autoirq_report(1);
554: if ((dev->irq) && (irqnum == dev->irq)) {
555: printk(" and uses IRQ%d.\n", dev->irq);
556: } else {
557: if (!dev->irq) {
558: printk(" and failed to detect IRQ line.\n");
559: } else if ((irqnum == 1) && (lemac == LeMAC2)) {
560: printk(" and an illegal IRQ line detected.\n");
561: } else {
562: printk(", but incorrect IRQ line detected.\n");
563: }
564: status = -ENXIO;
565: }
566:
567: DISABLE_IRQs; /* Mask all interrupts */
568:
569: #endif /* MODULE */
570: } else {
571: printk(" and requires IRQ%d.\n", dev->irq);
572: }
573: }
574: if (status) release_region(iobase, EWRK3_TOTAL_SIZE);
575: } else {
576: status = -ENXIO;
577: }
578: }
579: }
580: } else {
581: status = -ENXIO;
582: }
583: }
584:
585: if (!status) {
586: if (ewrk3_debug > 0) {
587: printk(version);
588: }
589:
590: /* The EWRK3-specific entries in the device structure. */
591: dev->open = &ewrk3_open;
592: dev->hard_start_xmit = &ewrk3_queue_pkt;
593: dev->stop = &ewrk3_close;
594: dev->get_stats = &ewrk3_get_stats;
595: dev->set_multicast_list = &set_multicast_list;
596: dev->do_ioctl = &ewrk3_ioctl;
597:
598: dev->mem_start = 0;
599:
600: /* Fill in the generic field of the device structure. */
601: ether_setup(dev);
602: }
603: } else {
604: status = -ENXIO;
605: }
606:
607: return status;
608: }
609:
610:
611: static int
612: ewrk3_open(struct device *dev)
613: {
614: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
615: u_long iobase = dev->base_addr;
616: int i, status = 0;
617: u_char icr, csr;
618:
619: /*
620: ** Stop the TX and RX...
621: */
622: STOP_EWRK3;
623:
624: if (!lp->hard_strapped) {
625: irq2dev_map[dev->irq] = dev; /* For latched interrupts */
626:
627: if (request_irq(dev->irq, (void *)ewrk3_interrupt, 0, "ewrk3")) {
628: printk("ewrk3_open(): Requested IRQ%d is busy\n",dev->irq);
629: status = -EAGAIN;
630: } else {
631:
632: /*
633: ** Re-initialize the EWRK3...
634: */
635: ewrk3_init(dev);
636:
637: if (ewrk3_debug > 1){
638: printk("%s: ewrk3 open with irq %d\n",dev->name,dev->irq);
639: printk(" physical address: ");
640: for (i=0;i<5;i++){
641: printk("%2.2x:",(u_char)dev->dev_addr[i]);
642: }
643: printk("%2.2x\n",(u_char)dev->dev_addr[i]);
644: if (lp->shmem_length == 0) {
645: printk(" no shared memory, I/O only mode\n");
646: } else {
647: printk(" start of shared memory: 0x%08lx\n",lp->shmem_base);
648: printk(" window length: 0x%04lx\n",lp->shmem_length);
649: }
650: printk(" # of DRAMS: %d\n",((inb(EWRK3_CMR) & 0x02) ? 2 : 1));
651: printk(" csr: 0x%02x\n", inb(EWRK3_CSR));
652: printk(" cr: 0x%02x\n", inb(EWRK3_CR));
653: printk(" icr: 0x%02x\n", inb(EWRK3_ICR));
654: printk(" cmr: 0x%02x\n", inb(EWRK3_CMR));
655: printk(" fmqc: 0x%02x\n", inb(EWRK3_FMQC));
656: }
657:
658: dev->tbusy = 0;
659: dev->start = 1;
660: dev->interrupt = UNMASK_INTERRUPTS;
661:
662: /*
663: ** Unmask EWRK3 board interrupts
664: */
665: icr = inb(EWRK3_ICR);
666: ENABLE_IRQs;
667:
668: }
669: } else {
670: dev->start = 0;
671: dev->tbusy = 1;
672: printk("%s: ewrk3 available for hard strapped set up only.\n", dev->name);
673: printk(" Run the 'ewrk3setup' utility or remove the hard straps.\n");
674: }
675:
676: MOD_INC_USE_COUNT;
677:
678: return status;
679: }
680:
681: /*
682: ** Initialize the EtherWORKS 3 operating conditions
683: */
684: static void
685: ewrk3_init(struct device *dev)
686: {
687: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
688: u_char csr, page;
689: u_long iobase = dev->base_addr;
690:
691: /*
692: ** Enable any multicasts
693: */
694: set_multicast_list(dev);
695:
696: /*
697: ** Clean out any remaining entries in all the queues here
698: */
699: while (inb(EWRK3_TQ));
700: while (inb(EWRK3_TDQ));
701: while (inb(EWRK3_RQ));
702: while (inb(EWRK3_FMQ));
703:
704: /*
705: ** Write a clean free memory queue
706: */
707: for (page=1;page<lp->mPage;page++) { /* Write the free page numbers */
708: outb(page, EWRK3_FMQ); /* to the Free Memory Queue */
709: }
710:
711: lp->lock = 0; /* Ensure there are no locks */
712:
713: START_EWRK3; /* Enable the TX and/or RX */
714: }
715:
716: /*
717: ** Writes a socket buffer to the free page queue
718: */
719: static int
720: ewrk3_queue_pkt(struct sk_buff *skb, struct device *dev)
721: {
722: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
723: u_long iobase = dev->base_addr;
724: int status = 0;
725: u_char icr, csr;
726:
727: /* Transmitter timeout, serious problems. */
728: if (dev->tbusy || lp->lock) {
729: int tickssofar = jiffies - dev->trans_start;
730: if (tickssofar < QUEUE_PKT_TIMEOUT) {
731: status = -1;
732: } else if (!lp->hard_strapped) {
733: printk("%s: transmit timed/locked out, status %04x, resetting.\n",
734: dev->name, inb(EWRK3_CSR));
735:
736: /*
737: ** Mask all board interrupts
738: */
739: DISABLE_IRQs;
740:
741: /*
742: ** Stop the TX and RX...
743: */
744: STOP_EWRK3;
745:
746: ewrk3_init(dev);
747:
748: /*
749: ** Unmask EWRK3 board interrupts
750: */
751: ENABLE_IRQs;
752:
753: dev->tbusy=0;
754: dev->trans_start = jiffies;
755: }
756: } else if (skb == NULL) {
757: dev_tint(dev);
758: } else if (skb->len > 0) {
759:
760: /*
761: ** Block a timer-based transmit from overlapping. This could better be
762: ** done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
763: */
764: if (set_bit(0, (void*)&dev->tbusy) != 0)
765: printk("%s: Transmitter access conflict.\n", dev->name);
766:
767: DISABLE_IRQs; /* So that the page # remains correct */
768:
769: /*
770: ** Get a free page from the FMQ when resources are available
771: */
772: if (inb(EWRK3_FMQC) > 0) {
773: u_long buf = 0;
774: u_char page;
775:
776: if ((page = inb(EWRK3_FMQ)) < lp->mPage) {
777: /*
778: ** Set up shared memory window and pointer into the window
779: */
780: while (set_bit(0, (void *)&lp->lock) != 0); /* Wait for lock to free */
781: if (lp->shmem_length == IO_ONLY) {
782: outb(page, EWRK3_IOPR);
783: } else if (lp->shmem_length == SHMEM_2K) {
784: buf = lp->shmem_base;
785: outb(page, EWRK3_MPR);
786: } else if (lp->shmem_length == SHMEM_32K) {
787: buf = ((((short)page << 11) & 0x7800) + lp->shmem_base);
788: outb((page >> 4), EWRK3_MPR);
789: } else if (lp->shmem_length == SHMEM_64K) {
790: buf = ((((short)page << 11) & 0xf800) + lp->shmem_base);
791: outb((page >> 5), EWRK3_MPR);
792: } else {
793: status = -1;
794: printk("%s: Oops - your private data area is hosed!\n",dev->name);
795: }
796:
797: if (!status) {
798:
799: /*
800: ** Set up the buffer control structures and copy the data from
801: ** the socket buffer to the shared memory .
802: */
803:
804: if (lp->shmem_length == IO_ONLY) {
805: int i;
806: u_char *p = skb->data;
807:
808: outb((char)(TCR_QMODE | TCR_PAD | TCR_IFC), EWRK3_DATA);
809: outb((char)(skb->len & 0xff), EWRK3_DATA);
810: outb((char)((skb->len >> 8) & 0xff), EWRK3_DATA);
811: outb((char)0x04, EWRK3_DATA);
812: for (i=0; i<skb->len; i++) {
813: outb(*p++, EWRK3_DATA);
814: }
815: outb(page, EWRK3_TQ); /* Start sending pkt */
816: } else {
817: writeb((char)(TCR_QMODE|TCR_PAD|TCR_IFC), (char *)buf);/* ctrl byte*/
818: buf+=1;
819: writeb((char)(skb->len & 0xff), (char *)buf);/* length (16 bit xfer)*/
820: buf+=1;
821: if (lp->txc) {
822: writeb((char)(((skb->len >> 8) & 0xff) | XCT), (char *)buf);
823: buf+=1;
824: writeb(0x04, (char *)buf); /* index byte */
825: buf+=1;
826: writeb(0x00, (char *)(buf + skb->len)); /* Write the XCT flag */
827: memcpy_toio(buf, skb->data, PRELOAD);/* Write PRELOAD bytes*/
828: outb(page, EWRK3_TQ); /* Start sending pkt */
829: memcpy_toio(buf+PRELOAD, skb->data+PRELOAD, skb->len-PRELOAD);
830: writeb(0xff, (char *)(buf + skb->len)); /* Write the XCT flag */
831: } else {
832: writeb((char)((skb->len >> 8) & 0xff), (char *)buf);
833: buf+=1;
834: writeb(0x04, (char *)buf); /* index byte */
835: buf+=1;
836: memcpy_toio((char *)buf, skb->data, skb->len);/* Write data bytes */
837: outb(page, EWRK3_TQ); /* Start sending pkt */
838: }
839: }
840:
841: dev->trans_start = jiffies;
842: dev_kfree_skb (skb, FREE_WRITE);
843:
844: } else { /* return unused page to the free memory queue */
845: outb(page, EWRK3_FMQ);
846: }
847: lp->lock = 0; /* unlock the page register */
848: } else {
849: printk("ewrk3_queue_pkt(): Invalid free memory page (%d).\n",
850: (u_char) page);
851: }
852: } else {
853: printk("ewrk3_queue_pkt(): No free resources...\n");
854: printk("ewrk3_queue_pkt(): CSR: %02x ICR: %02x FMQC: %02x\n",inb(EWRK3_CSR),inb(EWRK3_ICR),inb(EWRK3_FMQC));
855: }
856:
857: /* Check for free resources: clear 'tbusy' if there are some */
858: if (inb(EWRK3_FMQC) > 0) {
859: dev->tbusy = 0;
860: }
861:
862: ENABLE_IRQs;
863: }
864:
865: return status;
866: }
867:
868: /*
869: ** The EWRK3 interrupt handler.
870: */
871: static void
872: ewrk3_interrupt(int irq, struct pt_regs * regs)
873: {
874: struct device *dev = (struct device *)(irq2dev_map[irq]);
875: struct ewrk3_private *lp;
876: u_long iobase;
877: u_char icr, cr, csr;
878:
879: if (dev == NULL) {
880: printk ("ewrk3_interrupt(): irq %d for unknown device.\n", irq);
881: } else {
882: lp = (struct ewrk3_private *)dev->priv;
883: iobase = dev->base_addr;
884:
885: if (dev->interrupt)
886: printk("%s: Re-entering the interrupt handler.\n", dev->name);
887:
888: dev->interrupt = MASK_INTERRUPTS;
889:
890: /* get the interrupt information */
891: csr = inb(EWRK3_CSR);
892:
893: /*
894: ** Mask the EWRK3 board interrupts and turn on the LED
895: */
896: DISABLE_IRQs;
897:
898: cr = inb(EWRK3_CR);
899: cr |= CR_LED;
900: outb(cr, EWRK3_CR);
901:
902: if (csr & CSR_RNE) /* Rx interrupt (packet[s] arrived) */
903: ewrk3_rx(dev);
904:
905: if (csr & CSR_TNE) /* Tx interrupt (packet sent) */
906: ewrk3_tx(dev);
907:
908: /*
909: ** Now deal with the TX/RX disable flags. These are set when there
910: ** are no more resources. If resources free up then enable these
911: ** interrupts, otherwise mask them - failure to do this will result
912: ** in the system hanging in an interrupt loop.
913: */
914: if (inb(EWRK3_FMQC)) { /* any resources available? */
915: lp->irq_mask |= ICR_TXDM|ICR_RXDM;/* enable the interrupt source */
916: csr &= ~(CSR_TXD|CSR_RXD);/* ensure restart of a stalled TX or RX */
917: outb(csr, EWRK3_CSR);
918: dev->tbusy = 0; /* clear TX busy flag */
919: mark_bh(NET_BH);
920: } else {
921: lp->irq_mask &= ~(ICR_TXDM|ICR_RXDM);/* disable the interrupt source */
922: }
923:
924: /* Unmask the EWRK3 board interrupts and turn off the LED */
925: cr &= ~CR_LED;
926: outb(cr, EWRK3_CR);
927:
928: dev->interrupt = UNMASK_INTERRUPTS;
929: ENABLE_IRQs;
930: }
931:
932: return;
933: }
934:
935: static int
936: ewrk3_rx(struct device *dev)
937: {
938: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
939: u_long iobase = dev->base_addr;
940: int i, status = 0;
941: u_char page, tmpPage = 0, tmpLock = 0;
942: u_long buf = 0;
943:
944: while (inb(EWRK3_RQC) && !status) { /* Whilst there's incoming data */
945: if ((page = inb(EWRK3_RQ)) < lp->mPage) {/* Get next entry's buffer page */
946: /*
947: ** Preempt any process using the current page register. Check for
948: ** an existing lock to reduce time taken in I/O transactions.
949: */
950: if ((tmpLock = set_bit(0, (void *)&lp->lock)) == 1) { /* Assert lock */
951: if (lp->shmem_length == IO_ONLY) { /* Get existing page */
952: tmpPage = inb(EWRK3_IOPR);
953: } else {
954: tmpPage = inb(EWRK3_MPR);
955: }
956: }
957:
958: /*
959: ** Set up shared memory window and pointer into the window
960: */
961: if (lp->shmem_length == IO_ONLY) {
962: outb(page, EWRK3_IOPR);
963: } else if (lp->shmem_length == SHMEM_2K) {
964: buf = lp->shmem_base;
965: outb(page, EWRK3_MPR);
966: } else if (lp->shmem_length == SHMEM_32K) {
967: buf = ((((short)page << 11) & 0x7800) + lp->shmem_base);
968: outb((page >> 4), EWRK3_MPR);
969: } else if (lp->shmem_length == SHMEM_64K) {
970: buf = ((((short)page << 11) & 0xf800) + lp->shmem_base);
971: outb((page >> 5), EWRK3_MPR);
972: } else {
973: status = -1;
974: printk("%s: Oops - your private data area is hosed!\n",dev->name);
975: }
976:
977: if (!status) {
978: char rx_status;
979: int pkt_len;
980:
981: if (lp->shmem_length == IO_ONLY) {
982: rx_status = inb(EWRK3_DATA);
983: pkt_len = inb(EWRK3_DATA);
984: pkt_len |= ((u_short)inb(EWRK3_DATA) << 8);
985: } else {
986: rx_status = readb(buf);
987: buf+=1;
988: pkt_len = readw(buf);
989: buf+=3;
990: }
991:
992: if (!(rx_status & R_ROK)) { /* There was an error. */
993: lp->stats.rx_errors++; /* Update the error stats. */
994: if (rx_status & R_DBE) lp->stats.rx_frame_errors++;
995: if (rx_status & R_CRC) lp->stats.rx_crc_errors++;
996: if (rx_status & R_PLL) lp->stats.rx_fifo_errors++;
997: } else {
998: struct sk_buff *skb;
999:
1000: if ((skb = dev_alloc_skb(pkt_len+2)) != NULL) {
1001: unsigned char *p;
1002: skb->dev = dev;
1003: skb_reserve(skb,2); /* Align to 16 bytes */
1004: p = skb_put(skb,pkt_len);
1005:
1006: if (lp->shmem_length == IO_ONLY) {
1007: *p = inb(EWRK3_DATA); /* dummy read */
1008: for (i=0; i<pkt_len; i++) {
1009: *p++ = inb(EWRK3_DATA);
1010: }
1011: } else {
1012: memcpy_fromio(p, buf, pkt_len);
1013: }
1014:
1015: /*
1016: ** Notify the upper protocol layers that there is another
1017: ** packet to handle
1018: */
1019: skb->protocol=eth_type_trans(skb,dev);
1020: netif_rx(skb);
1021:
1022: /*
1023: ** Update stats
1024: */
1025: lp->stats.rx_packets++;
1026: for (i=1; i<EWRK3_PKT_STAT_SZ-1; i++) {
1027: if (pkt_len < i*EWRK3_PKT_BIN_SZ) {
1028: lp->pktStats.bins[i]++;
1029: i = EWRK3_PKT_STAT_SZ;
1030: }
1031: }
1032: p = skb->data; /* Look at the dest addr */
1033: if (p[0] & 0x01) { /* Multicast/Broadcast */
1034: if ((*(s32 *)&p[0] == -1) && (*(s16 *)&p[4] == -1)) {
1035: lp->pktStats.broadcast++;
1036: } else {
1037: lp->pktStats.multicast++;
1038: }
1039: } else if ((*(s32 *)&p[0] == *(s32 *)&dev->dev_addr[0]) &&
1040: (*(s16 *)&p[4] == *(s16 *)&dev->dev_addr[4])) {
1041: lp->pktStats.unicast++;
1042: }
1043:
1044: lp->pktStats.bins[0]++; /* Duplicates stats.rx_packets */
1045: if (lp->pktStats.bins[0] == 0) { /* Reset counters */
1046: memset(&lp->pktStats, 0, sizeof(lp->pktStats));
1047: }
1048: } else {
1049: printk("%s: Insufficient memory; nuking packet.\n", dev->name);
1050: lp->stats.rx_dropped++; /* Really, deferred. */
1051: break;
1052: }
1053: }
1054: }
1055: /*
1056: ** Return the received buffer to the free memory queue
1057: */
1058: outb(page, EWRK3_FMQ);
1059:
1060: if (tmpLock) { /* If a lock was preempted */
1061: if (lp->shmem_length == IO_ONLY) { /* Replace old page */
1062: outb(tmpPage, EWRK3_IOPR);
1063: } else {
1064: outb(tmpPage, EWRK3_MPR);
1065: }
1066: }
1067: lp->lock = 0; /* Unlock the page register */
1068: } else {
1069: printk("ewrk3_rx(): Illegal page number, page %d\n",page);
1070: printk("ewrk3_rx(): CSR: %02x ICR: %02x FMQC: %02x\n",inb(EWRK3_CSR),inb(EWRK3_ICR),inb(EWRK3_FMQC));
1071: }
1072: }
1073: return status;
1074: }
1075:
1076: /*
1077: ** Buffer sent - check for TX buffer errors.
1078: */
1079: static int
1080: ewrk3_tx(struct device *dev)
1081: {
1082: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
1083: u_long iobase = dev->base_addr;
1084: u_char tx_status;
1085:
1086: while ((tx_status = inb(EWRK3_TDQ)) > 0) { /* Whilst there's old buffers */
1087: if (tx_status & T_VSTS) { /* The status is valid */
1088: if (tx_status & T_TXE) {
1089: lp->stats.tx_errors++;
1090: if (tx_status & T_NCL) lp->stats.tx_carrier_errors++;
1091: if (tx_status & T_LCL) lp->stats.tx_window_errors++;
1092: if (tx_status & T_CTU) {
1093: if ((tx_status & T_COLL) ^ T_XUR) {
1094: lp->pktStats.tx_underruns++;
1095: } else {
1096: lp->pktStats.excessive_underruns++;
1097: }
1098: } else if (tx_status & T_COLL) {
1099: if ((tx_status & T_COLL) ^ T_XCOLL) {
1100: lp->stats.collisions++;
1101: } else {
1102: lp->pktStats.excessive_collisions++;
1103: }
1104: }
1105: } else {
1106: lp->stats.tx_packets++;
1107: }
1108: }
1109: }
1110:
1111: return 0;
1112: }
1113:
1114: static int
1115: ewrk3_close(struct device *dev)
1116: {
1117: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
1118: u_long iobase = dev->base_addr;
1119: u_char icr, csr;
1120:
1121: dev->start = 0;
1122: dev->tbusy = 1;
1123:
1124: if (ewrk3_debug > 1) {
1125: printk("%s: Shutting down ethercard, status was %2.2x.\n",
1126: dev->name, inb(EWRK3_CSR));
1127: }
1128:
1129: /*
1130: ** We stop the EWRK3 here... mask interrupts and stop TX & RX
1131: */
1132: DISABLE_IRQs;
1133:
1134: STOP_EWRK3;
1135:
1136: /*
1137: ** Clean out the TX and RX queues here (note that one entry
1138: ** may get added to either the TXD or RX queues if the the TX or RX
1139: ** just starts processing a packet before the STOP_EWRK3 command
1140: ** is received. This will be flushed in the ewrk3_open() call).
1141: */
1142: while (inb(EWRK3_TQ));
1143: while (inb(EWRK3_TDQ));
1144: while (inb(EWRK3_RQ));
1145:
1146: if (!lp->hard_strapped) {
1147: free_irq(dev->irq);
1148:
1149: irq2dev_map[dev->irq] = 0;
1150: }
1151:
1152: MOD_DEC_USE_COUNT;
1153:
1154: return 0;
1155: }
1156:
1157: static struct enet_statistics *
1158: ewrk3_get_stats(struct device *dev)
1159: {
1160: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
1161:
1162: /* Null body since there is no framing error counter */
1163:
1164: return &lp->stats;
1165: }
1166:
1167: /*
1168: ** Set or clear the multicast filter for this adaptor.
1169: */
1170: static void
1171: set_multicast_list(struct device *dev)
1172: {
1173: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
1174: u_long iobase = dev->base_addr;
1175: u_char csr;
1176:
1177: if (irq2dev_map[dev->irq] != NULL) {
1178: csr = inb(EWRK3_CSR);
1179:
1180: if (lp->shmem_length == IO_ONLY) {
1181: lp->mctbl = (char *) PAGE0_HTE;
1182: } else {
1183: lp->mctbl = (char *)(lp->shmem_base + PAGE0_HTE);
1184: }
1185:
1186: csr &= ~(CSR_PME | CSR_MCE);
1187: if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */
1188: csr |= CSR_PME;
1189: outb(csr, EWRK3_CSR);
1190: } else {
1191: SetMulticastFilter(dev);
1192: csr |= CSR_MCE;
1193: outb(csr, EWRK3_CSR);
1194: }
1195: }
1196: }
1197:
1198: /*
1199: ** Calculate the hash code and update the logical address filter
1200: ** from a list of ethernet multicast addresses.
1201: ** Little endian crc one liner from Matt Thomas, DEC.
1202: **
1203: ** Note that when clearing the table, the broadcast bit must remain asserted
1204: ** to receive broadcast messages.
1205: */
1206: static void SetMulticastFilter(struct device *dev)
1207: {
1208: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
1209: struct dev_mc_list *dmi=dev->mc_list;
1210: u_long iobase = dev->base_addr;
1211: int i;
1212: char *addrs, j, bit, byte;
1213: short *p = (short *) lp->mctbl;
1214: u16 hashcode;
1215: s32 crc, poly = CRC_POLYNOMIAL_LE;
1216:
1217: while (set_bit(0, (void *)&lp->lock) != 0); /* Wait for lock to free */
1218:
1219: if (lp->shmem_length == IO_ONLY) {
1220: outb(0, EWRK3_IOPR);
1221: outw(EEPROM_OFFSET(lp->mctbl), EWRK3_PIR1);
1222: } else {
1223: outb(0, EWRK3_MPR);
1224: }
1225:
1226: if (dev->flags & IFF_ALLMULTI) {
1227: for (i=0; i<(HASH_TABLE_LEN >> 3); i++) {
1228: if (lp->shmem_length == IO_ONLY) {
1229: outb(0xff, EWRK3_DATA);
1230: } else { /* memset didn't work here */
1231: writew(0xffff, p);
1232: p++; i++;
1233: }
1234: }
1235: } else {
1236: /* Clear table except for broadcast bit */
1237: if (lp->shmem_length == IO_ONLY) {
1238: for (i=0; i<(HASH_TABLE_LEN >> 4) - 1; i++) {
1239: outb(0x00, EWRK3_DATA);
1240: }
1241: outb(0x80, EWRK3_DATA); i++; /* insert the broadcast bit */
1242: for (; i<(HASH_TABLE_LEN >> 3); i++) {
1243: outb(0x00, EWRK3_DATA);
1244: }
1245: } else {
1246: memset_io(lp->mctbl, 0, (HASH_TABLE_LEN >> 3));
1247: writeb(0x80, (char *)(lp->mctbl + (HASH_TABLE_LEN >> 4) - 1));
1248: }
1249:
1250: /* Update table */
1251: for (i=0;i<dev->mc_count;i++) { /* for each address in the list */
1252: addrs=dmi->dmi_addr;
1253: dmi=dmi->next;
1254: if ((*addrs & 0x01) == 1) { /* multicast address? */
1255: crc = 0xffffffff; /* init CRC for each address */
1256: for (byte=0;byte<ETH_ALEN;byte++) { /* for each address byte */
1257: /* process each address bit */
1258: for (bit = *addrs++,j=0;j<8;j++, bit>>=1) {
1259: crc = (crc >> 1) ^ (((crc ^ bit) & 0x01) ? poly : 0);
1260: }
1261: }
1262: hashcode = crc & ((1 << 9) - 1); /* hashcode is 9 LSb of CRC */
1263:
1264: byte = hashcode >> 3; /* bit[3-8] -> byte in filter */
1265: bit = 1 << (hashcode & 0x07); /* bit[0-2] -> bit in byte */
1266:
1267: if (lp->shmem_length == IO_ONLY) {
1268: u_char tmp;
1269:
1270: outw((short)((long)lp->mctbl) + byte, EWRK3_PIR1);
1271: tmp = inb(EWRK3_DATA);
1272: tmp |= bit;
1273: outw((short)((long)lp->mctbl) + byte, EWRK3_PIR1);
1274: outb(tmp, EWRK3_DATA);
1275: } else {
1276: writeb(readb(lp->mctbl + byte) | bit, lp->mctbl + byte);
1277: }
1278: }
1279: }
1280: }
1281:
1282: lp->lock = 0; /* Unlock the page register */
1283:
1284: return;
1285: }
1286:
1287: /*
1288: ** ISA bus I/O device probe
1289: */
1290: static void isa_probe(struct device *dev, u_long ioaddr)
1291: {
1292: int i = num_ewrk3s, maxSlots;
1293: u_long iobase;
1294:
1295: if (!ioaddr && autoprobed) return ; /* Been here before ! */
1296: if (ioaddr >= 0x400) return; /* Not ISA */
1297:
1298: if (ioaddr == 0) { /* Autoprobing */
1299: iobase = EWRK3_IO_BASE; /* Get the first slot address */
1300: maxSlots = 24;
1301: } else { /* Probe a specific location */
1302: iobase = ioaddr;
1303: maxSlots = i + 1;
1304: }
1305:
1306: for (; (i<maxSlots) && (dev!=NULL);iobase+=EWRK3_IOP_INC, i++) {
1307: if (!check_region(iobase, EWRK3_TOTAL_SIZE)) {
1308: if (DevicePresent(iobase) == 0) {
1309: if ((dev = alloc_device(dev, iobase)) != NULL) {
1310: if (ewrk3_hw_init(dev, iobase) == 0) {
1311: num_ewrk3s++;
1312: }
1313: num_eth++;
1314: }
1315: }
1316: } else if (autoprobed) {
1317: printk("%s: region already allocated at 0x%04lx.\n", dev->name, iobase);
1318: }
1319: }
1320:
1321: return;
1322: }
1323:
1324: /*
1325: ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually
1326: ** the motherboard.
1327: */
1328: static void eisa_probe(struct device *dev, u_long ioaddr)
1329: {
1330: int i, maxSlots;
1331: u_long iobase;
1332: char name[EWRK3_STRLEN];
1333:
1334: if (!ioaddr && autoprobed) return ; /* Been here before ! */
1335: if (ioaddr < 0x1000) return; /* Not EISA */
1336:
1337: if (ioaddr == 0) { /* Autoprobing */
1338: iobase = EISA_SLOT_INC; /* Get the first slot address */
1339: i = 1;
1340: maxSlots = MAX_EISA_SLOTS;
1341: } else { /* Probe a specific location */
1342: iobase = ioaddr;
1343: i = (ioaddr >> 12);
1344: maxSlots = i + 1;
1345: }
1346:
1347: for (i=1; (i<maxSlots) && (dev!=NULL); i++, iobase+=EISA_SLOT_INC) {
1348: if (EISA_signature(name, EISA_ID) == 0) {
1349: if (!check_region(iobase, EWRK3_TOTAL_SIZE)) {
1350: if (DevicePresent(iobase) == 0) {
1351: if ((dev = alloc_device(dev, iobase)) != NULL) {
1352: if (ewrk3_hw_init(dev, iobase) == 0) {
1353: num_ewrk3s++;
1354: }
1355: num_eth++;
1356: }
1357: }
1358: } else if (autoprobed) {
1359: printk("%s: region already allocated at 0x%04lx.\n", dev->name, iobase);
1360: }
1361: }
1362: }
1363:
1364: return;
1365: }
1366:
1367: /*
1368: ** Allocate the device by pointing to the next available space in the
1369: ** device structure. Should one not be available, it is created.
1370: */
1371: static struct device *alloc_device(struct device *dev, u_long iobase)
1372: {
1373: int addAutoProbe = 0;
1374: struct device *tmp = NULL, *ret;
1375: int (*init)(struct device *) = NULL;
1376:
1377: /*
1378: ** Check the device structures for an end of list or unused device
1379: */
1380: if (!loading_module) {
1381: while (dev->next != NULL) {
1382: if ((dev->base_addr == EWRK3_NDA) || (dev->base_addr == 0)) break;
1383: dev = dev->next; /* walk through eth device list */
1384: num_eth++; /* increment eth device number */
1385: }
1386:
1387: /*
1388: ** If an autoprobe is requested for another device, we must re-insert
1389: ** the request later in the list. Remember the current position first.
1390: */
1391: if ((dev->base_addr == 0) && (num_ewrk3s > 0)) {
1392: addAutoProbe++;
1393: tmp = dev->next; /* point to the next device */
1394: init = dev->init; /* remember the probe function */
1395: }
1396:
1397: /*
1398: ** If at end of list and can't use current entry, malloc one up.
1399: ** If memory could not be allocated, print an error message.
1400: */
1401: if ((dev->next == NULL) &&
1402: !((dev->base_addr == EWRK3_NDA) || (dev->base_addr == 0))){
1403: dev->next = (struct device *)kmalloc(sizeof(struct device) + 8,
1404: GFP_KERNEL);
1405:
1406: dev = dev->next; /* point to the new device */
1407: if (dev == NULL) {
1408: printk("eth%d: Device not initialised, insufficient memory\n",
1409: num_eth);
1410: } else {
1411: /*
1412: ** If the memory was allocated, point to the new memory area
1413: ** and initialize it (name, I/O address, next device (NULL) and
1414: ** initialisation probe routine).
1415: */
1416: dev->name = (char *)(dev + sizeof(struct device));
1417: if (num_eth > 9999) {
1418: sprintf(dev->name,"eth????"); /* New device name */
1419: } else {
1420: sprintf(dev->name,"eth%d", num_eth);/* New device name */
1421: }
1422: dev->base_addr = iobase; /* assign the io address */
1423: dev->next = NULL; /* mark the end of list */
1424: dev->init = &ewrk3_probe; /* initialisation routine */
1425: num_ewrk3s++;
1426: }
1427: }
1428: ret = dev; /* return current struct, or NULL */
1429:
1430: /*
1431: ** Now figure out what to do with the autoprobe that has to be inserted.
1432: ** Firstly, search the (possibly altered) list for an empty space.
1433: */
1434: if (ret != NULL) {
1435: if (addAutoProbe) {
1436: for (;(tmp->next!=NULL) && (tmp->base_addr!=EWRK3_NDA); tmp=tmp->next);
1437:
1438: /*
1439: ** If no more device structures and can't use the current one, malloc
1440: ** one up. If memory could not be allocated, print an error message.
1441: */
1442: if ((tmp->next == NULL) && !(tmp->base_addr == EWRK3_NDA)) {
1443: tmp->next = (struct device *)kmalloc(sizeof(struct device) + 8,
1444: GFP_KERNEL);
1445: tmp = tmp->next; /* point to the new device */
1446: if (tmp == NULL) {
1447: printk("%s: Insufficient memory to extend the device list.\n",
1448: dev->name);
1449: } else {
1450: /*
1451: ** If the memory was allocated, point to the new memory area
1452: ** and initialize it (name, I/O address, next device (NULL) and
1453: ** initialisation probe routine).
1454: */
1455: tmp->name = (char *)(tmp + sizeof(struct device));
1456: if (num_eth > 9999) {
1457: sprintf(tmp->name,"eth????"); /* New device name */
1458: } else {
1459: sprintf(tmp->name,"eth%d", num_eth);/* New device name */
1460: }
1461: tmp->base_addr = 0; /* re-insert the io address */
1462: tmp->next = NULL; /* mark the end of list */
1463: tmp->init = init; /* initialisation routine */
1464: }
1465: } else { /* structure already exists */
1466: tmp->base_addr = 0; /* re-insert the io address */
1467: }
1468: }
1469: }
1470: } else {
1471: ret = dev;
1472: }
1473:
1474: return ret;
1475: }
1476:
1477: /*
1478: ** Read the EWRK3 EEPROM using this routine
1479: */
1480: static int Read_EEPROM(u_long iobase, u_char eaddr)
1481: {
1482: int i;
1483:
1484: outb((eaddr & 0x3f), EWRK3_PIR1); /* set up 6 bits of address info */
1485: outb(EEPROM_RD, EWRK3_IOPR); /* issue read command */
1486: for (i=0;i<5000;i++) inb(EWRK3_CSR); /* wait 1msec */
1487:
1488: return inw(EWRK3_EPROM1); /* 16 bits data return */
1489: }
1490:
1491: /*
1492: ** Write the EWRK3 EEPROM using this routine
1493: */
1494: static int Write_EEPROM(short data, u_long iobase, u_char eaddr)
1495: {
1496: int i;
1497:
1498: outb(EEPROM_WR_EN, EWRK3_IOPR); /* issue write enable command */
1499: for (i=0;i<5000;i++) inb(EWRK3_CSR); /* wait 1msec */
1500: outw(data, EWRK3_EPROM1); /* write data to register */
1501: outb((eaddr & 0x3f), EWRK3_PIR1); /* set up 6 bits of address info */
1502: outb(EEPROM_WR, EWRK3_IOPR); /* issue write command */
1503: for (i=0;i<75000;i++) inb(EWRK3_CSR); /* wait 15msec */
1504: outb(EEPROM_WR_DIS, EWRK3_IOPR); /* issue write disable command */
1505: for (i=0;i<5000;i++) inb(EWRK3_CSR); /* wait 1msec */
1506:
1507: return 0;
1508: }
1509:
1510: /*
1511: ** Look for a particular board name in the on-board EEPROM.
1512: */
1513: static void EthwrkSignature(char *name, char *eeprom_image)
1514: {
1515: u_long i,j,k;
1516: char *signatures[] = EWRK3_SIGNATURE;
1517:
1518: strcpy(name, "");
1519: for (i=0;*signatures[i] != '\0' && *name == '\0';i++) {
1520: for (j=EEPROM_PNAME7,k=0;j<=EEPROM_PNAME0 && k<strlen(signatures[i]);j++) {
1521: if (signatures[i][k] == eeprom_image[j]) { /* track signature */
1522: k++;
1523: } else { /* lost signature; begin search again */
1524: k=0;
1525: }
1526: }
1527: if (k == strlen(signatures[i])) {
1528: for (k=0; k<EWRK3_STRLEN; k++) {
1529: name[k] = eeprom_image[EEPROM_PNAME7 + k];
1530: name[EWRK3_STRLEN] = '\0';
1531: }
1532: }
1533: }
1534:
1535: return; /* return the device name string */
1536: }
1537:
1538: /*
1539: ** Look for a special sequence in the Ethernet station address PROM that
1540: ** is common across all EWRK3 products.
1541: **
1542: ** Search the Ethernet address ROM for the signature. Since the ROM address
1543: ** counter can start at an arbitrary point, the search must include the entire
1544: ** probe sequence length plus the (length_of_the_signature - 1).
1545: ** Stop the search IMMEDIATELY after the signature is found so that the
1546: ** PROM address counter is correctly positioned at the start of the
1547: ** ethernet address for later read out.
1548: */
1549:
1550: static int DevicePresent(u_long iobase)
1551: {
1552: union {
1553: struct {
1554: u32 a;
1555: u32 b;
1556: } llsig;
1557: char Sig[sizeof(u32) << 1];
1558: } dev;
1559: short sigLength;
1560: char data;
1561: int i, j, status = 0;
1562:
1563: dev.llsig.a = ETH_PROM_SIG;
1564: dev.llsig.b = ETH_PROM_SIG;
1565: sigLength = sizeof(u32) << 1;
1566:
1567: for (i=0,j=0;j<sigLength && i<PROBE_LENGTH+sigLength-1;i++) {
1568: data = inb(EWRK3_APROM);
1569: if (dev.Sig[j] == data) { /* track signature */
1570: j++;
1571: } else { /* lost signature; begin search again */
1572: if (data == dev.Sig[0]) {
1573: j=1;
1574: } else {
1575: j=0;
1576: }
1577: }
1578: }
1579:
1580: if (j!=sigLength) {
1581: status = -ENODEV; /* search failed */
1582: }
1583:
1584: return status;
1585: }
1586:
1587: static u_char get_hw_addr(struct device *dev, u_char *eeprom_image, char chipType)
1588: {
1589: int i, j, k;
1590: u_short chksum;
1591: u_char crc, lfsr, sd, status = 0;
1592: u_long iobase = dev->base_addr;
1593: u16 tmp;
1594:
1595: if (chipType == LeMAC2) {
1596: for (crc=0x6a, j=0; j<ETH_ALEN; j++) {
1597: sd = dev->dev_addr[j] = eeprom_image[EEPROM_PADDR0 + j];
1598: outb(dev->dev_addr[j], EWRK3_PAR0 + j);
1599: for (k=0; k<8; k++, sd >>= 1) {
1600: lfsr = ((((crc & 0x02) >> 1) ^ (crc & 0x01)) ^ (sd & 0x01)) << 7;
1601: crc = (crc >> 1) + lfsr;
1602: }
1603: }
1604: if (crc != eeprom_image[EEPROM_PA_CRC]) status = -1;
1605: } else {
1606: for (i=0,k=0;i<ETH_ALEN;) {
1607: k <<= 1 ;
1608: if (k > 0xffff) k-=0xffff;
1609:
1610: k += (u_char) (tmp = inb(EWRK3_APROM));
1611: dev->dev_addr[i] = (u_char) tmp;
1612: outb(dev->dev_addr[i], EWRK3_PAR0 + i);
1613: i++;
1614: k += (u_short) ((tmp = inb(EWRK3_APROM)) << 8);
1615: dev->dev_addr[i] = (u_char) tmp;
1616: outb(dev->dev_addr[i], EWRK3_PAR0 + i);
1617: i++;
1618:
1619: if (k > 0xffff) k-=0xffff;
1620: }
1621: if (k == 0xffff) k=0;
1622: chksum = inb(EWRK3_APROM);
1623: chksum |= (inb(EWRK3_APROM)<<8);
1624: if (k != chksum) status = -1;
1625: }
1626:
1627: return status;
1628: }
1629:
1630: /*
1631: ** Look for a particular board name in the EISA configuration space
1632: */
1633: static int EISA_signature(char *name, s32 eisa_id)
1634: {
1635: u_long i;
1636: char *signatures[] = EWRK3_SIGNATURE;
1637: char ManCode[EWRK3_STRLEN];
1638: union {
1639: s32 ID;
1640: char Id[4];
1641: } Eisa;
1642: int status = 0;
1643:
1644: *name = '\0';
1645: for (i=0; i<4; i++) {
1646: Eisa.Id[i] = inb(eisa_id + i);
1647: }
1648:
1649: ManCode[0]=(((Eisa.Id[0]>>2)&0x1f)+0x40);
1650: ManCode[1]=(((Eisa.Id[1]&0xe0)>>5)+((Eisa.Id[0]&0x03)<<3)+0x40);
1651: ManCode[2]=(((Eisa.Id[2]>>4)&0x0f)+0x30);
1652: ManCode[3]=((Eisa.Id[2]&0x0f)+0x30);
1653: ManCode[4]=(((Eisa.Id[3]>>4)&0x0f)+0x30);
1654: ManCode[5]='\0';
1655:
1656: for (i=0;(*signatures[i] != '\0') && (*name == '\0');i++) {
1657: if (strstr(ManCode, signatures[i]) != NULL) {
1658: strcpy(name,ManCode);
1659: status = 1;
1660: }
1661: }
1662:
1663: return status; /* return the device name string */
1664: }
1665:
1666: /*
1667: ** Perform IOCTL call functions here. Some are privileged operations and the
1668: ** effective uid is checked in those cases.
1669: */
1670: static int ewrk3_ioctl(struct device *dev, struct ifreq *rq, int cmd)
1671: {
1672: struct ewrk3_private *lp = (struct ewrk3_private *)dev->priv;
1673: struct ewrk3_ioctl *ioc = (struct ewrk3_ioctl *) &rq->ifr_data;
1674: u_long iobase = dev->base_addr;
1675: int i, j, status = 0;
1676: u_char csr;
1677: union {
1678: u_char addr[HASH_TABLE_LEN * ETH_ALEN];
1679: u_short val[(HASH_TABLE_LEN * ETH_ALEN) >> 1];
1680: } tmp;
1681:
1682: switch(ioc->cmd) {
1683: case EWRK3_GET_HWADDR: /* Get the hardware address */
1684: for (i=0; i<ETH_ALEN; i++) {
1685: tmp.addr[i] = dev->dev_addr[i];
1686: }
1687: ioc->len = ETH_ALEN;
1688: if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len))) {
1689: memcpy_tofs(ioc->data, tmp.addr, ioc->len);
1690: }
1691:
1692: break;
1693: case EWRK3_SET_HWADDR: /* Set the hardware address */
1694: if (suser()) {
1695: if (!(status = verify_area(VERIFY_READ, (void *)ioc->data, ETH_ALEN))) {
1696: csr = inb(EWRK3_CSR);
1697: csr |= (CSR_TXD|CSR_RXD);
1698: outb(csr, EWRK3_CSR); /* Disable the TX and RX */
1699:
1700: memcpy_fromfs(tmp.addr,ioc->data,ETH_ALEN);
1701: for (i=0; i<ETH_ALEN; i++) {
1702: dev->dev_addr[i] = tmp.addr[i];
1703: outb(tmp.addr[i], EWRK3_PAR0 + i);
1704: }
1705:
1706: csr &= ~(CSR_TXD|CSR_RXD); /* Enable the TX and RX */
1707: outb(csr, EWRK3_CSR);
1708: }
1709: } else {
1710: status = -EPERM;
1711: }
1712:
1713: break;
1714: case EWRK3_SET_PROM: /* Set Promiscuous Mode */
1715: if (suser()) {
1716: csr = inb(EWRK3_CSR);
1717: csr |= CSR_PME;
1718: csr &= ~CSR_MCE;
1719: outb(csr, EWRK3_CSR);
1720: } else {
1721: status = -EPERM;
1722: }
1723:
1724: break;
1725: case EWRK3_CLR_PROM: /* Clear Promiscuous Mode */
1726: if (suser()) {
1727: csr = inb(EWRK3_CSR);
1728: csr &= ~CSR_PME;
1729: outb(csr, EWRK3_CSR);
1730: } else {
1731: status = -EPERM;
1732: }
1733:
1734: break;
1735: case EWRK3_SAY_BOO: /* Say "Boo!" to the kernel log file */
1736: printk("%s: Boo!\n", dev->name);
1737:
1738: break;
1739: case EWRK3_GET_MCA: /* Get the multicast address table */
1740: if (!(status = verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
1741: while (set_bit(0, (void *)&lp->lock) != 0); /* Wait for lock to free */
1742: if (lp->shmem_length == IO_ONLY) {
1743: outb(0, EWRK3_IOPR);
1744: outw(PAGE0_HTE, EWRK3_PIR1);
1745: for (i=0; i<(HASH_TABLE_LEN >> 3); i++) {
1746: tmp.addr[i] = inb(EWRK3_DATA);
1747: }
1748: } else {
1749: outb(0, EWRK3_MPR);
1750: memcpy_fromio(tmp.addr, (char *)(lp->shmem_base + PAGE0_HTE), (HASH_TABLE_LEN >> 3));
1751: }
1752: ioc->len = (HASH_TABLE_LEN >> 3);
1753: memcpy_tofs(ioc->data, tmp.addr, ioc->len);
1754: }
1755: lp->lock = 0; /* Unlock the page register */
1756:
1757: break;
1758: case EWRK3_SET_MCA: /* Set a multicast address */
1759: if (suser()) {
1760: if (!(status=verify_area(VERIFY_READ, ioc->data, ETH_ALEN*ioc->len))) {
1761: memcpy_fromfs(tmp.addr, ioc->data, ETH_ALEN * ioc->len);
1762: set_multicast_list(dev);
1763: }
1764: } else {
1765: status = -EPERM;
1766: }
1767:
1768: break;
1769: case EWRK3_CLR_MCA: /* Clear all multicast addresses */
1770: if (suser()) {
1771: set_multicast_list(dev);
1772: } else {
1773: status = -EPERM;
1774: }
1775:
1776: break;
1777: case EWRK3_MCA_EN: /* Enable multicast addressing */
1778: if (suser()) {
1779: csr = inb(EWRK3_CSR);
1780: csr |= CSR_MCE;
1781: csr &= ~CSR_PME;
1782: outb(csr, EWRK3_CSR);
1783: } else {
1784: status = -EPERM;
1785: }
1786:
1787: break;
1788: case EWRK3_GET_STATS: /* Get the driver statistics */
1789: cli();
1790: ioc->len = sizeof(lp->pktStats);
1791: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
1792: memcpy_tofs(ioc->data, &lp->pktStats, ioc->len);
1793: }
1794: sti();
1795:
1796: break;
1797: case EWRK3_CLR_STATS: /* Zero out the driver statistics */
1798: if (suser()) {
1799: cli();
1800: memset(&lp->pktStats, 0, sizeof(lp->pktStats));
1801: sti();
1802: } else {
1803: status = -EPERM;
1804: }
1805:
1806: break;
1807: case EWRK3_GET_CSR: /* Get the CSR Register contents */
1808: tmp.addr[0] = inb(EWRK3_CSR);
1809: ioc->len = 1;
1810: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
1811: memcpy_tofs(ioc->data, tmp.addr, ioc->len);
1812: }
1813:
1814: break;
1815: case EWRK3_SET_CSR: /* Set the CSR Register contents */
1816: if (suser()) {
1817: if (!(status=verify_area(VERIFY_READ, ioc->data, 1))) {
1818: memcpy_fromfs(tmp.addr, ioc->data, 1);
1819: outb(tmp.addr[0], EWRK3_CSR);
1820: }
1821: } else {
1822: status = -EPERM;
1823: }
1824:
1825: break;
1826: case EWRK3_GET_EEPROM: /* Get the EEPROM contents */
1827: if (suser()) {
1828: for (i=0; i<(EEPROM_MAX>>1); i++) {
1829: tmp.val[i] = (short)Read_EEPROM(iobase, i);
1830: }
1831: i = EEPROM_MAX;
1832: tmp.addr[i++] = inb(EWRK3_CMR); /* Config/Management Reg. */
1833: for (j=0;j<ETH_ALEN;j++) {
1834: tmp.addr[i++] = inb(EWRK3_PAR0 + j);
1835: }
1836: ioc->len = EEPROM_MAX + 1 + ETH_ALEN;
1837: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
1838: memcpy_tofs(ioc->data, tmp.addr, ioc->len);
1839: }
1840: } else {
1841: status = -EPERM;
1842: }
1843:
1844: break;
1845: case EWRK3_SET_EEPROM: /* Set the EEPROM contents */
1846: if (suser()) {
1847: if (!(status=verify_area(VERIFY_READ, ioc->data, EEPROM_MAX))) {
1848: memcpy_fromfs(tmp.addr, ioc->data, EEPROM_MAX);
1849: for (i=0; i<(EEPROM_MAX>>1); i++) {
1850: Write_EEPROM(tmp.val[i], iobase, i);
1851: }
1852: }
1853: } else {
1854: status = -EPERM;
1855: }
1856:
1857: break;
1858: case EWRK3_GET_CMR: /* Get the CMR Register contents */
1859: tmp.addr[0] = inb(EWRK3_CMR);
1860: ioc->len = 1;
1861: if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
1862: memcpy_tofs(ioc->data, tmp.addr, ioc->len);
1863: }
1864:
1865: break;
1866: case EWRK3_SET_TX_CUT_THRU: /* Set TX cut through mode */
1867: if (suser()) {
1868: lp->txc = 1;
1869: } else {
1870: status = -EPERM;
1871: }
1872:
1873: break;
1874: case EWRK3_CLR_TX_CUT_THRU: /* Clear TX cut through mode */
1875: if (suser()) {
1876: lp->txc = 0;
1877: } else {
1878: status = -EPERM;
1879: }
1880:
1881: break;
1882: default:
1883: status = -EOPNOTSUPP;
1884: }
1885:
1886: return status;
1887: }
1888:
1889: #ifdef MODULE
1890: static char devicename[9] = { 0, };
1891: static struct device thisEthwrk = {
1892: devicename, /* device name is inserted by /linux/drivers/net/net_init.c */
1893: 0, 0, 0, 0,
1894: 0x300, 5, /* I/O address, IRQ */
1895: 0, 0, 0, NULL, ewrk3_probe };
1896:
1897: static int io=0x300; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */
1898: static int irq=5; /* or use the insmod io= irq= options */
1899:
1900: int
1901: init_module(void)
1902: {
1903: thisEthwrk.base_addr=io;
1904: thisEthwrk.irq=irq;
1905: if (register_netdev(&thisEthwrk) != 0)
1906: return -EIO;
1907: return 0;
1908: }
1909:
1910: void
1911: cleanup_module(void)
1912: {
1913: release_region(thisEthwrk.base_addr, EWRK3_TOTAL_SIZE);
1914:
1915: if (thisEthwrk.priv) {
1916: kfree(thisEthwrk.priv);
1917: thisEthwrk.priv = NULL;
1918: }
1919: thisEthwrk.irq = 0;
1920:
1921: unregister_netdev(&thisEthwrk);
1922: }
1923: #endif /* MODULE */
1924:
1925:
1926: /*
1927: * Local variables:
1928: * kernel-compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O2 -m486 -c ewrk3.c"
1929: *
1930: * module-compile-command: "gcc -D__KERNEL__ -DMODULE -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O2 -m486 -c ewrk3.c"
1931: * End:
1932: */
1933:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.