static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status)
 {
        struct mb86a20s_state *state = fe->demodulator_priv;
-       u8 val;
+       int val;
 
        dprintk("\n");
        *status = 0;
 
-       if (fe->ops.i2c_gate_ctrl)
-               fe->ops.i2c_gate_ctrl(fe, 0);
        val = mb86a20s_readreg(state, 0x0a) & 0xf;
-       if (fe->ops.i2c_gate_ctrl)
-               fe->ops.i2c_gate_ctrl(fe, 1);
+       if (val < 0)
+               return val;
 
        if (val >= 2)
                *status |= FE_HAS_SIGNAL;
 
 }
 
+static int mb86a20s_read_status_gate(struct dvb_frontend *fe,
+                                    fe_status_t *status)
+{
+       int ret;
+
+       dprintk("\n");
+       *status = 0;
+
+       if (fe->ops.i2c_gate_ctrl)
+               fe->ops.i2c_gate_ctrl(fe, 0);
+
+       ret = mb86a20s_read_status(fe, status);
+
+       if (fe->ops.i2c_gate_ctrl)
+               fe->ops.i2c_gate_ctrl(fe, 1);
+
+       return ret;
+}
+
 static int mb86a20s_tune(struct dvb_frontend *fe,
                        bool re_tune,
                        unsigned int mode_flags,
                rc = mb86a20s_set_frontend(fe);
 
        if (!(mode_flags & FE_TUNE_MODE_ONESHOT))
-               mb86a20s_read_status(fe, status);
+               mb86a20s_read_status_gate(fe, status);
 
        return rc;
 }
        .init = mb86a20s_initfe,
        .set_frontend = mb86a20s_set_frontend,
        .get_frontend = mb86a20s_get_frontend,
-       .read_status = mb86a20s_read_status,
+       .read_status = mb86a20s_read_status_gate,
        .read_signal_strength = mb86a20s_read_signal_strength,
        .tune = mb86a20s_tune,
 };