Skip to contentSkip to conversation

Fixes stb0899 not locking

PATCH In review Lutz Sammer 2 participants 3 messages Apr 4, 2011 – Apr 21, 2011 Media (V4L/DVB)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Fixes stb0899 not locking

Fixes stb0899 not locking.
See http://www.spinics.net/lists/linux-media/msg30486.html ...

When stb0899_check_data is entered, it could happen, that the data is already locked and the data search looped. stb0899_check_data fails to lock on a good frequency. stb0899_search_data uses an extrem big search step and fails to lock.

The new code checks for lock before starting a new search. The first read ignores the loop bit, for the case that the loop bit is set during the search setup. I also added the msleep to reduce the traffic on the i2c bus.

Johns

(quoted diff) +0 -0

b/drivers/media/dvb/frontends/stb0899_algo.c
index 2da55ec..55f0c4e 100644

drivers/media/dvb/frontends/stb0899_algo.c +0 -0
@@ -338,36 +338,42 @@ static enum stb0899_status

stb0899_check_data(struct stb0899_state *state)

        int lock = 0, index = 0, dataTime = 500, loop;
        u8 reg;
-       internal->status = NODATA;
+       reg = stb0899_read_reg(state, STB0899_VSTATUS);
+       lock = STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg);
+       if ( !lock ) {
-       /* RESET FEC    */
-       reg = stb0899_read_reg(state, STB0899_TSTRES);
-       STB0899_SETFIELD_VAL(FRESACS, reg, 1);
-       stb0899_write_reg(state, STB0899_TSTRES, reg);
-       msleep(1);
-       reg = stb0899_read_reg(state, STB0899_TSTRES);
-       STB0899_SETFIELD_VAL(FRESACS, reg, 0);
-       stb0899_write_reg(state, STB0899_TSTRES, reg);

+ internal->status = NODATA;

- if (params->srate <= 2000000)
- dataTime = 2000;
- else if (params->srate <= 5000000)
- dataTime = 1500;
- else if (params->srate <= 15000000)
- dataTime = 1000;
- else
- dataTime = 500;
-
- stb0899_write_reg(state, STB0899_DSTATUS2, 0x00); /* force
search loop */
- while (1) {
- /* WARNING! VIT LOCKED has to be tested before
VIT_END_LOOOP */

-               reg = stb0899_read_reg(state, STB0899_VSTATUS);
-               lock = STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg);
-               loop = STB0899_GETFIELD(VSTATUS_END_LOOPVIT, reg);
+               /* RESET FEC    */
+               reg = stb0899_read_reg(state, STB0899_TSTRES);
+               STB0899_SETFIELD_VAL(FRESACS, reg, 1);
+               stb0899_write_reg(state, STB0899_TSTRES, reg);
+               msleep(1);
+               reg = stb0899_read_reg(state, STB0899_TSTRES);
+               STB0899_SETFIELD_VAL(FRESACS, reg, 0);
+               stb0899_write_reg(state, STB0899_TSTRES, reg);

- if (lock || loop || (index > dataTime))
- break;
- index++;
+ msleep(1);
+ }
}

if (lock) { /* DATA LOCK indicator */

#1 lore raw
Quoted 8 lines · On Mon, 04 Apr 2011 14:02:31 +0200 Lutz Sammer <[email protected]> wrote:

Fixes stb0899 not locking.
See http://www.spinics.net/lists/linux-media/msg30486.html ...

When stb0899_check_data is entered, it could happen, that the data is already locked and the data search looped. stb0899_check_data fails to lock on a good frequency. stb0899_search_data uses an extrem big search step and fails to lock.

Quoted 5 lines

The new code checks for lock before starting a new search. The first read ignores the loop bit, for the case that the loop bit is set during the search setup. I also added the msleep to reduce the traffic on the i2c bus.

Thanks Lutz for getting down to the problem :) !

Manu, Mauro,

Any comments ? Let's have that finally sorted.

I think its proven now that its a bug. We have a fix.

---
A few test result on 2.6.39-rc3 from vdr-portal(thx to jrie, hope its ok for him). This is tuning a pre defined channel list until we have a lock and then tune the next.

Astra_only.txt + Original
TOT: lok_errs =172, runs=1136 of sequ=1135, multi=56032, multi_max=931 real 101m40.777s
user 0m0.083s
sys 0m19.039s

Astra_only.txt + stb0899_not_locking_fix.diff
TOT: lok_errs =0, runs=1136 of sequ=1135, multi=289, multi_max=99 real 17m15.636s
user 0m0.007s
sys 0m9.445s

#2 lore raw
In reply to Lutz Sammer
Quoted 8 lines · On Mon, 04 Apr 2011 14:02:31 +0200 Lutz Sammer <[email protected]> wrote:

Fixes stb0899 not locking.
See http://www.spinics.net/lists/linux-media/msg30486.html ...

When stb0899_check_data is entered, it could happen, that the data is already locked and the data search looped. stb0899_check_data fails to lock on a good frequency. stb0899_search_data uses an extrem big search step and fails to lock.

Quoted 4 lines

The new code checks for lock before starting a new search. The first read ignores the loop bit, for the case that the loop bit is set during the search setup. I also added the msleep to reduce the traffic on the i2c bus.

Any updates on this one, or does this really need to be discussed. Its proven now, that here is a bug, there was enough discussion before.

Can this PLEASE get applied.

What proofs are needed, anything wrong with it , at least ANY comment on it ?

I'm starting to hate that its hidden trough v4l development causing that DVB development is dead. This sucks ...

Is there any DVB developer on this list ? Someone who can check and comment or approve this patch ?

Thanks !