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 several 
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.625...@earthlink.net>
---

Changes in v3:
- Actually sleep for 4 seconds after the hdpvr_stop_streaming call.

 drivers/media/usb/hdpvr/hdpvr-video.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/drivers/media/usb/hdpvr/hdpvr-video.c 
b/drivers/media/usb/hdpvr/hdpvr-video.c
index 2a3a8b4..dec8496 100644
--- a/drivers/media/usb/hdpvr/hdpvr-video.c
+++ b/drivers/media/usb/hdpvr/hdpvr-video.c
@@ -454,6 +454,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)
@@ -461,9 +462,27 @@ 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) {
+                               int delay;
+
+                               v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
+                                       "timeout: restart streaming\n");
+                               hdpvr_stop_streaming(dev);
+                               delay = msecs_to_jiffies(4000);
+                               schedule_timeout(delay);
+                               err = hdpvr_start_streaming(dev);
+                               if (err) {
+                                       ret = err;
+                                       goto err;
+                               }
+                       }
                }
 
                if (buf->status != BUFSTAT_READY)
-- 
2.10.1
--
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