Commit 15b1c5a0 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

[media] mb86a20s: provide CNR stats before FE_HAS_SYNC

State 9 means TS started to be output, and it should be
associated with FE_HAS_SYNC.
The mb86a20scan get CNR statistics at state 7, when frame sync
is obtained.
As CNR may help to adjust the antenna, provide it earlier.
A latter patch could eventually start outputing MER measures
earlier, but that would require a bigger change, and probably
won't be better than the current way, as the time between
changing from state 8 to 9 is generally lower than the time
to get the stats collected.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 768e6dad
...@@ -312,7 +312,7 @@ static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status) ...@@ -312,7 +312,7 @@ static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status)
dev_dbg(&state->i2c->dev, "%s: Status = 0x%02x (state = %d)\n", dev_dbg(&state->i2c->dev, "%s: Status = 0x%02x (state = %d)\n",
__func__, *status, val); __func__, *status, val);
return 0; return val;
} }
static int mb86a20s_read_signal_strength(struct dvb_frontend *fe) static int mb86a20s_read_signal_strength(struct dvb_frontend *fe)
...@@ -1564,7 +1564,7 @@ static void mb86a20s_stats_not_ready(struct dvb_frontend *fe) ...@@ -1564,7 +1564,7 @@ static void mb86a20s_stats_not_ready(struct dvb_frontend *fe)
} }
} }
static int mb86a20s_get_stats(struct dvb_frontend *fe) static int mb86a20s_get_stats(struct dvb_frontend *fe, int status_nr)
{ {
struct mb86a20s_state *state = fe->demodulator_priv; struct mb86a20s_state *state = fe->demodulator_priv;
struct dtv_frontend_properties *c = &fe->dtv_property_cache; struct dtv_frontend_properties *c = &fe->dtv_property_cache;
...@@ -1584,6 +1584,14 @@ static int mb86a20s_get_stats(struct dvb_frontend *fe) ...@@ -1584,6 +1584,14 @@ static int mb86a20s_get_stats(struct dvb_frontend *fe)
/* Get per-layer stats */ /* Get per-layer stats */
mb86a20s_get_blk_error_layer_CNR(fe); mb86a20s_get_blk_error_layer_CNR(fe);
/*
* At state 7, only CNR is available
* For BER measures, state=9 is required
* FIXME: we may get MER measures with state=8
*/
if (status_nr < 9)
return 0;
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
if (c->isdbt_layer_enabled & (1 << i)) { if (c->isdbt_layer_enabled & (1 << i)) {
/* Layer is active and has rc segments */ /* Layer is active and has rc segments */
...@@ -1875,7 +1883,7 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe, ...@@ -1875,7 +1883,7 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe,
{ {
struct mb86a20s_state *state = fe->demodulator_priv; struct mb86a20s_state *state = fe->demodulator_priv;
struct dtv_frontend_properties *c = &fe->dtv_property_cache; struct dtv_frontend_properties *c = &fe->dtv_property_cache;
int rc; int rc, status_nr;
dev_dbg(&state->i2c->dev, "%s called.\n", __func__); dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
...@@ -1883,12 +1891,12 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe, ...@@ -1883,12 +1891,12 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe,
fe->ops.i2c_gate_ctrl(fe, 0); fe->ops.i2c_gate_ctrl(fe, 0);
/* Get lock */ /* Get lock */
rc = mb86a20s_read_status(fe, status); status_nr = mb86a20s_read_status(fe, status);
if (!(*status & FE_HAS_LOCK)) { if (status_nr < 7) {
mb86a20s_stats_not_ready(fe); mb86a20s_stats_not_ready(fe);
mb86a20s_reset_frontend_cache(fe); mb86a20s_reset_frontend_cache(fe);
} }
if (rc < 0) { if (status_nr < 0) {
dev_err(&state->i2c->dev, dev_err(&state->i2c->dev,
"%s: Can't read frontend lock status\n", __func__); "%s: Can't read frontend lock status\n", __func__);
goto error; goto error;
...@@ -1908,7 +1916,7 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe, ...@@ -1908,7 +1916,7 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe,
/* Fill signal strength */ /* Fill signal strength */
c->strength.stat[0].uvalue = rc; c->strength.stat[0].uvalue = rc;
if (*status & FE_HAS_LOCK) { if (status_nr >= 7) {
/* Get TMCC info*/ /* Get TMCC info*/
rc = mb86a20s_get_frontend(fe); rc = mb86a20s_get_frontend(fe);
if (rc < 0) { if (rc < 0) {
...@@ -1919,7 +1927,7 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe, ...@@ -1919,7 +1927,7 @@ static int mb86a20s_read_status_and_stats(struct dvb_frontend *fe,
} }
/* Get statistics */ /* Get statistics */
rc = mb86a20s_get_stats(fe); rc = mb86a20s_get_stats(fe, status_nr);
if (rc < 0 && rc != -EBUSY) { if (rc < 0 && rc != -EBUSY) {
dev_err(&state->i2c->dev, dev_err(&state->i2c->dev,
"%s: Can't get FE statistics.\n", __func__); "%s: Can't get FE statistics.\n", __func__);
......
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