Commit ce3556bd authored by Terry Heo's avatar Terry Heo Committed by Mauro Carvalho Chehab

[media] cx231xx: fix bulk transfer mode

The current cx231xx driver doesn't work with bulk transfer mode.
This patch makes it possible to use bulk transfer mode.
Signed-off-by: default avatarTerry Heo <terryheo@google.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 18a8560c
...@@ -914,6 +914,7 @@ EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc); ...@@ -914,6 +914,7 @@ EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
*/ */
void cx231xx_uninit_bulk(struct cx231xx *dev) void cx231xx_uninit_bulk(struct cx231xx *dev)
{ {
struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
struct urb *urb; struct urb *urb;
int i; int i;
...@@ -931,7 +932,7 @@ void cx231xx_uninit_bulk(struct cx231xx *dev) ...@@ -931,7 +932,7 @@ void cx231xx_uninit_bulk(struct cx231xx *dev)
if (dev->video_mode.bulk_ctl.transfer_buffer[i]) { if (dev->video_mode.bulk_ctl.transfer_buffer[i]) {
usb_free_coherent(dev->udev, usb_free_coherent(dev->udev,
urb->transfer_buffer_length, urb->transfer_buffer_length,
dev->video_mode.isoc_ctl. dev->video_mode.bulk_ctl.
transfer_buffer[i], transfer_buffer[i],
urb->transfer_dma); urb->transfer_dma);
} }
...@@ -943,10 +944,12 @@ void cx231xx_uninit_bulk(struct cx231xx *dev) ...@@ -943,10 +944,12 @@ void cx231xx_uninit_bulk(struct cx231xx *dev)
kfree(dev->video_mode.bulk_ctl.urb); kfree(dev->video_mode.bulk_ctl.urb);
kfree(dev->video_mode.bulk_ctl.transfer_buffer); 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.urb = NULL;
dev->video_mode.bulk_ctl.transfer_buffer = NULL; dev->video_mode.bulk_ctl.transfer_buffer = NULL;
dev->video_mode.bulk_ctl.num_bufs = 0; dev->video_mode.bulk_ctl.num_bufs = 0;
dma_q->p_left_data = NULL;
if (dev->mode_tv == 0) if (dev->mode_tv == 0)
cx231xx_capture_start(dev, 0, Raw_Video); cx231xx_capture_start(dev, 0, Raw_Video);
...@@ -1196,6 +1199,16 @@ int cx231xx_init_bulk(struct cx231xx *dev, int max_packets, ...@@ -1196,6 +1199,16 @@ int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
sb_size, cx231xx_bulk_irq_callback, dma_q); 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); init_waitqueue_head(&dma_q->wq);
/* submit urbs and enables IRQ */ /* submit urbs and enables IRQ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment