Merge branch 'devicetree/next' of git://git.secretlab.ca/git/linux-2.6
[pandora-kernel.git] / drivers / net / arcnet / com90xx.c
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