libdvbv5: Retry FE_GET_PROPERTY ioctl if it returns EAGAIN
PATCH 1/1 libdvbv5: Retry FE_GET_PROPERTY ioctl if it returns EAGAIN
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 <[email protected]>
Signed-off-by David Howells <[email protected]>
--- dvb-fe.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
lib/libdvbv5/dvb-fe.c +8 -2
@@ -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