Commit 4992775c authored by Andrew de Quincey's avatar Andrew de Quincey Committed by Linus Torvalds

[PATCH] dvb: core: add workaround for tuning problem

Add workaround for signal lock loss issue, where the frontend loses the signal
after some hours without any visible reason.
Signed-off-by: default avatarAndrew de Quincey <adq_dvb@lidskialf.net>
Signed-off-by: default avatarJohannes Stezenbach <js@linuxtv.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6757ccc5
...@@ -42,6 +42,8 @@ ...@@ -42,6 +42,8 @@
#include "dvb_frontend.h" #include "dvb_frontend.h"
#include "dvbdev.h" #include "dvbdev.h"
// #define DEBUG_LOCKLOSS 1
static int dvb_frontend_debug; static int dvb_frontend_debug;
static int dvb_shutdown_timeout = 5; static int dvb_shutdown_timeout = 5;
static int dvb_force_auto_inversion; static int dvb_force_auto_inversion;
...@@ -113,6 +115,7 @@ struct dvb_frontend_private { ...@@ -113,6 +115,7 @@ struct dvb_frontend_private {
int exit; int exit;
int wakeup; int wakeup;
fe_status_t status; fe_status_t status;
fe_sec_tone_mode_t tone;
}; };
...@@ -434,9 +437,26 @@ static int dvb_frontend_thread(void *data) ...@@ -434,9 +437,26 @@ static int dvb_frontend_thread(void *data)
/* we're tuned, and the lock is still good... */ /* we're tuned, and the lock is still good... */
if (s & FE_HAS_LOCK) if (s & FE_HAS_LOCK)
continue; continue;
else { else { /* if we _WERE_ tuned, but now don't have a lock */
/* if we _WERE_ tuned, but now don't have a lock, #ifdef DEBUG_LOCKLOSS
* need to zigzag */ /* first of all try setting the tone again if it was on - this
* sometimes works around problems with noisy power supplies */
if (fe->ops->set_tone && (fepriv->tone == SEC_TONE_ON)) {
fe->ops->set_tone(fe, fepriv->tone);
mdelay(100);
s = 0;
fe->ops->read_status(fe, &s);
if (s & FE_HAS_LOCK) {
printk("DVB%i: Lock was lost, but regained by setting "
"the tone. This may indicate your power supply "
"is noisy/slightly incompatable with this DVB-S "
"adapter\n", fe->dvb->num);
fepriv->state = FESTATE_TUNED;
continue;
}
}
#endif
/* some other reason for losing the lock - start zigzagging */
fepriv->state = FESTATE_ZIGZAG_FAST; fepriv->state = FESTATE_ZIGZAG_FAST;
fepriv->started_auto_step = fepriv->auto_step; fepriv->started_auto_step = fepriv->auto_step;
check_wrapped = 0; check_wrapped = 0;
...@@ -691,6 +711,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, ...@@ -691,6 +711,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
err = fe->ops->set_tone(fe, (fe_sec_tone_mode_t) parg); err = fe->ops->set_tone(fe, (fe_sec_tone_mode_t) parg);
fepriv->state = FESTATE_DISEQC; fepriv->state = FESTATE_DISEQC;
fepriv->status = 0; fepriv->status = 0;
fepriv->tone = (fe_sec_tone_mode_t) parg;
} }
break; break;
...@@ -893,6 +914,7 @@ int dvb_register_frontend(struct dvb_adapter* dvb, ...@@ -893,6 +914,7 @@ int dvb_register_frontend(struct dvb_adapter* dvb,
init_MUTEX (&fepriv->events.sem); init_MUTEX (&fepriv->events.sem);
fe->dvb = dvb; fe->dvb = dvb;
fepriv->inversion = INVERSION_OFF; fepriv->inversion = INVERSION_OFF;
fepriv->tone = SEC_TONE_OFF;
printk ("DVB: registering frontend %i (%s)...\n", printk ("DVB: registering frontend %i (%s)...\n",
fe->dvb->num, fe->dvb->num,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment