Hi,

Manu Abraham wrote:
> On Sun, Jan 10, 2010 at 4:52 PM, Mauro Carvalho Chehab
> <mche...@infradead.org> wrote:
> > Manu Abraham wrote:
> >> Mauro,
> >>
> >> Please pull http://jusst.de/hg/stv090x changesets: from 13880 - 13891
> >> inclusive of both.
> >
> > The third changeset has some locking troubles:
> >
> > # Node ID 4dd17a6a5ecc320eab58590a8567e5ba03b9d53a
> > [STV090x] Added mutex protection around tuner I2C access.
> >
> > After the patch, the code will look like:
> >
> > static int stv090x_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
> > {
> >        struct stv090x_state *state = fe->demodulator_priv;
> >        u32 reg;
> >
> >        if (enable)
> >                mutex_lock(&state->internal->tuner_lock);
> >
> >        reg = STV090x_READ_DEMOD(state, I2CRPT);
> >        if (enable) {
> >                dprintk(FE_DEBUG, 1, "Enable Gate");
> >                STV090x_SETFIELD_Px(reg, I2CT_ON_FIELD, 1);
> >                if (STV090x_WRITE_DEMOD(state, I2CRPT, reg) < 0)
> >                        goto err;
> >
> >        } else {
> >
> >                dprintk(FE_DEBUG, 1, "Disable Gate");
> >                STV090x_SETFIELD_Px(reg, I2CT_ON_FIELD, 0);
> >                if ((STV090x_WRITE_DEMOD(state, I2CRPT, reg)) < 0)
> >                        goto err;
> >        }
> >
> >        if (!enable)
> >                mutex_unlock(&state->internal->tuner_lock);
> >
> >        return 0;
> > err:
> >        dprintk(FE_ERROR, 1, "I/O error");
> >        mutex_unlock(&state->internal->tuner_lock);
> >        return -1;
> > }
> >
> > As the err: is called on both enable and disable conditions, the error
> > code will try to unlock an already unlocked mutex, if !enable.

Nak. stv090x_i2c_gate_ctrl will only be called with enable==false,
if it has previously been called successfully with enable==true.

> > Also, it doesn't make sense to lock only if the gate is enabled,
> > since it seems that the lock is meant to protect the i2c gate bus and
> > both conditions will call STV090x_SETFIELD_Px(reg, I2CT_ON_FIELD, enable ? 
> > 1 : 0);
> >
> > The better would be simply to remove the if (enable)/if (!enable) tests
> > on the above code.
> 
> It looks okay to my eyes. Any other pitfalls in the tuner operations
> can you think of ?
> 
> 
> Oliver,
> 
>  any thoughts that comes to your mind on this one ?

The purpuse of tuner_lock is to allow for 2 tuners with equal I2C
address on one I2C bus. Each one is behind its own I2C gate.

The code is a bit tricky. Lets analyse what may happen:

1. no error, enable==true:
   lock mutex -> return 0
   -> ok

2. no error, enable==false:
   unlock mutex (which has been locked by a previous call), return 0
   -> ok

3. error on enable:
   mutex lock, mutex unlock, return -1
   -> ok

4. error on disable:
   unlock mutex (which has been locked by a previous call), return -1
   -> ok

The code looks ok to me.

CU
Oliver

-- 
----------------------------------------------------------------
VDR Remote Plugin 0.4.0: http://www.escape-edv.de/endriss/vdr/
4 MByte Mod: http://www.escape-edv.de/endriss/dvb-mem-mod/
Full-TS Mod: http://www.escape-edv.de/endriss/dvb-full-ts-mod/
----------------------------------------------------------------
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to