module.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * PCBIT-D module support
  3. *
  4. * Copyright (C) 1996 Universidade de Lisboa
  5. *
  6. * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  7. *
  8. * This software may be used and distributed according to the terms of
  9. * the GNU General Public License, incorporated herein by reference.
  10. */
  11. #include <linux/module.h>
  12. #include <linux/init.h>
  13. #include <linux/sched.h>
  14. #include <linux/string.h>
  15. #include <linux/kernel.h>
  16. #include <linux/skbuff.h>
  17. #include <linux/isdnif.h>
  18. #include "pcbit.h"
  19. MODULE_DESCRIPTION("ISDN4Linux: Driver for PCBIT-T card");
  20. MODULE_AUTHOR("Pedro Roque Marques");
  21. MODULE_LICENSE("GPL");
  22. static int mem[MAX_PCBIT_CARDS];
  23. static int irq[MAX_PCBIT_CARDS];
  24. module_param_array(mem, int, NULL, 0);
  25. module_param_array(irq, int, NULL, 0);
  26. static int num_boards;
  27. struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS];
  28. static int __init pcbit_init(void)
  29. {
  30. int board;
  31. num_boards = 0;
  32. printk(KERN_NOTICE
  33. "PCBIT-D device driver v 0.5-fjpc0 19991204 - "
  34. "Copyright (C) 1996 Universidade de Lisboa\n");
  35. if (mem[0] || irq[0])
  36. {
  37. for (board=0; board < MAX_PCBIT_CARDS && mem[board] && irq[board]; board++)
  38. {
  39. if (!mem[board])
  40. mem[board] = 0xD0000;
  41. if (!irq[board])
  42. irq[board] = 5;
  43. if (pcbit_init_dev(board, mem[board], irq[board]) == 0)
  44. num_boards++;
  45. else
  46. {
  47. printk(KERN_WARNING
  48. "pcbit_init failed for dev %d",
  49. board + 1);
  50. return -EIO;
  51. }
  52. }
  53. }
  54. /* Hardcoded default settings detection */
  55. if (!num_boards)
  56. {
  57. printk(KERN_INFO
  58. "Trying to detect board using default settings\n");
  59. if (pcbit_init_dev(0, 0xD0000, 5) == 0)
  60. num_boards++;
  61. else
  62. return -EIO;
  63. }
  64. return 0;
  65. }
  66. static void __exit pcbit_exit(void)
  67. {
  68. #ifdef MODULE
  69. int board;
  70. for (board = 0; board < num_boards; board++)
  71. pcbit_terminate(board);
  72. printk(KERN_NOTICE
  73. "PCBIT-D module unloaded\n");
  74. #endif
  75. }
  76. #ifndef MODULE
  77. #define MAX_PARA (MAX_PCBIT_CARDS * 2)
  78. static int __init pcbit_setup(char *line)
  79. {
  80. int i, j, argc;
  81. char *str;
  82. int ints[MAX_PARA+1];
  83. str = get_options(line, MAX_PARA, ints);
  84. argc = ints[0];
  85. i = 0;
  86. j = 1;
  87. while (argc && (i<MAX_PCBIT_CARDS)) {
  88. if (argc) {
  89. mem[i] = ints[j];
  90. j++; argc--;
  91. }
  92. if (argc) {
  93. irq[i] = ints[j];
  94. j++; argc--;
  95. }
  96. i++;
  97. }
  98. return(1);
  99. }
  100. __setup("pcbit=", pcbit_setup);
  101. #endif
  102. module_init(pcbit_init);
  103. module_exit(pcbit_exit);