[media] hdpvr: fix interrupted recording
authorJonathan Sims <jonathan.625266@earthlink.net>
Sun, 23 Oct 2016 18:19:07 +0000 (16:19 -0200)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Wed, 16 Nov 2016 15:30:30 +0000 (13:30 -0200)
This is a reworking of a patch originally submitted by Ryley Angus,
modified by Hans Verkuil and then seemingly forgotten before changes
suggested by Keith Pyle here:

http://www.mail-archive.com/linux-media@vger.kernel.org/msg75163.html

were made and tested.

I have implemented the suggested changes and have been testing for the
last 2 months. I am no longer experiencing lockups while recording
(with blue light on, requiring power cycling) which had been a long
standing problem with the HD-PVR. I have not noticed any other problems
since applying the patch.

Signed-off-by: Jonathan Sims <jonathan.625266@earthlink.net>
Reported-by: Ryley Angus <ryleyjangus@gmail.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/usb/hdpvr/hdpvr-video.c

index e3e7682..7fb036d 100644 (file)
@@ -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)