summaryrefslogtreecommitdiff
path: root/linux/drivers
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@infradead.org>2007-12-03 10:48:43 +0100
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-12-03 10:48:43 +0100
commit1ecbaa50c6dfbc09017fff9113c88dac126542b8 (patch)
treeeb00df4930d86d35f3da127e96b3f3efd7862e10 /linux/drivers
parent833edd5e26e3f0c8b453f4ee65512b200f5b8e43 (diff)
downloadmediapointer-dvb-s2-1ecbaa50c6dfbc09017fff9113c88dac126542b8.tar.gz
mediapointer-dvb-s2-1ecbaa50c6dfbc09017fff9113c88dac126542b8.tar.bz2
dsbr100 violates DMA coherency rules
From: Oliver Neukum <oliver@neukum.org> Signed-off-by: Oliver Neukum <oneukum@suse.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'linux/drivers')
-rw-r--r--linux/drivers/media/radio/dsbr100.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/linux/drivers/media/radio/dsbr100.c b/linux/drivers/media/radio/dsbr100.c
index 7f9ceb3cf..3107f00bc 100644
--- a/linux/drivers/media/radio/dsbr100.c
+++ b/linux/drivers/media/radio/dsbr100.c
@@ -33,6 +33,9 @@
History:
+ Version 0.43:
+ Oliver Neukum: avoided DMA coherency issue
+
Version 0.42:
Converted dsbr100 to use video_ioctl2
by Douglas Landgraf <dougsland@gmail.com>
@@ -136,7 +139,7 @@ module_param(radio_nr, int, 0);
struct dsbr100_device {
struct usb_device *usbdev;
struct video_device *videodev;
- unsigned char transfer_buffer[TB_LEN];
+ u8 *transfer_buffer;
int curfreq;
int stereo;
int users;
@@ -238,10 +241,7 @@ static void dsbr100_getstat(struct dsbr100_device *radio)
/* handle unplugging of the device, release data structures
if nothing keeps us from doing it. If something is still
keeping us busy, the release callback of v4l will take care
-of releasing it. stv680.c does not relase its private
-data, so I don't do this here either. Checking out the
-code I'd expect I better did that, but if there's a memory
-leak here it's tiny (~50 bytes per disconnect) */
+of releasing it. */
static void usb_dsbr100_disconnect(struct usb_interface *intf)
{
struct dsbr100_device *radio = usb_get_intfdata(intf);
@@ -251,6 +251,7 @@ static void usb_dsbr100_disconnect(struct usb_interface *intf)
video_unregister_device(radio->videodev);
radio->videodev = NULL;
if (radio->users) {
+ kfree(radio->transfer_buffer);
kfree(radio);
} else {
radio->removed = 1;
@@ -426,6 +427,7 @@ static int usb_dsbr100_close(struct inode *inode, struct file *file)
return -ENODEV;
radio->users = 0;
if (radio->removed) {
+ kfree(radio->transfer_buffer);
kfree(radio);
}
return 0;
@@ -472,7 +474,12 @@ static int usb_dsbr100_probe(struct usb_interface *intf,
if (!(radio = kmalloc(sizeof(struct dsbr100_device), GFP_KERNEL)))
return -ENOMEM;
+ if (!(radio->transfer_buffer = kmalloc(TB_LEN, GFP_KERNEL))) {
+ kfree(radio);
+ return -ENOMEM;
+ }
if (!(radio->videodev = video_device_alloc())) {
+ kfree(radio->transfer_buffer);
kfree(radio);
return -ENOMEM;
}
@@ -486,6 +493,7 @@ static int usb_dsbr100_probe(struct usb_interface *intf,
if (video_register_device(radio->videodev, VFL_TYPE_RADIO,radio_nr)) {
warn("Could not register video device");
video_device_release(radio->videodev);
+ kfree(radio->transfer_buffer);
kfree(radio);
return -EIO;
}