summaryrefslogtreecommitdiff
path: root/drivers/media/common
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2013-03-15 07:22:08 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-03-21 07:52:05 -0300
commite1b2ac4d1e6bb214823c42bb807a6cc5f21aa223 (patch)
treebea25ec75888d5ebb77ddbd0a7fb75dcbcab31c9 /drivers/media/common
parent5c3b87435b291efb260aec37fdbe397859e550c5 (diff)
downloadlinux-3.10-e1b2ac4d1e6bb214823c42bb807a6cc5f21aa223.tar.gz
linux-3.10-e1b2ac4d1e6bb214823c42bb807a6cc5f21aa223.tar.bz2
linux-3.10-e1b2ac4d1e6bb214823c42bb807a6cc5f21aa223.zip
[media] siano: Only feed DVB data when there's a feed
Right now, the driver sends DVB data even before tunning. It was noticed that this may lead into some mistakes at DVB decode, as the PIDs from wrong channels may be associated with another frequency, as they may already be inside the PID buffers. So, prevent it by not feeding DVB demux with data while there's no feed or while the device is not tuned. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/common')
-rw-r--r--drivers/media/common/siano/smsdvb-main.c18
-rw-r--r--drivers/media/common/siano/smsdvb.h3
2 files changed, 18 insertions, 3 deletions
diff --git a/drivers/media/common/siano/smsdvb-main.c b/drivers/media/common/siano/smsdvb-main.c
index d83896bb98f..4393c688d0a 100644
--- a/drivers/media/common/siano/smsdvb-main.c
+++ b/drivers/media/common/siano/smsdvb-main.c
@@ -512,8 +512,13 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
switch (phdr->msgType) {
case MSG_SMS_DVBT_BDA_DATA:
- dvb_dmx_swfilter(&client->demux, p,
- cb->size - sizeof(struct SmsMsgHdr_ST));
+ /*
+ * Only feed data to dvb demux if are there any feed listening
+ * to it and if the device has tuned
+ */
+ if (client->feed_users && client->has_tuned)
+ dvb_dmx_swfilter(&client->demux, p,
+ cb->size - sizeof(struct SmsMsgHdr_ST));
break;
case MSG_SMS_RF_TUNE_RES:
@@ -579,9 +584,10 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
sms_board_dvb3_event(client, DVB3_EVENT_UNC_OK);
else
sms_board_dvb3_event(client, DVB3_EVENT_UNC_ERR);
+ client->has_tuned = true;
} else {
smsdvb_stats_not_ready(fe);
-
+ client->has_tuned = false;
sms_board_dvb3_event(client, DVB3_EVENT_FE_UNLOCK);
}
complete(&client->stats_done);
@@ -623,6 +629,8 @@ static int smsdvb_start_feed(struct dvb_demux_feed *feed)
sms_debug("add pid %d(%x)",
feed->pid, feed->pid);
+ client->feed_users++;
+
PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
PidMsg.xMsgHeader.msgDstId = HIF_TASK;
PidMsg.xMsgHeader.msgFlags = 0;
@@ -643,6 +651,8 @@ static int smsdvb_stop_feed(struct dvb_demux_feed *feed)
sms_debug("remove pid %d(%x)",
feed->pid, feed->pid);
+ client->feed_users--;
+
PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
PidMsg.xMsgHeader.msgDstId = HIF_TASK;
PidMsg.xMsgHeader.msgFlags = 0;
@@ -963,6 +973,8 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe)
c->strength.stat[0].uvalue = 0;
c->cnr.stat[0].uvalue = 0;
+ client->has_tuned = false;
+
switch (smscore_get_device_mode(coredev)) {
case DEVICE_MODE_DVBT:
case DEVICE_MODE_DVBT_BDA:
diff --git a/drivers/media/common/siano/smsdvb.h b/drivers/media/common/siano/smsdvb.h
index 34220696d87..63cdd755521 100644
--- a/drivers/media/common/siano/smsdvb.h
+++ b/drivers/media/common/siano/smsdvb.h
@@ -54,6 +54,9 @@ struct smsdvb_client_t {
unsigned long get_stats_jiffies;
+ int feed_users;
+ bool has_tuned;
+
/* Stats debugfs data */
struct dentry *debugfs;