aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2012-06-12 20:16:52 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-08-04 06:56:31 -0400
commitd32be21800feb38d51a584437f1a5eb3f4126a17 (patch)
tree4639b9913e0a7398474a5c1ebbbfc4b7ae5c6486
parentce6ea9a9424b5c511ea6d7b86081f01fa53d02b4 (diff)
[media] dvb_usb_v2: do not check active fe when stop streaming
Do not check active frontend as it could be already shutdown. Add some more debugs. It turns out that device is put sleep earlier than streaming is stopped in some cases. That is because streaming is running different task and there is no locking. Maybe some locking could be good idea to force stop streaming before device is shut down. I can guess there could be problems in someday cases like chip is sleep but streaming control is requested after that... Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/dvb/dvb-usb/dvb_usb_dvb.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/drivers/media/dvb/dvb-usb/dvb_usb_dvb.c b/drivers/media/dvb/dvb-usb/dvb_usb_dvb.c
index a0f76eb2b6db..f302e63a0d8f 100644
--- a/drivers/media/dvb/dvb-usb/dvb_usb_dvb.c
+++ b/drivers/media/dvb/dvb-usb/dvb_usb_dvb.c
@@ -68,11 +68,14 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
68 struct dvb_usb_adapter *adap = dvbdmxfeed->demux->priv; 68 struct dvb_usb_adapter *adap = dvbdmxfeed->demux->priv;
69 int newfeedcount, ret; 69 int newfeedcount, ret;
70 70
71 if (adap == NULL || adap->active_fe < 0) { 71 if (adap == NULL) {
72 ret = -ENODEV; 72 ret = -ENODEV;
73 goto err; 73 goto err;
74 } 74 }
75 75
76 pr_debug("%s: adap=%d active_fe=%d\n", __func__, adap->id,
77 adap->active_fe);
78
76 newfeedcount = adap->feedcount + (onoff ? 1 : -1); 79 newfeedcount = adap->feedcount + (onoff ? 1 : -1);
77 80
78 /* stop feed before setting a new pid if there will be no pid anymore */ 81 /* stop feed before setting a new pid if there will be no pid anymore */
@@ -189,12 +192,15 @@ static int dvb_usb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
189 192
190int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap) 193int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
191{ 194{
192 int ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->name, 195 int ret;
193 adap->dev->props->owner, 196 pr_debug("%s: adap=%d\n", __func__, adap->id);
194 &adap->dev->udev->dev, 197
195 adap->dev->props->adapter_nr); 198 ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->name,
199 adap->dev->props->owner, &adap->dev->udev->dev,
200 adap->dev->props->adapter_nr);
196 if (ret < 0) { 201 if (ret < 0) {
197 pr_debug("%s: dvb_register_adapter failed=%d\n", __func__, ret); 202 pr_debug("%s: dvb_register_adapter() failed=%d\n", __func__,
203 ret);
198 goto err; 204 goto err;
199 } 205 }
200 adap->dvb_adap.priv = adap; 206 adap->dvb_adap.priv = adap;
@@ -258,6 +264,8 @@ err:
258 264
259int dvb_usbv2_adapter_dvb_exit(struct dvb_usb_adapter *adap) 265int dvb_usbv2_adapter_dvb_exit(struct dvb_usb_adapter *adap)
260{ 266{
267 pr_debug("%s: adap=%d\n", __func__, adap->id);
268
261 if (adap->state & DVB_USB_ADAP_STATE_DVB) { 269 if (adap->state & DVB_USB_ADAP_STATE_DVB) {
262 pr_debug("%s: unregistering DVB part\n", __func__); 270 pr_debug("%s: unregistering DVB part\n", __func__);
263 dvb_net_release(&adap->dvb_net); 271 dvb_net_release(&adap->dvb_net);
@@ -274,6 +282,7 @@ static int dvb_usb_fe_wakeup(struct dvb_frontend *fe)
274{ 282{
275 int ret; 283 int ret;
276 struct dvb_usb_adapter *adap = fe->dvb->priv; 284 struct dvb_usb_adapter *adap = fe->dvb->priv;
285 pr_debug("%s: adap=%d fe=%d\n", __func__, adap->id, fe->id);
277 286
278 ret = dvb_usbv2_device_power_ctrl(adap->dev, 1); 287 ret = dvb_usbv2_device_power_ctrl(adap->dev, 1);
279 if (ret < 0) 288 if (ret < 0)
@@ -303,6 +312,7 @@ static int dvb_usb_fe_sleep(struct dvb_frontend *fe)
303{ 312{
304 int ret; 313 int ret;
305 struct dvb_usb_adapter *adap = fe->dvb->priv; 314 struct dvb_usb_adapter *adap = fe->dvb->priv;
315 pr_debug("%s: adap=%d fe=%d\n", __func__, adap->id, fe->id);
306 316
307 if (adap->fe_sleep[fe->id]) { 317 if (adap->fe_sleep[fe->id]) {
308 ret = adap->fe_sleep[fe->id](fe); 318 ret = adap->fe_sleep[fe->id](fe);
@@ -331,8 +341,7 @@ err:
331int dvb_usbv2_adapter_frontend_init(struct dvb_usb_adapter *adap) 341int dvb_usbv2_adapter_frontend_init(struct dvb_usb_adapter *adap)
332{ 342{
333 int ret, i, count_registered = 0; 343 int ret, i, count_registered = 0;
334 344 pr_debug("%s: adap=%d\n", __func__, adap->id);
335 pr_debug("%s:\n", __func__);
336 345
337 memset(adap->fe, 0, sizeof(adap->fe)); 346 memset(adap->fe, 0, sizeof(adap->fe));
338 adap->active_fe = -1; 347 adap->active_fe = -1;
@@ -400,8 +409,7 @@ err:
400int dvb_usbv2_adapter_frontend_exit(struct dvb_usb_adapter *adap) 409int dvb_usbv2_adapter_frontend_exit(struct dvb_usb_adapter *adap)
401{ 410{
402 int i; 411 int i;
403 412 pr_debug("%s: adap=%d\n", __func__, adap->id);
404 pr_debug("%s:\n", __func__);
405 413
406 for (i = adap->num_frontends_initialized - 1; i >= 0; i--) { 414 for (i = adap->num_frontends_initialized - 1; i >= 0; i--) {
407 if (adap->fe[i]) { 415 if (adap->fe[i]) {