st5481_init.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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 = kzalloc(sizeof(struct st5481_adapter), GFP_KERNEL);
  62. if (!adapter)
  63. return -ENOMEM;
  64. adapter->number_of_leds = number_of_leds;
  65. adapter->usb_dev = dev;
  66. adapter->hisax_d_if.owner = THIS_MODULE;
  67. adapter->hisax_d_if.ifc.priv = adapter;
  68. adapter->hisax_d_if.ifc.l2l1 = st5481_d_l2l1;
  69. for (i = 0; i < 2; i++) {
  70. adapter->bcs[i].adapter = adapter;
  71. adapter->bcs[i].channel = i;
  72. adapter->bcs[i].b_if.ifc.priv = &adapter->bcs[i];
  73. adapter->bcs[i].b_if.ifc.l2l1 = st5481_b_l2l1;
  74. }
  75. list_add(&adapter->list, &adapter_list);
  76. retval = st5481_setup_usb(adapter);
  77. if (retval < 0)
  78. goto err;
  79. retval = st5481_setup_d(adapter);
  80. if (retval < 0)
  81. goto err_usb;
  82. retval = st5481_setup_b(&adapter->bcs[0]);
  83. if (retval < 0)
  84. goto err_d;
  85. retval = st5481_setup_b(&adapter->bcs[1]);
  86. if (retval < 0)
  87. goto err_b;
  88. for (i = 0; i < 2; i++)
  89. b_if[i] = &adapter->bcs[i].b_if;
  90. if (hisax_register(&adapter->hisax_d_if, b_if, "st5481_usb",
  91. protocol) != 0)
  92. goto err_b1;
  93. st5481_start(adapter);
  94. usb_set_intfdata(intf, adapter);
  95. return 0;
  96. err_b1:
  97. st5481_release_b(&adapter->bcs[1]);
  98. err_b:
  99. st5481_release_b(&adapter->bcs[0]);
  100. err_d:
  101. st5481_release_d(adapter);
  102. err_usb:
  103. st5481_release_usb(adapter);
  104. err:
  105. return -EIO;
  106. }
  107. /*
  108. * This function will be called when the adapter is removed
  109. * from the USB bus.
  110. */
  111. static void disconnect_st5481(struct usb_interface *intf)
  112. {
  113. struct st5481_adapter *adapter = usb_get_intfdata(intf);
  114. DBG(1,"");
  115. usb_set_intfdata(intf, NULL);
  116. if (!adapter)
  117. return;
  118. list_del(&adapter->list);
  119. st5481_stop(adapter);
  120. st5481_release_b(&adapter->bcs[1]);
  121. st5481_release_b(&adapter->bcs[0]);
  122. st5481_release_d(adapter);
  123. // we would actually better wait for completion of outstanding urbs
  124. mdelay(2);
  125. st5481_release_usb(adapter);
  126. hisax_unregister(&adapter->hisax_d_if);
  127. kfree(adapter);
  128. }
  129. /*
  130. * The last 4 bits in the Product Id is set with 4 pins on the chip.
  131. */
  132. static struct usb_device_id st5481_ids[] = {
  133. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x0) },
  134. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x1) },
  135. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x2) },
  136. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x3) },
  137. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x4) },
  138. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x5) },
  139. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x6) },
  140. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x7) },
  141. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x8) },
  142. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x9) },
  143. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xA) },
  144. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xB) },
  145. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xC) },
  146. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xD) },
  147. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xE) },
  148. { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xF) },
  149. { }
  150. };
  151. MODULE_DEVICE_TABLE (usb, st5481_ids);
  152. static struct usb_driver st5481_usb_driver = {
  153. .name = "st5481_usb",
  154. .probe = probe_st5481,
  155. .disconnect = disconnect_st5481,
  156. .id_table = st5481_ids,
  157. };
  158. static int __init st5481_usb_init(void)
  159. {
  160. int retval;
  161. #ifdef CONFIG_HISAX_DEBUG
  162. st5481_debug = debug;
  163. #endif
  164. printk(KERN_INFO "hisax_st5481: ST5481 USB ISDN driver $Revision: 2.4.2.3 $\n");
  165. retval = st5481_d_init();
  166. if (retval < 0)
  167. goto out;
  168. retval = usb_register(&st5481_usb_driver);
  169. if (retval < 0)
  170. goto out_d_exit;
  171. return 0;
  172. out_d_exit:
  173. st5481_d_exit();
  174. out:
  175. return retval;
  176. }
  177. static void __exit st5481_usb_exit(void)
  178. {
  179. usb_deregister(&st5481_usb_driver);
  180. st5481_d_exit();
  181. }
  182. module_init(st5481_usb_init);
  183. module_exit(st5481_usb_exit);