[media] DVB: stb0899: speed up getting BER values
stb0899_read_ber() takes 500ms (half a second!) to deliver the current BER value. Apparently it takes 5 subsequent readings, with a 100ms pause between them (and even before the first one). This is a real performance brake if an application freqeuently reads the BER of several devices. The attached patch reduces this to a single reading, with no more pausing. I didn't observe any negative side effects of this change. Signed-off-by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de> Cc: Manu Abraham <abraham.manu@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Родитель
4a62817095
Коммит
fdaaee6c4a
|
@ -1129,7 +1129,6 @@ static int stb0899_read_ber(struct dvb_frontend *fe, u32 *ber)
|
|||
struct stb0899_internal *internal = &state->internal;
|
||||
|
||||
u8 lsb, msb;
|
||||
u32 i;
|
||||
|
||||
*ber = 0;
|
||||
|
||||
|
@ -1137,14 +1136,9 @@ static int stb0899_read_ber(struct dvb_frontend *fe, u32 *ber)
|
|||
case SYS_DVBS:
|
||||
case SYS_DSS:
|
||||
if (internal->lock) {
|
||||
/* average 5 BER values */
|
||||
for (i = 0; i < 5; i++) {
|
||||
msleep(100);
|
||||
lsb = stb0899_read_reg(state, STB0899_ECNT1L);
|
||||
msb = stb0899_read_reg(state, STB0899_ECNT1M);
|
||||
*ber += MAKEWORD16(msb, lsb);
|
||||
}
|
||||
*ber /= 5;
|
||||
lsb = stb0899_read_reg(state, STB0899_ECNT1L);
|
||||
msb = stb0899_read_reg(state, STB0899_ECNT1M);
|
||||
*ber = MAKEWORD16(msb, lsb);
|
||||
/* Viterbi Check */
|
||||
if (STB0899_GETFIELD(VSTATUS_PRFVIT, internal->v_status)) {
|
||||
/* Error Rate */
|
||||
|
@ -1157,13 +1151,9 @@ static int stb0899_read_ber(struct dvb_frontend *fe, u32 *ber)
|
|||
break;
|
||||
case SYS_DVBS2:
|
||||
if (internal->lock) {
|
||||
/* Average 5 PER values */
|
||||
for (i = 0; i < 5; i++) {
|
||||
msleep(100);
|
||||
lsb = stb0899_read_reg(state, STB0899_ECNT1L);
|
||||
msb = stb0899_read_reg(state, STB0899_ECNT1M);
|
||||
*ber += MAKEWORD16(msb, lsb);
|
||||
}
|
||||
lsb = stb0899_read_reg(state, STB0899_ECNT1L);
|
||||
msb = stb0899_read_reg(state, STB0899_ECNT1M);
|
||||
*ber = MAKEWORD16(msb, lsb);
|
||||
/* ber = ber * 10 ^ 7 */
|
||||
*ber *= 10000000;
|
||||
*ber /= (-1 + (1 << (4 + 2 * STB0899_GETFIELD(NOE, internal->err_ctrl))));
|
||||
|
|
Загрузка…
Ссылка в новой задаче