[media] cx231xx: fix bulk transfer mode
authorTerry Heo <terryheo@google.com>
Tue, 22 Sep 2015 08:18:05 +0000 (05:18 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 17 Nov 2015 16:53:41 +0000 (14:53 -0200)
The current cx231xx driver doesn't work with bulk transfer mode.
This patch makes it possible to use bulk transfer mode.

Signed-off-by: Terry Heo <terryheo@google.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/usb/cx231xx/cx231xx-core.c

index a2fd49b..f497888 100644 (file)
@@ -914,6 +914,7 @@ EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
  */
 void cx231xx_uninit_bulk(struct cx231xx *dev)
 {
+       struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
        struct urb *urb;
        int i;
 
@@ -931,7 +932,7 @@ void cx231xx_uninit_bulk(struct cx231xx *dev)
                        if (dev->video_mode.bulk_ctl.transfer_buffer[i]) {
                                usb_free_coherent(dev->udev,
                                                urb->transfer_buffer_length,
-                                               dev->video_mode.isoc_ctl.
+                                               dev->video_mode.bulk_ctl.
                                                transfer_buffer[i],
                                                urb->transfer_dma);
                        }
@@ -943,10 +944,12 @@ void cx231xx_uninit_bulk(struct cx231xx *dev)
 
        kfree(dev->video_mode.bulk_ctl.urb);
        kfree(dev->video_mode.bulk_ctl.transfer_buffer);
+       kfree(dma_q->p_left_data);
 
        dev->video_mode.bulk_ctl.urb = NULL;
        dev->video_mode.bulk_ctl.transfer_buffer = NULL;
        dev->video_mode.bulk_ctl.num_bufs = 0;
+       dma_q->p_left_data = NULL;
 
        if (dev->mode_tv == 0)
                cx231xx_capture_start(dev, 0, Raw_Video);
@@ -1196,6 +1199,16 @@ int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
                                  sb_size, cx231xx_bulk_irq_callback, dma_q);
        }
 
+       /* clear halt */
+       rc = usb_clear_halt(dev->udev, dev->video_mode.bulk_ctl.urb[0]->pipe);
+       if (rc < 0) {
+               dev_err(dev->dev,
+                       "failed to clear USB bulk endpoint stall/halt condition (error=%i)\n",
+                       rc);
+               cx231xx_uninit_bulk(dev);
+               return rc;
+       }
+
        init_waitqueue_head(&dma_q->wq);
 
        /* submit urbs and enables IRQ */