|
@@ -449,6 +449,7 @@ static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count,
|
|
|
|
|
|
if (buf->status != BUFSTAT_READY &&
|
|
|
dev->status != STATUS_DISCONNECTED) {
|
|
|
+ int err;
|
|
|
/* return nonblocking */
|
|
|
if (file->f_flags & O_NONBLOCK) {
|
|
|
if (!ret)
|
|
@@ -456,9 +457,24 @@ static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count,
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
- if (wait_event_interruptible(dev->wait_data,
|
|
|
- buf->status == BUFSTAT_READY))
|
|
|
- return -ERESTARTSYS;
|
|
|
+ err = wait_event_interruptible_timeout(dev->wait_data,
|
|
|
+ buf->status == BUFSTAT_READY,
|
|
|
+ msecs_to_jiffies(1000));
|
|
|
+ if (err < 0) {
|
|
|
+ ret = err;
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+ if (!err) {
|
|
|
+ v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
|
|
|
+ "timeout: restart streaming\n");
|
|
|
+ hdpvr_stop_streaming(dev);
|
|
|
+ msecs_to_jiffies(4000);
|
|
|
+ err = hdpvr_start_streaming(dev);
|
|
|
+ if (err) {
|
|
|
+ ret = err;
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (buf->status != BUFSTAT_READY)
|