if (buf->status != BUFSTAT_READY &&
                    dev->status != STATUS_DISCONNECTED) {
+                       int err;
                        /* return nonblocking */
                        if (file->f_flags & O_NONBLOCK) {
                                if (!ret)
                                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)