From dd0e720e527a06246c39ee9947f2ea48596c0aae Mon Sep 17 00:00:00 2001 From: CrazyCat Date: Wed, 23 Oct 2024 20:14:31 +0300 Subject: [PATCH] media: mxl58x, si2183, si2168: Limit CNR legacy value. --- drivers/media/dvb-frontends/mxl58x.c | 2 ++ drivers/media/dvb-frontends/si2168.c | 2 ++ drivers/media/dvb-frontends/si2183.c | 16 +++++++++++----- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/media/dvb-frontends/mxl58x.c b/drivers/media/dvb-frontends/mxl58x.c index 1db4036f1b7e..956867cfc671 100644 --- a/drivers/media/dvb-frontends/mxl58x.c +++ b/drivers/media/dvb-frontends/mxl58x.c @@ -532,6 +532,8 @@ static int read_status(struct dvb_frontend *fe, enum fe_status *status) p->cnr.stat[0].svalue = (s16)reg[0] * 10; p->cnr.stat[1].scale = FE_SCALE_RELATIVE; p->cnr.stat[1].uvalue = reg[0] * 33; + if (p->cnr.stat[1].uvalue > 0xffff) + p->cnr.stat[1].uvalue = 0xffff; /* Read BER */ mutex_lock(&state->base->status_lock); diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c index dc33eb8ead8b..467646ede3ee 100644 --- a/drivers/media/dvb-frontends/si2168.c +++ b/drivers/media/dvb-frontends/si2168.c @@ -169,6 +169,8 @@ static int si2168_read_status(struct dvb_frontend *fe, enum fe_status *status) c->cnr.stat[0].svalue = (s64)cmd.args[3] * 250; c->cnr.stat[1].scale = FE_SCALE_RELATIVE; c->cnr.stat[1].uvalue = (s64)cmd.args[3] * 328; + if (c->cnr.stat[1].uvalue > 0xffff) + c->cnr.stat[1].uvalue = 0xffff; } else { c->cnr.len = 1; c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; diff --git a/drivers/media/dvb-frontends/si2183.c b/drivers/media/dvb-frontends/si2183.c index 6f07d7a89e2a..a275fe82e4c7 100644 --- a/drivers/media/dvb-frontends/si2183.c +++ b/drivers/media/dvb-frontends/si2183.c @@ -315,7 +315,10 @@ static int si2183_read_status(struct dvb_frontend *fe, enum fe_status *status) c->cnr.stat[0].scale = FE_SCALE_DECIBEL; c->cnr.stat[0].svalue = (s64) cmd.args[3] * 250; c->cnr.stat[1].scale = FE_SCALE_RELATIVE; - c->cnr.stat[1].svalue = dev->snr; + c->cnr.stat[1].uvalue = dev->snr; + if (c->cnr.stat[1].uvalue > 0xffff) + c->cnr.stat[1].uvalue = 0xffff; + // writing missing properties // CONSTELLATION or modulation @@ -555,10 +558,13 @@ err: static int si2183_read_snr(struct dvb_frontend *fe, u16 *snr) { - struct i2c_client *client = fe->demodulator_priv; - struct si2183_dev *dev = i2c_get_clientdata(client); - - *snr = (dev->fe_status & FE_HAS_LOCK) ? dev->snr : 0; + struct dtv_frontend_properties *c = &fe->dtv_property_cache; + int i; + + *snr = 0; + for (i=0; i < c->cnr.len; i++) + if (c->cnr.stat[i].scale == FE_SCALE_RELATIVE) + *snr = (u16)c->cnr.stat[i].uvalue; return 0; }