dvb_usb_dvb.c 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. /* dvb-usb-dvb.c is part of the DVB USB library.
  2. *
  3. * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
  4. * see dvb-usb-init.c for copyright information.
  5. *
  6. * This file contains functions for initializing and handling the
  7. * linux-dvb API.
  8. */
  9. #include "dvb_usb_common.h"
  10. static void dvb_usb_data_complete(struct usb_data_stream *stream, u8 *buf,
  11. size_t len)
  12. {
  13. struct dvb_usb_adapter *adap = stream->user_priv;
  14. dvb_dmx_swfilter(&adap->demux, buf, len);
  15. }
  16. static void dvb_usb_data_complete_204(struct usb_data_stream *stream, u8 *buf,
  17. size_t len)
  18. {
  19. struct dvb_usb_adapter *adap = stream->user_priv;
  20. dvb_dmx_swfilter_204(&adap->demux, buf, len);
  21. }
  22. static void dvb_usb_data_complete_raw(struct usb_data_stream *stream, u8 *buf,
  23. size_t len)
  24. {
  25. struct dvb_usb_adapter *adap = stream->user_priv;
  26. dvb_dmx_swfilter_raw(&adap->demux, buf, len);
  27. }
  28. int dvb_usbv2_adapter_stream_init(struct dvb_usb_adapter *adap)
  29. {
  30. pr_debug("%s: adap=%d\n", __func__, adap->id);
  31. adap->stream.udev = adap_to_d(adap)->udev;
  32. adap->stream.user_priv = adap;
  33. adap->stream.complete = dvb_usb_data_complete;
  34. return usb_urb_initv2(&adap->stream, &adap->props->stream);
  35. }
  36. int dvb_usbv2_adapter_stream_exit(struct dvb_usb_adapter *adap)
  37. {
  38. pr_debug("%s: adap=%d\n", __func__, adap->id);
  39. usb_urb_exitv2(&adap->stream);
  40. return 0;
  41. }
  42. /* does the complete input transfer handling */
  43. static inline int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int count)
  44. {
  45. struct dvb_usb_adapter *adap = dvbdmxfeed->demux->priv;
  46. struct dvb_usb_device *d = adap_to_d(adap);
  47. int ret;
  48. pr_debug("%s: adap=%d active_fe=%d feed_type=%d setting pid [%s]: " \
  49. "%04x (%04d) at index %d '%s'\n", __func__, adap->id,
  50. adap->active_fe, dvbdmxfeed->type,
  51. adap->pid_filtering ? "yes" : "no", dvbdmxfeed->pid,
  52. dvbdmxfeed->pid, dvbdmxfeed->index,
  53. (count == 1) ? "on" : "off");
  54. if (adap->active_fe == -1)
  55. return -EINVAL;
  56. adap->feed_count += count;
  57. /* stop feeding if it is last pid */
  58. if (adap->feed_count == 0) {
  59. pr_debug("%s: stop feeding\n", __func__);
  60. usb_urb_killv2(&adap->stream);
  61. if (d->props->streaming_ctrl) {
  62. ret = d->props->streaming_ctrl(adap, 0);
  63. if (ret < 0) {
  64. pr_err("%s: streaming_ctrl() failed=%d\n",
  65. KBUILD_MODNAME, ret);
  66. goto err_mutex_unlock;
  67. }
  68. }
  69. mutex_unlock(&adap->sync_mutex);
  70. }
  71. /* activate the pid on the device pid filter */
  72. if (adap->props->caps & DVB_USB_ADAP_HAS_PID_FILTER &&
  73. adap->pid_filtering &&
  74. adap->props->pid_filter)
  75. ret = adap->props->pid_filter(adap, dvbdmxfeed->index,
  76. dvbdmxfeed->pid, (count == 1) ? 1 : 0);
  77. if (ret < 0)
  78. pr_err("%s: pid_filter() failed=%d\n",
  79. KBUILD_MODNAME, ret);
  80. /* start feeding if it is first pid */
  81. if (adap->feed_count == 1 && count == 1) {
  82. struct usb_data_stream_properties stream_props;
  83. mutex_lock(&adap->sync_mutex);
  84. pr_debug("%s: start feeding\n", __func__);
  85. /* resolve input and output streaming paramters */
  86. if (d->props->get_stream_config) {
  87. memcpy(&stream_props, &adap->props->stream,
  88. sizeof(struct usb_data_stream_properties));
  89. ret = d->props->get_stream_config(
  90. adap->fe[adap->active_fe],
  91. &adap->ts_type, &stream_props);
  92. if (ret < 0)
  93. goto err_mutex_unlock;
  94. } else {
  95. stream_props = adap->props->stream;
  96. }
  97. switch (adap->ts_type) {
  98. case DVB_USB_FE_TS_TYPE_204:
  99. adap->stream.complete = dvb_usb_data_complete_204;
  100. break;
  101. case DVB_USB_FE_TS_TYPE_RAW:
  102. adap->stream.complete = dvb_usb_data_complete_raw;
  103. break;
  104. case DVB_USB_FE_TS_TYPE_188:
  105. default:
  106. adap->stream.complete = dvb_usb_data_complete;
  107. break;
  108. }
  109. usb_urb_submitv2(&adap->stream, &stream_props);
  110. if (adap->props->caps & DVB_USB_ADAP_HAS_PID_FILTER &&
  111. adap->props->caps &
  112. DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF &&
  113. adap->props->pid_filter_ctrl) {
  114. ret = adap->props->pid_filter_ctrl(adap,
  115. adap->pid_filtering);
  116. if (ret < 0) {
  117. pr_err("%s: pid_filter_ctrl() failed=%d\n",
  118. KBUILD_MODNAME, ret);
  119. goto err_mutex_unlock;
  120. }
  121. }
  122. if (d->props->streaming_ctrl) {
  123. ret = d->props->streaming_ctrl(adap, 1);
  124. if (ret < 0) {
  125. pr_err("%s: streaming_ctrl() failed=%d\n",
  126. KBUILD_MODNAME, ret);
  127. goto err_mutex_unlock;
  128. }
  129. }
  130. }
  131. return 0;
  132. err_mutex_unlock:
  133. mutex_unlock(&adap->sync_mutex);
  134. pr_debug("%s: failed=%d\n", __func__, ret);
  135. return ret;
  136. }
  137. static int dvb_usb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
  138. {
  139. return dvb_usb_ctrl_feed(dvbdmxfeed, 1);
  140. }
  141. static int dvb_usb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
  142. {
  143. return dvb_usb_ctrl_feed(dvbdmxfeed, -1);
  144. }
  145. int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
  146. {
  147. int ret;
  148. struct dvb_usb_device *d = adap_to_d(adap);
  149. pr_debug("%s: adap=%d\n", __func__, adap->id);
  150. ret = dvb_register_adapter(&adap->dvb_adap, d->name, d->props->owner,
  151. &d->udev->dev, d->props->adapter_nr);
  152. if (ret < 0) {
  153. pr_debug("%s: dvb_register_adapter() failed=%d\n", __func__,
  154. ret);
  155. goto err;
  156. }
  157. adap->dvb_adap.priv = adap;
  158. if (d->props->read_mac_address) {
  159. ret = d->props->read_mac_address(adap,
  160. adap->dvb_adap.proposed_mac);
  161. if (ret < 0)
  162. goto err_dmx;
  163. pr_info("%s: MAC address: %pM\n", KBUILD_MODNAME,
  164. adap->dvb_adap.proposed_mac);
  165. }
  166. adap->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
  167. adap->demux.priv = adap;
  168. adap->demux.filternum = 0;
  169. if (adap->demux.filternum < adap->max_feed_count)
  170. adap->demux.filternum = adap->max_feed_count;
  171. adap->demux.feednum = adap->demux.filternum;
  172. adap->demux.start_feed = dvb_usb_start_feed;
  173. adap->demux.stop_feed = dvb_usb_stop_feed;
  174. adap->demux.write_to_decoder = NULL;
  175. ret = dvb_dmx_init(&adap->demux);
  176. if (ret < 0) {
  177. pr_err("%s: dvb_dmx_init() failed=%d\n", KBUILD_MODNAME, ret);
  178. goto err_dmx;
  179. }
  180. adap->dmxdev.filternum = adap->demux.filternum;
  181. adap->dmxdev.demux = &adap->demux.dmx;
  182. adap->dmxdev.capabilities = 0;
  183. ret = dvb_dmxdev_init(&adap->dmxdev, &adap->dvb_adap);
  184. if (ret < 0) {
  185. pr_err("%s: dvb_dmxdev_init() failed=%d\n", KBUILD_MODNAME,
  186. ret);
  187. goto err_dmx_dev;
  188. }
  189. ret = dvb_net_init(&adap->dvb_adap, &adap->dvb_net, &adap->demux.dmx);
  190. if (ret < 0) {
  191. pr_err("%s: dvb_net_init() failed=%d\n", KBUILD_MODNAME, ret);
  192. goto err_net_init;
  193. }
  194. mutex_init(&adap->sync_mutex);
  195. return 0;
  196. err_net_init:
  197. dvb_dmxdev_release(&adap->dmxdev);
  198. err_dmx_dev:
  199. dvb_dmx_release(&adap->demux);
  200. err_dmx:
  201. dvb_unregister_adapter(&adap->dvb_adap);
  202. err:
  203. adap->dvb_adap.priv = NULL;
  204. return ret;
  205. }
  206. int dvb_usbv2_adapter_dvb_exit(struct dvb_usb_adapter *adap)
  207. {
  208. pr_debug("%s: adap=%d\n", __func__, adap->id);
  209. if (adap->dvb_adap.priv) {
  210. dvb_net_release(&adap->dvb_net);
  211. adap->demux.dmx.close(&adap->demux.dmx);
  212. dvb_dmxdev_release(&adap->dmxdev);
  213. dvb_dmx_release(&adap->demux);
  214. dvb_unregister_adapter(&adap->dvb_adap);
  215. }
  216. return 0;
  217. }
  218. static int dvb_usb_fe_wakeup(struct dvb_frontend *fe)
  219. {
  220. int ret;
  221. struct dvb_usb_adapter *adap = fe->dvb->priv;
  222. struct dvb_usb_device *d = adap_to_d(adap);
  223. mutex_lock(&adap->sync_mutex);
  224. pr_debug("%s: adap=%d fe=%d\n", __func__, adap->id, fe->id);
  225. ret = dvb_usbv2_device_power_ctrl(d, 1);
  226. if (ret < 0)
  227. goto err;
  228. if (d->props->frontend_ctrl) {
  229. ret = d->props->frontend_ctrl(fe, 1);
  230. if (ret < 0)
  231. goto err;
  232. }
  233. if (adap->fe_init[fe->id]) {
  234. ret = adap->fe_init[fe->id](fe);
  235. if (ret < 0)
  236. goto err;
  237. }
  238. adap->active_fe = fe->id;
  239. mutex_unlock(&adap->sync_mutex);
  240. return 0;
  241. err:
  242. mutex_unlock(&adap->sync_mutex);
  243. pr_debug("%s: failed=%d\n", __func__, ret);
  244. return ret;
  245. }
  246. static int dvb_usb_fe_sleep(struct dvb_frontend *fe)
  247. {
  248. int ret;
  249. struct dvb_usb_adapter *adap = fe->dvb->priv;
  250. struct dvb_usb_device *d = adap_to_d(adap);
  251. mutex_lock(&adap->sync_mutex);
  252. pr_debug("%s: adap=%d fe=%d\n", __func__, adap->id, fe->id);
  253. if (adap->fe_sleep[fe->id]) {
  254. ret = adap->fe_sleep[fe->id](fe);
  255. if (ret < 0)
  256. goto err;
  257. }
  258. if (d->props->frontend_ctrl) {
  259. ret = d->props->frontend_ctrl(fe, 0);
  260. if (ret < 0)
  261. goto err;
  262. }
  263. ret = dvb_usbv2_device_power_ctrl(d, 0);
  264. if (ret < 0)
  265. goto err;
  266. adap->active_fe = -1;
  267. mutex_unlock(&adap->sync_mutex);
  268. return 0;
  269. err:
  270. mutex_unlock(&adap->sync_mutex);
  271. pr_debug("%s: failed=%d\n", __func__, ret);
  272. return ret;
  273. }
  274. int dvb_usbv2_adapter_frontend_init(struct dvb_usb_adapter *adap)
  275. {
  276. int ret, i, count_registered = 0;
  277. struct dvb_usb_device *d = adap_to_d(adap);
  278. pr_debug("%s: adap=%d\n", __func__, adap->id);
  279. memset(adap->fe, 0, sizeof(adap->fe));
  280. adap->active_fe = -1;
  281. if (d->props->frontend_attach) {
  282. ret = d->props->frontend_attach(adap);
  283. if (ret < 0) {
  284. pr_debug("%s: frontend_attach() failed=%d\n", __func__,
  285. ret);
  286. goto err_dvb_frontend_detach;
  287. }
  288. } else {
  289. pr_debug("%s: frontend_attach() do not exists\n", __func__);
  290. ret = 0;
  291. goto err;
  292. }
  293. for (i = 0; i < MAX_NO_OF_FE_PER_ADAP && adap->fe[i]; i++) {
  294. adap->fe[i]->id = i;
  295. /* re-assign sleep and wakeup functions */
  296. adap->fe_init[i] = adap->fe[i]->ops.init;
  297. adap->fe[i]->ops.init = dvb_usb_fe_wakeup;
  298. adap->fe_sleep[i] = adap->fe[i]->ops.sleep;
  299. adap->fe[i]->ops.sleep = dvb_usb_fe_sleep;
  300. ret = dvb_register_frontend(&adap->dvb_adap, adap->fe[i]);
  301. if (ret < 0) {
  302. pr_err("%s: frontend%d registration failed\n",
  303. KBUILD_MODNAME, i);
  304. goto err_dvb_unregister_frontend;
  305. }
  306. count_registered++;
  307. }
  308. if (d->props->tuner_attach) {
  309. ret = d->props->tuner_attach(adap);
  310. if (ret < 0) {
  311. pr_debug("%s: tuner_attach() failed=%d\n", __func__,
  312. ret);
  313. goto err_dvb_unregister_frontend;
  314. }
  315. }
  316. return 0;
  317. err_dvb_unregister_frontend:
  318. for (i = count_registered - 1; i >= 0; i--)
  319. dvb_unregister_frontend(adap->fe[i]);
  320. err_dvb_frontend_detach:
  321. for (i = MAX_NO_OF_FE_PER_ADAP - 1; i >= 0; i--) {
  322. if (adap->fe[i])
  323. dvb_frontend_detach(adap->fe[i]);
  324. }
  325. err:
  326. pr_debug("%s: failed=%d\n", __func__, ret);
  327. return ret;
  328. }
  329. int dvb_usbv2_adapter_frontend_exit(struct dvb_usb_adapter *adap)
  330. {
  331. int i;
  332. pr_debug("%s: adap=%d\n", __func__, adap->id);
  333. for (i = MAX_NO_OF_FE_PER_ADAP - 1; i >= 0; i--) {
  334. if (adap->fe[i]) {
  335. dvb_unregister_frontend(adap->fe[i]);
  336. dvb_frontend_detach(adap->fe[i]);
  337. }
  338. }
  339. return 0;
  340. }