com20020-isa.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * Linux ARCnet driver - COM20020 chipset support
  3. *
  4. * Written 1997 by David Woodhouse.
  5. * Written 1994-1999 by Avery Pennarun.
  6. * Written 1999-2000 by Martin Mares <mj@ucw.cz>.
  7. * Derived from skeleton.c by Donald Becker.
  8. *
  9. * Special thanks to Contemporary Controls, Inc. (www.ccontrols.com)
  10. * for sponsoring the further development of this driver.
  11. *
  12. * **********************
  13. *
  14. * The original copyright of skeleton.c was as follows:
  15. *
  16. * skeleton.c Written 1993 by Donald Becker.
  17. * Copyright 1993 United States Government as represented by the
  18. * Director, National Security Agency. This software may only be used
  19. * and distributed according to the terms of the GNU General Public License as
  20. * modified by SRC, incorporated herein by reference.
  21. *
  22. * **********************
  23. *
  24. * For more details, see drivers/net/arcnet.c
  25. *
  26. * **********************
  27. */
  28. #include <linux/module.h>
  29. #include <linux/moduleparam.h>
  30. #include <linux/kernel.h>
  31. #include <linux/types.h>
  32. #include <linux/ioport.h>
  33. #include <linux/errno.h>
  34. #include <linux/delay.h>
  35. #include <linux/netdevice.h>
  36. #include <linux/init.h>
  37. #include <linux/bootmem.h>
  38. #include <linux/arcdevice.h>
  39. #include <linux/com20020.h>
  40. #include <asm/io.h>
  41. #define VERSION "arcnet: COM20020 ISA support (by David Woodhouse et al.)\n"
  42. /*
  43. * We cannot (yet) probe for an IO mapped card, although we can check that
  44. * it's where we were told it was, and even do autoirq.
  45. */
  46. static int __init com20020isa_probe(struct net_device *dev)
  47. {
  48. int ioaddr;
  49. unsigned long airqmask;
  50. struct arcnet_local *lp = netdev_priv(dev);
  51. int err;
  52. BUGLVL(D_NORMAL) printk(VERSION);
  53. ioaddr = dev->base_addr;
  54. if (!ioaddr) {
  55. BUGMSG(D_NORMAL, "No autoprobe (yet) for IO mapped cards; you "
  56. "must specify the base address!\n");
  57. return -ENODEV;
  58. }
  59. if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "arcnet (COM20020)")) {
  60. BUGMSG(D_NORMAL, "IO region %xh-%xh already allocated.\n",
  61. ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1);
  62. return -ENXIO;
  63. }
  64. if (ASTATUS() == 0xFF) {
  65. BUGMSG(D_NORMAL, "IO address %x empty\n", ioaddr);
  66. err = -ENODEV;
  67. goto out;
  68. }
  69. if (com20020_check(dev)) {
  70. err = -ENODEV;
  71. goto out;
  72. }
  73. if (!dev->irq) {
  74. /* if we do this, we're sure to get an IRQ since the
  75. * card has just reset and the NORXflag is on until
  76. * we tell it to start receiving.
  77. */
  78. BUGMSG(D_INIT_REASONS, "intmask was %02Xh\n", inb(_INTMASK));
  79. outb(0, _INTMASK);
  80. airqmask = probe_irq_on();
  81. outb(NORXflag, _INTMASK);
  82. udelay(1);
  83. outb(0, _INTMASK);
  84. dev->irq = probe_irq_off(airqmask);
  85. if ((int)dev->irq <= 0) {
  86. BUGMSG(D_INIT_REASONS, "Autoprobe IRQ failed first time\n");
  87. airqmask = probe_irq_on();
  88. outb(NORXflag, _INTMASK);
  89. udelay(5);
  90. outb(0, _INTMASK);
  91. dev->irq = probe_irq_off(airqmask);
  92. if ((int)dev->irq <= 0) {
  93. BUGMSG(D_NORMAL, "Autoprobe IRQ failed.\n");
  94. err = -ENODEV;
  95. goto out;
  96. }
  97. }
  98. }
  99. lp->card_name = "ISA COM20020";
  100. if ((err = com20020_found(dev, 0)) != 0)
  101. goto out;
  102. return 0;
  103. out:
  104. release_region(ioaddr, ARCNET_TOTAL_SIZE);
  105. return err;
  106. }
  107. static int node = 0;
  108. static int io = 0x0; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */
  109. static int irq = 0; /* or use the insmod io= irq= shmem= options */
  110. static char device[9]; /* use eg. device="arc1" to change name */
  111. static int timeout = 3;
  112. static int backplane = 0;
  113. static int clockp = 0;
  114. static int clockm = 0;
  115. module_param(node, int, 0);
  116. module_param(io, int, 0);
  117. module_param(irq, int, 0);
  118. module_param_string(device, device, sizeof(device), 0);
  119. module_param(timeout, int, 0);
  120. module_param(backplane, int, 0);
  121. module_param(clockp, int, 0);
  122. module_param(clockm, int, 0);
  123. MODULE_LICENSE("GPL");
  124. static struct net_device *my_dev;
  125. static int __init com20020_init(void)
  126. {
  127. struct net_device *dev;
  128. struct arcnet_local *lp;
  129. dev = alloc_arcdev(device);
  130. if (!dev)
  131. return -ENOMEM;
  132. if (node && node != 0xff)
  133. dev->dev_addr[0] = node;
  134. dev->netdev_ops = &com20020_netdev_ops;
  135. lp = netdev_priv(dev);
  136. lp->backplane = backplane;
  137. lp->clockp = clockp & 7;
  138. lp->clockm = clockm & 3;
  139. lp->timeout = timeout & 3;
  140. lp->hw.owner = THIS_MODULE;
  141. dev->base_addr = io;
  142. dev->irq = irq;
  143. if (dev->irq == 2)
  144. dev->irq = 9;
  145. if (com20020isa_probe(dev)) {
  146. free_netdev(dev);
  147. return -EIO;
  148. }
  149. my_dev = dev;
  150. return 0;
  151. }
  152. static void __exit com20020_exit(void)
  153. {
  154. unregister_netdev(my_dev);
  155. free_irq(my_dev->irq, my_dev);
  156. release_region(my_dev->base_addr, ARCNET_TOTAL_SIZE);
  157. free_netdev(my_dev);
  158. }
  159. #ifndef MODULE
  160. static int __init com20020isa_setup(char *s)
  161. {
  162. int ints[8];
  163. s = get_options(s, 8, ints);
  164. if (!ints[0])
  165. return 1;
  166. switch (ints[0]) {
  167. default: /* ERROR */
  168. printk("com90xx: Too many arguments.\n");
  169. case 6: /* Timeout */
  170. timeout = ints[6];
  171. case 5: /* CKP value */
  172. clockp = ints[5];
  173. case 4: /* Backplane flag */
  174. backplane = ints[4];
  175. case 3: /* Node ID */
  176. node = ints[3];
  177. case 2: /* IRQ */
  178. irq = ints[2];
  179. case 1: /* IO address */
  180. io = ints[1];
  181. }
  182. if (*s)
  183. snprintf(device, sizeof(device), "%s", s);
  184. return 1;
  185. }
  186. __setup("com20020=", com20020isa_setup);
  187. #endif /* MODULE */
  188. module_init(com20020_init)
  189. module_exit(com20020_exit)