dvb-usb-init.c 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * DVB USB library - provides a generic interface for a DVB USB device driver.
  4. *
  5. * dvb-usb-init.c
  6. *
  7. * Copyright (C) 2004-6 Patrick Boettcher ([email protected])
  8. *
  9. * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information
  10. */
  11. #include "dvb-usb-common.h"
  12. /* debug */
  13. int dvb_usb_debug;
  14. module_param_named(debug, dvb_usb_debug, int, 0644);
  15. MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,pll=4,ts=8,err=16,rc=32,fw=64,mem=128,uxfer=256 (or-able))." DVB_USB_DEBUG_STATUS);
  16. int dvb_usb_disable_rc_polling;
  17. module_param_named(disable_rc_polling, dvb_usb_disable_rc_polling, int, 0644);
  18. MODULE_PARM_DESC(disable_rc_polling, "disable remote control polling (default: 0).");
  19. static int dvb_usb_force_pid_filter_usage;
  20. module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage, int, 0444);
  21. MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a PID filter, if any (default: 0).");
  22. static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
  23. {
  24. struct dvb_usb_adapter *adap;
  25. int ret, n, o;
  26. for (n = 0; n < d->props.num_adapters; n++) {
  27. adap = &d->adapter[n];
  28. adap->dev = d;
  29. adap->id = n;
  30. memcpy(&adap->props, &d->props.adapter[n], sizeof(struct dvb_usb_adapter_properties));
  31. for (o = 0; o < adap->props.num_frontends; o++) {
  32. struct dvb_usb_adapter_fe_properties *props = &adap->props.fe[o];
  33. /* speed - when running at FULL speed we need a HW PID filter */
  34. if (d->udev->speed == USB_SPEED_FULL && !(props->caps & DVB_USB_ADAP_HAS_PID_FILTER)) {
  35. err("This USB2.0 device cannot be run on a USB1.1 port. (it lacks a hardware PID filter)");
  36. return -ENODEV;
  37. }
  38. if ((d->udev->speed == USB_SPEED_FULL && props->caps & DVB_USB_ADAP_HAS_PID_FILTER) ||
  39. (props->caps & DVB_USB_ADAP_NEED_PID_FILTERING)) {
  40. info("will use the device's hardware PID filter (table count: %d).", props->pid_filter_count);
  41. adap->fe_adap[o].pid_filtering = 1;
  42. adap->fe_adap[o].max_feed_count = props->pid_filter_count;
  43. } else {
  44. info("will pass the complete MPEG2 transport stream to the software demuxer.");
  45. adap->fe_adap[o].pid_filtering = 0;
  46. adap->fe_adap[o].max_feed_count = 255;
  47. }
  48. if (!adap->fe_adap[o].pid_filtering &&
  49. dvb_usb_force_pid_filter_usage &&
  50. props->caps & DVB_USB_ADAP_HAS_PID_FILTER) {
  51. info("pid filter enabled by module option.");
  52. adap->fe_adap[o].pid_filtering = 1;
  53. adap->fe_adap[o].max_feed_count = props->pid_filter_count;
  54. }
  55. if (props->size_of_priv > 0) {
  56. adap->fe_adap[o].priv = kzalloc(props->size_of_priv, GFP_KERNEL);
  57. if (adap->fe_adap[o].priv == NULL) {
  58. err("no memory for priv for adapter %d fe %d.", n, o);
  59. return -ENOMEM;
  60. }
  61. }
  62. }
  63. if (adap->props.size_of_priv > 0) {
  64. adap->priv = kzalloc(adap->props.size_of_priv, GFP_KERNEL);
  65. if (adap->priv == NULL) {
  66. err("no memory for priv for adapter %d.", n);
  67. return -ENOMEM;
  68. }
  69. }
  70. ret = dvb_usb_adapter_stream_init(adap);
  71. if (ret)
  72. goto stream_init_err;
  73. ret = dvb_usb_adapter_dvb_init(adap, adapter_nrs);
  74. if (ret)
  75. goto dvb_init_err;
  76. ret = dvb_usb_adapter_frontend_init(adap);
  77. if (ret)
  78. goto frontend_init_err;
  79. /* use exclusive FE lock if there is multiple shared FEs */
  80. if (adap->fe_adap[1].fe)
  81. adap->dvb_adap.mfe_shared = 1;
  82. d->num_adapters_initialized++;
  83. d->state |= DVB_USB_STATE_DVB;
  84. }
  85. /*
  86. * when reloading the driver w/o replugging the device
  87. * sometimes a timeout occurs, this helps
  88. */
  89. if (d->props.generic_bulk_ctrl_endpoint != 0) {
  90. usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
  91. usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
  92. }
  93. return 0;
  94. frontend_init_err:
  95. dvb_usb_adapter_dvb_exit(adap);
  96. dvb_init_err:
  97. dvb_usb_adapter_stream_exit(adap);
  98. stream_init_err:
  99. kfree(adap->priv);
  100. return ret;
  101. }
  102. static int dvb_usb_adapter_exit(struct dvb_usb_device *d)
  103. {
  104. int n;
  105. for (n = 0; n < d->num_adapters_initialized; n++) {
  106. dvb_usb_adapter_frontend_exit(&d->adapter[n]);
  107. dvb_usb_adapter_dvb_exit(&d->adapter[n]);
  108. dvb_usb_adapter_stream_exit(&d->adapter[n]);
  109. kfree(d->adapter[n].priv);
  110. }
  111. d->num_adapters_initialized = 0;
  112. d->state &= ~DVB_USB_STATE_DVB;
  113. return 0;
  114. }
  115. /* general initialization functions */
  116. static int dvb_usb_exit(struct dvb_usb_device *d)
  117. {
  118. deb_info("state before exiting everything: %x\n", d->state);
  119. dvb_usb_remote_exit(d);
  120. dvb_usb_adapter_exit(d);
  121. dvb_usb_i2c_exit(d);
  122. deb_info("state should be zero now: %x\n", d->state);
  123. d->state = DVB_USB_STATE_INIT;
  124. if (d->priv != NULL && d->props.priv_destroy != NULL)
  125. d->props.priv_destroy(d);
  126. kfree(d->priv);
  127. kfree(d);
  128. return 0;
  129. }
  130. static int dvb_usb_init(struct dvb_usb_device *d, short *adapter_nums)
  131. {
  132. int ret = 0;
  133. mutex_init(&d->data_mutex);
  134. mutex_init(&d->usb_mutex);
  135. mutex_init(&d->i2c_mutex);
  136. d->state = DVB_USB_STATE_INIT;
  137. if (d->props.size_of_priv > 0) {
  138. d->priv = kzalloc(d->props.size_of_priv, GFP_KERNEL);
  139. if (d->priv == NULL) {
  140. err("no memory for priv in 'struct dvb_usb_device'");
  141. return -ENOMEM;
  142. }
  143. if (d->props.priv_init != NULL) {
  144. ret = d->props.priv_init(d);
  145. if (ret != 0)
  146. goto err_priv_init;
  147. }
  148. }
  149. /* check the capabilities and set appropriate variables */
  150. dvb_usb_device_power_ctrl(d, 1);
  151. ret = dvb_usb_i2c_init(d);
  152. if (ret)
  153. goto err_i2c_init;
  154. ret = dvb_usb_adapter_init(d, adapter_nums);
  155. if (ret)
  156. goto err_adapter_init;
  157. if ((ret = dvb_usb_remote_init(d)))
  158. err("could not initialize remote control.");
  159. dvb_usb_device_power_ctrl(d, 0);
  160. return 0;
  161. err_adapter_init:
  162. dvb_usb_adapter_exit(d);
  163. dvb_usb_i2c_exit(d);
  164. err_i2c_init:
  165. if (d->priv && d->props.priv_destroy)
  166. d->props.priv_destroy(d);
  167. err_priv_init:
  168. kfree(d->priv);
  169. d->priv = NULL;
  170. return ret;
  171. }
  172. /* determine the name and the state of the just found USB device */
  173. static const struct dvb_usb_device_description *dvb_usb_find_device(struct usb_device *udev, const struct dvb_usb_device_properties *props, int *cold)
  174. {
  175. int i, j;
  176. const struct dvb_usb_device_description *desc = NULL;
  177. *cold = -1;
  178. for (i = 0; i < props->num_device_descs; i++) {
  179. for (j = 0; j < DVB_USB_ID_MAX_NUM && props->devices[i].cold_ids[j] != NULL; j++) {
  180. deb_info("check for cold %x %x\n", props->devices[i].cold_ids[j]->idVendor, props->devices[i].cold_ids[j]->idProduct);
  181. if (props->devices[i].cold_ids[j]->idVendor == le16_to_cpu(udev->descriptor.idVendor) &&
  182. props->devices[i].cold_ids[j]->idProduct == le16_to_cpu(udev->descriptor.idProduct)) {
  183. *cold = 1;
  184. desc = &props->devices[i];
  185. break;
  186. }
  187. }
  188. if (desc != NULL)
  189. break;
  190. for (j = 0; j < DVB_USB_ID_MAX_NUM && props->devices[i].warm_ids[j] != NULL; j++) {
  191. deb_info("check for warm %x %x\n", props->devices[i].warm_ids[j]->idVendor, props->devices[i].warm_ids[j]->idProduct);
  192. if (props->devices[i].warm_ids[j]->idVendor == le16_to_cpu(udev->descriptor.idVendor) &&
  193. props->devices[i].warm_ids[j]->idProduct == le16_to_cpu(udev->descriptor.idProduct)) {
  194. *cold = 0;
  195. desc = &props->devices[i];
  196. break;
  197. }
  198. }
  199. }
  200. if (desc != NULL && props->identify_state != NULL)
  201. props->identify_state(udev, props, &desc, cold);
  202. return desc;
  203. }
  204. int dvb_usb_device_power_ctrl(struct dvb_usb_device *d, int onoff)
  205. {
  206. if (onoff)
  207. d->powered++;
  208. else
  209. d->powered--;
  210. if (d->powered == 0 || (onoff && d->powered == 1)) { /* when switching from 1 to 0 or from 0 to 1 */
  211. deb_info("power control: %d\n", onoff);
  212. if (d->props.power_ctrl)
  213. return d->props.power_ctrl(d, onoff);
  214. }
  215. return 0;
  216. }
  217. /*
  218. * USB
  219. */
  220. int dvb_usb_device_init(struct usb_interface *intf,
  221. const struct dvb_usb_device_properties *props,
  222. struct module *owner, struct dvb_usb_device **du,
  223. short *adapter_nums)
  224. {
  225. struct usb_device *udev = interface_to_usbdev(intf);
  226. struct dvb_usb_device *d = NULL;
  227. const struct dvb_usb_device_description *desc = NULL;
  228. int ret = -ENOMEM, cold = 0;
  229. if (du != NULL)
  230. *du = NULL;
  231. d = kzalloc(sizeof(*d), GFP_KERNEL);
  232. if (!d) {
  233. err("no memory for 'struct dvb_usb_device'");
  234. return -ENOMEM;
  235. }
  236. memcpy(&d->props, props, sizeof(struct dvb_usb_device_properties));
  237. desc = dvb_usb_find_device(udev, &d->props, &cold);
  238. if (!desc) {
  239. deb_err("something went very wrong, device was not found in current device list - let's see what comes next.\n");
  240. ret = -ENODEV;
  241. goto error;
  242. }
  243. if (cold) {
  244. info("found a '%s' in cold state, will try to load a firmware", desc->name);
  245. ret = dvb_usb_download_firmware(udev, props);
  246. if (!props->no_reconnect || ret != 0)
  247. goto error;
  248. }
  249. info("found a '%s' in warm state.", desc->name);
  250. d->udev = udev;
  251. d->desc = desc;
  252. d->owner = owner;
  253. usb_set_intfdata(intf, d);
  254. ret = dvb_usb_init(d, adapter_nums);
  255. if (ret) {
  256. info("%s error while loading driver (%d)", desc->name, ret);
  257. goto error;
  258. }
  259. if (du)
  260. *du = d;
  261. info("%s successfully initialized and connected.", desc->name);
  262. return 0;
  263. error:
  264. usb_set_intfdata(intf, NULL);
  265. kfree(d);
  266. return ret;
  267. }
  268. EXPORT_SYMBOL(dvb_usb_device_init);
  269. void dvb_usb_device_exit(struct usb_interface *intf)
  270. {
  271. struct dvb_usb_device *d = usb_get_intfdata(intf);
  272. const char *default_name = "generic DVB-USB module";
  273. char name[40];
  274. usb_set_intfdata(intf, NULL);
  275. if (d != NULL && d->desc != NULL) {
  276. strscpy(name, d->desc->name, sizeof(name));
  277. dvb_usb_exit(d);
  278. } else {
  279. strscpy(name, default_name, sizeof(name));
  280. }
  281. info("%s successfully deinitialized and disconnected.", name);
  282. }
  283. EXPORT_SYMBOL(dvb_usb_device_exit);
  284. MODULE_VERSION("1.0");
  285. MODULE_AUTHOR("Patrick Boettcher <[email protected]>");
  286. MODULE_DESCRIPTION("A library module containing commonly used USB and DVB function USB DVB devices");
  287. MODULE_LICENSE("GPL");