aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/common
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2013-03-15 06:22:08 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-03-21 06:52:05 -0400
commite1b2ac4d1e6bb214823c42bb807a6cc5f21aa223 (patch)
treebea25ec75888d5ebb77ddbd0a7fb75dcbcab31c9 /drivers/media/common
parent5c3b87435b291efb260aec37fdbe397859e550c5 (diff)
[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 d83896bb98fd..4393c688d0ad 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)
512 512
513 switch (phdr->msgType) { 513 switch (phdr->msgType) {
514 case MSG_SMS_DVBT_BDA_DATA: 514 case MSG_SMS_DVBT_BDA_DATA:
515 dvb_dmx_swfilter(&client->demux, p, 515 /*
516 cb->size - sizeof(struct SmsMsgHdr_ST)); 516 * Only feed data to dvb demux if are there any feed listening
517 * to it and if the device has tuned
518 */
519 if (client->feed_users && client->has_tuned)
520 dvb_dmx_swfilter(&client->demux, p,
521 cb->size - sizeof(struct SmsMsgHdr_ST));
517 break; 522 break;
518 523
519 case MSG_SMS_RF_TUNE_RES: 524 case MSG_SMS_RF_TUNE_RES:
@@ -579,9 +584,10 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
579 sms_board_dvb3_event(client, DVB3_EVENT_UNC_OK); 584 sms_board_dvb3_event(client, DVB3_EVENT_UNC_OK);
580 else 585 else
581 sms_board_dvb3_event(client, DVB3_EVENT_UNC_ERR); 586 sms_board_dvb3_event(client, DVB3_EVENT_UNC_ERR);
587 client->has_tuned = true;
582 } else { 588 } else {
583 smsdvb_stats_not_ready(fe); 589 smsdvb_stats_not_ready(fe);
584 590 client->has_tuned = false;
585 sms_board_dvb3_event(client, DVB3_EVENT_FE_UNLOCK); 591 sms_board_dvb3_event(client, DVB3_EVENT_FE_UNLOCK);
586 } 592 }
587 complete(&client->stats_done); 593 complete(&client->stats_done);
@@ -623,6 +629,8 @@ static int smsdvb_start_feed(struct dvb_demux_feed *feed)
623 sms_debug("add pid %d(%x)", 629 sms_debug("add pid %d(%x)",
624 feed->pid, feed->pid); 630 feed->pid, feed->pid);
625 631
632 client->feed_users++;
633
626 PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; 634 PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
627 PidMsg.xMsgHeader.msgDstId = HIF_TASK; 635 PidMsg.xMsgHeader.msgDstId = HIF_TASK;
628 PidMsg.xMsgHeader.msgFlags = 0; 636 PidMsg.xMsgHeader.msgFlags = 0;
@@ -643,6 +651,8 @@ static int smsdvb_stop_feed(struct dvb_demux_feed *feed)
643 sms_debug("remove pid %d(%x)", 651 sms_debug("remove pid %d(%x)",
644 feed->pid, feed->pid); 652 feed->pid, feed->pid);
645 653
654 client->feed_users--;
655
646 PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID; 656 PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
647 PidMsg.xMsgHeader.msgDstId = HIF_TASK; 657 PidMsg.xMsgHeader.msgDstId = HIF_TASK;
648 PidMsg.xMsgHeader.msgFlags = 0; 658 PidMsg.xMsgHeader.msgFlags = 0;
@@ -963,6 +973,8 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe)
963 c->strength.stat[0].uvalue = 0; 973 c->strength.stat[0].uvalue = 0;
964 c->cnr.stat[0].uvalue = 0; 974 c->cnr.stat[0].uvalue = 0;
965 975
976 client->has_tuned = false;
977
966 switch (smscore_get_device_mode(coredev)) { 978 switch (smscore_get_device_mode(coredev)) {
967 case DEVICE_MODE_DVBT: 979 case DEVICE_MODE_DVBT:
968 case DEVICE_MODE_DVBT_BDA: 980 case DEVICE_MODE_DVBT_BDA:
diff --git a/drivers/media/common/siano/smsdvb.h b/drivers/media/common/siano/smsdvb.h
index 34220696d87d..63cdd755521e 100644
--- a/drivers/media/common/siano/smsdvb.h
+++ b/drivers/media/common/siano/smsdvb.h
@@ -54,6 +54,9 @@ struct smsdvb_client_t {
54 54
55 unsigned long get_stats_jiffies; 55 unsigned long get_stats_jiffies;
56 56
57 int feed_users;
58 bool has_tuned;
59
57 /* Stats debugfs data */ 60 /* Stats debugfs data */
58 struct dentry *debugfs; 61 struct dentry *debugfs;
59 62