Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
com90xx.c
Go to the documentation of this file.
1 /*
2  * Linux ARCnet driver - COM90xx chipset (memory-mapped buffers)
3  *
4  * Written 1994-1999 by Avery Pennarun.
5  * Written 1999 by Martin Mares <[email protected]>.
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);
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;
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++)
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;
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