diff options
-rw-r--r-- | drivers/media/dvb-frontends/drx39xyj/drxj.c | 89 |
1 files 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: | |||
6199 | * \brief Get the values of packet error in 8VSB mode | 6199 | * \brief Get the values of packet error in 8VSB mode |
6200 | * \return Error code | 6200 | * \return Error code |
6201 | */ | 6201 | */ |
6202 | static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *pck_errs) | 6202 | static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, |
6203 | u16 *pck_errs, u16 *pck_count) | ||
6203 | { | 6204 | { |
6204 | int rc; | 6205 | int rc; |
6205 | u16 data = 0; | 6206 | u16 data = 0; |
@@ -6224,9 +6225,8 @@ static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr, u16 *pck_er | |||
6224 | pr_err("error: period and/or prescale is zero!\n"); | 6225 | pr_err("error: period and/or prescale is zero!\n"); |
6225 | return -EIO; | 6226 | return -EIO; |
6226 | } | 6227 | } |
6227 | *pck_errs = | 6228 | *pck_errs = packet_errors_mant * (1 << packet_errors_exp); |
6228 | (u16) frac_times1e6(packet_errors_mant * (1 << packet_errors_exp), | 6229 | *pck_count = period * prescale * 77; |
6229 | (period * prescale * 77)); | ||
6230 | 6230 | ||
6231 | return 0; | 6231 | return 0; |
6232 | rw_error: | 6232 | rw_error: |
@@ -6238,7 +6238,8 @@ rw_error: | |||
6238 | * \brief Get the values of ber in VSB mode | 6238 | * \brief Get the values of ber in VSB mode |
6239 | * \return Error code | 6239 | * \return Error code |
6240 | */ | 6240 | */ |
6241 | static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber) | 6241 | static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr, |
6242 | u32 *ber, u32 *cnt) | ||
6242 | { | 6243 | { |
6243 | int rc; | 6244 | int rc; |
6244 | u16 data = 0; | 6245 | u16 data = 0; |
@@ -6259,19 +6260,17 @@ static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber) | |||
6259 | bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M) | 6260 | bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M) |
6260 | >> FEC_RS_NR_BIT_ERRORS_EXP__B; | 6261 | >> FEC_RS_NR_BIT_ERRORS_EXP__B; |
6261 | 6262 | ||
6263 | *cnt = period * prescale * 207 * ((bit_errors_exp > 2) ? 1 : 8); | ||
6264 | |||
6262 | if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700) | 6265 | if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700) |
6263 | *ber = 26570; | 6266 | *ber = (*cnt) * 26570; |
6264 | else { | 6267 | else { |
6265 | if (period * prescale == 0) { | 6268 | if (period * prescale == 0) { |
6266 | pr_err("error: period and/or prescale is zero!\n"); | 6269 | pr_err("error: period and/or prescale is zero!\n"); |
6267 | return -EIO; | 6270 | return -EIO; |
6268 | } | 6271 | } |
6269 | *ber = | 6272 | *ber = bit_errors_mant << ((bit_errors_exp > 2) ? |
6270 | frac_times1e6(bit_errors_mant << | 6273 | (bit_errors_exp - 3) : bit_errors_exp); |
6271 | ((bit_errors_exp > | ||
6272 | 2) ? (bit_errors_exp - 3) : bit_errors_exp), | ||
6273 | period * prescale * 207 * | ||
6274 | ((bit_errors_exp > 2) ? 1 : 8)); | ||
6275 | } | 6274 | } |
6276 | 6275 | ||
6277 | return 0; | 6276 | return 0; |
@@ -6284,7 +6283,8 @@ rw_error: | |||
6284 | * \brief Get the values of ber in VSB mode | 6283 | * \brief Get the values of ber in VSB mode |
6285 | * \return Error code | 6284 | * \return Error code |
6286 | */ | 6285 | */ |
6287 | static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber) | 6286 | static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, |
6287 | u32 *ber, u32 *cnt) | ||
6288 | { | 6288 | { |
6289 | u16 data = 0; | 6289 | u16 data = 0; |
6290 | int rc; | 6290 | int rc; |
@@ -6292,15 +6292,12 @@ static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr, u32 *ber) | |||
6292 | rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0); | 6292 | rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0); |
6293 | if (rc != 0) { | 6293 | if (rc != 0) { |
6294 | pr_err("error %d\n", rc); | 6294 | pr_err("error %d\n", rc); |
6295 | goto rw_error; | 6295 | return -EIO; |
6296 | } | 6296 | } |
6297 | *ber = | 6297 | *ber = data; |
6298 | frac_times1e6(data, | 6298 | *cnt = VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT; |
6299 | VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT); | ||
6300 | 6299 | ||
6301 | return 0; | 6300 | return 0; |
6302 | rw_error: | ||
6303 | return -EIO; | ||
6304 | } | 6301 | } |
6305 | 6302 | ||
6306 | /** | 6303 | /** |
@@ -9289,7 +9286,8 @@ rw_error: | |||
9289 | * | 9286 | * |
9290 | */ | 9287 | */ |
9291 | static int | 9288 | static int |
9292 | get_qamrs_err_count(struct i2c_device_addr *dev_addr, struct drxjrs_errors *rs_errors) | 9289 | get_qamrs_err_count(struct i2c_device_addr *dev_addr, |
9290 | struct drxjrs_errors *rs_errors) | ||
9293 | { | 9291 | { |
9294 | int rc; | 9292 | int rc; |
9295 | u16 nr_bit_errors = 0, | 9293 | u16 nr_bit_errors = 0, |
@@ -9474,6 +9472,8 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod) | |||
9474 | u16 qam_vd_period = 0; /* Viterbi Measurement period */ | 9472 | u16 qam_vd_period = 0; /* Viterbi Measurement period */ |
9475 | u32 vd_bit_cnt = 0; /* ViterbiDecoder Bit Count */ | 9473 | u32 vd_bit_cnt = 0; /* ViterbiDecoder Bit Count */ |
9476 | 9474 | ||
9475 | p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
9476 | |||
9477 | /* read the physical registers */ | 9477 | /* read the physical registers */ |
9478 | /* Get the RS error data */ | 9478 | /* Get the RS error data */ |
9479 | rc = get_qamrs_err_count(dev_addr, &measuredrs_errors); | 9479 | rc = get_qamrs_err_count(dev_addr, &measuredrs_errors); |
@@ -9554,9 +9554,9 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod) | |||
9554 | QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B; | 9554 | QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B; |
9555 | 9555 | ||
9556 | if ((m << e) >> 3 > 549752) | 9556 | if ((m << e) >> 3 > 549752) |
9557 | qam_vd_ser = 500000; | 9557 | qam_vd_ser = 500000 * vd_bit_cnt * ((e > 2) ? 1 : 8) / 8; |
9558 | else | 9558 | else |
9559 | qam_vd_ser = frac_times1e6(m << ((e > 2) ? (e - 3) : e), vd_bit_cnt * ((e > 2) ? 1 : 8) / 8); | 9559 | qam_vd_ser = m << ((e > 2) ? (e - 3) : e); |
9560 | 9560 | ||
9561 | /* --------------------------------------- */ | 9561 | /* --------------------------------------- */ |
9562 | /* pre and post RedSolomon BER Calculation */ | 9562 | /* pre and post RedSolomon BER Calculation */ |
@@ -9578,9 +9578,9 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod) | |||
9578 | 9578 | ||
9579 | /*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */ | 9579 | /*qam_pre_rs_ber = frac_times1e6( ber_cnt, rs_bit_cnt ); */ |
9580 | if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0) | 9580 | if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0) |
9581 | qam_pre_rs_ber = 500000; | 9581 | qam_pre_rs_ber = 500000 * rs_bit_cnt >> e; |
9582 | else | 9582 | else |
9583 | qam_pre_rs_ber = frac_times1e6(m, rs_bit_cnt >> e); | 9583 | qam_pre_rs_ber = m; |
9584 | 9584 | ||
9585 | /* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) / */ | 9585 | /* post RS BER = 1000000* (11.17 * FEC_OC_SNC_FAIL_COUNT__A) / */ |
9586 | /* (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A) */ | 9586 | /* (1504.0 * FEC_OC_SNC_FAIL_PERIOD__A) */ |
@@ -9609,16 +9609,16 @@ ctrl_get_qam_sig_quality(struct drx_demod_instance *demod) | |||
9609 | p->cnr.stat[0].scale = FE_SCALE_DECIBEL; | 9609 | p->cnr.stat[0].scale = FE_SCALE_DECIBEL; |
9610 | 9610 | ||
9611 | p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100; | 9611 | p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100; |
9612 | if (ext_attr->standard == DRX_STANDARD_ITU_B) | 9612 | if (ext_attr->standard == DRX_STANDARD_ITU_B) { |
9613 | p->pre_bit_error.stat[0].uvalue += qam_vd_ser; | 9613 | p->pre_bit_error.stat[0].uvalue += qam_vd_ser; |
9614 | else | 9614 | p->pre_bit_count.stat[0].uvalue += vd_bit_cnt * ((e > 2) ? 1 : 8) / 8; |
9615 | } else { | ||
9615 | p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber; | 9616 | p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber; |
9617 | p->pre_bit_count.stat[0].uvalue += rs_bit_cnt >> e; | ||
9618 | } | ||
9616 | 9619 | ||
9617 | p->post_bit_error.stat[0].uvalue = qam_post_rs_ber; | 9620 | p->post_bit_error.stat[0].uvalue = qam_post_rs_ber; |
9618 | 9621 | ||
9619 | p->pre_bit_count.stat[0].uvalue += 1000000; | ||
9620 | p->post_bit_count.stat[0].uvalue += 1000000; | ||
9621 | |||
9622 | p->block_error.stat[0].uvalue += pkt_errs; | 9622 | p->block_error.stat[0].uvalue += pkt_errs; |
9623 | 9623 | ||
9624 | #ifdef DRXJ_SIGNAL_ACCUM_ERR | 9624 | #ifdef DRXJ_SIGNAL_ACCUM_ERR |
@@ -10661,8 +10661,8 @@ ctrl_sig_quality(struct drx_demod_instance *demod, | |||
10661 | struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache; | 10661 | struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache; |
10662 | enum drx_standard standard = ext_attr->standard; | 10662 | enum drx_standard standard = ext_attr->standard; |
10663 | int rc; | 10663 | int rc; |
10664 | u32 ber; | 10664 | u32 ber, cnt; |
10665 | u16 pkt, mer, strength; | 10665 | u16 err, pkt, mer, strength; |
10666 | 10666 | ||
10667 | rc = get_sig_strength(demod, &strength); | 10667 | rc = get_sig_strength(demod, &strength); |
10668 | if (rc < 0) { | 10668 | if (rc < 0) { |
@@ -10684,23 +10684,26 @@ ctrl_sig_quality(struct drx_demod_instance *demod, | |||
10684 | #endif | 10684 | #endif |
10685 | if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) { | 10685 | if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) { |
10686 | p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 10686 | p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
10687 | p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
10688 | p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 10687 | p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
10688 | p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
10689 | p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 10689 | p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
10690 | p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
10690 | p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 10691 | p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
10691 | p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 10692 | p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
10692 | } else { | 10693 | } else { |
10693 | rc = get_vsb_post_rs_pck_err(dev_addr, &pkt); | 10694 | rc = get_vsb_post_rs_pck_err(dev_addr, &err, &pkt); |
10694 | if (rc != 0) { | 10695 | if (rc != 0) { |
10695 | pr_err("error %d getting UCB\n", rc); | 10696 | pr_err("error %d getting UCB\n", rc); |
10696 | p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 10697 | p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
10697 | } else { | 10698 | } else { |
10698 | p->block_error.stat[0].scale = FE_SCALE_COUNTER; | 10699 | p->block_error.stat[0].scale = FE_SCALE_COUNTER; |
10699 | p->block_error.stat[0].uvalue += pkt; | 10700 | p->block_error.stat[0].uvalue += err; |
10701 | p->block_count.stat[0].scale = FE_SCALE_COUNTER; | ||
10702 | p->block_count.stat[0].uvalue += pkt; | ||
10700 | } | 10703 | } |
10701 | 10704 | ||
10702 | /* PostViterbi is compute in steps of 10^(-6) */ | 10705 | /* PostViterbi is compute in steps of 10^(-6) */ |
10703 | rc = get_vs_bpre_viterbi_ber(dev_addr, &ber); | 10706 | rc = get_vs_bpre_viterbi_ber(dev_addr, &ber, &cnt); |
10704 | if (rc != 0) { | 10707 | if (rc != 0) { |
10705 | pr_err("error %d getting pre-ber\n", rc); | 10708 | pr_err("error %d getting pre-ber\n", rc); |
10706 | p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 10709 | p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
@@ -10708,10 +10711,10 @@ ctrl_sig_quality(struct drx_demod_instance *demod, | |||
10708 | p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER; | 10711 | p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER; |
10709 | p->pre_bit_error.stat[0].uvalue += ber; | 10712 | p->pre_bit_error.stat[0].uvalue += ber; |
10710 | p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER; | 10713 | p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER; |
10711 | p->pre_bit_count.stat[0].uvalue += 1000000; | 10714 | p->pre_bit_count.stat[0].uvalue += cnt; |
10712 | } | 10715 | } |
10713 | 10716 | ||
10714 | rc = get_vs_bpost_viterbi_ber(dev_addr, &ber); | 10717 | rc = get_vs_bpost_viterbi_ber(dev_addr, &ber, &cnt); |
10715 | if (rc != 0) { | 10718 | if (rc != 0) { |
10716 | pr_err("error %d getting post-ber\n", rc); | 10719 | pr_err("error %d getting post-ber\n", rc); |
10717 | p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 10720 | p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
@@ -10719,7 +10722,7 @@ ctrl_sig_quality(struct drx_demod_instance *demod, | |||
10719 | p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; | 10722 | p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; |
10720 | p->post_bit_error.stat[0].uvalue += ber; | 10723 | p->post_bit_error.stat[0].uvalue += ber; |
10721 | p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; | 10724 | p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; |
10722 | p->post_bit_count.stat[0].uvalue += 1000000; | 10725 | p->post_bit_count.stat[0].uvalue += cnt; |
10723 | } | 10726 | } |
10724 | rc = get_vsbmer(dev_addr, &mer); | 10727 | rc = get_vsbmer(dev_addr, &mer); |
10725 | if (rc != 0) { | 10728 | if (rc != 0) { |
@@ -11966,7 +11969,15 @@ static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber) | |||
11966 | return 0; | 11969 | return 0; |
11967 | } | 11970 | } |
11968 | 11971 | ||
11969 | *ber = p->pre_bit_error.stat[0].uvalue; | 11972 | if (!p->pre_bit_count.stat[0].uvalue) { |
11973 | if (!p->pre_bit_error.stat[0].uvalue) | ||
11974 | *ber = 0; | ||
11975 | else | ||
11976 | *ber = 1000000; | ||
11977 | } else { | ||
11978 | *ber = frac_times1e6(p->pre_bit_error.stat[0].uvalue, | ||
11979 | p->pre_bit_count.stat[0].uvalue); | ||
11980 | } | ||
11970 | return 0; | 11981 | return 0; |
11971 | } | 11982 | } |
11972 | 11983 | ||