Commit a7deca6f authored by David Dillow's avatar David Dillow Committed by Mauro Carvalho Chehab

[media] cx231xx: don't DMA to random addresses

Commit 7a6f6c29 (cx231xx: use
URB_NO_TRANSFER_DMA_MAP) was intended to avoid mapping the DMA buffer
for URB twice. This works for the URBs allocated with usb_alloc_urb(),
as those are allocated from cohernent DMA pools, but the flag was also
added for the VBI and audio URBs, which have a manually allocated area.
This leaves the random trash in the structure after allocation as the
DMA address, corrupting memory and preventing VBI and audio from
working. Letting the USB core map the buffers solves the problem.

Cc: stable@kernel.org
Signed-off-by: default avatarDavid Dillow <dave@thedillows.org>
Cc: Sri Deevi <srinivasa.deevi@conexant.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 4dab0e5f
...@@ -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_NO_TRANSFER_DMA_MAP; urb->transfer_flags = URB_ISO_ASAP;
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 = URB_NO_TRANSFER_DMA_MAP; urb->transfer_flags = 0;
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;
......
...@@ -448,7 +448,7 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets, ...@@ -448,7 +448,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 = URB_NO_TRANSFER_DMA_MAP; urb->transfer_flags = 0;
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