Commit 7a6f6c29 authored by Thomas Petazzoni's avatar Thomas Petazzoni Committed by Mauro Carvalho Chehab

[media] cx231xx: use URB_NO_TRANSFER_DMA_MAP on URBs allocated with usb_alloc_urb()

URBs allocated with usb_alloc_urb() are allocated from DMA-coherent
areas, and therefore it is not necessary to call dma_map_single() on
such buffers. Worst, on ARM, calling dma_map_single() on a
DMA-coherent buffer will trigger a BUG_ON() in
arch/arm/mm/dma-mapping.c.

Therefore, we mark all URBs allocated with usb_alloc_urb() with the
URB_NO_TRANSFER_DMA_MAP transfer_flags, so that the USB core does not
do dma_map_single()/dma_unmap_single() on those buffers.

This is similar to 882787ff for the
gspca driver, and has already been discussed on the linux-media list
in the past:
http://www.mail-archive.com/linux-media@vger.kernel.org/msg37086.html.
Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 15cb6af8
...@@ -307,7 +307,7 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev) ...@@ -307,7 +307,7 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
urb->context = dev; urb->context = dev;
urb->pipe = usb_rcvisocpipe(dev->udev, urb->pipe = usb_rcvisocpipe(dev->udev,
dev->adev.end_point_addr); dev->adev.end_point_addr);
urb->transfer_flags = URB_ISO_ASAP; urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
urb->transfer_buffer = dev->adev.transfer_buffer[i]; urb->transfer_buffer = dev->adev.transfer_buffer[i];
urb->interval = 1; urb->interval = 1;
urb->complete = cx231xx_audio_isocirq; urb->complete = cx231xx_audio_isocirq;
...@@ -368,7 +368,7 @@ static int cx231xx_init_audio_bulk(struct cx231xx *dev) ...@@ -368,7 +368,7 @@ static int cx231xx_init_audio_bulk(struct cx231xx *dev)
urb->context = dev; urb->context = dev;
urb->pipe = usb_rcvbulkpipe(dev->udev, urb->pipe = usb_rcvbulkpipe(dev->udev,
dev->adev.end_point_addr); dev->adev.end_point_addr);
urb->transfer_flags = 0; urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
urb->transfer_buffer = dev->adev.transfer_buffer[i]; urb->transfer_buffer = dev->adev.transfer_buffer[i];
urb->complete = cx231xx_audio_bulkirq; urb->complete = cx231xx_audio_bulkirq;
urb->transfer_buffer_length = sb_size; urb->transfer_buffer_length = sb_size;
......
...@@ -1074,7 +1074,7 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets, ...@@ -1074,7 +1074,7 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
sb_size, cx231xx_isoc_irq_callback, dma_q, 1); sb_size, cx231xx_isoc_irq_callback, dma_q, 1);
urb->number_of_packets = max_packets; urb->number_of_packets = max_packets;
urb->transfer_flags = URB_ISO_ASAP; urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
k = 0; k = 0;
for (j = 0; j < max_packets; j++) { for (j = 0; j < max_packets; j++) {
...@@ -1185,7 +1185,7 @@ int cx231xx_init_bulk(struct cx231xx *dev, int max_packets, ...@@ -1185,7 +1185,7 @@ int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
return -ENOMEM; return -ENOMEM;
} }
dev->video_mode.bulk_ctl.urb[i] = urb; dev->video_mode.bulk_ctl.urb[i] = urb;
urb->transfer_flags = 0; urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
dev->video_mode.bulk_ctl.transfer_buffer[i] = dev->video_mode.bulk_ctl.transfer_buffer[i] =
usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL, usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
......
...@@ -452,7 +452,7 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets, ...@@ -452,7 +452,7 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
return -ENOMEM; return -ENOMEM;
} }
dev->vbi_mode.bulk_ctl.urb[i] = urb; dev->vbi_mode.bulk_ctl.urb[i] = urb;
urb->transfer_flags = 0; urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
dev->vbi_mode.bulk_ctl.transfer_buffer[i] = dev->vbi_mode.bulk_ctl.transfer_buffer[i] =
kzalloc(sb_size, GFP_KERNEL); kzalloc(sb_size, GFP_KERNEL);
......
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