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