Retry the FE_GET_PROPERTY ioctl used to determine if we have a DVBv5 device
if it returns EAGAIN indicating the driver is currently locked by the kernel.

Also skip over subsequent information gathering calls to FE_GET_PROPERTY
that return EAGAIN.

Original-author: Mauro Carvalho Chehab <mche...@osg.samsung.com>
Signed-off-by: David Howells <dhowe...@redhat.com>
---
 dvb-fe.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/libdvbv5/dvb-fe.c b/lib/libdvbv5/dvb-fe.c
index 04ad907..3657334 100644
--- a/lib/libdvbv5/dvb-fe.c
+++ b/lib/libdvbv5/dvb-fe.c
@@ -171,9 +171,12 @@ struct dvb_v5_fe_parms *dvb_fe_open_flags(int adapter, int 
frontend,
        dtv_prop.props = parms->dvb_prop;
 
        /* Detect a DVBv3 device */
-       if (ioctl(fd, FE_GET_PROPERTY, &dtv_prop) == -1) {
+       while (ioctl(fd, FE_GET_PROPERTY, &dtv_prop) == -1) {
+               if (errno == EAGAIN)
+                       continue;
                parms->dvb_prop[0].u.data = 0x300;
                parms->dvb_prop[1].u.data = SYS_UNDEFINED;
+               break;
        }
        parms->p.version = parms->dvb_prop[0].u.data;
        parms->p.current_sys = parms->dvb_prop[1].u.data;
@@ -1336,8 +1339,11 @@ int dvb_fe_get_stats(struct dvb_v5_fe_parms *p)
                props.props = parms->stats.prop;
 
                /* Do a DVBv5.10 stats call */
-               if (ioctl(parms->fd, FE_GET_PROPERTY, &props) == -1)
+               if (ioctl(parms->fd, FE_GET_PROPERTY, &props) == -1) {
+                       if (errno == EAGAIN)
+                               return 0;
                        goto dvbv3_fallback;
+               }
 
                /*
                 * All props with len=0 mean that this device doesn't have any
--
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