st5481_init.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * Driver for ST5481 USB ISDN modem
  3. *
  4. * Author Frode Isaksen
  5. * Copyright 2001 by Frode Isaksen <fisaksen@bewan.com>
  6. * 2001 by Kai Germaschewski <kai.germaschewski@gmx.de>
  7. *
  8. * This software may be used and distributed according to the terms
  9. * of the GNU General Public License, incorporated herein by reference.
  10. *
  11. */
  12. /*
  13. * TODO:
  14. *
  15. * b layer1 delay?
  16. * hotplug / unregister issues
  17. * mod_inc/dec_use_count
  18. * unify parts of d/b channel usb handling
  19. * file header
  20. * avoid copy to isoc buffer?
  21. * improve usb delay?
  22. * merge l1 state machines?
  23. * clean up debug
  24. */
  25. #include <linux/module.h>
  26. #include <linux/init.h>
  27. #include <linux/usb.h>
  28. #include <linux/slab.h>
  29. #include "st5481.h"
  30. MODULE_DESCRIPTION("ISDN4Linux: driver for ST5481 USB ISDN adapter");
  31. MODULE_AUTHOR("Frode Isaksen");
  32. MODULE_LICENSE("GPL");
  33. static int protocol = 2; /* EURO-ISDN Default */
  34. module_param(protocol, int, 0);
  35. static int number_of_leds = 2; /* 2 LEDs on the adpater default */
  36. module_param(number_of_leds, int, 0);
  37. #ifdef CONFIG_HISAX_DEBUG
  38. static int debug = 0;
  39. module_param(debug, int, 0);
  40. #endif
  41. int st5481_debug;
  42. static LIST_HEAD(adapter_list);
  43. /* ======================================================================
  44. * registration/deregistration with the USB layer
  45. */
  46. /*
  47. * This function will be called when the adapter is plugged
  48. * into the USB bus.
  49. */
  50. static int probe_st5481(struct usb_interface *intf,
  51. const struct usb_device_id *id)
  52. {
  53. struct usb_device *dev = interface_to_usbdev(intf);
  54. struct st5481_adapter *adapter;
  55. struct hisax_b_if *b_if[2];
  56. int retval, i;
  57. printk(KERN_INFO "st541: found adapter VendorId %04x, ProductId %04x, LEDs %d\n",
  58. le16_to_cpu(dev->descriptor.idVendor),
  59. le16_to_cpu(dev->descriptor.idProduct),
  60. number_of_leds);
  61. adapter = kmalloc(sizeof(struct st5481_adapter), GFP_KERNEL);
  62. if (!adapter)
  63. return -ENOMEM;
  64. memset(adapter, 0, sizeof(struct st5481_adapter));
  65. adapter->number_of_leds = number_of_leds;
  66. adapter->usb_dev = dev;
  67. adapter->hisax_d_if.owner = THIS_MODULE;
  68. adapter->hisax_d_if.ifc.priv = adapter;
  69. adapter->hisax_d_if.ifc.l2l1 = st5481_d_l2l1;
  70. for (i = 0; i < 2; i++) {
  71. adapter->bcs[i].adapter = adapter;
  72. adapter->bcs[i].channel = i;
  73. adapter->bcs[i].b_if.ifc.priv = &adapter->bcs[i];
  74. adapter->bcs[i].b_if.ifc.l2l1 = st5481_b_l2l1;
  75. }
  76. list_add(&adapter->list, &adapter_list);
  77. retval = st5481_setup_usb(adapter);
  78. if (retval < 0)
  79. goto err;
  80. retval = st5481_setup_d(adapter);
  81. if (retval < 0)
  82. goto err_usb;
  83. retval = st5481_setup_b(&adapter->bcs[0]);
  84. if (retval < 0)
  85. goto err_d;
  86. retval = st5481_setup_b(&adapter->bcs[1]);
  87. if (retval < 0)
  88. goto err_b;
  89. for (i = 0; i < 2; i++)
  90. b_if[i] = &adapter->bcs[i].b_if;
  91. hisax_register(&adapter->hisax_d_if, b_if, "st5481_usb", protocol);
  92. st5481_start(adapter);
  93. usb_set_intfdata(intf, adapter);
  94. return 0;
  95. err_b:
  96. st5481_release_b(&adapter->bcs[0]);
  97. err_d:
  98. st5481_release_d(adapter);
  99. err_usb:
  100. st5481_release_usb(adapter);
  101. err:
  102. return -EIO;
  103. }
  104. /*
  105. * This function will be called when the adapter is removed
  106. * from the USB bus.
  107. */
  108. static void disconnect_st5481(struct usb_interface *intf)
  109. {
  110. struct st5481_adapter *adapter = usb_get_intfdata(intf);
  111. DBG(1,"");
  112. usb_set_intfdata(intf, NULL);
  113. if (!adapter)
  114. return;
  115. list_del(&adapter->list);
  116. st5481_stop(adapter);
  117. st5481_release_b(&adapter->bcs[1]);
  118. st5481_release_b(&adapter->bcs[0]);
  119. st5481_release_d(adapter);
  120. // we would actually better wait for completion of outstanding urbs
  121. mdelay(2);
  122. st5481_release_usb(adapter);
  123. hisax_unregister(&adapter->hisax_d_if);
  124. kfree(adapter);
  125. }
  126. /*
  127. * The last 4 bits in the Product Id is set with 4 pins on the chip.
  128. */
  129. static struct usb_device_id st5481_ids[] = {
  130. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x0) },
  131. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x1) },
  132. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x2) },
  133. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x3) },
  134. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x4) },
  135. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x5) },
  136. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x6) },
  137. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x7) },
  138. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x8) },
  139. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x9) },
  140. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xA) },
  141. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xB) },
  142. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xC) },
  143. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xD) },
  144. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xE) },
  145. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xF) },
  146. { }
  147. };
  148. MODULE_DEVICE_TABLE (usb, st5481_ids);
  149. static struct usb_driver st5481_usb_driver = {
  150. .name = "st5481_usb",
  151. .probe = probe_st5481,
  152. .disconnect = disconnect_st5481,
  153. .id_table = st5481_ids,
  154. };
  155. static int __init st5481_usb_init(void)
  156. {
  157. int retval;
  158. #ifdef CONFIG_HISAX_DEBUG
  159. st5481_debug = debug;
  160. #endif
  161. printk(KERN_INFO "hisax_st5481: ST5481 USB ISDN driver $Revision: 2.4.2.3 $\n");
  162. retval = st5481_d_init();
  163. if (retval < 0)
  164. goto out;
  165. retval = usb_register(&st5481_usb_driver);
  166. if (retval < 0)
  167. goto out_d_exit;
  168. return 0;
  169. out_d_exit:
  170. st5481_d_exit();
  171. out:
  172. return retval;
  173. }
  174. static void __exit st5481_usb_exit(void)
  175. {
  176. usb_deregister(&st5481_usb_driver);
  177. st5481_d_exit();
  178. }
  179. module_init(st5481_usb_init);
  180. module_exit(st5481_usb_exit);