[media] dvb_frontend: do not allow statistic IOCTLs when sleeping
authorAntti Palosaari <crope@iki.fi>
Thu, 9 Aug 2012 22:00:51 +0000 (19:00 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 27 Sep 2012 17:23:10 +0000 (14:23 -0300)
Demodulator cannot perform statistic IOCTLs when it is not tuned.
Return -EAGAIN in such case.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb-core/dvb_frontend.c

index 479a5e52cb0dcb8406521e52dfa3204acc64f341..1f3b16db203659e42d736eeba12600e0c85ab9dd 100644 (file)
@@ -2131,27 +2131,43 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
                        err = fe->ops.read_status(fe, status);
                break;
        }
+
        case FE_READ_BER:
-               if (fe->ops.read_ber)
-                       err = fe->ops.read_ber(fe, (__u32*) parg);
+               if (fe->ops.read_ber) {
+                       if (fepriv->thread)
+                               err = fe->ops.read_ber(fe, (__u32 *) parg);
+                       else
+                               err = -EAGAIN;
+               }
                break;
 
        case FE_READ_SIGNAL_STRENGTH:
-               if (fe->ops.read_signal_strength)
-                       err = fe->ops.read_signal_strength(fe, (__u16*) parg);
+               if (fe->ops.read_signal_strength) {
+                       if (fepriv->thread)
+                               err = fe->ops.read_signal_strength(fe, (__u16 *) parg);
+                       else
+                               err = -EAGAIN;
+               }
                break;
 
        case FE_READ_SNR:
-               if (fe->ops.read_snr)
-                       err = fe->ops.read_snr(fe, (__u16*) parg);
+               if (fe->ops.read_snr) {
+                       if (fepriv->thread)
+                               err = fe->ops.read_snr(fe, (__u16 *) parg);
+                       else
+                               err = -EAGAIN;
+               }
                break;
 
        case FE_READ_UNCORRECTED_BLOCKS:
-               if (fe->ops.read_ucblocks)
-                       err = fe->ops.read_ucblocks(fe, (__u32*) parg);
+               if (fe->ops.read_ucblocks) {
+                       if (fepriv->thread)
+                               err = fe->ops.read_ucblocks(fe, (__u32 *) parg);
+                       else
+                               err = -EAGAIN;
+               }
                break;
 
-
        case FE_DISEQC_RESET_OVERLOAD:
                if (fe->ops.diseqc_reset_overload) {
                        err = fe->ops.diseqc_reset_overload(fe);