* [PATCH 01/15] drx-j: Don't use 0 as NULL
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
@ 2014-03-10 11:58 ` Mauro Carvalho Chehab
2014-03-10 11:58 ` [PATCH 02/15] drx-j: Fix dubious usage of "&" instead of "&&" Mauro Carvalho Chehab
` (13 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:58 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
Fixes the following warnings:
drivers/media/dvb-frontends/drx39xyj/drxj.c:1679:65: warning: Using plain integer as NULL pointer
drivers/media/dvb-frontends/drx39xyj/drxj.c:1679:71: warning: Using plain integer as NULL pointer
drivers/media/dvb-frontends/drx39xyj/drxj.c:1681:52: warning: Using plain integer as NULL pointer
drivers/media/dvb-frontends/drx39xyj/drxj.c:1681:58: warning: Using plain integer as NULL pointer
Reported-by: kbuild test robot <fengguang.wu@intel.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index 0232b1409ec0..af3b69ce8c16 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -1676,9 +1676,10 @@ static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
* In single master mode, split the read and write actions.
* No special action is needed for write chunks here.
*/
- rc = drxbsp_i2c_write_read(dev_addr, bufx, buf, 0, 0, 0);
+ rc = drxbsp_i2c_write_read(dev_addr, bufx, buf,
+ NULL, 0, NULL);
if (rc == 0)
- rc = drxbsp_i2c_write_read(0, 0, 0, dev_addr, todo, data);
+ rc = drxbsp_i2c_write_read(NULL, 0, NULL, dev_addr, todo, data);
#else
/* In multi master mode, do everything in one RW action */
rc = drxbsp_i2c_write_read(dev_addr, bufx, buf, dev_addr, todo,
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 02/15] drx-j: Fix dubious usage of "&" instead of "&&"
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
2014-03-10 11:58 ` [PATCH 01/15] drx-j: Don't use 0 as NULL Mauro Carvalho Chehab
@ 2014-03-10 11:58 ` Mauro Carvalho Chehab
2014-03-10 11:58 ` [PATCH 03/15] drx39xxj.h: Fix undefined reference to attach function Mauro Carvalho Chehab
` (12 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:58 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
Fixes the following warnings:
drivers/media/dvb-frontends/drx39xyj/drxj.c:16764:68: warning: dubious: x & !y
drivers/media/dvb-frontends/drx39xyj/drxj.c:16778:68: warning: dubious: x & !y
drivers/media/dvb-frontends/drx39xyj/drxj.c:16797:68: warning: dubious: x & !y
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index af3b69ce8c16..1e6dab7e5892 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -16762,12 +16762,12 @@ static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_par
case DRX_OOB_MODE_A:
if (
/* signal is transmitted inverted */
- ((oob_param->spectrum_inverted == true) &
+ ((oob_param->spectrum_inverted == true) &&
/* and tuner is not mirroring the signal */
(!mirror_freq_spect_oob)) |
/* or */
/* signal is transmitted noninverted */
- ((oob_param->spectrum_inverted == false) &
+ ((oob_param->spectrum_inverted == false) &&
/* and tuner is mirroring the signal */
(mirror_freq_spect_oob))
)
@@ -16780,12 +16780,12 @@ static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_par
case DRX_OOB_MODE_B_GRADE_A:
if (
/* signal is transmitted inverted */
- ((oob_param->spectrum_inverted == true) &
+ ((oob_param->spectrum_inverted == true) &&
/* and tuner is not mirroring the signal */
(!mirror_freq_spect_oob)) |
/* or */
/* signal is transmitted noninverted */
- ((oob_param->spectrum_inverted == false) &
+ ((oob_param->spectrum_inverted == false) &&
/* and tuner is mirroring the signal */
(mirror_freq_spect_oob))
)
@@ -16799,12 +16799,12 @@ static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_par
default:
if (
/* signal is transmitted inverted */
- ((oob_param->spectrum_inverted == true) &
+ ((oob_param->spectrum_inverted == true) &&
/* and tuner is not mirroring the signal */
(!mirror_freq_spect_oob)) |
/* or */
/* signal is transmitted noninverted */
- ((oob_param->spectrum_inverted == false) &
+ ((oob_param->spectrum_inverted == false) &&
/* and tuner is mirroring the signal */
(mirror_freq_spect_oob))
)
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 03/15] drx39xxj.h: Fix undefined reference to attach function
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
2014-03-10 11:58 ` [PATCH 01/15] drx-j: Don't use 0 as NULL Mauro Carvalho Chehab
2014-03-10 11:58 ` [PATCH 02/15] drx-j: Fix dubious usage of "&" instead of "&&" Mauro Carvalho Chehab
@ 2014-03-10 11:58 ` Mauro Carvalho Chehab
2014-03-10 11:58 ` [PATCH 04/15] drx-j: don't use mc_info before checking if its not NULL Mauro Carvalho Chehab
` (11 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:58 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
As reported by the kbuild test robot <fengguang.wu@intel.com>:
drivers/built-in.o: In function `em28xx_dvb_init':
em28xx-dvb.c:(.text+0x876f2c): undefined reference to `drx39xxj_attach'
That happens when CONFIG_VIDEO_EM28XX_DVB is selected, and neither
CONFIG_MEDIA_SUBDRV_AUTOSELECT or DVB_DRX39XYJ is selected.
Reported-by: kbuild test robot <fengguang.wu@intel.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drx39xxj.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drx39xxj.h b/drivers/media/dvb-frontends/drx39xyj/drx39xxj.h
index 2e0c50f0a12a..cfd0b96b6939 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drx39xxj.h
+++ b/drivers/media/dvb-frontends/drx39xyj/drx39xxj.h
@@ -34,6 +34,12 @@ struct drx39xxj_state {
const struct firmware *fw;
};
+#if IS_ENABLED(CONFIG_DVB_DRX39XYJ)
struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c);
+#else
+static inline struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c) {
+ return NULL;
+};
+#endif
#endif /* DVB_DUMMY_FE_H */
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 04/15] drx-j: don't use mc_info before checking if its not NULL
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (2 preceding siblings ...)
2014-03-10 11:58 ` [PATCH 03/15] drx39xxj.h: Fix undefined reference to attach function Mauro Carvalho Chehab
@ 2014-03-10 11:58 ` Mauro Carvalho Chehab
2014-03-10 11:58 ` [PATCH 06/15] drx-j: remove external symbols Mauro Carvalho Chehab
` (10 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:58 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
smatch warning:
drivers/media/dvb-frontends/drx39xyj/drxj.c:20803 drx_ctrl_u_code() warn: variable dereferenced before check 'mc_info' (see line 20800)
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index 1e6dab7e5892..a8fd53b612ae 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -20208,12 +20208,14 @@ static int drx_ctrl_u_code(struct drx_demod_instance *demod,
const u8 *mc_data_init = NULL;
u8 *mc_data = NULL;
unsigned size;
- char *mc_file = mc_info->mc_file;
+ char *mc_file;
/* Check arguments */
- if (!mc_info || !mc_file)
+ if (!mc_info || !mc_info->mc_file)
return -EINVAL;
+ mc_file = mc_info->mc_file;
+
if (!demod->firmware) {
const struct firmware *fw = NULL;
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 06/15] drx-j: remove external symbols
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (3 preceding siblings ...)
2014-03-10 11:58 ` [PATCH 04/15] drx-j: don't use mc_info before checking if its not NULL Mauro Carvalho Chehab
@ 2014-03-10 11:58 ` Mauro Carvalho Chehab
2014-03-10 11:58 ` [PATCH 07/15] drx-j: Fix usage of drxj_close() Mauro Carvalho Chehab
` (9 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:58 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
This driver doesn't export any external symbol, except for
the attach() method.
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 12 ++++++------
drivers/media/dvb-frontends/drx39xyj/drxj.h | 30 -----------------------------
2 files changed, 6 insertions(+), 36 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index e8c890800904..828d0527f38d 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -561,7 +561,7 @@ static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
u32 addr,
u32 data, u32 flags);
-struct drxj_data drxj_data_g = {
+static struct drxj_data drxj_data_g = {
false, /* has_lna : true if LNA (aka PGA) present */
false, /* has_oob : true if OOB supported */
false, /* has_ntsc: true if NTSC supported */
@@ -810,7 +810,7 @@ struct drxj_data drxj_data_g = {
* \var drxj_default_addr_g
* \brief Default I2C address and device identifier.
*/
-struct i2c_device_addr drxj_default_addr_g = {
+static struct i2c_device_addr drxj_default_addr_g = {
DRXJ_DEF_I2C_ADDR, /* i2c address */
DRXJ_DEF_DEMOD_DEV_ID /* device id */
};
@@ -819,7 +819,7 @@ struct i2c_device_addr drxj_default_addr_g = {
* \var drxj_default_comm_attr_g
* \brief Default common attributes of a drxj demodulator instance.
*/
-struct drx_common_attr drxj_default_comm_attr_g = {
+static struct drx_common_attr drxj_default_comm_attr_g = {
NULL, /* ucode file */
true, /* ucode verify switch */
{0}, /* version record */
@@ -890,7 +890,7 @@ struct drx_common_attr drxj_default_comm_attr_g = {
* \var drxj_default_demod_g
* \brief Default drxj demodulator instance.
*/
-struct drx_demod_instance drxj_default_demod_g = {
+static struct drx_demod_instance drxj_default_demod_g = {
&drxj_default_addr_g, /* i2c address & device id */
&drxj_default_comm_attr_g, /* demod common attributes */
&drxj_data_g /* demod device specific attributes */
@@ -11291,7 +11291,7 @@ static int drx_ctrl_u_code(struct drx_demod_instance *demod,
*
*/
-int drxj_open(struct drx_demod_instance *demod)
+static int drxj_open(struct drx_demod_instance *demod)
{
struct i2c_device_addr *dev_addr = NULL;
struct drxj_data *ext_attr = NULL;
@@ -11504,7 +11504,7 @@ rw_error:
* \return Status_t Return status.
*
*/
-int drxj_close(struct drx_demod_instance *demod)
+static int drxj_close(struct drx_demod_instance *demod)
{
struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
int rc;
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.h b/drivers/media/dvb-frontends/drx39xyj/drxj.h
index 6d46513b7169..55ad535197d2 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.h
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.h
@@ -647,34 +647,4 @@ DEFINES
(x == DRX_LOCK_STATE_2) ? "sync lock" : \
"(Invalid)")
-/*-------------------------------------------------------------------------
-ENUM
--------------------------------------------------------------------------*/
-
-/*-------------------------------------------------------------------------
-STRUCTS
--------------------------------------------------------------------------*/
-
-/*-------------------------------------------------------------------------
-Exported FUNCTIONS
--------------------------------------------------------------------------*/
-
- int drxj_open(struct drx_demod_instance *demod);
- int drxj_close(struct drx_demod_instance *demod);
- int drxj_ctrl(struct drx_demod_instance *demod,
- u32 ctrl, void *ctrl_data);
-
-/*-------------------------------------------------------------------------
-Exported GLOBAL VARIABLES
--------------------------------------------------------------------------*/
- extern struct drx_access_func drx_dap_drxj_funct_g;
- extern struct drx_demod_func drxj_functions_g;
- extern struct drxj_data drxj_data_g;
- extern struct i2c_device_addr drxj_default_addr_g;
- extern struct drx_common_attr drxj_default_comm_attr_g;
- extern struct drx_demod_instance drxj_default_demod_g;
-
-/*-------------------------------------------------------------------------
-THE END
--------------------------------------------------------------------------*/
#endif /* __DRXJ_H__ */
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 07/15] drx-j: Fix usage of drxj_close()
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (4 preceding siblings ...)
2014-03-10 11:58 ` [PATCH 06/15] drx-j: remove external symbols Mauro Carvalho Chehab
@ 2014-03-10 11:58 ` Mauro Carvalho Chehab
2014-03-10 11:59 ` [PATCH 08/15] drx-j: propagate returned error from request_firmware() Mauro Carvalho Chehab
` (8 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:58 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
This function is currently not used. However, it was meant to
be called at device release. So, add it there.
While here, remove the bad check, as reported by Dan, as
smatch warning:
drivers/media/dvb-frontends/drx39xyj/drxj.c:20041 drxj_close() warn: variable dereferenced before check 'demod' (see line 20036)
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index 828d0527f38d..c5205d5c997e 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -11510,8 +11510,7 @@ static int drxj_close(struct drx_demod_instance *demod)
int rc;
enum drx_power_mode power_mode = DRX_POWER_UP;
- if ((demod == NULL) ||
- (demod->my_common_attr == NULL) ||
+ if ((demod->my_common_attr == NULL) ||
(demod->my_ext_attr == NULL) ||
(demod->my_i2c_dev_addr == NULL) ||
(!demod->my_common_attr->is_opened)) {
@@ -12218,6 +12217,8 @@ static void drx39xxj_release(struct dvb_frontend *fe)
struct drx39xxj_state *state = fe->demodulator_priv;
struct drx_demod_instance *demod = state->demod;
+ drxj_close(demod);
+
kfree(demod->my_ext_attr);
kfree(demod->my_common_attr);
kfree(demod->my_i2c_dev_addr);
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 08/15] drx-j: propagate returned error from request_firmware()
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (5 preceding siblings ...)
2014-03-10 11:58 ` [PATCH 07/15] drx-j: Fix usage of drxj_close() Mauro Carvalho Chehab
@ 2014-03-10 11:59 ` Mauro Carvalho Chehab
2014-03-10 11:59 ` [PATCH 09/15] drx-j: get rid of some unused vars Mauro Carvalho Chehab
` (7 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:59 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
Fix a smatch warning:
drivers/media/dvb-frontends/drx39xyj/drxj.c:11711 drx_ctrl_u_code() info: why not propagate 'rc' from request_firmware() instead of (-2)?
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index c5205d5c997e..a26ddc9fa2bc 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -11708,7 +11708,7 @@ static int drx_ctrl_u_code(struct drx_demod_instance *demod,
rc = request_firmware(&fw, mc_file, demod->i2c->dev.parent);
if (rc < 0) {
pr_err("Couldn't read firmware %s\n", mc_file);
- return -ENOENT;
+ return rc;
}
demod->firmware = fw;
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 09/15] drx-j: get rid of some unused vars
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (6 preceding siblings ...)
2014-03-10 11:59 ` [PATCH 08/15] drx-j: propagate returned error from request_firmware() Mauro Carvalho Chehab
@ 2014-03-10 11:59 ` Mauro Carvalho Chehab
2014-03-10 11:59 ` [PATCH 10/15] drx-j: Don't use "state" for DVB lock state Mauro Carvalho Chehab
` (6 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:59 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
As reported when compiled with W=1:
drivers/media/dvb-frontends/drx39xyj/drxj.c: In function ‘ctrl_set_channel’:
drivers/media/dvb-frontends/drx39xyj/drxj.c:10340:26: warning: variable ‘common_attr’ set but not used [-Wunused-but-set-variable]
struct drx_common_attr *common_attr = NULL;
^
drivers/media/dvb-frontends/drx39xyj/drxj.c:10336:6: warning: variable ‘intermediate_freq’ set but not used [-Wunused-but-set-variable]
s32 intermediate_freq = 0;
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index a26ddc9fa2bc..a36cfa684153 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -10333,11 +10333,9 @@ ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel)
{
int rc;
s32 tuner_freq_offset = 0;
- s32 intermediate_freq = 0;
struct drxj_data *ext_attr = NULL;
struct i2c_device_addr *dev_addr = NULL;
enum drx_standard standard = DRX_STANDARD_UNKNOWN;
- struct drx_common_attr *common_attr = NULL;
#ifndef DRXJ_VSB_ONLY
u32 min_symbol_rate = 0;
u32 max_symbol_rate = 0;
@@ -10348,7 +10346,6 @@ ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel)
if ((demod == NULL) || (channel == NULL))
return -EINVAL;
- common_attr = (struct drx_common_attr *) demod->my_common_attr;
dev_addr = demod->my_i2c_dev_addr;
ext_attr = (struct drxj_data *) demod->my_ext_attr;
standard = ext_attr->standard;
@@ -10506,7 +10503,6 @@ ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel)
}
tuner_freq_offset = 0;
- intermediate_freq = demod->my_common_attr->intermediate_freq;
/*== Setup demod for specific standard ====================================*/
switch (standard) {
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 10/15] drx-j: Don't use "state" for DVB lock state
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (7 preceding siblings ...)
2014-03-10 11:59 ` [PATCH 09/15] drx-j: get rid of some unused vars Mauro Carvalho Chehab
@ 2014-03-10 11:59 ` Mauro Carvalho Chehab
2014-03-10 11:59 ` [PATCH 11/15] drx-j: re-add get_sig_strength() Mauro Carvalho Chehab
` (5 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:59 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
State is already used on other places for the state struct.
Don't use it here, to avoid troubles with latter patches.
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index a36cfa684153..7022a69f56bd 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -8861,7 +8861,7 @@ qam64auto(struct drx_demod_instance *demod,
struct drx_sig_quality sig_quality;
struct drxj_data *ext_attr = NULL;
int rc;
- u32 state = NO_LOCK;
+ u32 lck_state = NO_LOCK;
u32 start_time = 0;
u32 d_locked_time = 0;
u32 timeout_ofs = 0;
@@ -8871,7 +8871,7 @@ qam64auto(struct drx_demod_instance *demod,
ext_attr = (struct drxj_data *) demod->my_ext_attr;
*lock_status = DRX_NOT_LOCKED;
start_time = jiffies_to_msecs(jiffies);
- state = NO_LOCK;
+ lck_state = NO_LOCK;
do {
rc = ctrl_lock_status(demod, lock_status);
if (rc != 0) {
@@ -8879,7 +8879,7 @@ qam64auto(struct drx_demod_instance *demod,
goto rw_error;
}
- switch (state) {
+ switch (lck_state) {
case NO_LOCK:
if (*lock_status == DRXJ_DEMOD_LOCK) {
rc = ctrl_get_qam_sig_quality(demod, &sig_quality);
@@ -8888,7 +8888,7 @@ qam64auto(struct drx_demod_instance *demod,
goto rw_error;
}
if (sig_quality.MER > 208) {
- state = DEMOD_LOCKED;
+ lck_state = DEMOD_LOCKED;
/* some delay to see if fec_lock possible TODO find the right value */
timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME; /* see something, waiting longer */
d_locked_time = jiffies_to_msecs(jiffies);
@@ -8909,7 +8909,7 @@ qam64auto(struct drx_demod_instance *demod,
pr_err("error %d\n", rc);
goto rw_error;
}
- state = SYNC_FLIPPED;
+ lck_state = SYNC_FLIPPED;
msleep(10);
}
break;
@@ -8934,7 +8934,7 @@ qam64auto(struct drx_demod_instance *demod,
pr_err("error %d\n", rc);
goto rw_error;
}
- state = SPEC_MIRRORED;
+ lck_state = SPEC_MIRRORED;
/* reset timer TODO: still need 500ms? */
start_time = d_locked_time =
jiffies_to_msecs(jiffies);
@@ -9008,7 +9008,7 @@ qam256auto(struct drx_demod_instance *demod,
struct drx_sig_quality sig_quality;
struct drxj_data *ext_attr = NULL;
int rc;
- u32 state = NO_LOCK;
+ u32 lck_state = NO_LOCK;
u32 start_time = 0;
u32 d_locked_time = 0;
u32 timeout_ofs = DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
@@ -9017,14 +9017,14 @@ qam256auto(struct drx_demod_instance *demod,
ext_attr = (struct drxj_data *) demod->my_ext_attr;
*lock_status = DRX_NOT_LOCKED;
start_time = jiffies_to_msecs(jiffies);
- state = NO_LOCK;
+ lck_state = NO_LOCK;
do {
rc = ctrl_lock_status(demod, lock_status);
if (rc != 0) {
pr_err("error %d\n", rc);
goto rw_error;
}
- switch (state) {
+ switch (lck_state) {
case NO_LOCK:
if (*lock_status == DRXJ_DEMOD_LOCK) {
rc = ctrl_get_qam_sig_quality(demod, &sig_quality);
@@ -9033,7 +9033,7 @@ qam256auto(struct drx_demod_instance *demod,
goto rw_error;
}
if (sig_quality.MER > 268) {
- state = DEMOD_LOCKED;
+ lck_state = DEMOD_LOCKED;
timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME; /* see something, wait longer */
d_locked_time = jiffies_to_msecs(jiffies);
}
@@ -9050,7 +9050,7 @@ qam256auto(struct drx_demod_instance *demod,
pr_err("error %d\n", rc);
goto rw_error;
}
- state = SPEC_MIRRORED;
+ lck_state = SPEC_MIRRORED;
/* reset timer TODO: still need 300ms? */
start_time = jiffies_to_msecs(jiffies);
timeout_ofs = -DRXJ_QAM_MAX_WAITTIME / 2;
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 11/15] drx-j: re-add get_sig_strength()
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (8 preceding siblings ...)
2014-03-10 11:59 ` [PATCH 10/15] drx-j: Don't use "state" for DVB lock state Mauro Carvalho Chehab
@ 2014-03-10 11:59 ` Mauro Carvalho Chehab
2014-03-10 11:59 ` [PATCH 12/15] drx-j: Prepare to use DVBv5 stats Mauro Carvalho Chehab
` (4 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:59 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
We'll need to use this function. Restore it from the
git history.
This function will be used on the next patch.
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 77 +++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index 7022a69f56bd..ca807b1fc67c 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -9352,6 +9352,83 @@ rw_error:
/*============================================================================*/
/**
+ * \fn int get_sig_strength()
+ * \brief Retrieve signal strength for VSB and QAM.
+ * \param demod Pointer to demod instance
+ * \param u16-t Pointer to signal strength data; range 0, .. , 100.
+ * \return int.
+ * \retval 0 sig_strength contains valid data.
+ * \retval -EINVAL sig_strength is NULL.
+ * \retval -EIO Erroneous data, sig_strength contains invalid data.
+ */
+#define DRXJ_AGC_TOP 0x2800
+#define DRXJ_AGC_SNS 0x1600
+#define DRXJ_RFAGC_MAX 0x3fff
+#define DRXJ_RFAGC_MIN 0x800
+
+static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
+{
+ struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
+ int rc;
+ u16 rf_gain = 0;
+ u16 if_gain = 0;
+ u16 if_agc_sns = 0;
+ u16 if_agc_top = 0;
+ u16 rf_agc_max = 0;
+ u16 rf_agc_min = 0;
+
+ rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_IF__A, &if_gain, 0);
+ if (rc != 0) {
+ pr_err("error %d\n", rc);
+ goto rw_error;
+ }
+ if_gain &= IQM_AF_AGC_IF__M;
+ rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_RF__A, &rf_gain, 0);
+ if (rc != 0) {
+ pr_err("error %d\n", rc);
+ goto rw_error;
+ }
+ rf_gain &= IQM_AF_AGC_RF__M;
+
+ if_agc_sns = DRXJ_AGC_SNS;
+ if_agc_top = DRXJ_AGC_TOP;
+ rf_agc_max = DRXJ_RFAGC_MAX;
+ rf_agc_min = DRXJ_RFAGC_MIN;
+
+ if (if_gain > if_agc_top) {
+ if (rf_gain > rf_agc_max)
+ *sig_strength = 100;
+ else if (rf_gain > rf_agc_min) {
+ if (rf_agc_max == rf_agc_min) {
+ pr_err("error: rf_agc_max == rf_agc_min\n");
+ return -EIO;
+ }
+ *sig_strength =
+ 75 + 25 * (rf_gain - rf_agc_min) / (rf_agc_max -
+ rf_agc_min);
+ } else
+ *sig_strength = 75;
+ } else if (if_gain > if_agc_sns) {
+ if (if_agc_top == if_agc_sns) {
+ pr_err("error: if_agc_top == if_agc_sns\n");
+ return -EIO;
+ }
+ *sig_strength =
+ 20 + 55 * (if_gain - if_agc_sns) / (if_agc_top - if_agc_sns);
+ } else {
+ if (!if_agc_sns) {
+ pr_err("error: if_agc_sns is zero!\n");
+ return -EIO;
+ }
+ *sig_strength = (20 * if_gain / if_agc_sns);
+ }
+
+ return 0;
+ rw_error:
+ return -EIO;
+}
+
+/**
* \fn int ctrl_get_qam_sig_quality()
* \brief Retreive QAM signal quality from device.
* \param devmod Pointer to demodulator instance.
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 12/15] drx-j: Prepare to use DVBv5 stats
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (9 preceding siblings ...)
2014-03-10 11:59 ` [PATCH 11/15] drx-j: re-add get_sig_strength() Mauro Carvalho Chehab
@ 2014-03-10 11:59 ` Mauro Carvalho Chehab
2014-03-10 11:59 ` [PATCH 13/15] drx-j: properly handle bit counts on stats Mauro Carvalho Chehab
` (3 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:59 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
Convert the stats internally to use DVBv5. For now, it will keep
showing everything via DVBv3 API only, as the .len value were
not initialized.
That allows testing if the new stats code didn't break anything.
A latter patch will add the final bits for the DVBv5 stats to
fully work.
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drx_driver.h | 24 --
drivers/media/dvb-frontends/drx39xyj/drxj.c | 321 +++++++++-------------
2 files changed, 125 insertions(+), 220 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drx_driver.h b/drivers/media/dvb-frontends/drx39xyj/drx_driver.h
index e54eb35b52d9..9076bf21cc8a 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drx_driver.h
+++ b/drivers/media/dvb-frontends/drx39xyj/drx_driver.h
@@ -1033,30 +1033,6 @@ struct drx_channel {
/*========================================*/
-/**
-* \struct struct drx_sig_quality * Signal quality metrics.
-*
-* Used by DRX_CTRL_SIG_QUALITY.
-*/
-struct drx_sig_quality {
- u16 MER; /**< in steps of 0.1 dB */
- u32 pre_viterbi_ber;
- /**< in steps of 1/scale_factor_ber */
- u32 post_viterbi_ber;
- /**< in steps of 1/scale_factor_ber */
- u32 scale_factor_ber;
- /**< scale factor for BER */
- u16 packet_error;
- /**< number of packet errors */
- u32 post_reed_solomon_ber;
- /**< in steps of 1/scale_factor_ber */
- u32 pre_ldpc_ber;
- /**< in steps of 1/scale_factor_ber */
- u32 aver_iter;/**< in steps of 0.01 */
- u16 indicator;
- /**< indicative signal quality low=0..100=high */
-};
-
enum drx_cfg_sqi_speed {
DRX_SQI_SPEED_FAST = 0,
DRX_SQI_SPEED_MEDIUM,
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index ca807b1fc67c..6005e344f66c 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -8656,10 +8656,12 @@ rw_error:
}
/*============================================================================*/
-static int
-ctrl_get_qam_sig_quality(struct drx_demod_instance *demod, struct drx_sig_quality *sig_quality);
+static int ctrl_get_qam_sig_quality(struct drx_demod_instance *demod);
+
static int qam_flip_spec(struct drx_demod_instance *demod, struct drx_channel *channel)
{
+ struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
+ struct drxj_data *ext_attr = demod->my_ext_attr;
int rc;
u32 iqm_fs_rate_ofs = 0;
u32 iqm_fs_rate_lo = 0;
@@ -8669,11 +8671,6 @@ static int qam_flip_spec(struct drx_demod_instance *demod, struct drx_channel *c
u16 fsm_state = 0;
int i = 0;
int ofsofs = 0;
- struct i2c_device_addr *dev_addr = NULL;
- struct drxj_data *ext_attr = NULL;
-
- dev_addr = demod->my_i2c_dev_addr;
- ext_attr = (struct drxj_data *) demod->my_ext_attr;
/* Silence the controlling of lc, equ, and the acquisition state machine */
rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, &qam_ctl_ena, 0);
@@ -8858,8 +8855,10 @@ qam64auto(struct drx_demod_instance *demod,
struct drx_channel *channel,
s32 tuner_freq_offset, enum drx_lock_status *lock_status)
{
- struct drx_sig_quality sig_quality;
- struct drxj_data *ext_attr = NULL;
+ struct drxj_data *ext_attr = demod->my_ext_attr;
+ struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
+ struct drx39xxj_state *state = dev_addr->user_data;
+ struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
int rc;
u32 lck_state = NO_LOCK;
u32 start_time = 0;
@@ -8868,7 +8867,6 @@ qam64auto(struct drx_demod_instance *demod,
u16 data = 0;
/* external attributes for storing aquired channel constellation */
- ext_attr = (struct drxj_data *) demod->my_ext_attr;
*lock_status = DRX_NOT_LOCKED;
start_time = jiffies_to_msecs(jiffies);
lck_state = NO_LOCK;
@@ -8882,12 +8880,12 @@ qam64auto(struct drx_demod_instance *demod,
switch (lck_state) {
case NO_LOCK:
if (*lock_status == DRXJ_DEMOD_LOCK) {
- rc = ctrl_get_qam_sig_quality(demod, &sig_quality);
+ rc = ctrl_get_qam_sig_quality(demod);
if (rc != 0) {
pr_err("error %d\n", rc);
goto rw_error;
}
- if (sig_quality.MER > 208) {
+ if (p->cnr.stat[0].svalue > 20800) {
lck_state = DEMOD_LOCKED;
/* some delay to see if fec_lock possible TODO find the right value */
timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME; /* see something, waiting longer */
@@ -8951,12 +8949,12 @@ qam64auto(struct drx_demod_instance *demod,
if ((*lock_status == DRXJ_DEMOD_LOCK) && /* still demod_lock in 150ms */
((jiffies_to_msecs(jiffies) - d_locked_time) >
DRXJ_QAM_FEC_LOCK_WAITTIME)) {
- rc = ctrl_get_qam_sig_quality(demod, &sig_quality);
+ rc = ctrl_get_qam_sig_quality(demod);
if (rc != 0) {
pr_err("error %d\n", rc);
goto rw_error;
}
- if (sig_quality.MER > 208) {
+ if (p->cnr.stat[0].svalue > 20800) {
rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
if (rc != 0) {
pr_err("error %d\n", rc);
@@ -9005,8 +9003,10 @@ qam256auto(struct drx_demod_instance *demod,
struct drx_channel *channel,
s32 tuner_freq_offset, enum drx_lock_status *lock_status)
{
- struct drx_sig_quality sig_quality;
- struct drxj_data *ext_attr = NULL;
+ struct drxj_data *ext_attr = demod->my_ext_attr;
+ struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
+ struct drx39xxj_state *state = dev_addr->user_data;
+ struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
int rc;
u32 lck_state = NO_LOCK;
u32 start_time = 0;
@@ -9014,7 +9014,6 @@ qam256auto(struct drx_demod_instance *demod,
u32 timeout_ofs = DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
/* external attributes for storing aquired channel constellation */
- ext_attr = (struct drxj_data *) demod->my_ext_attr;
*lock_status = DRX_NOT_LOCKED;
start_time = jiffies_to_msecs(jiffies);
lck_state = NO_LOCK;
@@ -9027,12 +9026,12 @@ qam256auto(struct drx_demod_instance *demod,
switch (lck_state) {
case NO_LOCK:
if (*lock_status == DRXJ_DEMOD_LOCK) {
- rc = ctrl_get_qam_sig_quality(demod, &sig_quality);
+ rc = ctrl_get_qam_sig_quality(demod);
if (rc != 0) {
pr_err("error %d\n", rc);
goto rw_error;
}
- if (sig_quality.MER > 268) {
+ if (p->cnr.stat[0].svalue > 26800) {
lck_state = DEMOD_LOCKED;
timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME; /* see something, wait longer */
d_locked_time = jiffies_to_msecs(jiffies);
@@ -9441,13 +9440,15 @@ static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
* Pre-condition: Device must be started and in lock.
*/
static int
-ctrl_get_qam_sig_quality(struct drx_demod_instance *demod, struct drx_sig_quality *sig_quality)
+ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
{
- struct i2c_device_addr *dev_addr = NULL;
- struct drxj_data *ext_attr = NULL;
- int rc;
- enum drx_modulation constellation = DRX_CONSTELLATION_UNKNOWN;
+ struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
+ struct drxj_data *ext_attr = demod->my_ext_attr;
+ struct drx39xxj_state *state = dev_addr->user_data;
+ struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
struct drxjrs_errors measuredrs_errors = { 0, 0, 0, 0, 0 };
+ enum drx_modulation constellation = ext_attr->constellation;
+ int rc;
u32 pre_bit_err_rs = 0; /* pre RedSolomon Bit Error Rate */
u32 post_bit_err_rs = 0; /* post RedSolomon Bit Error Rate */
@@ -9473,11 +9474,6 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod, struct drx_sig_qualit
u16 qam_vd_period = 0; /* Viterbi Measurement period */
u32 vd_bit_cnt = 0; /* ViterbiDecoder Bit Count */
- /* get device basic information */
- dev_addr = demod->my_i2c_dev_addr;
- ext_attr = (struct drxj_data *) demod->my_ext_attr;
- constellation = ext_attr->constellation;
-
/* read the physical registers */
/* Get the RS error data */
rc = get_qamrs_err_count(dev_addr, &measuredrs_errors);
@@ -9605,26 +9601,43 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod, struct drx_sig_qualit
qam_post_rs_ber = e / m;
/* fill signal quality data structure */
- sig_quality->MER = ((u16) qam_sl_mer);
+ p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
+ p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
+ p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
+ p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
+ p->block_error.stat[0].scale = FE_SCALE_COUNTER;
+ p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
+
+ p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100;
if (ext_attr->standard == DRX_STANDARD_ITU_B)
- sig_quality->pre_viterbi_ber = qam_vd_ser;
+ p->pre_bit_error.stat[0].uvalue += qam_vd_ser;
else
- sig_quality->pre_viterbi_ber = qam_pre_rs_ber;
- sig_quality->post_viterbi_ber = qam_pre_rs_ber;
- sig_quality->post_reed_solomon_ber = qam_post_rs_ber;
- sig_quality->scale_factor_ber = ((u32) 1000000);
+ p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber;
+
+ p->post_bit_error.stat[0].uvalue = qam_post_rs_ber;
+
+ p->pre_bit_count.stat[0].uvalue += 1000000;
+ p->post_bit_count.stat[0].uvalue += 1000000;
+
+ p->block_error.stat[0].uvalue += pkt_errs;
+
#ifdef DRXJ_SIGNAL_ACCUM_ERR
rc = get_acc_pkt_err(demod, &sig_quality->packet_error);
if (rc != 0) {
pr_err("error %d\n", rc);
goto rw_error;
}
-#else
- sig_quality->packet_error = ((u16) pkt_errs);
#endif
return 0;
rw_error:
+ p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+
return -EIO;
}
@@ -10627,28 +10640,6 @@ rw_error:
===== SigQuality() ==========================================================
===========================================================================*/
-static u16
-mer2indicator(u16 mer, u16 min_mer, u16 threshold_mer, u16 max_mer)
-{
- u16 indicator = 0;
-
- if (mer < min_mer) {
- indicator = 0;
- } else if (mer < threshold_mer) {
- if ((threshold_mer - min_mer) != 0)
- indicator = 25 * (mer - min_mer) / (threshold_mer - min_mer);
- } else if (mer < max_mer) {
- if ((max_mer - threshold_mer) != 0)
- indicator = 25 + 75 * (mer - threshold_mer) / (max_mer - threshold_mer);
- else
- indicator = 25;
- } else {
- indicator = 100;
- }
-
- return indicator;
-}
-
/**
* \fn int ctrl_sig_quality()
* \brief Retreive signal quality form device.
@@ -10661,130 +10652,94 @@ mer2indicator(u16 mer, u16 min_mer, u16 threshold_mer, u16 max_mer)
*/
static int
-ctrl_sig_quality(struct drx_demod_instance *demod, struct drx_sig_quality *sig_quality)
+ctrl_sig_quality(struct drx_demod_instance *demod,
+ enum drx_lock_status lock_status)
{
- struct i2c_device_addr *dev_addr = NULL;
- struct drxj_data *ext_attr = NULL;
+ struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
+ struct drxj_data *ext_attr = demod->my_ext_attr;
+ struct drx39xxj_state *state = dev_addr->user_data;
+ struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
+ enum drx_standard standard = ext_attr->standard;
int rc;
- enum drx_standard standard = DRX_STANDARD_UNKNOWN;
- enum drx_lock_status lock_status = DRX_NOT_LOCKED;
- u16 min_mer = 0;
- u16 max_mer = 0;
- u16 threshold_mer = 0;
-
- /* Check arguments */
- if ((sig_quality == NULL) || (demod == NULL))
- return -EINVAL;
+ u32 ber;
+ u16 pkt, mer, strength;
- ext_attr = (struct drxj_data *) demod->my_ext_attr;
- standard = ext_attr->standard;
-
- /* get basic information */
- dev_addr = demod->my_i2c_dev_addr;
- rc = ctrl_lock_status(demod, &lock_status);
- if (rc != 0) {
- pr_err("error %d\n", rc);
- goto rw_error;
+ rc = get_sig_strength(demod, &strength);
+ if (rc < 0) {
+ pr_err("error getting signal strength %d\n", rc);
+ p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ } else {
+ p->strength.stat[0].scale = FE_SCALE_RELATIVE;
+ p->strength.stat[0].uvalue = 65535UL * strength/ 100;
}
+
switch (standard) {
case DRX_STANDARD_8VSB:
#ifdef DRXJ_SIGNAL_ACCUM_ERR
- rc = get_acc_pkt_err(demod, &sig_quality->packet_error);
- if (rc != 0) {
- pr_err("error %d\n", rc);
- goto rw_error;
- }
-#else
- rc = get_vsb_post_rs_pck_err(dev_addr, &sig_quality->packet_error);
+ rc = get_acc_pkt_err(demod, &pkt);
if (rc != 0) {
pr_err("error %d\n", rc);
goto rw_error;
}
#endif
if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) {
- sig_quality->post_viterbi_ber = 500000;
- sig_quality->MER = 20;
- sig_quality->pre_viterbi_ber = 0;
+ p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
} else {
+ rc = get_vsb_post_rs_pck_err(dev_addr, &pkt);
+ if (rc != 0) {
+ pr_err("error %d getting UCB\n", rc);
+ p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ } else {
+ p->block_error.stat[0].scale = FE_SCALE_COUNTER;
+ p->block_error.stat[0].uvalue += pkt;
+ }
+
/* PostViterbi is compute in steps of 10^(-6) */
- rc = get_vs_bpre_viterbi_ber(dev_addr, &sig_quality->pre_viterbi_ber);
+ rc = get_vs_bpre_viterbi_ber(dev_addr, &ber);
if (rc != 0) {
- pr_err("error %d\n", rc);
- goto rw_error;
+ pr_err("error %d getting pre-ber\n", rc);
+ p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ } else {
+ p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
+ p->pre_bit_error.stat[0].uvalue += ber;
+ p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
+ p->pre_bit_count.stat[0].uvalue += 1000000;
}
- rc = get_vs_bpost_viterbi_ber(dev_addr, &sig_quality->post_viterbi_ber);
+
+ rc = get_vs_bpost_viterbi_ber(dev_addr, &ber);
if (rc != 0) {
- pr_err("error %d\n", rc);
- goto rw_error;
+ pr_err("error %d getting post-ber\n", rc);
+ p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ } else {
+ p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
+ p->post_bit_error.stat[0].uvalue += ber;
+ p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
+ p->post_bit_count.stat[0].uvalue += 1000000;
}
- rc = get_vsbmer(dev_addr, &sig_quality->MER);
+ rc = get_vsbmer(dev_addr, &mer);
if (rc != 0) {
- pr_err("error %d\n", rc);
- goto rw_error;
+ pr_err("error %d getting MER\n", rc);
+ p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ } else {
+ p->cnr.stat[0].svalue = mer * 100;
+ p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
}
}
- min_mer = 20;
- max_mer = 360;
- threshold_mer = 145;
- sig_quality->post_reed_solomon_ber = 0;
- sig_quality->scale_factor_ber = 1000000;
- sig_quality->indicator =
- mer2indicator(sig_quality->MER, min_mer, threshold_mer,
- max_mer);
break;
#ifndef DRXJ_VSB_ONLY
case DRX_STANDARD_ITU_A:
case DRX_STANDARD_ITU_B:
case DRX_STANDARD_ITU_C:
- rc = ctrl_get_qam_sig_quality(demod, sig_quality);
+ rc = ctrl_get_qam_sig_quality(demod);
if (rc != 0) {
pr_err("error %d\n", rc);
goto rw_error;
}
- if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) {
- switch (ext_attr->constellation) {
- case DRX_CONSTELLATION_QAM256:
- sig_quality->MER = 210;
- break;
- case DRX_CONSTELLATION_QAM128:
- sig_quality->MER = 180;
- break;
- case DRX_CONSTELLATION_QAM64:
- sig_quality->MER = 150;
- break;
- case DRX_CONSTELLATION_QAM32:
- sig_quality->MER = 120;
- break;
- case DRX_CONSTELLATION_QAM16:
- sig_quality->MER = 90;
- break;
- default:
- sig_quality->MER = 0;
- return -EIO;
- }
- }
-
- switch (ext_attr->constellation) {
- case DRX_CONSTELLATION_QAM256:
- min_mer = 210;
- threshold_mer = 270;
- max_mer = 380;
- break;
- case DRX_CONSTELLATION_QAM64:
- min_mer = 150;
- threshold_mer = 210;
- max_mer = 380;
- break;
- case DRX_CONSTELLATION_QAM128:
- case DRX_CONSTELLATION_QAM32:
- case DRX_CONSTELLATION_QAM16:
- break;
- default:
- return -EIO;
- }
- sig_quality->indicator =
- mer2indicator(sig_quality->MER, min_mer, threshold_mer,
- max_mer);
break;
#endif
default:
@@ -11997,81 +11952,61 @@ static int drx39xxj_read_status(struct dvb_frontend *fe, fe_status_t *status)
default:
pr_err("Lock state unknown %d\n", lock_status);
}
+ ctrl_sig_quality(demod, lock_status);
return 0;
}
static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber)
{
- struct drx39xxj_state *state = fe->demodulator_priv;
- struct drx_demod_instance *demod = state->demod;
- int result;
- struct drx_sig_quality sig_quality;
+ struct dtv_frontend_properties *p = &fe->dtv_property_cache;
- result = ctrl_sig_quality(demod, &sig_quality);
- if (result != 0) {
- pr_err("drx39xxj: could not get ber!\n");
+ if (p->pre_bit_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
*ber = 0;
return 0;
}
- *ber = sig_quality.post_reed_solomon_ber;
+ *ber = p->pre_bit_error.stat[0].uvalue;
return 0;
}
static int drx39xxj_read_signal_strength(struct dvb_frontend *fe,
u16 *strength)
{
- struct drx39xxj_state *state = fe->demodulator_priv;
- struct drx_demod_instance *demod = state->demod;
- int result;
- struct drx_sig_quality sig_quality;
+ struct dtv_frontend_properties *p = &fe->dtv_property_cache;
- result = ctrl_sig_quality(demod, &sig_quality);
- if (result != 0) {
- pr_err("drx39xxj: could not get signal strength!\n");
+ if (p->strength.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
*strength = 0;
return 0;
}
- /* 1-100% scaled to 0-65535 */
- *strength = (sig_quality.indicator * 65535 / 100);
+ *strength = p->strength.stat[0].uvalue;
return 0;
}
static int drx39xxj_read_snr(struct dvb_frontend *fe, u16 *snr)
{
- struct drx39xxj_state *state = fe->demodulator_priv;
- struct drx_demod_instance *demod = state->demod;
- int result;
- struct drx_sig_quality sig_quality;
+ struct dtv_frontend_properties *p = &fe->dtv_property_cache;
- result = ctrl_sig_quality(demod, &sig_quality);
- if (result != 0) {
- pr_err("drx39xxj: could not read snr!\n");
+ if (p->cnr.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
*snr = 0;
return 0;
}
- *snr = sig_quality.MER;
+ *snr = p->cnr.stat[0].svalue / 10;
return 0;
}
-static int drx39xxj_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
+static int drx39xxj_read_ucblocks(struct dvb_frontend *fe, u32 *ucb)
{
- struct drx39xxj_state *state = fe->demodulator_priv;
- struct drx_demod_instance *demod = state->demod;
- int result;
- struct drx_sig_quality sig_quality;
+ struct dtv_frontend_properties *p = &fe->dtv_property_cache;
- result = ctrl_sig_quality(demod, &sig_quality);
- if (result != 0) {
- pr_err("drx39xxj: could not get uc blocks!\n");
- *ucblocks = 0;
+ if (p->block_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
+ *ucb = 0;
return 0;
}
- *ucblocks = sig_quality.packet_error;
+ *ucb = p->block_error.stat[0].uvalue;
return 0;
}
@@ -12178,15 +12113,9 @@ static int drx39xxj_set_frontend(struct dvb_frontend *fe)
pr_err("Failed to disable LNA!\n");
return 0;
}
-#ifdef DJH_DEBUG
- for (i = 0; i < 2000; i++) {
- fe_status_t status;
- drx39xxj_read_status(fe, &status);
- pr_debug("i=%d status=%d\n", i, status);
- msleep(100);
- i += 100;
- }
-#endif
+
+ /* After set_frontend, except for strength, stats aren't available */
+ p->strength.stat[0].scale = FE_SCALE_RELATIVE;
return 0;
}
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 13/15] drx-j: properly handle bit counts on stats
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (10 preceding siblings ...)
2014-03-10 11:59 ` [PATCH 12/15] drx-j: Prepare to use DVBv5 stats Mauro Carvalho Chehab
@ 2014-03-10 11:59 ` Mauro Carvalho Chehab
2014-03-10 11:59 ` [PATCH 14/15] drx-j: Fix detection of no signal Mauro Carvalho Chehab
` (2 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:59 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
Instead of just assuming that the min resolution is 1E-6,
pass both bit error and bit counts for userspace to calculate
BER. The same applies for PER, for 8VSB. It is not clear how
to get the packet count for QAM. So, for now, don't expose PER
for QAM.
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 89 ++++++++++++++++-------------
1 file changed, 50 insertions(+), 39 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index 6005e344f66c..9958277dd943 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -6199,7 +6199,8 @@ rw_error:
* \brief Get the values of packet error in 8VSB mode
* \return Error code
*/
-static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *pck_errs)
+static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr,
+ u16 *pck_errs, u16 *pck_count)
{
int rc;
u16 data = 0;
@@ -6224,9 +6225,8 @@ static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *pck_er
pr_err("error: period and/or prescale is zero!\n");
return -EIO;
}
- *pck_errs =
- (u16) frac_times1e6(packet_errors_mant * (1 << packet_errors_exp),
- (period * prescale * 77));
+ *pck_errs = packet_errors_mant * (1 << packet_errors_exp);
+ *pck_count = period * prescale * 77;
return 0;
rw_error:
@@ -6238,7 +6238,8 @@ rw_error:
* \brief Get the values of ber in VSB mode
* \return Error code
*/
-static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
+static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr,
+ u32 *ber, u32 *cnt)
{
int rc;
u16 data = 0;
@@ -6259,19 +6260,17 @@ static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M)
>> FEC_RS_NR_BIT_ERRORS_EXP__B;
+ *cnt = period * prescale * 207 * ((bit_errors_exp > 2) ? 1 : 8);
+
if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700)
- *ber = 26570;
+ *ber = (*cnt) * 26570;
else {
if (period * prescale == 0) {
pr_err("error: period and/or prescale is zero!\n");
return -EIO;
}
- *ber =
- frac_times1e6(bit_errors_mant <<
- ((bit_errors_exp >
- 2) ? (bit_errors_exp - 3) : bit_errors_exp),
- period * prescale * 207 *
- ((bit_errors_exp > 2) ? 1 : 8));
+ *ber = bit_errors_mant << ((bit_errors_exp > 2) ?
+ (bit_errors_exp - 3) : bit_errors_exp);
}
return 0;
@@ -6284,7 +6283,8 @@ rw_error:
* \brief Get the values of ber in VSB mode
* \return Error code
*/
-static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
+static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr,
+ u32 *ber, u32 *cnt)
{
u16 data = 0;
int rc;
@@ -6292,15 +6292,12 @@ static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber)
rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0);
if (rc != 0) {
pr_err("error %d\n", rc);
- goto rw_error;
+ return -EIO;
}
- *ber =
- frac_times1e6(data,
- VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT);
+ *ber = data;
+ *cnt = VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT;
return 0;
-rw_error:
- return -EIO;
}
/**
@@ -9289,7 +9286,8 @@ rw_error:
*
*/
static int
-get_qamrs_err_count(struct i2c_device_addr *dev_addr, struct drxjrs_errors *rs_errors)
+get_qamrs_err_count(struct i2c_device_addr *dev_addr,
+ struct drxjrs_errors *rs_errors)
{
int rc;
u16 nr_bit_errors = 0,
@@ -9474,6 +9472,8 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
u16 qam_vd_period = 0; /* Viterbi Measurement period */
u32 vd_bit_cnt = 0; /* ViterbiDecoder Bit Count */
+ p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+
/* read the physical registers */
/* Get the RS error data */
rc = get_qamrs_err_count(dev_addr, &measuredrs_errors);
@@ -9554,9 +9554,9 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B;
if ((m << e) >> 3 > 549752)
- qam_vd_ser = 500000;
+ qam_vd_ser = 500000 * vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
else
- qam_vd_ser = frac_times1e6(m << ((e > 2) ? (e - 3) : e), vd_bit_cnt * ((e > 2) ? 1 : 8) / 8);
+ qam_vd_ser = m << ((e > 2) ? (e - 3) : e);
/* --------------------------------------- */
/* pre and post RedSolomon BER Calculation */
@@ -9578,9 +9578,9 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
/*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */
if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0)
- qam_pre_rs_ber = 500000;
+ qam_pre_rs_ber = 500000 * rs_bit_cnt >> e;
else
- qam_pre_rs_ber = frac_times1e6(m, rs_bit_cnt >> e);
+ qam_pre_rs_ber = m;
/* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) / */
/* (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A) */
@@ -9609,16 +9609,16 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100;
- if (ext_attr->standard == DRX_STANDARD_ITU_B)
+ if (ext_attr->standard == DRX_STANDARD_ITU_B) {
p->pre_bit_error.stat[0].uvalue += qam_vd_ser;
- else
+ p->pre_bit_count.stat[0].uvalue += vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
+ } else {
p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber;
+ p->pre_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
+ }
p->post_bit_error.stat[0].uvalue = qam_post_rs_ber;
- p->pre_bit_count.stat[0].uvalue += 1000000;
- p->post_bit_count.stat[0].uvalue += 1000000;
-
p->block_error.stat[0].uvalue += pkt_errs;
#ifdef DRXJ_SIGNAL_ACCUM_ERR
@@ -10661,8 +10661,8 @@ ctrl_sig_quality(struct drx_demod_instance *demod,
struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
enum drx_standard standard = ext_attr->standard;
int rc;
- u32 ber;
- u16 pkt, mer, strength;
+ u32 ber, cnt;
+ u16 err, pkt, mer, strength;
rc = get_sig_strength(demod, &strength);
if (rc < 0) {
@@ -10684,23 +10684,26 @@ ctrl_sig_quality(struct drx_demod_instance *demod,
#endif
if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) {
p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
- p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
} else {
- rc = get_vsb_post_rs_pck_err(dev_addr, &pkt);
+ rc = get_vsb_post_rs_pck_err(dev_addr, &err, &pkt);
if (rc != 0) {
pr_err("error %d getting UCB\n", rc);
p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
} else {
p->block_error.stat[0].scale = FE_SCALE_COUNTER;
- p->block_error.stat[0].uvalue += pkt;
+ p->block_error.stat[0].uvalue += err;
+ p->block_count.stat[0].scale = FE_SCALE_COUNTER;
+ p->block_count.stat[0].uvalue += pkt;
}
/* PostViterbi is compute in steps of 10^(-6) */
- rc = get_vs_bpre_viterbi_ber(dev_addr, &ber);
+ rc = get_vs_bpre_viterbi_ber(dev_addr, &ber, &cnt);
if (rc != 0) {
pr_err("error %d getting pre-ber\n", rc);
p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
@@ -10708,10 +10711,10 @@ ctrl_sig_quality(struct drx_demod_instance *demod,
p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
p->pre_bit_error.stat[0].uvalue += ber;
p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
- p->pre_bit_count.stat[0].uvalue += 1000000;
+ p->pre_bit_count.stat[0].uvalue += cnt;
}
- rc = get_vs_bpost_viterbi_ber(dev_addr, &ber);
+ rc = get_vs_bpost_viterbi_ber(dev_addr, &ber, &cnt);
if (rc != 0) {
pr_err("error %d getting post-ber\n", rc);
p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
@@ -10719,7 +10722,7 @@ ctrl_sig_quality(struct drx_demod_instance *demod,
p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
p->post_bit_error.stat[0].uvalue += ber;
p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
- p->post_bit_count.stat[0].uvalue += 1000000;
+ p->post_bit_count.stat[0].uvalue += cnt;
}
rc = get_vsbmer(dev_addr, &mer);
if (rc != 0) {
@@ -11966,7 +11969,15 @@ static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber)
return 0;
}
- *ber = p->pre_bit_error.stat[0].uvalue;
+ if (!p->pre_bit_count.stat[0].uvalue) {
+ if (!p->pre_bit_error.stat[0].uvalue)
+ *ber = 0;
+ else
+ *ber = 1000000;
+ } else {
+ *ber = frac_times1e6(p->pre_bit_error.stat[0].uvalue,
+ p->pre_bit_count.stat[0].uvalue);
+ }
return 0;
}
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 14/15] drx-j: Fix detection of no signal
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (11 preceding siblings ...)
2014-03-10 11:59 ` [PATCH 13/15] drx-j: properly handle bit counts on stats Mauro Carvalho Chehab
@ 2014-03-10 11:59 ` Mauro Carvalho Chehab
2014-03-10 11:59 ` [PATCH 15/15] drx-j: enable DVBv5 stats Mauro Carvalho Chehab
2014-03-10 13:04 ` [PATCH 00/15] drx-j: Cleanups, fixes and support for " Mauro Carvalho Chehab
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:59 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
When the signal is 7, it means that no signal was received.
Value experimentally measured.
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index 9958277dd943..8098d87cda0b 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -9420,6 +9420,9 @@ static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
*sig_strength = (20 * if_gain / if_agc_sns);
}
+ if (*sig_strength <= 7)
+ *sig_strength = 0;
+
return 0;
rw_error:
return -EIO;
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 15/15] drx-j: enable DVBv5 stats
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (12 preceding siblings ...)
2014-03-10 11:59 ` [PATCH 14/15] drx-j: Fix detection of no signal Mauro Carvalho Chehab
@ 2014-03-10 11:59 ` Mauro Carvalho Chehab
2014-03-10 13:04 ` [PATCH 00/15] drx-j: Cleanups, fixes and support for " Mauro Carvalho Chehab
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 11:59 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
Now that everything is set, let's enable DVBv5 stats, for
applications that support it.
DVBv3 apps will still work.
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
---
drivers/media/dvb-frontends/drx39xyj/drxj.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index 8098d87cda0b..0c0e9f3b108f 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -6200,7 +6200,7 @@ rw_error:
* \return Error code
*/
static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr,
- u16 *pck_errs, u16 *pck_count)
+ u32 *pck_errs, u32 *pck_count)
{
int rc;
u16 data = 0;
@@ -10664,8 +10664,8 @@ ctrl_sig_quality(struct drx_demod_instance *demod,
struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
enum drx_standard standard = ext_attr->standard;
int rc;
- u32 ber, cnt;
- u16 err, pkt, mer, strength;
+ u32 ber, cnt, err, pkt;
+ u16 mer, strength;
rc = get_sig_strength(demod, &strength);
if (rc < 0) {
@@ -12249,11 +12249,11 @@ static struct dvb_frontend_ops drx39xxj_ops;
struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
{
struct drx39xxj_state *state = NULL;
-
struct i2c_device_addr *demod_addr = NULL;
struct drx_common_attr *demod_comm_attr = NULL;
struct drxj_data *demod_ext_attr = NULL;
struct drx_demod_instance *demod = NULL;
+ struct dtv_frontend_properties *p;
struct drxuio_cfg uio_cfg;
struct drxuio_data uio_data;
int result;
@@ -12331,6 +12331,27 @@ struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
sizeof(struct dvb_frontend_ops));
state->frontend.demodulator_priv = state;
+
+ /* Initialize stats - needed for DVBv5 stats to work */
+ p = &state->frontend.dtv_property_cache;
+ p->strength.len = 1;
+ p->pre_bit_count.len = 1;
+ p->pre_bit_error.len = 1;
+ p->post_bit_count.len = 1;
+ p->post_bit_error.len = 1;
+ p->block_count.len = 1;
+ p->block_error.len = 1;
+ p->cnr.len = 1;
+
+ p->strength.stat[0].scale = FE_SCALE_RELATIVE;
+ p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+ p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+
return &state->frontend;
error:
--
1.8.5.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats
2014-03-10 11:58 [PATCH 00/15] drx-j: Cleanups, fixes and support for DVBv5 stats Mauro Carvalho Chehab
` (13 preceding siblings ...)
2014-03-10 11:59 ` [PATCH 15/15] drx-j: enable DVBv5 stats Mauro Carvalho Chehab
@ 2014-03-10 13:04 ` Mauro Carvalho Chehab
14 siblings, 0 replies; 16+ messages in thread
From: Mauro Carvalho Chehab @ 2014-03-10 13:04 UTC (permalink / raw)
To: Mauro Carvalho Chehab; +Cc: Linux Media Mailing List, Mauro Carvalho Chehab
Em Mon, 10 Mar 2014 08:58:52 -0300
Mauro Carvalho Chehab <m.chehab@samsung.com> escreveu:
> This patch series is meant to:
> 1) fix some reported issues (sparse, smatch);
>
> 2) Fix one compilation issue with em28xx when drx-j is not selected;
>
> 3) Get rid of unused code. It is always possible to restore the code
> from git history. Removing the unused code helps to better understand
> what's actually there.
>
> 4) Add support for DVBv5 stats.
>
> On my tests here with an AWGN noise generator, the CNR measure made by
> drx-j was close enough to the SNR injected (with a difference of about
> 1 dB).
>
> Mauro Carvalho Chehab (15):
> drx-j: Don't use 0 as NULL
> drx-j: Fix dubious usage of "&" instead of "&&"
> drx39xxj.h: Fix undefined reference to attach function
> drx-j: don't use mc_info before checking if its not NULL
> drx-j: get rid of dead code
This patch seems to be rejected by vger... likely too big.
Well the patch is here:
http://git.linuxtv.org/mchehab/experimental.git/commitdiff/49bac5876df20f74238bfccf3ef9cbaefcaa2ca9
For anyone wanting to test, all patches are at:
http://git.linuxtv.org/mchehab/experimental.git/shortlog/refs/heads/drx-j-v3
> drx-j: remove external symbols
> drx-j: Fix usage of drxj_close()
> drx-j: propagate returned error from request_firmware()
> drx-j: get rid of some unused vars
> drx-j: Don't use "state" for DVB lock state
> drx-j: re-add get_sig_strength()
> drx-j: Prepare to use DVBv5 stats
> drx-j: properly handle bit counts on stats
> drx-j: Fix detection of no signal
> drx-j: enable DVBv5 stats
>
> drivers/media/dvb-frontends/drx39xyj/drx39xxj.h | 6 +
> drivers/media/dvb-frontends/drx39xyj/drx_driver.h | 24 -
> drivers/media/dvb-frontends/drx39xyj/drxj.c | 11146 +++-----------------
> drivers/media/dvb-frontends/drx39xyj/drxj.h | 30 -
> 4 files changed, 1343 insertions(+), 9863 deletions(-)
>
--
Regards,
Mauro
^ permalink raw reply [flat|nested] 16+ messages in thread