xref: /linux/drivers/net/arcnet/com90xx.c (revision 93d90ad708b8da6efc0e487b66111aa9db7f70c7)
1 /*
2  * Linux ARCnet driver - COM90xx chipset (memory-mapped buffers)
3  *
4  * Written 1994-1999 by Avery Pennarun.
5  * Written 1999 by Martin Mares <mj@ucw.cz>.
6  * Derived from skeleton.c by Donald Becker.
7  *
8  * Special thanks to Contemporary Controls, Inc. (www.ccontrols.com)
9  *  for sponsoring the further development of this driver.
10  *
11  * **********************
12  *
13  * The original copyright of skeleton.c was as follows:
14  *
15  * skeleton.c Written 1993 by Donald Becker.
16  * Copyright 1993 United States Government as represented by the
17  * Director, National Security Agency.  This software may only be used
18  * and distributed according to the terms of the GNU General Public License as
19  * modified by SRC, incorporated herein by reference.
20  *
21  * **********************
22  *
23  * For more details, see drivers/net/arcnet.c
24  *
25  * **********************
26  */
27 #include <linux/module.h>
28 #include <linux/moduleparam.h>
29 #include <linux/init.h>
30 #include <linux/interrupt.h>
31 #include <linux/ioport.h>
32 #include <linux/delay.h>
33 #include <linux/netdevice.h>
34 #include <linux/slab.h>
35 #include <asm/io.h>
36 #include <linux/arcdevice.h>
37 
38 
39 #define VERSION "arcnet: COM90xx chipset support\n"
40 
41 
42 /* Define this to speed up the autoprobe by assuming if only one io port and
43  * shmem are left in the list at Stage 5, they must correspond to each
44  * other.
45  *
46  * This is undefined by default because it might not always be true, and the
47  * extra check makes the autoprobe even more careful.  Speed demons can turn
48  * it on - I think it should be fine if you only have one ARCnet card
49  * installed.
50  *
51  * If no ARCnet cards are installed, this delay never happens anyway and thus
52  * the option has no effect.
53  */
54 #undef FAST_PROBE
55 
56 
57 /* Internal function declarations */
58 static int com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem *);
59 static void com90xx_command(struct net_device *dev, int command);
60 static int com90xx_status(struct net_device *dev);
61 static void com90xx_setmask(struct net_device *dev, int mask);
62 static int com90xx_reset(struct net_device *dev, int really_reset);
63 static void com90xx_copy_to_card(struct net_device *dev, int bufnum, int offset,
64 				 void *buf, int count);
65 static void com90xx_copy_from_card(struct net_device *dev, int bufnum, int offset,
66 				   void *buf, int count);
67 
68 /* Known ARCnet cards */
69 
70 static struct net_device *cards[16];
71 static int numcards;
72 
73 /* Handy defines for ARCnet specific stuff */
74 
75 /* The number of low I/O ports used by the card */
76 #define ARCNET_TOTAL_SIZE	16
77 
78 /* Amount of I/O memory used by the card */
79 #define BUFFER_SIZE (512)
80 #define MIRROR_SIZE (BUFFER_SIZE*4)
81 
82 /* COM 9026 controller chip --> ARCnet register addresses */
83 #define _INTMASK (ioaddr+0)	/* writable */
84 #define _STATUS  (ioaddr+0)	/* readable */
85 #define _COMMAND (ioaddr+1)	/* writable, returns random vals on read (?) */
86 #define _CONFIG  (ioaddr+2)	/* Configuration register */
87 #define _RESET   (ioaddr+8)	/* software reset (on read) */
88 #define _MEMDATA (ioaddr+12)	/* Data port for IO-mapped memory */
89 #define _ADDR_HI (ioaddr+15)	/* Control registers for said */
90 #define _ADDR_LO (ioaddr+14)
91 
92 #undef ASTATUS
93 #undef ACOMMAND
94 #undef AINTMASK
95 
96 #define ASTATUS()	inb(_STATUS)
97 #define ACOMMAND(cmd) 	outb((cmd),_COMMAND)
98 #define AINTMASK(msk)	outb((msk),_INTMASK)
99 
100 
101 static int com90xx_skip_probe __initdata = 0;
102 
103 /* Module parameters */
104 
105 static int io;			/* use the insmod io= irq= shmem= options */
106 static int irq;
107 static int shmem;
108 static char device[9];		/* use eg. device=arc1 to change name */
109 
110 module_param(io, int, 0);
111 module_param(irq, int, 0);
112 module_param(shmem, int, 0);
113 module_param_string(device, device, sizeof(device), 0);
114 
115 static void __init com90xx_probe(void)
116 {
117 	int count, status, ioaddr, numprint, airq, openparen = 0;
118 	unsigned long airqmask;
119 	int ports[(0x3f0 - 0x200) / 16 + 1] =
120 	{0};
121 	unsigned long *shmems;
122 	void __iomem **iomem;
123 	int numports, numshmems, *port;
124 	u_long *p;
125 	int index;
126 
127 	if (!io && !irq && !shmem && !*device && com90xx_skip_probe)
128 		return;
129 
130 	shmems = kzalloc(((0x100000-0xa0000) / 0x800) * sizeof(unsigned long),
131 			 GFP_KERNEL);
132 	if (!shmems)
133 		return;
134 	iomem = kzalloc(((0x100000-0xa0000) / 0x800) * sizeof(void __iomem *),
135 			 GFP_KERNEL);
136 	if (!iomem) {
137 		kfree(shmems);
138 		return;
139 	}
140 
141 	BUGLVL(D_NORMAL) printk(VERSION);
142 
143 	/* set up the arrays where we'll store the possible probe addresses */
144 	numports = numshmems = 0;
145 	if (io)
146 		ports[numports++] = io;
147 	else
148 		for (count = 0x200; count <= 0x3f0; count += 16)
149 			ports[numports++] = count;
150 	if (shmem)
151 		shmems[numshmems++] = shmem;
152 	else
153 		for (count = 0xA0000; count <= 0xFF800; count += 2048)
154 			shmems[numshmems++] = count;
155 
156 	/* Stage 1: abandon any reserved ports, or ones with status==0xFF
157 	 * (empty), and reset any others by reading the reset port.
158 	 */
159 	numprint = -1;
160 	for (port = &ports[0]; port - ports < numports; port++) {
161 		numprint++;
162 		numprint %= 8;
163 		if (!numprint) {
164 			BUGMSG2(D_INIT, "\n");
165 			BUGMSG2(D_INIT, "S1: ");
166 		}
167 		BUGMSG2(D_INIT, "%Xh ", *port);
168 
169 		ioaddr = *port;
170 
171 		if (!request_region(*port, ARCNET_TOTAL_SIZE, "arcnet (90xx)")) {
172 			BUGMSG2(D_INIT_REASONS, "(request_region)\n");
173 			BUGMSG2(D_INIT_REASONS, "S1: ");
174 			BUGLVL(D_INIT_REASONS) numprint = 0;
175 			*port-- = ports[--numports];
176 			continue;
177 		}
178 		if (ASTATUS() == 0xFF) {
179 			BUGMSG2(D_INIT_REASONS, "(empty)\n");
180 			BUGMSG2(D_INIT_REASONS, "S1: ");
181 			BUGLVL(D_INIT_REASONS) numprint = 0;
182 			release_region(*port, ARCNET_TOTAL_SIZE);
183 			*port-- = ports[--numports];
184 			continue;
185 		}
186 		inb(_RESET);	/* begin resetting card */
187 
188 		BUGMSG2(D_INIT_REASONS, "\n");
189 		BUGMSG2(D_INIT_REASONS, "S1: ");
190 		BUGLVL(D_INIT_REASONS) numprint = 0;
191 	}
192 	BUGMSG2(D_INIT, "\n");
193 
194 	if (!numports) {
195 		BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n");
196 		kfree(shmems);
197 		kfree(iomem);
198 		return;
199 	}
200 	/* Stage 2: we have now reset any possible ARCnet cards, so we can't
201 	 * do anything until they finish.  If D_INIT, print the list of
202 	 * cards that are left.
203 	 */
204 	numprint = -1;
205 	for (port = &ports[0]; port < ports + numports; port++) {
206 		numprint++;
207 		numprint %= 8;
208 		if (!numprint) {
209 			BUGMSG2(D_INIT, "\n");
210 			BUGMSG2(D_INIT, "S2: ");
211 		}
212 		BUGMSG2(D_INIT, "%Xh ", *port);
213 	}
214 	BUGMSG2(D_INIT, "\n");
215 	mdelay(RESETtime);
216 
217 	/* Stage 3: abandon any shmem addresses that don't have the signature
218 	 * 0xD1 byte in the right place, or are read-only.
219 	 */
220 	numprint = -1;
221 	for (index = 0, p = &shmems[0]; index < numshmems; p++, index++) {
222 		void __iomem *base;
223 
224 		numprint++;
225 		numprint %= 8;
226 		if (!numprint) {
227 			BUGMSG2(D_INIT, "\n");
228 			BUGMSG2(D_INIT, "S3: ");
229 		}
230 		BUGMSG2(D_INIT, "%lXh ", *p);
231 
232 		if (!request_mem_region(*p, MIRROR_SIZE, "arcnet (90xx)")) {
233 			BUGMSG2(D_INIT_REASONS, "(request_mem_region)\n");
234 			BUGMSG2(D_INIT_REASONS, "Stage 3: ");
235 			BUGLVL(D_INIT_REASONS) numprint = 0;
236 			goto out;
237 		}
238 		base = ioremap(*p, MIRROR_SIZE);
239 		if (!base) {
240 			BUGMSG2(D_INIT_REASONS, "(ioremap)\n");
241 			BUGMSG2(D_INIT_REASONS, "Stage 3: ");
242 			BUGLVL(D_INIT_REASONS) numprint = 0;
243 			goto out1;
244 		}
245 		if (readb(base) != TESTvalue) {
246 			BUGMSG2(D_INIT_REASONS, "(%02Xh != %02Xh)\n",
247 				readb(base), TESTvalue);
248 			BUGMSG2(D_INIT_REASONS, "S3: ");
249 			BUGLVL(D_INIT_REASONS) numprint = 0;
250 			goto out2;
251 		}
252 		/* By writing 0x42 to the TESTvalue location, we also make
253 		 * sure no "mirror" shmem areas show up - if they occur
254 		 * in another pass through this loop, they will be discarded
255 		 * because *cptr != TESTvalue.
256 		 */
257 		writeb(0x42, base);
258 		if (readb(base) != 0x42) {
259 			BUGMSG2(D_INIT_REASONS, "(read only)\n");
260 			BUGMSG2(D_INIT_REASONS, "S3: ");
261 			goto out2;
262 		}
263 		BUGMSG2(D_INIT_REASONS, "\n");
264 		BUGMSG2(D_INIT_REASONS, "S3: ");
265 		BUGLVL(D_INIT_REASONS) numprint = 0;
266 		iomem[index] = base;
267 		continue;
268 	out2:
269 		iounmap(base);
270 	out1:
271 		release_mem_region(*p, MIRROR_SIZE);
272 	out:
273 		*p-- = shmems[--numshmems];
274 		index--;
275 	}
276 	BUGMSG2(D_INIT, "\n");
277 
278 	if (!numshmems) {
279 		BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n");
280 		for (port = &ports[0]; port < ports + numports; port++)
281 			release_region(*port, ARCNET_TOTAL_SIZE);
282 		kfree(shmems);
283 		kfree(iomem);
284 		return;
285 	}
286 	/* Stage 4: something of a dummy, to report the shmems that are
287 	 * still possible after stage 3.
288 	 */
289 	numprint = -1;
290 	for (p = &shmems[0]; p < shmems + numshmems; p++) {
291 		numprint++;
292 		numprint %= 8;
293 		if (!numprint) {
294 			BUGMSG2(D_INIT, "\n");
295 			BUGMSG2(D_INIT, "S4: ");
296 		}
297 		BUGMSG2(D_INIT, "%lXh ", *p);
298 	}
299 	BUGMSG2(D_INIT, "\n");
300 
301 	/* Stage 5: for any ports that have the correct status, can disable
302 	 * the RESET flag, and (if no irq is given) generate an autoirq,
303 	 * register an ARCnet device.
304 	 *
305 	 * Currently, we can only register one device per probe, so quit
306 	 * after the first one is found.
307 	 */
308 	numprint = -1;
309 	for (port = &ports[0]; port < ports + numports; port++) {
310 		int found = 0;
311 		numprint++;
312 		numprint %= 8;
313 		if (!numprint) {
314 			BUGMSG2(D_INIT, "\n");
315 			BUGMSG2(D_INIT, "S5: ");
316 		}
317 		BUGMSG2(D_INIT, "%Xh ", *port);
318 
319 		ioaddr = *port;
320 		status = ASTATUS();
321 
322 		if ((status & 0x9D)
323 		    != (NORXflag | RECONflag | TXFREEflag | RESETflag)) {
324 			BUGMSG2(D_INIT_REASONS, "(status=%Xh)\n", status);
325 			BUGMSG2(D_INIT_REASONS, "S5: ");
326 			BUGLVL(D_INIT_REASONS) numprint = 0;
327 			release_region(*port, ARCNET_TOTAL_SIZE);
328 			*port-- = ports[--numports];
329 			continue;
330 		}
331 		ACOMMAND(CFLAGScmd | RESETclear | CONFIGclear);
332 		status = ASTATUS();
333 		if (status & RESETflag) {
334 			BUGMSG2(D_INIT_REASONS, " (eternal reset, status=%Xh)\n",
335 				status);
336 			BUGMSG2(D_INIT_REASONS, "S5: ");
337 			BUGLVL(D_INIT_REASONS) numprint = 0;
338 			release_region(*port, ARCNET_TOTAL_SIZE);
339 			*port-- = ports[--numports];
340 			continue;
341 		}
342 		/* skip this completely if an IRQ was given, because maybe
343 		 * we're on a machine that locks during autoirq!
344 		 */
345 		if (!irq) {
346 			/* if we do this, we're sure to get an IRQ since the
347 			 * card has just reset and the NORXflag is on until
348 			 * we tell it to start receiving.
349 			 */
350 			airqmask = probe_irq_on();
351 			AINTMASK(NORXflag);
352 			udelay(1);
353 			AINTMASK(0);
354 			airq = probe_irq_off(airqmask);
355 
356 			if (airq <= 0) {
357 				BUGMSG2(D_INIT_REASONS, "(airq=%d)\n", airq);
358 				BUGMSG2(D_INIT_REASONS, "S5: ");
359 				BUGLVL(D_INIT_REASONS) numprint = 0;
360 				release_region(*port, ARCNET_TOTAL_SIZE);
361 				*port-- = ports[--numports];
362 				continue;
363 			}
364 		} else {
365 			airq = irq;
366 		}
367 
368 		BUGMSG2(D_INIT, "(%d,", airq);
369 		openparen = 1;
370 
371 		/* Everything seems okay.  But which shmem, if any, puts
372 		 * back its signature byte when the card is reset?
373 		 *
374 		 * If there are multiple cards installed, there might be
375 		 * multiple shmems still in the list.
376 		 */
377 #ifdef FAST_PROBE
378 		if (numports > 1 || numshmems > 1) {
379 			inb(_RESET);
380 			mdelay(RESETtime);
381 		} else {
382 			/* just one shmem and port, assume they match */
383 			writeb(TESTvalue, iomem[0]);
384 		}
385 #else
386 		inb(_RESET);
387 		mdelay(RESETtime);
388 #endif
389 
390 		for (index = 0; index < numshmems; index++) {
391 			u_long ptr = shmems[index];
392 			void __iomem *base = iomem[index];
393 
394 			if (readb(base) == TESTvalue) {	/* found one */
395 				BUGMSG2(D_INIT, "%lXh)\n", *p);
396 				openparen = 0;
397 
398 				/* register the card */
399 				if (com90xx_found(*port, airq, ptr, base) == 0)
400 					found = 1;
401 				numprint = -1;
402 
403 				/* remove shmem from the list */
404 				shmems[index] = shmems[--numshmems];
405 				iomem[index] = iomem[numshmems];
406 				break;	/* go to the next I/O port */
407 			} else {
408 				BUGMSG2(D_INIT_REASONS, "%Xh-", readb(base));
409 			}
410 		}
411 
412 		if (openparen) {
413 			BUGLVL(D_INIT) printk("no matching shmem)\n");
414 			BUGLVL(D_INIT_REASONS) printk("S5: ");
415 			BUGLVL(D_INIT_REASONS) numprint = 0;
416 		}
417 		if (!found)
418 			release_region(*port, ARCNET_TOTAL_SIZE);
419 		*port-- = ports[--numports];
420 	}
421 
422 	BUGLVL(D_INIT_REASONS) printk("\n");
423 
424 	/* Now put back TESTvalue on all leftover shmems. */
425 	for (index = 0; index < numshmems; index++) {
426 		writeb(TESTvalue, iomem[index]);
427 		iounmap(iomem[index]);
428 		release_mem_region(shmems[index], MIRROR_SIZE);
429 	}
430 	kfree(shmems);
431 	kfree(iomem);
432 }
433 
434 static int check_mirror(unsigned long addr, size_t size)
435 {
436 	void __iomem *p;
437 	int res = -1;
438 
439 	if (!request_mem_region(addr, size, "arcnet (90xx)"))
440 		return -1;
441 
442 	p = ioremap(addr, size);
443 	if (p) {
444 		if (readb(p) == TESTvalue)
445 			res = 1;
446 		else
447 			res = 0;
448 		iounmap(p);
449 	}
450 
451 	release_mem_region(addr, size);
452 	return res;
453 }
454 
455 /* Set up the struct net_device associated with this card.  Called after
456  * probing succeeds.
457  */
458 static int __init com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem *p)
459 {
460 	struct net_device *dev = NULL;
461 	struct arcnet_local *lp;
462 	u_long first_mirror, last_mirror;
463 	int mirror_size;
464 
465 	/* allocate struct net_device */
466 	dev = alloc_arcdev(device);
467 	if (!dev) {
468 		BUGMSG2(D_NORMAL, "com90xx: Can't allocate device!\n");
469 		iounmap(p);
470 		release_mem_region(shmem, MIRROR_SIZE);
471 		return -ENOMEM;
472 	}
473 	lp = netdev_priv(dev);
474 	/* find the real shared memory start/end points, including mirrors */
475 
476 	/* guess the actual size of one "memory mirror" - the number of
477 	 * bytes between copies of the shared memory.  On most cards, it's
478 	 * 2k (or there are no mirrors at all) but on some, it's 4k.
479 	 */
480 	mirror_size = MIRROR_SIZE;
481 	if (readb(p) == TESTvalue &&
482 	    check_mirror(shmem - MIRROR_SIZE, MIRROR_SIZE) == 0 &&
483 	    check_mirror(shmem - 2 * MIRROR_SIZE, MIRROR_SIZE) == 1)
484 		mirror_size = 2 * MIRROR_SIZE;
485 
486 	first_mirror = shmem - mirror_size;
487 	while (check_mirror(first_mirror, mirror_size) == 1)
488 		first_mirror -= mirror_size;
489 	first_mirror += mirror_size;
490 
491 	last_mirror = shmem + mirror_size;
492 	while (check_mirror(last_mirror, mirror_size) == 1)
493 		last_mirror += mirror_size;
494 	last_mirror -= mirror_size;
495 
496 	dev->mem_start = first_mirror;
497 	dev->mem_end = last_mirror + MIRROR_SIZE - 1;
498 
499 	iounmap(p);
500 	release_mem_region(shmem, MIRROR_SIZE);
501 
502 	if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)"))
503 		goto err_free_dev;
504 
505 	/* reserve the irq */
506 	if (request_irq(airq, arcnet_interrupt, 0, "arcnet (90xx)", dev)) {
507 		BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", airq);
508 		goto err_release_mem;
509 	}
510 	dev->irq = airq;
511 
512 	/* Initialize the rest of the device structure. */
513 	lp->card_name = "COM90xx";
514 	lp->hw.command = com90xx_command;
515 	lp->hw.status = com90xx_status;
516 	lp->hw.intmask = com90xx_setmask;
517 	lp->hw.reset = com90xx_reset;
518 	lp->hw.owner = THIS_MODULE;
519 	lp->hw.copy_to_card = com90xx_copy_to_card;
520 	lp->hw.copy_from_card = com90xx_copy_from_card;
521 	lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 1);
522 	if (!lp->mem_start) {
523 		BUGMSG(D_NORMAL, "Can't remap device memory!\n");
524 		goto err_free_irq;
525 	}
526 
527 	/* get and check the station ID from offset 1 in shmem */
528 	dev->dev_addr[0] = readb(lp->mem_start + 1);
529 
530 	dev->base_addr = ioaddr;
531 
532 	BUGMSG(D_NORMAL, "COM90xx station %02Xh found at %03lXh, IRQ %d, "
533 	       "ShMem %lXh (%ld*%xh).\n",
534 	       dev->dev_addr[0],
535 	       dev->base_addr, dev->irq, dev->mem_start,
536 	 (dev->mem_end - dev->mem_start + 1) / mirror_size, mirror_size);
537 
538 	if (register_netdev(dev))
539 		goto err_unmap;
540 
541 	cards[numcards++] = dev;
542 	return 0;
543 
544 err_unmap:
545 	iounmap(lp->mem_start);
546 err_free_irq:
547 	free_irq(dev->irq, dev);
548 err_release_mem:
549 	release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
550 err_free_dev:
551 	free_netdev(dev);
552 	return -EIO;
553 }
554 
555 
556 static void com90xx_command(struct net_device *dev, int cmd)
557 {
558 	short ioaddr = dev->base_addr;
559 
560 	ACOMMAND(cmd);
561 }
562 
563 
564 static int com90xx_status(struct net_device *dev)
565 {
566 	short ioaddr = dev->base_addr;
567 
568 	return ASTATUS();
569 }
570 
571 
572 static void com90xx_setmask(struct net_device *dev, int mask)
573 {
574 	short ioaddr = dev->base_addr;
575 
576 	AINTMASK(mask);
577 }
578 
579 
580 /*
581  * Do a hardware reset on the card, and set up necessary registers.
582  *
583  * This should be called as little as possible, because it disrupts the
584  * token on the network (causes a RECON) and requires a significant delay.
585  *
586  * However, it does make sure the card is in a defined state.
587  */
588 static int com90xx_reset(struct net_device *dev, int really_reset)
589 {
590 	struct arcnet_local *lp = netdev_priv(dev);
591 	short ioaddr = dev->base_addr;
592 
593 	BUGMSG(D_INIT, "Resetting (status=%02Xh)\n", ASTATUS());
594 
595 	if (really_reset) {
596 		/* reset the card */
597 		inb(_RESET);
598 		mdelay(RESETtime);
599 	}
600 	ACOMMAND(CFLAGScmd | RESETclear);	/* clear flags & end reset */
601 	ACOMMAND(CFLAGScmd | CONFIGclear);
602 
603 	/* don't do this until we verify that it doesn't hurt older cards! */
604 	/* outb(inb(_CONFIG) | ENABLE16flag, _CONFIG); */
605 
606 	/* verify that the ARCnet signature byte is present */
607 	if (readb(lp->mem_start) != TESTvalue) {
608 		if (really_reset)
609 			BUGMSG(D_NORMAL, "reset failed: TESTvalue not present.\n");
610 		return 1;
611 	}
612 	/* enable extended (512-byte) packets */
613 	ACOMMAND(CONFIGcmd | EXTconf);
614 
615 	/* clean out all the memory to make debugging make more sense :) */
616 	BUGLVL(D_DURING)
617 	    memset_io(lp->mem_start, 0x42, 2048);
618 
619 	/* done!  return success. */
620 	return 0;
621 }
622 
623 static void com90xx_copy_to_card(struct net_device *dev, int bufnum, int offset,
624 				 void *buf, int count)
625 {
626 	struct arcnet_local *lp = netdev_priv(dev);
627 	void __iomem *memaddr = lp->mem_start + bufnum * 512 + offset;
628 	TIME("memcpy_toio", count, memcpy_toio(memaddr, buf, count));
629 }
630 
631 
632 static void com90xx_copy_from_card(struct net_device *dev, int bufnum, int offset,
633 				   void *buf, int count)
634 {
635 	struct arcnet_local *lp = netdev_priv(dev);
636 	void __iomem *memaddr = lp->mem_start + bufnum * 512 + offset;
637 	TIME("memcpy_fromio", count, memcpy_fromio(buf, memaddr, count));
638 }
639 
640 
641 MODULE_LICENSE("GPL");
642 
643 static int __init com90xx_init(void)
644 {
645 	if (irq == 2)
646 		irq = 9;
647 	com90xx_probe();
648 	if (!numcards)
649 		return -EIO;
650 	return 0;
651 }
652 
653 static void __exit com90xx_exit(void)
654 {
655 	struct net_device *dev;
656 	struct arcnet_local *lp;
657 	int count;
658 
659 	for (count = 0; count < numcards; count++) {
660 		dev = cards[count];
661 		lp = netdev_priv(dev);
662 
663 		unregister_netdev(dev);
664 		free_irq(dev->irq, dev);
665 		iounmap(lp->mem_start);
666 		release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
667 		release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
668 		free_netdev(dev);
669 	}
670 }
671 
672 module_init(com90xx_init);
673 module_exit(com90xx_exit);
674 
675 #ifndef MODULE
676 static int __init com90xx_setup(char *s)
677 {
678 	int ints[8];
679 
680 	s = get_options(s, 8, ints);
681 	if (!ints[0] && !*s) {
682 		printk("com90xx: Disabled.\n");
683 		return 1;
684 	}
685 
686 	switch (ints[0]) {
687 	default:		/* ERROR */
688 		printk("com90xx: Too many arguments.\n");
689 	case 3:		/* Mem address */
690 		shmem = ints[3];
691 	case 2:		/* IRQ */
692 		irq = ints[2];
693 	case 1:		/* IO address */
694 		io = ints[1];
695 	}
696 
697 	if (*s)
698 		snprintf(device, sizeof(device), "%s", s);
699 
700 	return 1;
701 }
702 
703 __setup("com90xx=", com90xx_setup);
704 #endif
705