[media] rtl2832: implement DVBv5 BER statistic
authorAntti Palosaari <crope@iki.fi>
Sun, 14 Dec 2014 12:59:20 +0000 (09:59 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 3 Feb 2015 18:06:30 +0000 (16:06 -0200)
DVBv5 BER.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/dvb-frontends/rtl2832.c
drivers/media/dvb-frontends/rtl2832_priv.h

index 239472b4ce72924720274b6ec1a8873914da5367..0a0899d2a6b204ad973fab959ab53c20d470d33c 100644 (file)
@@ -476,6 +476,10 @@ static int rtl2832_init(struct dvb_frontend *fe)
        /* init stats here in order signal app which stats are supported */
        c->cnr.len = 1;
        c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+       c->post_bit_error.len = 1;
+       c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+       c->post_bit_count.len = 1;
+       c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
        /* start statistics polling */
        schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
        dev->sleeping = false;
@@ -904,6 +908,27 @@ static void rtl2832_stat_work(struct work_struct *work)
                c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
        }
 
+       /* BER */
+       if (dev->fe_status & FE_HAS_LOCK) {
+               ret = rtl2832_bulk_read(client, 0x34e, buf, 2);
+               if (ret)
+                       goto err;
+
+               u16tmp = buf[0] << 8 | buf[1] << 0;
+               dev->post_bit_error += u16tmp;
+               dev->post_bit_count += 1000000;
+
+               dev_dbg(&client->dev, "ber errors=%u total=1000000\n", u16tmp);
+
+               c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
+               c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
+               c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
+               c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
+       } else {
+               c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+               c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
+       }
+
 err_schedule_delayed_work:
        schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
        return;
index 3c44983b95a0016d2eb322440d387f81bd16f410..a5f5ccdf10d853c0bad3b48fcc3244002f185d86 100644 (file)
@@ -35,6 +35,8 @@ struct rtl2832_dev {
        struct dvb_frontend fe;
        struct delayed_work stat_work;
        fe_status_t fe_status;
+       u64 post_bit_error;
+       u64 post_bit_count;
        bool i2c_gate_state;
        bool sleeping;
        struct delayed_work i2c_gate_work;