Divas_mod.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This software may be used and distributed according to the terms
  3.  * of the GNU General Public License, incorporated herein by reference.
  4.  *
  5.  */
  6. #include <linux/config.h>
  7. #include <linux/init.h>
  8. #include <linux/fs.h>
  9. #undef N_DATA
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/pci.h>
  13. #include <linux/ioport.h>
  14. #include <linux/slab.h>
  15. #include <linux/errno.h>
  16. #include "adapter.h"
  17. #include "uxio.h"
  18. MODULE_DESCRIPTION("ISDN4Linux: Driver for Eicon Diva Server cards");
  19. MODULE_AUTHOR("Armin Schindler");
  20. MODULE_LICENSE("GPL");
  21. #ifdef MODULE
  22. #include "idi.h"
  23. void DIVA_DIDD_Write(DESCRIPTOR *, int);
  24. EXPORT_SYMBOL_NOVERS(DIVA_DIDD_Read);
  25. EXPORT_SYMBOL_NOVERS(DIVA_DIDD_Write);
  26. EXPORT_SYMBOL_NOVERS(DivasPrintf);
  27. #endif
  28. int DivasCardsDiscover(void);
  29. static int __init
  30. divas_init(void)
  31. {
  32. printk(KERN_DEBUG "DIVA Server Driver - initialisingn");
  33. printk(KERN_DEBUG "DIVA Server Driver - Version 2.0.16n");
  34. #if !defined(CONFIG_PCI)
  35. printk(KERN_WARNING "CONFIG_PCI is not defined!n");
  36. return -ENODEV;
  37. #endif
  38. if (pci_present())
  39. {
  40. if (DivasCardsDiscover() < 0)
  41. {
  42. printk(KERN_WARNING "Divas: Not loadedn");
  43. return -ENODEV;
  44. }
  45. }
  46. else
  47. {
  48. printk(KERN_WARNING "Divas: No PCI bus presentn");
  49. return -ENODEV;
  50. }
  51.     return 0;
  52. }
  53. static void __exit
  54. divas_exit(void)
  55. {
  56. card_t *pCard;
  57. word wCardIndex;
  58. extern int Divas_major;
  59. printk(KERN_DEBUG "DIVA Server Driver - unloadingn");
  60. pCard = DivasCards;
  61. for (wCardIndex = 0; wCardIndex < MAX_CARDS; wCardIndex++)
  62. {
  63. if ((pCard->hw) && (pCard->hw->in_use))
  64. {
  65. (*pCard->card_reset)(pCard);
  66. UxIsrRemove(pCard->hw, pCard);
  67. UxCardHandleFree(pCard->hw);
  68. if(pCard->e_tbl != NULL)
  69. {
  70. kfree(pCard->e_tbl);
  71. }
  72. if(pCard->hw->card_type == DIA_CARD_TYPE_DIVA_SERVER_B)
  73. {
  74. release_region(pCard->hw->io_base,0x20);
  75. release_region(pCard->hw->reset_base,0x80);
  76. }
  77. // If this is a 4BRI ...
  78. if (pCard->hw->card_type == DIA_CARD_TYPE_DIVA_SERVER_Q)
  79. {
  80. // Skip over the next 3 virtual adapters
  81. wCardIndex += 3;
  82. // But free their handles 
  83. pCard++;
  84. UxCardHandleFree(pCard->hw);
  85. if(pCard->e_tbl != NULL)
  86. {
  87. kfree(pCard->e_tbl);
  88. }
  89. pCard++;
  90. UxCardHandleFree(pCard->hw);
  91. if(pCard->e_tbl != NULL)
  92. {
  93. kfree(pCard->e_tbl);
  94. }
  95. pCard++;
  96. UxCardHandleFree(pCard->hw);
  97. if(pCard->e_tbl != NULL)
  98. {
  99. kfree(pCard->e_tbl);
  100. }
  101. }
  102. }
  103. pCard++;
  104. }
  105. unregister_chrdev(Divas_major, "Divas");
  106. }
  107. module_init(divas_init);
  108. module_exit(divas_exit);