]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
[media] airspy: fix error handling on start streaming
authorAntti Palosaari <crope@iki.fi>
Mon, 25 Aug 2014 00:59:36 +0000 (21:59 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Sun, 21 Sep 2014 19:42:31 +0000 (16:42 -0300)
Free all reserved USB buffers and URBs on failure. Return all queued
buffers to vb2 with state queued on error case.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/usb/airspy/airspy.c

index cb0e515d80ae378e7e26edecfa196c4024d7dd4b..56a1ae05ea7b6330412f0ef2b539f371162ea0e2 100644 (file)
@@ -540,27 +540,49 @@ static int airspy_start_streaming(struct vb2_queue *vq, unsigned int count)
 
        mutex_lock(&s->v4l2_lock);
 
-       set_bit(POWER_ON, &s->flags);
-
        s->sequence = 0;
 
+       set_bit(POWER_ON, &s->flags);
+
        ret = airspy_alloc_stream_bufs(s);
        if (ret)
-               goto err;
+               goto err_clear_bit;
 
        ret = airspy_alloc_urbs(s);
        if (ret)
-               goto err;
+               goto err_free_stream_bufs;
 
        ret = airspy_submit_urbs(s);
        if (ret)
-               goto err;
+               goto err_free_urbs;
 
        /* start hardware streaming */
        ret = airspy_ctrl_msg(s, CMD_RECEIVER_MODE, 1, 0, NULL, 0);
        if (ret)
-               goto err;
-err:
+               goto err_kill_urbs;
+
+       goto exit_mutex_unlock;
+
+err_kill_urbs:
+       airspy_kill_urbs(s);
+err_free_urbs:
+       airspy_free_urbs(s);
+err_free_stream_bufs:
+       airspy_free_stream_bufs(s);
+err_clear_bit:
+       clear_bit(POWER_ON, &s->flags);
+
+       /* return all queued buffers to vb2 */
+       {
+               struct airspy_frame_buf *buf, *tmp;
+
+               list_for_each_entry_safe(buf, tmp, &s->queued_bufs, list) {
+                       list_del(&buf->list);
+                       vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED);
+               }
+       }
+
+exit_mutex_unlock:
        mutex_unlock(&s->v4l2_lock);
 
        return ret;