Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 330637
b: refs/heads/master
c: 191f79a
h: refs/heads/master
i:
  330635: f7e5920
v: v3
  • Loading branch information
Antti Palosaari authored and Mauro Carvalho Chehab committed Aug 4, 2012
1 parent acbc986 commit 771e74d
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e80896616c11f4c0a0bc17ebd87b86da194b859a
refs/heads/master: 191f79a4d78292a82f9be9cc6c9c974365792f8f
3 changes: 3 additions & 0 deletions trunk/drivers/media/dvb/dvb-usb/dvb_usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,9 @@ struct dvb_usb_adapter {
int feedcount;
int max_feed_count;

/* sync frontend and streaming as those are different tasks */
struct mutex sync_mutex;

/* dvb */
struct dvb_adapter dvb_adap;
struct dmxdev dmxdev;
Expand Down
26 changes: 19 additions & 7 deletions trunk/drivers/media/dvb/dvb-usb/dvb_usb_dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,10 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
if (ret < 0) {
pr_err("%s: error while stopping stream\n",
KBUILD_MODNAME);
return ret;
goto err_mutex_unlock;
}
}
mutex_unlock(&adap->sync_mutex);
}

adap->feedcount = newfeedcount;
Expand All @@ -95,20 +96,22 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
adap->props->pid_filter(adap, dvbdmxfeed->index,
dvbdmxfeed->pid, onoff);

/* start the feed if this was the first feed and there is still a feed
/*
* Start the feed if this was the first feed and there is still a feed
* for reception.
*/
if (adap->feedcount == onoff && adap->feedcount > 0) {
struct usb_data_stream_properties stream_props;
unsigned int ts_props;
mutex_lock(&adap->sync_mutex);

/* resolve TS configuration */
if (adap->dev->props->get_ts_config) {
ret = adap->dev->props->get_ts_config(
adap->fe[adap->active_fe],
&ts_props);
if (ret < 0)
return ret;
goto err_mutex_unlock;
} else {
ts_props = 0; /* normal 188 payload only TS */
}
Expand All @@ -128,13 +131,12 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
adap->fe[adap->active_fe],
&stream_props);
if (ret < 0)
return ret;
goto err_mutex_unlock;
} else {
stream_props = adap->props->stream;
}

pr_debug("%s: submitting all URBs\n", __func__);

usb_urb_submitv2(&adap->stream, &stream_props);

pr_debug("%s: controlling pid parser\n", __func__);
Expand All @@ -147,7 +149,7 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
if (ret < 0) {
pr_err("%s: could not handle pid_parser\n",
KBUILD_MODNAME);
return ret;
goto err_mutex_unlock;
}
}
pr_debug("%s: start feeding\n", __func__);
Expand All @@ -156,12 +158,15 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
if (ret < 0) {
pr_err("%s: error while enabling fifo\n",
KBUILD_MODNAME);
return ret;
goto err_mutex_unlock;
}
}

}

return 0;
err_mutex_unlock:
mutex_unlock(&adap->sync_mutex);
err:
pr_debug("%s: failed=%d\n", __func__, ret);
return ret;
Expand Down Expand Up @@ -238,6 +243,7 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
goto err_net_init;
}

mutex_init(&adap->sync_mutex);
adap->state |= DVB_USB_ADAP_STATE_DVB;
return 0;

Expand Down Expand Up @@ -271,6 +277,7 @@ static int dvb_usb_fe_wakeup(struct dvb_frontend *fe)
{
int ret;
struct dvb_usb_adapter *adap = fe->dvb->priv;
mutex_lock(&adap->sync_mutex);
pr_debug("%s: adap=%d fe=%d\n", __func__, adap->id, fe->id);

ret = dvb_usbv2_device_power_ctrl(adap->dev, 1);
Expand All @@ -290,9 +297,11 @@ static int dvb_usb_fe_wakeup(struct dvb_frontend *fe)
}

adap->active_fe = fe->id;
mutex_unlock(&adap->sync_mutex);

return 0;
err:
mutex_unlock(&adap->sync_mutex);
pr_debug("%s: failed=%d\n", __func__, ret);
return ret;
}
Expand All @@ -301,6 +310,7 @@ static int dvb_usb_fe_sleep(struct dvb_frontend *fe)
{
int ret;
struct dvb_usb_adapter *adap = fe->dvb->priv;
mutex_lock(&adap->sync_mutex);
pr_debug("%s: adap=%d fe=%d\n", __func__, adap->id, fe->id);

if (adap->fe_sleep[fe->id]) {
Expand All @@ -320,9 +330,11 @@ static int dvb_usb_fe_sleep(struct dvb_frontend *fe)
goto err;

adap->active_fe = -1;
mutex_unlock(&adap->sync_mutex);

return 0;
err:
mutex_unlock(&adap->sync_mutex);
pr_debug("%s: failed=%d\n", __func__, ret);
return ret;
}
Expand Down

0 comments on commit 771e74d

Please sign in to comment.